Sdefine KZ_FMQI //控制蜂鳴器
Sdefine SD_ZDKZ O //控制手自動#define XF_INO5 //消防啟動信號
#define DDC_INO 6 //樓宇啟動信號Sdefine KM1_IN0 7 // 輸入信號 ISdefine KM2_IN0 O // 輸入信號 2Sdefine KM3_IN0 2 // 輸入信號 3Sdefine KEYl (I ? 4) // 按鍵位 ISdefine KEY2 (I ? 5) //按鍵位 2Sdefine KEY3 (I ? 6) //按鍵位 3unsigned char DYTZ_XT1[] = {O, 0};
Uchar key_value=0xFF;
Uchar xf_bz=0x55, run_bz=0, run_bzl=0, gz_bz=0, ly_bz=0xFF, zd_bz=0, zh_bz=0;
unsigned char at_zd[] = {0, 0};
unsigned int num=0x0000;
unsigned int adc_bufl[]={OxFFFF};
void port_init(void)
{
PORTA = OxFF;
DDRA = OxFF;
PORTB = OxFF;
DDRB = OxFE;
PORTC = OxFF;
DDRC = OxlB;
PORTD = OxFF;
DDRD = 0xF2;
}
void watchdog_init(void)
{
WDTCR = OxlB;
WDTCR = OxOB;
}void timerO_init(void)
{
TCCRO = 0x00; //stopTCNTO = 0xA2; //set countOCRO = 0x66; //set compareTCCRO = 0x02; //start timer
}
Spragma interrupt_handler timer0_ovf_isr:10void timer0_ovf_isr(void)
{
TCNTO = 0xA2; //reload counter value
}
void delay_xms(unsigned int MS)
{
unsigned int i;for (i=0;i〈MS;i++)
{
while ((TIFR&(1?T0V0)) == 0);
}
}
Spragma interrupt_handler int0_isr:2void int0_isr(void)
{
Uchar i;
WDR();
//PORTC &= -BIT(KZ_FMQ);key_value=0xFF;//無鍵按下
for (i=4;i<7;i++)
{
PORTD &= ~BIT(i);
delay_xms (I) ;// 延時
if ((PIND&0x04)==0)
{
while ((PIND&0x04) !=0)//等待鍵閉合
WDR();
delay_xms (20) ; //延時去抖動 key_value=1-3;// 鍵值 1,2, 3
break;
} }
if (key_value==2)//啟動按鈕程序功能
{ WDRO ;
if (xf_bz==0x55)
{ delay_xms (10); if(zd_bz==0)
{ if(run_bzl==0)
{PORTA &= ~ BIT (LED_RUN) ; // 運行燈亮 PORTA I= BIT(LED_RUN1);
PORTB = BIT(LED_ST0P) ; //停止燈滅
PORTB &= ~ BIT(KM1_KZ);
delay_xms(250);
delay_xms(250);
run_bz=l;
Il設備已經在運行狀態(tài)但實際檢測到設備并沒有啟動-報警 //原因可能是接觸器或其他控制設備損壞或啟動時過載跳閘 Il此項功能在傳統(tǒng)控制方式中是不具備的 if ((PINC&BIT(KM3_IN0))!=0)
{PORTB I= BIT(KM1_KZ);delay_xms(250);delay_xms(250);gz_bz=l;run_bz=0;
}
}
}
}
key_value=0xFF;
}
else if (key_value==l)//停機按鈕程序功能
{ WDRO ;if (xf_bz==0x55)
{delay_xms(10);
PORTA I= BIT(LED_GZ); if(gz_bz==l)
{gz_bz=0; zh_bz=0; run_bz=0;
PORTC =BIT(KZ_FMQ); PORTA I= BIT(LED_GZ);
}
if(zd_bz==0)
{
PORTA I= BIT (LED_RUN) ; //運行燈滅 PORTB &= ~BIT(LED_STOP);
PORTA = BIT(LED_RUN1) ; //停止燈亮
PORTB I= BIT(KM1_KZ);
delay_xms(250);
delay_xms(250);
run_bz=0;
Il設備已經在停機狀態(tài)但實際檢測到設備并沒有停機-報警 //原因可能是接觸器或其他控制設備觸頭粘連無法斷開,需采取非常手段斷電
Il此項功能在傳統(tǒng)控制方式中是不具備的 if ((PINC&BIT(KM3_IN0)) ==0) gz_bz=l;
}
}
}
}
Spragma interrupt_handler intl_isr:3 void intl_isr(void)
{
Uchar i;
WDR();
//PORTC &= -BIT(KZ_FMQ); key_value=0xFF;//無鍵按下
PORTD I =KEYl;Il 行線置低
PORTD =KEY2;
PORTD =KEY3;
delay_xms (10) ;//延時去抖動
for (i=4;i<7;i++)
{P0RTD &= ~BIT(i); delay_xms (I) ;// 延時
if ((PIND&0x08)==0)
{
while ((PIND&0x08) !=0)//等待鍵閉合
WDR(); delay—xms (20) ; // 延時去抖動 key_value=i ;// 鍵值 4,5,6
break;
}
}
if (key_value==5)//手自動切換按鍵功能程序
{ if (gz_bz==0)
{ delay_xms(20); if(zd_bz!=0)
{ WDRO ;
PORTC &= ~ BIT(LED_MAN) ; // 手動亮 PORTB &= ~ BIT(LED_ST0P);
PORTC =bit(led_aut) ; // 自動滅 PORTA I= BIT (LED_RUN);
PORTB I= BIT(KM1_KZ);
PORTC I= BIT(SD_ZDKZ);
}
else if(zd_bz==0)
{ WDRO ;
PORTC &= ~ BIT(LED_AUT) ; // 自動亮 PORTC = BIT(LED_MAN) ; //手動滅 PORTA I= BIT (LED_RUN);
PORTB &= ~ BIT(LED_ST0P);
PORTB I= BIT(KM1_KZ);
PORTC &= ~ BIT(SD_ZDKZ);
}
}
key_value=0xFF;
}
}
void init_parameter(void)
{unsigned char i, k=l;
WDR();
for (i=0;i<2;i++)
IWDRO ;
EEPR0M_READ((int)&DYTZ_XT1[i], at_zd[i]);
}
}
//主程序流程 void main—run(void)
{Uchar k=l,i,j=0,m; key_value=Oxff; while (k)
{ WDRO ;
if (key_value==6)// 消音
{ if(gz—bz!=0) zh_bz=l;
PORTC I= BIT(KZ_FMQ); key_value=0xFF;
}
if(zd_bz==0)
{PORTC &= ~ BIT(LED_MAN);
PORTC =bit(led_aut);
}
if(zd_bz!=0)
{PORTC I= BIT(LED_MA