📄 alarm-v3.c
字号:
}
/*****************************************************************************
功能:从74LS166读取8位数据
用法:
执行时间:Cycles:395 Time:395us
******************************************************************************/
void HC595_Write16bit(unsigned char Data0, unsigned char Data1)
{
unsigned char loop;
for(loop=8;loop>0;loop--) //送8位数据
{
SCLK = 0;
if(Data0 & 0X80)
{
SER = 1; //送数据
}
else
{
SER = 0;
}
Data0<<=1; //数据移位
SCLK=1; //送移位有效时钟
}
for(loop=8;loop>0;loop--) //送8位数据
{
SCLK=0;
if(Data1 & 0X80)
{
SER = 1; //送数据
}
else
{
SER = 0;
}
Data1<<=1; //数据移位
SCLK=1; //送移位有效时钟
}
}
/*****************************************************************************
功能:从74LS166读取8位数据
用法:
执行时间:Cycles:193 Time:193us
******************************************************************************/
void Ini_HC595(void)
{
RCLK_LED = 0; //输出LOCK
RCLK_RELAY = 0; //输出LOCK
HC595_Write16bit(0X00, 0X00); //写放16位数据
RCLK_LED = 1; //上升沿HC595输出黄灯数据
RCLK_RELAY = 1; //上升沿HC595输出红灯,继电器数据
RCLK_LED = 0; //输出LOCK
RCLK_RELAY = 0; //输出LOCK
}
/*****************************************************************************
功能:从74LS166读取8位数据
用法:
******************************************************************************/
void Ini_System(void)
{
OPTION = 0X0d; //开上拉电阻,预分频器分给看门狗,32分频
TRISA = 0XC0;
TRISB = 0X1F; //高3位输出,其它位输入
TRISC = 0X00; //C口设置为输出
PORTB = 0XFF;
PORTA = 0XFF;
PORTC = 0XD3; //声音关,电源灯关,RCLK_LED/RCLK_RELAY输出低
//SCLK,RER输出高电平
Ini_HC595(); //初始化HC595
TMR1H = 0Xf8;
TMR1L = 0X2f; //设置2MS中断
PIE1 = 0X01; //开启定时器1益出中断
PIR1 = 0X00; //清除中断摽志
INTCON = 0XC0; //开全部中断
T1CON = 0x05; //设置定时器1为内部时钟,并开启
Flag.allBits = 0x00; //初始其它标志
InFlag.allBits = 0x0000; //初始化输出状态标志位
YellowLed.allBits = 0x0000; //黄灯输出不亮
RelayFlag.allBits = 0x0000; //关闭所以继电器
}
/*******************************************************************************
功能:检测输出信号状态功能及处理相关置位
用法:直接调用
执行时间:Cycles:395 Time:395us
********************************************************************************/
void Output_Dispose(void)
{
unsigned char temp0,temp1;
unsigned int temp;
temp0 = RelayFlag.allBits & 0x00ff; //取低八位
temp = RelayFlag.allBits >> 8;
temp1 = temp & 0x00ff; //取高八位
RCLK_LED = 0; //输出LOCK
RCLK_RELAY = 0; //输出LOCK
HC595_Write16bit (temp0, temp1); //写放16位数据
RCLK_RELAY = 1; //上升沿HC595输出红灯,继电器数据
temp0 = YellowLed.allBits & 0x00ff; //取低八位
temp = YellowLed.allBits >> 8;
temp1 = temp & 0x00ff; //取高八位
HC595_Write16bit (temp0, temp1); //写16位数据到HC595
RCLK_LED = 1; //上升沿HC595输出黄灯数据
RCLK_LED = 0; //输出LOCK
RCLK_RELAY = 0; //输出LOCK
}
/*******************************************************************************
功能:报警音输出处理功能
用法:直接调用
******************************************************************************/
void Output_Audio(void)
{
if(!RelayFlag.allBits) //如果输出全为“0”
{
Flag.oneBit.b0 = 0;
BUZZER = 0;
}
if(Flag.oneBit.b0) //当为“1”时报警输出
{
BUZZER = 1;
}
}
/*******************************************************************************
功能:复位按键功能
用法:直接调用
******************************************************************************/
void Reset_Dispose(void)
{
unsigned char loop1,loop2;
Flag.oneBit.b0 = 0; //清除声音状态标志
InFlag.allBits = 0x0000; //初始化输出状态标志位
YellowLed.allBits = 0x0000; //黄灯输出不亮
RelayFlag.allBits = 0x0000; //关闭所以继电器
Output_Dispose(); //清除继电器及黄灯为“0”
BUZZER = 0; //关闭声音
for(loop2=8;loop2>0;loop2--) //延时2S
{
for(loop1=250;loop1>0;loop1--)
{
delay_1ms(1);
}
}
}
/*******************************************************************************
功能:测试按键程序,用于测试输出端
用法:直接调用
******************************************************************************/
void Test_Dispose(void)
{
unsigned char loop,loop1,loop2;
unsigned char temp0,temp1;
RCLK_RELAY = 0; //清除当除输出状态
RCLK_LED = 0; //输出LOCK
HC595_Write16bit (0x00, 0x00); //写放16位数据全为高
RCLK_LED = 1;
RCLK_RELAY = 1;
temp0 = 0;
temp1 = 0x01; //合成输出后:temp0 temp1 高===低
for(loop=0;loop<17;loop++)
{
RCLK_RELAY = 0; //输出LOCK
HC595_Write16bit (temp0, temp1); //写放16位数据
RCLK_RELAY = 1;
for(loop2=2;loop2>0;loop2--)
{
for(loop1=250;loop1>0;loop1--)
{
delay_1ms(1);
if(!RESET_KEY)
{
delay_1ms(20);
if(!RESET_KEY)
{
while(!RESET_KEY);
goto Test_back;
}
}
}
BUZZER =! BUZZER;
}
if(loop<8)
{
temp0 = 0;
temp1<<=1;
if(!temp1)
{
temp0 = 0x01;
temp1 = 0x00;
}
}
else
{
temp0<<=1;
temp1 = 0;
}
}
temp0 = 0;
temp1 = 0x01; //合成输出后:temp0 temp1 高===低
for(loop=0;loop<17;loop++)
{
RCLK_LED = 0; //输出LOCK
HC595_Write16bit (temp0, temp1); //写放16位数据
RCLK_LED = 1;
for(loop2=2;loop2>0;loop2--)
{
for(loop1=250;loop1>0;loop1--)
{
delay_1ms(1);
if(!RESET_KEY)
{
delay_1ms(20);
if(!RESET_KEY)
{
while(!RESET_KEY);
goto Test_back;
}
}
}
BUZZER =! BUZZER;
}
if(loop<8)
{
temp0 = 0;
temp1<<=1;
if(!temp1)
{
temp0 = 0x01;
temp1 = 0x00;
}
}
else
{
temp0<<=1;
temp1 = 0;
}
}
temp0 = 0;
temp1 = 0;
for(loop=4;loop>0;loop--)
{
BUZZER =! BUZZER;
RCLK_RELAY = 0;
RCLK_LED = 0; //输出LOCK
HC595_Write16bit (temp0, temp1); //写放16位数据全为高
RCLK_LED = 1;
RCLK_RELAY = 1;
for(loop2=4;loop2>0;loop2--) //延时1S
{
for(loop1=250;loop1>0;loop1--)
{
delay_1ms(1);
if(!RESET_KEY)
{
delay_1ms(20);
if(!RESET_KEY)
{
while(!RESET_KEY);
goto Test_back;
}
}
}
}
temp0 =~ temp0;
temp1 =~ temp1;
}
Test_back:
Reset_Dispose(); ///重新复位处理
for(loop2=8;loop2>0;loop2--) //延时2S
{
for(loop1=250;loop1>0;loop1--)
{
delay_1ms(1);
if(!RESET_KEY)
{
delay_1ms(20);
if(!RESET_KEY)
{
while(!RESET_KEY);
goto Test_back;
}
}
}
}
}
/*******************************************************************************
功能:mute按键程序
用法:直接调用
******************************************************************************/
void Mute_Dispose(void)
{
Flag.oneBit.b0 = 0; //关闭声音开启标志
BUZZER = 0;
}
/*******************************************************************************
功能:上电程序
用法:直接调用
******************************************************************************/
void Power_Up(void)
{
BUZZER = 1;
RCLK_RELAY = 0;
RCLK_LED = 0; //输出LOCK
HC595_Write16bit (0XFF, 0XFF); //写放16位数据全为高
RCLK_LED = 1;
RCLK_RELAY = 1;
delay_1ms(200); //延时0.2秒
BUZZER = 0;
RCLK_RELAY = 0;
RCLK_LED = 0; //输出LOCK
HC595_Write16bit (0X00, 0X00); //写放16位数据全为高
RCLK_LED = 1;
RCLK_RELAY = 1;
}
/*****************************************************************************
功能:中断服务程序
用法:
******************************************************************************/
void interrupt ISR (void)
{
asm("clrwdt"); //50MS喂狗一次,18*32=576MS后复位
if(TMR1IF) //定时器1中断服务程序
{
PIR1 = 0X00;
TMR1H = 0Xf8;
TMR1L = 0X2f; //设置2MS中断
Timer1_int0(); //电源指示灯
if(DET_ON) //为1时表示开始检测
{
Timer1_int1(); //检测记录频率脉冲
if(++SECOND_0 > 250) //定时500MS
{
SECOND_0 = 0;
if(++SECOND_1 > 0) //定时0.5S
{
SECOND_1 = 0;
DET_ON = 0; //标志定时0.5S到
Timer1_int2(); //判断已记录的脉冲数是否待合条件
}
}
}
}
}
/*****************************************************************************
功能:主程序
用法:
******************************************************************************/
void main(void)
{
unsigned char loop;
DET_ON = 0; //关闭检测输入
Ini_System(); //调用系统初始化程序
for(loop=0;loop<16;loop++)
{
FRE_CONT[loop]=0;
}
delay_1ms(250);
delay_1ms(250);
Power_Up(); //调用上电测试程序
//Test_Dispose();
delay_1ms(250);
delay_1ms(250);
delay_1ms(250);
delay_1ms(250);
delay_1ms(250);
delay_1ms(250);
delay_1ms(250);
delay_1ms(250); // 延时2秒后才进稳定工作
DET_ON = 0;
SECOND_0=0;
SECOND_1=0;
while(1)
{
while(!DET_ON)
{
Output_Dispose();
Output_Audio();
DET_ON = 0XFF; //开启输入信号检测
}
//----------------------------------RESET_KEY处理功能-------------------------//
if(!RESET_KEY)
{
delay_1ms(20); //去抖延时20MS
if(!RESET_KEY)
{
Reset_Dispose();
}
while(!RESET_KEY)
{
;
//Input_Dispose(); //检测输入信号
//Output_Dispose();
}
}
//----------------------------------MUTE_KEY处理功能-------------------------//
if(!MUTE_KEY)
{
delay_1ms(20); //去抖延时20MS
if(!MUTE_KEY)
{
Mute_Dispose();
}
while(!MUTE_KEY)
{
// Input_Dispose(); //检测输入信号
Output_Dispose();
}
}
//----------------------------------TEST_KEY处理功能-------------------------//
if(!TEST_KEY)
{
delay_1ms(20); //去抖延时20MS
if(!TEST_KEY)
{
Test_Dispose();
}
while(!TEST_KEY)
{
// Input_Dispose(); //检测输入信号
Output_Dispose();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -