大家好!我用51单片机做的门铃,增加掉电模式后门铃只能响一次后就不响了,请问各位是程序哪错了?
以下是我的主要源码:
include<STC89C5xRC.H> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit beep=P1^0; uchar ding,dong,flag,stop,k1; uint n; void delay(uint i) { while(i--); } void time0init() //定时器0初始化 { TMOD=0X01; //定时器0 方式1 TH0=0Xff; TL0=0X06; //定时250us // TR0=1; EA=1; ET0=1; IT0=1; //外部中断0触发方式:0低电平有效,1下降沿有效。 EX0=1; //外部中断0中断允许位:0禁止中断,1允许中断。 } void biaohaoinit() //各个标号初始化 { ding=0; //叮声音 计数标志 dong=0; //咚声音 计数标志 n=0; //定时0.5s标志 flag=0; stop=0; //结束标志 k1=1; } void main() { time0init(); biaohaoinit(); while(1) { if(k1==0) //判断按键是否按下 { stop=0x00; k1=1; TR0=1; //打开定时器0 while(!stop); /*!stop的意思是取反,意思就是stop值为0,那么这里判断就是1, 就一直循环执行这条语句,当stop值为1时,这里的!stop参数就是0,条件不成立, 就退出这个while循环,继续执行下一条语句了。*/ ET0=0; PCON = 0X02; delay(2000); _nop_(); _nop_(); } } } void zhongduan0() interrupt 0 { PCON = 0; k1=0; stop=0x00; ET0=1; } void time0() interrupt 1 { n++; TH0=0Xff; TL0=0X06; //250us stop=0; if(n==2000) //定时0.5s 叮响0.5秒,咚响0.5秒 { n=0; if(flag==0) { flag=~flag; } else { flag=0; stop=1; TR0=0; //关闭定时器0 } } if(flag==0) { //通过改变定时计数时间可以改变门铃的声音 ding++; //叮 if(ding==1) { ding=0; beep=~beep; } } else { dong++; if(dong==2) //咚 { dong=0; beep=~beep; } } } |