本段代码与定时器的简单应用有关。
使用数码管进行倒计时的显示。
主要功能就是先设置一个倒计时所需要的时间,然后按下 “启动” 按键进行开始倒计时。并且可以按下 “置零” 键进行时间置零并且蜂鸣器响起。最后可以按下 “重置” 键进行倒计时的重置。
本段代码默认设置的倒计时的时间是45分钟,如果想要更改成自己想要的时间可以直接进行更改。
(在 #define time 后进行更改。单位为:分钟,最大可以设置999分钟)
(本人学习单片机也没有很长时间,如果有不足或者宝贵的意见还请给予指出,十分感谢!)
#include <REGX52.H>
typedef 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;
}
}
附上仿真图