给你写了一个程序,完全符合你的要求《60+10秒互锁倒计时+仿真》
60+10秒互锁倒计时+仿真.zip
(108.73 KB, 下载次数: 14)
- #include <reg52.h>
- #define u16 unsigned int
- #define u8 unsigned char
- sbit key1=P3^2;
- sbit key2=P3^3;
- u8 code table[]={ //0~F段码
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- u8 code wei[]={0xfe,0xfd,0xfb,0xf7};//位码
- u16 Cnt1ms1=0,Cnt1ms2=0; //中断2毫秒变量
- u8 Cnt1s1=0,Cnt1s2=0; //1秒变量
- bit start1=0,start2=0; //计时标志
- bit stop1,stop2; //停止标志
- /***********定时器初始化程序****************/
- void Timer0Init() //1毫秒@12MHz
- {
- TMOD=0x01;
- TH0=(65536-1000)/256; //1ms
- TL0=(65536-1000)%256; //1ms
- TR0=1;
- EA=1;
- ET0=1;
- }
- /***********按键扫描程序****************/
- void keyscan()
- {
- static u8 count1=0,count2=0; //消抖计数变量
- static bit key_sign1=0,key_sign2=0;//按键自锁标志
- if(key1==0) //检测输入如果为0
- {
- if(++count1>=10 && key_sign1==0)//消抖计数,检测按键自锁标志为0
- {
- key_sign1=1; //按键自锁标志置1,防止重复响应
- stop2=0; //暂停10秒倒计时
- if(Cnt1ms1!=0 && Cnt1s1!=0)//判断暂停状态
- stop1=1; //继续倒计时
- else
- {
- Cnt1s1=60; //赋初值
- Cnt1ms1=0; //清0
- stop1=1; //开始倒计时
- }
- }
- }
- else
- {
- count1=0; //计数变量清0
- key_sign1=0; //按键自锁标志清0
- }
- if(key2==0) //检测输入如果为0
- {
- if(++count2>=10 && key_sign2==0)//消抖计数,检测按键自锁标志为0
- {
- key_sign2=1; //按键自锁标志置1,防止重复响应
- stop1=0; //暂停60秒倒计时
- if(Cnt1ms2!=0 && Cnt1s2!=0)//判断暂停状态
- stop2=1; //继续倒计时
- else
- {
- Cnt1s2=10; //赋初值
- Cnt1ms2=0; //清0
- stop2=1; //开始倒计时
- }
- }
- }
- else
- {
- count2=0; //计数变量清0
- key_sign2=0; //按键自锁标志清0
- }
- }
- /**************4位数码管显示程序***************/
- void display() //显示程序
- {
- static u8 i=0; //计数变量
- P0=0x00; //消隐
- switch(i)
- {
- case 0: P2=wei[i];P0=table[Cnt1s1/10];i++;break;
- case 1: P2=wei[i];P0=table[Cnt1s1%10];i++;break;
- case 2: P2=wei[i];P0=table[Cnt1s2/10];i++;break;
- case 3: P2=wei[i];P0=table[Cnt1s2%10];i=0;break;
- }
- }
- void main()
- {
- Timer0Init();
- while(1);
- }
- /**************中断服务程序*****************/
- void timer0() interrupt 1
- {
- TH0=(65536-1000)/256; //1ms
- TL0=(65536-1000)%256; //1ms
- if(stop1==1)
- {
- Cnt1ms1++;
- if(Cnt1ms1==1000) //1s
- {
- Cnt1ms1=0;
- Cnt1s1--;
- if(Cnt1s1==0)
- stop1=0;
- }
- }
- if(stop2==1)
- {
- Cnt1ms2++;
- if(Cnt1ms2==1000) //1s
- {
- Cnt1ms2=0;
- Cnt1s2--;
- if(Cnt1s2==0)
- stop2=0;
- }
- }
- keyscan(); //按键扫描
- display(); //数码管显示
- }
复制代码
|