?? 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 + -