#include<reg52.h> //52 系列单片机头文件 #define uchar unsignedchar //宏定义 #define uint unsigned int sbit key1=P3^4; //申明四个按键的锁存端 sbit key2=P3^5; sbit key3=P3^6; sbit key4=P3^7; uchar code table[]={ //含有 0~9 的数字数组 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7c,0x07, 0x7f,0x67}; uchar code table2[]={ //含有 0~9 的数字数组(带小数点) 0xbf,0x86,0xdb,0xcf, 0xe6,0xed,0xfc,0x87, 0xff,0xe7}; void delayms(uint); //声明延时函数 voiddisplay(uchar,uchar,uchar); //声明显示函数 void keyscan(); //声明按键函数 ucharnum1,num2,bai,shi,ge; //变量声明 uint num; void main() //主函数入口 { TMOD=0x11; //设置 TO,T1 定时器 TH0=(65536-45872)/256; //装初值11.05992M晶振50ms数为45872 TL0=(65536-45872)%256; TH1=(65536-45872)/256; TL1=(65536-45872)%256; EA=1; //开总中断 ET0=1; //开启定时器 T0 中断 ET1=1; //开启定时器 T1 中断 while(1) //程序停在这里等待中断的发生,这个大循环也是实现数据显示的主体 { keyscan(); //三个数码管要选送的数据 bai=num/100; //百位 shi=(num-100*bai)/10; //十位 ge=num-100*bai-shi*10; //个位 display(bai,shi,ge); //数码管显示 } } void display(uchar bai,uchar shi,uchar ge) { P1=0xfe; //位选选中第一个数码管 P2=table[bai]; //送段选数据 delayms(10); //延时 P1=0xff; //关闭位选 P1=0xfd; //位选选中第二个数码管 P2=table2[shi]; //送段选数据 delayms(10); //延时 P1=0xff; //关闭位选 P1=0xfb; //位选选中第二个数码管 P2=table[ge]; //送段选数据 delayms(10); //延时 P1=0xff; //关闭位选 } void delayms(uintxms) //延时子函数 { 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 { while(!key3); TR0=0; TR1=1; num=999; TR1=0; } if(key4==0) //实现计数器的倒数功能 { while(!key4); TR1=0; TR0=~TR0;//TR0=1; } } void T0_time()interrupt 1 //定时器 T0,中断序号为 1 {TH0=(65536-45872)/256; //重装初值 TL0=(65536-45872)%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=999; //num 逐渐自减 num--; } void T1_time()interrupt 3 { TH1=(65536-45872)/256; //重装初值 TL1=(65536-45872)%256; num2++; if(num2==2) //如果到了 2 次,说明 0.1 秒的时间到 { num2=0; //然后把 num2 清零重新再计 2 次 num1++; if(num1==10) num1=0; num++; //num 逐渐自加 if(num==999) num=0;//这个数十用来送给数码管显示的,到了60.0后归零 } }
|