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