//30秒,300秒,600秒三档倒计时,key1按键切换时间,key2键LED点亮,松手后启动倒计时,数码管显示数值每秒减1,
//倒计时结束,LED熄灭,数码管显示设定值;如果倒计时没结束时,再按下key2键,倒计时时间置设定值重新计时
//仿真通过;附件有源程序,仿真文件,hex文件
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序:
- //30秒,300秒,600秒三档倒计时,key1按键切换时间,key2键LED点亮,松手后启动倒计时,数码管显示数值每秒减1,
- //倒计时结束,LED熄灭,数码管显示设定值;如果倒计时没结束时,再按下key2键,倒计时时间置设定值重新计时
- //仿真通过
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit led = P1^7;
- sbit key1 = P1^0; //时间切换键
- sbit key2 = P1^1; //启动按键
- sbit we1 = P2^0; //数码管位端口
- sbit we2 = P2^1;
- sbit we3 = P2^2;
- uchar knum; //key1按键按下次数计数变量
- uchar cont; //中断次数变量
- uint cont1=30,cont2=300,cont3=600; //定义时间变量并赋值30秒,300秒,600秒
- uchar code LedTab[]= //定义共阴极数码管段码
- {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
- void delay(uint z)
- {
- uint x,y;
- for(x=z; x>0; x--)
- for(y=114; y>0; y--);
- }
- void display1(uint shu)
- {
- we1 = 0;
- P0 = LedTab[shu/100];
- delay(5);
- we1 = 1;
-
- we2 = 0;
- P0 = LedTab[shu%100/10];
- delay(5);
- we2 = 1;
-
- we3 = 0;
- P0 = LedTab[shu%10];
- delay(5);
- we3 = 1;
- }
- void keyscan()
- {
- if(key1==0)
- {
- delay(5);
- if(key1==0)
- {
- while(!key1);
- knum++;
- if(knum==3)
- knum=0;
- }
- }
- if(key2 == 0)
- {
- delay(5);
- if(key2 == 0) //key2按下
- {
- led = 0; //点亮LED,松手后启动倒计时
- while(!key2) //这句后面不加分号,下一句调用显示函数,按键时数码管才不会灭
- {
- // if(knum==0)
- // display1(cont1);
- // if(knum==1)
- // display1(cont2);
- // if(knum==2)
- // display1(cont3);
- switch(knum)
- {
- case 0: display1(cont1); break;
- case 1: display1(cont2); break;
- case 2: display1(cont3); break;
- }
-
- TR0 = 1; //启动定时器
- // led = 0; //点亮LED
- cont1=30;
- cont2=300;
- cont3=600;
- }
- }
- }
- }
- void main()
- {
- TMOD = 0X01; //T0定时器,模式1, 16位计数
- TH0 = (65536-46082)/256; //50ms初值
- TL0 = (65536-46082)%256;
- EA = 1; //开总中断
- ET0 = 1; //开定时器中断
- while(1)
- {
- keyscan();
- switch(knum)
- {
- case 0: display1(cont1); cont2=300; cont3=600; break;
- case 1: display1(cont2); cont1=30; cont3=600; break;
- case 2: display1(cont3); cont1=30; cont2=300; break;
- }
- }
- }
- void timer0() interrupt 1
- {
- TH0 = (65536-46082)/256; //重装初值
- TL0 = (65536-46082)%256;
- cont++;
- if(cont == 20)
- {
- cont = 0;
- switch(knum)
- {
- case 0: cont1--;
- if(cont1==0)
- {
- cont1=30; //倒计时时间到
- led=1; //熄灭LED
- TR0=0; //关闭定时器
- } break;
- case 1: cont2--;
- if(cont2==0)
- {
- cont2=300;
- led=1;
- TR0=0;
- } break;
- case 2: cont3--;
- if(cont3==0)
- {
- cont3=600;
- led=1;
- TR0=0;
- } break;
- }
- }
- }
复制代码
全部资料51hei下载地址:
多档倒计时.rar
(22.25 KB, 下载次数: 82)
|