学了一段时间单片机,这两天做了个实用电路,最长99分钟定时倒计时提醒器。缺陷是电路开始工作后,一分钟减一个数再无其它动作。给启动按钮加了声音,否则电路是否已经启动都看不出来。时间到有响声提醒。
上面两个按钮调节十分与分,每次加十分钟和加一分钟。
晶振下面是复位按钮,右下角是启动按钮。
下面压缩包中有Proteus仿真文件与C代码。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h> //自制最长99分钟定时倒计时提醒器 2020-11-06
- #define uchar unsigned char
- #define uint unsigned int
- sbit gewei0=P2^6; //允许个位显示。
- sbit shiwei0=P2^7; //允许十位显示。
- sbit key1=P2^5; //键1,每按加10分钟。
- sbit key2=P2^4; //键2,每按加1分钟。
- sbit key3=P2^3; //键3,开倒计时或暂停。
- sbit beep=P2^2;
- uchar k;
- unsigned int s;
- void delayms(uchar);
- void delay(uint z);
- void keyscan();
- void display(uchar);
- void init();
- void xiang1();
- void xiang2();
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- void main()
- { init(); //调“初始化”。
- while(1)
- { keyscan(); //调“监测按键”。
- display(k); //调“显示”。
- }}
- void keyscan() //监测按键。
- { if(key2==0)
- { delayms(26);
- if(key2==0)
- { k++;
- if(k>=99) //k==99与中断那里一致。
- k=0;
- while(!key2); //抬起按键key2时,显示出k+2的结果。
- }
- }
- if(key1==0)
- { delayms(26);
- if(key1==0)
- { k=k+10;
- if(k>=99) //k==99与中断那里一致。
- k=0;
- while(!key1);
- }
- }
- if(key3==0)
- { delayms(26);
- if(key3==0)
- { xiang1(); //启动“倒计时”提示。
- delayms(246);
- TR0=~TR0;
- while(!key3);
- }}}
- void delayms(uchar z) //延时。
- { uchar i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--); }
- void delay(uint z)
- { while(z--); }
- void display(uchar k) //显示。
- { uchar shi,ge;
- shi=k/10;
- ge =k%10;
- gewei0=0;
- P0=table[ge];
- delayms(21);
- gewei0=1;
- shiwei0=0;
- P0=table[shi];
- delayms(21);
- shiwei0=1;
- }
- void init() //初始化。设置中断与定时器的值。
- { TMOD=0x01;
- TH0=(65536-50000)/256; //晶振12MHz,定时50ms。
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- }
- void xiang1() //计时开始提示音。
- {
- uchar q;
- for(q=0;q<100;q++)
- {
- beep=0;
- delayms(6);
- beep=1;
- delayms(4);
- }
- delayms(64);
- }
- void xiang2() //计时结束提示音--嘟嘟。
- {
- unsigned int m;
- uchar n;
- for(n=0;n<2;n++)
- {
- for(n=0;n<111;n++)
- {
- beep=0;
- delay(107);
- beep=1;
- delay(107);
- }
- for(m=0;m<3456;m++);
- for(n=0;n<111;n++)
- {
- beep=0;
- delay(107);
- beep=1;
- delay(107);
- }
- for(m=0;m<33333;m++);
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
仿真文件与C代码.rar
(17.21 KB, 下载次数: 50)
|