#include<reg52.h>
unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 数码管 0~9
unsigned char table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; // 段选 数码管
unsigned char table3[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; // (带小数点)数码管
unsigned char j,k,b,c,d;
int a,num;
sbit key1=P3^2; // 按键01 匹配管脚 ( 复位 ,开始按键)
sbit key2=P3^3; // 按键02 匹配管脚 ( 暂停 ,继续按键)
void delayms(unsigned char i); //延时 子程序 声明
void init(); // 初始化 声明
//************************** 主 程 序 *******************
void main()
{
init(); //初始化
num=12000; //设定 定时时间 (2 分钟)
a=num;
P2=0x00; // 开启所有 数码管
P1=0x3f; // 数码管 显示 “0”
if(key1==0) // 按键01 有按下 开始倒计时
{
delayms(200);
while(1)
{
P1=table[a%10]; //取精确到0.01s位 的数值
P2=0xfe;
delayms(5);
P2=0xff;
P1=table[a%6000%60/10]; //取精确到0.1s位 的数值
P2=0xfd;
delayms(5);
P2=0xff;
P1=table3[a%6000%1000/100]; //取精确到1s位 的数值
P2=0xfb;
delayms(5);
P2=0xff;
P1=table[a%6000/1000]; //取精确到10s位 的数值
P2=0xf7;
delayms(5);
P2=0xff;
P1=table3[a/6000%10]; //取精确到 “分” 位 的数值
P2=0xef;
delayms(5);
P2=0xff;
P1=table[a/60000]; //取精确到 “十分' 位 的数值
P2=0xdf;
delayms(5);
P2=0xff;
if(key2==0) // 暂停,继续
{EA=0; // 关闭总中断 关闭倒计时
P1=0x3f; // 数码管显示 ”0“
P2=0xdf; // 开启 最高位 数码管
delayms(250);
while(1)
{
if(key2==0) // 继续 倒计时
{
delayms(250);
EA=1;break; // 开启中断 继续倒计时
}
}
}
if(key1==0) // 复位
{
P2=0x00; //开启所有数码管
P1=0x3f; //数码管 显示 ”0"
delayms(250);
while(1) // 开始
{
if(key1==0) //复位
{
a=num; //赋初值
delayms(250);
break;
}
}
}
}
}
}
void init() // 初始化 子程序
{
EA=1; //开启总中断
TMOD=0x11; // 使用16位定时器1,0
TR0=1; //定时器 1 开启
ET0=1; //允许 定时器中断
TH0=(65536-10000)/256; // 10ms 延时 (赋初值)
TL0=(65536-10000)%256;
}
void time_interrupt() interrupt 1
{
a--;
TH0=(65536-10000)/256; // 10ms 延时 (重装 初值)
TL0=(65536-10000)%256;
if(a==0)
{ while(1)
{
P2=0xfe; //开启 最低位数码管
P1=0x3f; // 数码管 显示”0“
}
}
}
void delayms( unsigned char i) //延 时 子程序 ( i=1时 约 1MS)
{
for(j=0;j<110;j++)
for(k=0;k<i;k++);
}