本段代码与定时器的简单应用有关。
使用数码管进行倒计时的显示。
主要功能就是先设置一个倒计时所需要的时间,然后按下 “启动” 按键进行开始倒计时。并且可以按下 “置零” 键进行时间置零并且蜂鸣器响起。最后可以按下 “重置” 键进行倒计时的重置。
本段代码默认设置的倒计时的时间是45分钟,如果想要更改成自己想要的时间可以直接进行更改。
(在 #define time 后进行更改。单位为:分钟,最大可以设置999分钟)
(本人学习单片机也没有很长时间,如果有不足或者宝贵的意见还请给予指出,十分感谢!)
#includetypedef unsigned int u16; typedef unsigned char u8; sbit LSA=P2^0; //定义74HC138位选端口 sbit LSB=P2^1; sbit LSC=P2^2; sbit k1=P3^2; //定义按键 sbit k2=P3^3; sbit k3=P3^4; sbit ring=P1^5; //定义蜂鸣器端口 #define time 45 //设置倒计时的时间,这里设置的45分钟(需要倒计时多少可直接对其更改--单位:分钟) u16 min=time; int sec; u8 code smgnum[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void keypros(); void mode1(); void mode2(); void mode3(); void delay(unsigned int xms) //@12.000MHz晶振--带参延时函数,延时一毫秒 { unsigned char i, j; while(xms--) { i = 2; j = 239; do { while (--j); } while (--i); } } void Timer0Init() //定时器初始化 { TMOD|=0x01; TH0=0xFC; TL0=0x18; ET0=1; EA=1; TR0=0; } void DigDisplay(unsigned char sec) //数码管显示 { LSA=0;LSB=0;LSC=0; P0=smgnum[min/100]; delay(1); P0=0x00; LSA=1;LSB=0;LSC=0; P0=smgnum[min/10%10]; delay(1); P0=0x00; LSA=0;LSB=1;LSC=0; P0=smgnum[min%10];; delay(1); P0=0x00; LSA=0;LSB=0;LSC=1; P0=0x40; delay(1); P0=0x00; LSA=0;LSB=1;LSC=1; P0=smgnum[sec/10%10]; delay(1); P0=0x00; LSA=1;LSB=1;LSC=1; P0=smgnum[sec%10]; delay(1); P0=0x00; } void keypros() //按键 { if(k1==0 && TR0==0) { delay(20); if(k1==0 && TR0==0) { mode1(); } while(!k1); } if(k2==0) { delay(20); if(k2==0) mode2(); while(!k2); } if(k3==0) { delay(20); if(k3==0) mode3(); while(!k3); } } void mode1() //模式一:开始倒计时 { sec=60; min-=1; TR0=1; } void mode2() //模式二:时间置零,蜂鸣器响起 { TR0=0; sec=0; min=0; ring=0; } void mode3() //模式三:重置时间 { TR0=0; min=time; sec=0; ring=1; } void main() //主函数 { sec=0; Timer0Init(); while(1) { DigDisplay(sec); keypros(); } } void Timer0() interrupt 1 //定时器 { static u16 i; TH0=0xFC; TL0=0x18; i++; if(i==1000) { i=0; sec--; } if(sec<0) { min--; sec=59; } if(min==0 && sec==0) { TR0=0; ring=0; } }
附上仿真图



