功能 :倒計時八數碼管顯示,最小1秒,最大24小時;計時結束蜂鳴器報警響10次;如果做實物,可以用繼電器作開關控制強電。
設置方法:
1.按K1鍵第一次,秒位閃爍,短按加減鍵加減1,長按連加連減;
2.按K1鍵第二次,分位閃爍,短按加減鍵加減1,長按連加連減;
3.按K1鍵第三次,時位閃爍,短按加減鍵加減1,長按連加連減;
4.按K1鍵第四次,退出設置;
5.按K4鍵啟動倒計時(非設置狀態下時分秒其中之一不為0才能啟動計時);
6.計時的時候,按K4鍵1次可以暫停計時并關閉輸出,再按一次恢復計時并啟動輸出,按K6鍵停止計時并清零,關閉輸出;
7.非計時狀態下,K5手動開關控制輸出。
完整工程文件見附件
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define duan P1
- #define wei P3
- sbit key1 = P2^3; //設置
- sbit key2 = P2^4; //加
- sbit key3 = P2^5; //減
- sbit key4 = P2^6; //啟動
- sbit key5 = P2^7; //手動
- sbit out = P2^2; //輸出控制 ,低電平有效
- sbit di = P2^0; //蜂鳴器
- bit flag=0,flag1=0,shan=0;
- uchar knum,shan_cont;
- uchar shi=0,fen=0,miao=0,cont,cont1,cont2;
- uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰段碼表
- //uchar code weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位碼
- uchar code weima[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位碼 加反相器用
- void delay(uint z)
- {
- uint x,y;
- for(x=z; x>0; x--)
- for(y=114; y>0; y--);
- }
- void init()
- {
- TMOD |= 0x01; //定時器0 工作方式1
- TH0 = (65536-50000)/256; //50ms初值 @12MHz
- TL0 = (65536-50000)%256;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void dispaly(uchar shi,uchar fen,uchar miao)
- {
-
- duan = 0;
- wei = weima[5];
- duan = 0x40;
- delay(1);
- duan = 0;
- wei = weima[2];
- duan = 0x40;
- delay(1);
- if(knum==0)
- {
- duan = 0;
- wei = weima[7];
- duan = duanma[shi/10];
- delay(1);
-
- duan = 0;
- wei = weima[6];
- duan = duanma[shi%10];
- delay(1);
-
-
- duan = 0;
- wei = weima[4];
- duan = duanma[fen/10];
- delay(1);
-
- duan = 0;
- wei = weima[3];
- duan = duanma[fen%10];
- delay(1);
-
-
- duan = 0;
- wei = weima[1];
- duan = duanma[miao/10];
- delay(1);
-
- duan = 0;
- wei = weima[0];
- duan = duanma[miao%10];
- delay(1);
- }
- else
- {
- if(knum==1)
- {
- if(shan==1)
- {
- duan = 0;
- wei = weima[7];
- duan = duanma[shi/10];
- delay(1);
-
- duan = 0;
- wei = weima[6];
- duan = duanma[shi%10];
- delay(1);
-
-
- duan = 0;
- wei = weima[4];
- duan = duanma[fen/10];
- delay(1);
-
- duan = 0;
- wei = weima[3];
- duan = duanma[fen%10];
- delay(1);
-
-
- duan = 0;
- wei = weima[1];
- duan = duanma[miao/10];
- delay(1);
-
- duan = 0;
- wei = weima[0];
- duan = duanma[miao%10];
- delay(1);
- }
- else
- {
- duan = 0;
- wei = weima[7];
- duan = duanma[shi/10];
- delay(1);
-
- duan = 0;
- wei = weima[6];
- duan = duanma[shi%10];
- delay(1);
-
-
- duan = 0;
- wei = weima[4];
- duan = duanma[fen/10];
- delay(1);
-
- duan = 0;
- wei = weima[3];
- duan = duanma[fen%10];
- delay(1);
-
-
- duan = 0;
- wei = weima[1];
- duan = 0;
- delay(1);
-
- duan = 0;
- wei = weima[0];
- duan = 0;
- delay(1);
-
- }
- }
-
- if(knum==2)
- {
- if(shan==1)
- {
- duan = 0;
- wei = weima[7];
- duan = duanma[shi/10];
- delay(1);
-
- duan = 0;
- wei = weima[6];
- duan = duanma[shi%10];
- delay(1);
-
-
- duan = 0;
- wei = weima[4];
- duan = duanma[fen/10];
- delay(1);
-
- duan = 0;
- wei = weima[3];
- duan = duanma[fen%10];
- delay(1);
-
-
- duan = 0;
- wei = weima[1];
- duan = duanma[miao/10];
- delay(1);
-
- duan = 0;
- wei = weima[0];
- duan = duanma[miao%10];
- delay(1);
- }
- else
- {
- duan = 0;
- wei = weima[7];
- duan = duanma[shi/10];
- delay(1);
-
- duan = 0;
- wei = weima[6];
- duan = duanma[shi%10];
- delay(1);
-
-
- duan = 0;
- wei = weima[4];
- duan = 0;
- delay(1);
-
- duan = 0;
- wei = weima[3];
- duan = 0;
- delay(1);
-
-
- duan = 0;
- wei = weima[1];
- duan = duanma[miao/10];
- delay(1);
-
- duan = 0;
- wei = weima[0];
- duan = duanma[miao%10];
- delay(1);
-
- }
- }
-
- if(knum==3)
- {
- if(shan==1)
- {
- duan = 0;
- wei = weima[7];
- duan = duanma[shi/10];
- delay(1);
-
- duan = 0;
- wei = weima[6];
- duan = duanma[shi%10];
- delay(1);
-
-
- duan = 0;
- wei = weima[4];
- duan = duanma[fen/10];
- delay(1);
-
- duan = 0;
- wei = weima[3];
- duan = duanma[fen%10];
- delay(1);
-
-
- duan = 0;
- wei = weima[1];
- duan = duanma[miao/10];
- delay(1);
-
- duan = 0;
- wei = weima[0];
- duan = duanma[miao%10];
- delay(1);
- }
- else
- {
- duan = 0;
- wei = weima[7];
- duan = 0;
- delay(1);
-
- duan = 0;
- wei = weima[6];
- duan = 0;
- delay(1);
-
-
- duan = 0;
- wei = weima[4];
- duan = duanma[fen/10];
- delay(1);
-
- duan = 0;
- wei = weima[3];
- duan = duanma[fen%10];
- delay(1);
-
-
- duan = 0;
- wei = weima[1];
- duan = duanma[miao/10];
- delay(1);
-
- duan = 0;
- wei = weima[0];
- duan = duanma[miao%10];
- delay(1);
-
- }
- }
- }
- }
- void keysan()
- {
- uchar i;
- if(knum==0)
- {
- if(key4 == 0 ) //啟動 暫停
- {
-
- i++; //消抖
- if( (key4 == 0 && i>12 )|| (miao != 0) || (fen != 0) || (shi != 0) )
- { //時分秒都為0時,不能啟動輸出,只要其中之一不為0,就能啟動輸出
- i=0;
- while(!key4)
- dispaly(shi,fen,miao);
- flag = !flag;
- out = !out;
- }
- }
- }
-
- if(key5 == 0 ) //手動開關,在沒有倒計時的狀態下才有用
- {
- delay(5);
- // i++;
- if( key5 == 0 )
- {
- // i=0;
- while(!key5)
- dispaly(shi,fen,miao);
- if(shi==0 && fen==0 && miao==0)
- out = !out;
- }
- }
-
- if(key1==0) //設置
- {
- i++;
- if(key1 ==0 && i>12)
- {
- i=0;
- while(!key1)
- dispaly(shi,fen,miao);
- knum++;
- if(knum==4)
- knum = 0;
- }
- }
- if(knum==1)
- {
- if(key2==0)
- {
- i++;
- if(key2 ==0 && i>20)
- {
- i=0;
- miao++;
- if(miao==60)
- miao = 0;
- }
- }
-
- if(key3==0)
- {
- i++;
- if(key3 ==0 && i>20)
- {
- i=0;
- miao--;
- if(miao==255)
- miao = 59;
- }
- }
- }
- if(knum==2)
- {
- if(key2==0)
- {
- i++;
- if(key2 ==0 && i>20)
- {
- i=0;
- fen++;
- if(fen==60)
- fen = 0;
- }
- }
-
- if(key3==0)
- {
- i++;
- if(key3 ==0 && i>20)
- {
- i=0;
- fen--;
- if(fen==255)
- fen = 59;
- }
- }
- }
- if(knum==3)
- {
- if(key2==0)
- {
- i++;
- if(key2 ==0 && i>20)
- {
- i=0;
- shi++;
- if(shi==24)
- shi = 0;
- }
- }
-
- if(key3==0)
- {
- i++;
- if(key3 ==0 && i>20)
- {
- i=0;
- shi--;
- if(shi==255)
- shi = 23;
- }
- }
- }
- }
- void main()
- {
- init();
- wei = 0x00;
- while(1)
- {
- keysan();
- dispaly(shi,fen,miao);
- if(shi==0 && fen==0 && miao==0 && flag == 1) //倒計時時間到
- {
- flag=0; //停止計時
- flag1=1; //啟動蜂鳴器標志置1
- out=1; //關閉輸出
- }
- }
- }
- void timer() interrupt 1
- {
- TH0 = (65536-50000)/256; //50毫秒初值
- TL0 = (65536-50000)%256;
-
- if(flag)
- {
- cont++;
- if(cont == 20)
- {
- cont = 0;
- miao--;
- if(miao==255)
- {
- miao=59;
- fen--;
- if(fen==255)
- {
- fen=59;
- shi--;
- if(shi==255)
- {
- shi=0;
- }
- if(shi==0)
- fen=59;
- if(fen==0 && shi==0)
- fen=0;
- }
- }
- }
- }
- if(flag1) //倒計時時間到,啟動蜂鳴器
- {
- cont1++;
- if(cont1==10) //500ms蜂鳴器響一次
- {
- cont1=0;
- di=!di;
- cont2++;
- if(cont2==20)//500*20=10000ms=10s,蜂鳴器響10s后停止
- {
- cont2=0;
- flag1=0;
- }
- }
- }
- if(knum != 0)
- {
- shan_cont++;
- if(shan_cont==5) //250ms閃爍時間
- {
- shan_cont=0;
- shan = !shan;
- }
- }
- }
復制代碼
全部資料51hei下載地址:
24小時倒計時仿真文件.rar
(180.63 KB, 下載次數: 324)
2018-5-16 11:06 上傳
點擊文件名下載附件
|