原理:对继电器驱动I/O口每隔一秒进行置高,如果继电器吸合则计数器加1,并更新驱动数码管显示,如果没有吸合,用另一个寄存器计数加1,蜂鸣器发出滴滴报警声,按S2键可以查到继电器未吸合的次数,数码管只有五位,继电器最多吸合十万次。
//**************************************************/ #include "reg51.h" #define uchar unsigned char #define uint unsigned int
#define Hidden 0x10; //消隐字符在字形码表中的位置 uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7}; uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}; uchar DispBuf[5]; //5字节的显示缓冲区 uchar DispBuf1[5]; bit Sec=0; //1s到的标记 bit key_flag0=0,key_flag1=0; bit flag=0; bit StartRun=0; uchar key_count;
uchar code TH0Val=63266/256; uchar code TL0Val=63266%256;//当晶振为11.0592时,定时2.5ms的定时器初值 //经过精确调整,在值为63266时,定时时间为1.00043362s //******************************************************************* void Timer0() interrupt 1 { uchar tmp; static uchar dCount;//计数器显示程序通过它得知现正显示哪个数码管 static uint Count; //秒计数器 TH0=TH0Val; TL0=TL0Val; tmp=BitTab[dCount]; //根据当前的计数值取位值 P2=P2|0xf8; //P2与11111000B相或,将高5位置1 P2=P2&tmp; //P2与取出的位值相与,将某一位清零 if(flag) { tmp=DispBuf1[dCount]; //根据当前的计数值取显示缓冲待显示值 tmp=DispTab[tmp]; //取字形码 P0=tmp; //送出字形码 } else { tmp=DispBuf[dCount]; //根据当前的计数值取显示缓冲待显示值 tmp=DispTab[tmp]; //取字形码 P0=tmp; //送出字形码 } dCount++; //计数值加1 if(dCount==5)dCount=0; //如果计数值等于5,则让其回0 Count++; //计数器加1 if(Count>=400) //到达预计数值 { Count=0; //清零 if(StartRun) //要求运行 { Sec=1; } else P1_2=0; } if(!P1_0) { if(!key_flag1) { StartRun=~StartRun; key_flag1=1; } } else { key_flag1=0; } if(P1_4==0) { if(!key_flag0) { flag=~flag; key_flag0=1; } } else { key_flag0=0; } } //******************************************************************* /*延时程序 由Delay参数确定延迟时间 */ void mDelay(unsigned int Delay) //ms { unsigned int i; for(;Delay>0;Delay--) { for(i=0;i<124;i++) {;} } } //--------------------- void usDelay(unsigned int Delay) //150us { unsigned int i; for(;Delay>0;Delay--) { for(i=0;i<15;i++) {;} } } //******************************************************************* void buzz_on() { uint i,j; for(j=0;j<6;j++) { for(i=0;i<1000;i++) { P1_3=0; usDelay(1); P1_3=1; usDelay(1); } mDelay(500); } } //******************************************************************* void Init() { P1=0XFB; TMOD=0x01; TH0=TH0Val; TL0=TL0Val; ET0=1; //开T0中断 EA=1; //开总中断 TR0=1; //T0开始运行 } //******************************************************************* void disconnect_Disp() { P1_2=0; DispBuf1[4]++; if(DispBuf1[4]>=10) { DispBuf1[4]=0; DispBuf1[3]++; if(DispBuf1[3]>=10) { DispBuf1[3]=0; DispBuf1[2]++; if(DispBuf1[2]>=10) { DispBuf1[2]=0; DispBuf1[1]++; if(DispBuf1[1]>=10) { DispBuf1[1]=0; DispBuf1[0]++; if(DispBuf1[0]>=10) { DispBuf1[0]=0; DispBuf1[1]=0; DispBuf1[2]=0; DispBuf1[3]=0; DispBuf1[4]=0; } } } } } } //-------------------------------- void connect_Disp() { P1_2=0; DispBuf[4]++; if(DispBuf[4]>=10) { DispBuf[4]=0; DispBuf[3]++; if(DispBuf[3]>=10) { DispBuf[3]=0; DispBuf[2]++; if(DispBuf[2]>=10) { DispBuf[2]=0; DispBuf[1]++; if(DispBuf[1]>=10) { DispBuf[1]=0; DispBuf[0]++; if(DispBuf[0]>=10) { DispBuf[0]=0; DispBuf[1]=0; DispBuf[2]=0; DispBuf[3]=0; DispBuf[4]=0; } } } } } } //******************************************************************* void main() { Init(); //初始化 while(1) { if(Sec) { Sec=0; P1_2=1; mDelay(700); if(P1_1==0) { connect_Disp(); } else { disconnect_Disp(); buzz_on(); } } } } |