#include //52系列单片机头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit key1=P1^0; //申明四个按键
sbit key2=P1^1;
sbit key3=P1^2;
//sbit key4=P1^3;
sbit feng=P3^1;
//bit aa=1;
uchar code table[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//含有0~9的数字数组
void delayms(uint); //声明延时函数
void display(uchar,uchar,uchar); //声明显示函数
void keyscan(); //声明按键函数
uchar num1,num2,maoshi,maoge,bai,shi,ge; //变量声明
uint num;
void display(uchar bai, uchar shi,uchar ge) //数码管显示子函数
{
bai=num/100; //百位
shi=(num-100*bai)/10; //十位
ge=num-100*bai-shi*10;
P0=table[bai];
P2=0x01;
delayms(5);
P0=table[shi];
P2=0x02; //送位选数据
delayms(5); //延时
P0=0xbf;
P2=0x04; //送位选数据
delayms(5);
P0=0xbf;
P2=0x08; //送位选数据
delayms(5);
P0=table[ge];
P2=0x10;
delayms(5);
}
void main() //主函数入口
TMOD=0x11; //设置TO,T1定时器
TH0=(65536-50000)/256; //装初值12M 晶振定时50ms 数为50000
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //开启定时器T0中断
ET1=1; //开启定时器T1中断
while(1) //程序停在这里等待中断的发生,这个大循环也是实现数据显示的主体循环
{
while(!feng)
{
delayms(10);
feng=1;
}
keyscan();
display();
}
}
void delayms(uint xms) //延时子函数
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms 毫秒
for(j=110;j>0;j--);
}
void keyscan() //按键子函数
{
if(key1==0) //清零
{
delayms(10); //延时去抖
if(key1==0)
{
while(!key1) //等待按下
{
TR0=0; //定时器TR0关闭
TR1=1; //定时器TR1打开
num=0; //送数据num=0
TR1=0; //定时器TR1关闭
}
}
}
if(key2==0) //暂停和开始
{
delayms(10);
if(key2==0)
{
while(!key2);
TR0=0;
TR1=~TR1; //每次按下,TR1的状态时相反的
}
}
if(key3==0) //使计数器显示为60.0
{
delayms(10);
if(key3==0)
{
while(!key3);
TR0=0;
TR1=1;
num=600;
TR1=0;
}
}
}
void T0_time()interrupt 1 //定时器T0,中断序号为1
{
TH0=(65536-50000)/256; //重装初值
TL0=(65536-50000)%256;
num2++;
if(num2==2) //如果到了2次,说明0.1秒的时间到
{
num2=0; //然后把num2清零重新再计2次
num1++;
if(num1==10)
num1=0;
if(num==0) //当num 自减为0时,重新为60.0,再开始倒计时 num=600;
num--; //num逐渐自减
}
}
void T1_time()interrupt 3 //定时器T1, 中断序号为3
{
TH1=(65536-50000)/256; //重装初值
TL1=(65536-50000)%256;
num2++;
if(num2==2) //如果到了2次,说明0.1秒的时间到 {
num2=0;
num1++;
if(num1==10)
num1=0;
num++;
if(num==600)
{
feng=1;
delayms(1000);
feng=0;
num=0;
}
}
}
//然后把num2清零重新再计2次 //num逐渐自加 //这个数用来送给数码管显示的,到了60.0后归零
#include //52系列单片机头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit key1=P1^0; //申明四个按键
sbit key2=P1^1;
sbit key3=P1^2;
//sbit key4=P1^3;
sbit feng=P3^1;
//bit aa=1;
uchar code table[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//含有0~9的数字数组
void delayms(uint); //声明延时函数
void display(uchar,uchar,uchar); //声明显示函数
void keyscan(); //声明按键函数
uchar num1,num2,maoshi,maoge,bai,shi,ge; //变量声明
uint num;
void display(uchar bai, uchar shi,uchar ge) //数码管显示子函数
{
bai=num/100; //百位
shi=(num-100*bai)/10; //十位
ge=num-100*bai-shi*10;
P0=table[bai];
P2=0x01;
delayms(5);
P0=table[shi];
P2=0x02; //送位选数据
delayms(5); //延时
P0=0xbf;
P2=0x04; //送位选数据
delayms(5);
P0=0xbf;
P2=0x08; //送位选数据
delayms(5);
P0=table[ge];
P2=0x10;
delayms(5);
}
void main() //主函数入口
TMOD=0x11; //设置TO,T1定时器
TH0=(65536-50000)/256; //装初值12M 晶振定时50ms 数为50000
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //开启定时器T0中断
ET1=1; //开启定时器T1中断
while(1) //程序停在这里等待中断的发生,这个大循环也是实现数据显示的主体循环
{
while(!feng)
{
delayms(10);
feng=1;
}
keyscan();
display();
}
}
void delayms(uint xms) //延时子函数
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms 毫秒
for(j=110;j>0;j--);
}
void keyscan() //按键子函数
{
if(key1==0) //清零
{
delayms(10); //延时去抖
if(key1==0)
{
while(!key1) //等待按下
{
TR0=0; //定时器TR0关闭
TR1=1; //定时器TR1打开
num=0; //送数据num=0
TR1=0; //定时器TR1关闭
}
}
}
if(key2==0) //暂停和开始
{
delayms(10);
if(key2==0)
{
while(!key2);
TR0=0;
TR1=~TR1; //每次按下,TR1的状态时相反的
}
}
if(key3==0) //使计数器显示为60.0
{
delayms(10);
if(key3==0)
{
while(!key3);
TR0=0;
TR1=1;
num=600;
TR1=0;
}
}
}
void T0_time()interrupt 1 //定时器T0,中断序号为1
{
TH0=(65536-50000)/256; //重装初值
TL0=(65536-50000)%256;
num2++;
if(num2==2) //如果到了2次,说明0.1秒的时间到
{
num2=0; //然后把num2清零重新再计2次
num1++;
if(num1==10)
num1=0;
if(num==0) //当num 自减为0时,重新为60.0,再开始倒计时 num=600;
num--; //num逐渐自减
}
}
void T1_time()interrupt 3 //定时器T1, 中断序号为3
{
TH1=(65536-50000)/256; //重装初值
TL1=(65536-50000)%256;
num2++;
if(num2==2) //如果到了2次,说明0.1秒的时间到 {
num2=0;
num1++;
if(num1==10)
num1=0;
num++;
if(num==600)
{
feng=1;
delayms(1000);
feng=0;
num=0;
}
}
}
//然后把num2清零重新再计2次 //num逐渐自加 //这个数用来送给数码管显示的,到了60.0后归零