|
//30秒,300秒,600秒三檔倒計時,key1按鍵切換時間,key2鍵LED點(diǎn)亮,松手后啟動倒計時,數(shù)碼管顯示數(shù)值每秒減1,
//倒計時結(jié)束,LED熄滅,數(shù)碼管顯示設(shè)定值;如果倒計時沒結(jié)束時,再按下key2鍵,倒計時時間置設(shè)定值重新計時
//仿真通過;附件有源程序,仿真文件,hex文件
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (15.71 KB, 下載次數(shù): 64)
下載附件
2018-1-17 21:09 上傳
0.png (46.9 KB, 下載次數(shù): 49)
下載附件
2018-1-17 21:08 上傳
單片機(jī)源程序:
- //30秒,300秒,600秒三檔倒計時,key1按鍵切換時間,key2鍵LED點(diǎn)亮,松手后啟動倒計時,數(shù)碼管顯示數(shù)值每秒減1,
- //倒計時結(jié)束,LED熄滅,數(shù)碼管顯示設(shè)定值;如果倒計時沒結(jié)束時,再按下key2鍵,倒計時時間置設(shè)定值重新計時
- //仿真通過
- #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; //數(shù)碼管位端口
- sbit we2 = P2^1;
- sbit we3 = P2^2;
- uchar knum; //key1按鍵按下次數(shù)計數(shù)變量
- uchar cont; //中斷次數(shù)變量
- uint cont1=30,cont2=300,cont3=600; //定義時間變量并賦值30秒,300秒,600秒
- uchar code LedTab[]= //定義共陰極數(shù)碼管段碼
- {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; //點(diǎn)亮LED,松手后啟動倒計時
- while(!key2) //這句后面不加分號,下一句調(diào)用顯示函數(shù),按鍵時數(shù)碼管才不會滅
- {
- // 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; //點(diǎn)亮LED
- cont1=30;
- cont2=300;
- cont3=600;
- }
- }
- }
- }
- void main()
- {
- TMOD = 0X01; //T0定時器,模式1, 16位計數(shù)
- 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; //關(guān)閉定時器
- } 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;
- }
- }
- }
復(fù)制代碼
全部資料51hei下載地址:
多檔倒計時.rar
(22.25 KB, 下載次數(shù): 82)
2018-1-17 13:07 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|