功能 :倒计时八数码管显示,最小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, 下载次数: 323)
|