倒計時程序
#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; // 繼電器釋放
}}
|