倒计时程序
#include<reg52.h> //最长99分钟定时倒计时提醒器
//2021-7-14 中微电子
#define uchar unsigned char
#define uint unsigned int
sbit gewei0=P1^6; //允许个位显示。
sbit shiwei0=P1^7; //允许十位显示。
sbit key1=P1^2; //键1,每按加10分钟。
sbit key2=P1^1; //键2,每按加1分钟。
sbit key3=P1^0; //键3,开倒计时或暂停。
sbit beep=P1^3; //蜂鸣器
sbit led=P1^4; //秒指示灯
sbit jdq=P3^4; //继电器
uchar k;
unsigned int s,m;
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;
jdq=~jdq; //继电器状态 随启动停止按键翻转
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;
P2=table[ge];
delayms(21);
gewei0=1;
shiwei0=0;
P2=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,i;
for(i=3;i>0;i--)
{
for(n=123;n>0;n--)
{
beep=0;
delay(100);
beep=1;
delay(100);
}
for(m=3456;m>0;m--);
for(n=123;n>0;n--)
{
beep=0;
delay(90);
beep=1;
delay(90);
}
for(m=56789;m>0;m--);
}
}
void time0()interrupt 1 //0中断,中断序号1。
{ uint zxc=65432;
TH0=0xb1; //晶振12MHz,定时20ms。
TL0=0xe0;
s++;
if(m==25) //作秒指示。
{
m=0;
led=~led;}
m++; //uchar m; 定义为全局变量。
if(s==3000) //3000×20ms=60000ms÷1000ms=60s(1分钟)
{ s=0; //归零。等待下个1分钟。
k--; } //倒计时,减1分钟。
if(k<=0) //如果到0,发声,关闭中断。
{
k=0;
xiang2();
TR0=0; //预定时间到,关中断0,停止。
jdq=1; // 继电器释放
}}
|