顶一下 |
xianfajushi: 精准到0.1秒的单片机秒表 sbit Qitin = P3^0; //启停按键 sbit duan = P2^6; //数码段 sbit wei = P2^7; //数码位 unsigned char code ShuMaGuan[]={0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned char code WeiXuanBiao[]={0x00,0xfe,0xfd,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char Js=0; //中断计时 unsigned char Hm=0; //毫秒 unsigned char Mo=0; //秒 void ShuMaXianShi(unsigned char d,unsigned char w) { unsigned char YanShi=255; P0=WeiXuanBiao[w]; wei=1; wei=0; P0=ShuMaGuan[d]; duan=1; While(YanShi--); duan=0; } void ZhongDuanSheZhi() { TH0+=0X4c; /*定时器赋初值, 定时50ms触发中断, 自动补偿方式*/ TL0+=0X00; TMOD=0X01; TR0=1; ET0=1; //开启定时器 EA=1; //全局中断开关 } void XianShi() { ShuMaXianShi(Hm,3); ShuMaXianShi(Mo%10,2); ShuMaXianShi(Mo/10,1); } void main() { ZhongDuanSheZhi(); while(1) { XianShi() if(!QiTin) { if(Js>=2) TR0=!TR0; while(!QiTin) XianShi(); } } } void ZhongDuan() interrupt 1 { ++Js; if(!(Js%2)) if(++Hm>=10) Hm=0; if(Js>=20) { if(++Mo>=60)Mo=0; Js=0; } TH0+=0X4c; TL0+=0X00; } ========================================== void main() { ZhongDuanSheZhi(); { XianShi(); if(!QiTin) { //XianShi(/*巧借 8个数码显示消抖*/); YanShi=Js; if(TR0==0){TR0=!TR0;K=1;} //重启中断 while(Js==YanShi)XianShi(); //中断消抖 if(!k)TR0=!TR0;else k=0; //关闭中断, 消抖后清除标记 while(!QiTin)XianShi(/*按下期间显示*/); } } } ====================================== 另说明代码工程中的中断内的这句YanShi=Js;要删除掉,并修改 if(!k&&++Hm>=10) Hm=0;这句,包内忘记改了。 |