单片机计时器如何编写?
#include>reg52.h<#defineuintunsignedint#defineucharunsignedcharsbitkey1=P3^0;//定义"启动"按钮sbitkey2=P3^1;//定义"停止"按钮sbitkey3=P3^2;//定义"复位"按钮sbitDP=P0^7;//定义"小数点(.)"ucharaa,bb,cc,dd,ee,qian,bai,shi,ge;ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极数码管依次从0到9的编码voiddelay(uintz)//延时子函数{uintx,y;for(x=z;x<0;x--)for(y=110;y<0;y--);}voiddisplay(ucharqian,ucharbai,ucharshi,ucharge)//显示子程序{P2=0xfe;P0=table[qian];//千位delay(10);P2=0xfd;P0=table[bai];//百位delay(10);DP=1;delay(10);P2=0xfb;P0=table[shi];//十位delay(10);P2=0xf7;P0=table[ge];//个位delay(10);//使用动态扫描的方法实现数码管显示}voidinit()//初始化子程序{aa=0;bb=0;cc=0;dd=0;ee=0;TMOD=0x01;//使用定时器T0的方式1TL0=0x18;TH0=0xfc;//定时1ms中断一次fosc=12MZHEA=1;//中断总允许ET0=1;//允许定时器T0中断}voidtimer0()interrupt1{TL0=0x18;TH0=0xfc;//重新赋初值aa;//中断一次变量aa的值加1if(aa==8)//中断10次后,定时时间为10*1ms=10ms=0.01sPS:实际模拟中发现程序显示时间比实际时间慢20%左右所以把a改为8{aa=0;bb;ge=bb;}if(bb==10)//中断100次后,定时时间为100*1ms=100ms=0.10s{bb=0;cc;shi=cc;}if(cc==10)//中断1000次后,定时时间为1000*1ms=1000ms=1.00s{cc=0;dd;bai=dd;}if(dd==10)//中断10000次后,定时时间为10000*1ms=10000ms=10.00s{dd=0;ee;qian=ee;}if(ee==10)//中断100000次后,全部归零重新开始{aa=0;bb=0;cc=0;dd=0;ee=0;}}voidmain(){init();//调用初始化子程序while(1){if(key1==0)//检测"启动"按钮是否按下{delay(10);//延时去抖动if(key1==0)//再次检测"启动"按钮是否按下{while(!key1);//松手检测,若按键没有释放,key1始终为0,那么!key1始终为1,程序就一直停在此TR0=1;//启动定时器开始工作}}if(key2==0)//检测"停止"按钮是否按下{delay(10);//延时去抖动if(key2==0)//再次检测"停止"按钮是否按下{while(!key2);//松手检测TR0=0;//关闭定时器}}if(key3==0)//检测"复位"按钮是否按下{delay(10);//延时去抖动if(key3==0)//再次检测"复位"按钮是否按下{while(!key3);//松手检测aa=0;bb=0;cc=0;dd=0;ee=0;ge=0;bai=0;shi=0;qian=0;TR0=0;//关闭定时器}}display(qian,bai,shi,ge);//调用显示子函数}}