想要实现倒计时显示器,首先得确定从哪个时间开始倒计时,这就需要写出一个计数的程序来,通过按键来控制需要的数,从而开始倒计时。我的开发板上用的Key2,Key3,Key4,Key5这四个键,分别对应着加1,减1,乘2,开始计时四个功能。
通过加一,减一,乘2三个操作,可以较快地得到想要设置的数。然后将所得到的数显示在数码管上(我这里使用的是共阴数码管)。这样就可以实时地看到自己所设置的数,然后就可以开始计时了。
具体实现步骤:
1.定义所用到的端口
2.定义一个数组,里面装0~9这十个数(用于后边的数码管显示,所以需要转化为对应的段选),例如0,就写成0X3F
3.写一个计数的程序,通过按键实现计数,并且在按下时数码管同步显示。
4.写一个计时的程序。(用时钟)
4.打开时钟中断,开始计时,运行计时程序。
5,打开蜂鸣器,提示计时结束。
以下为源代码:
#include<reg52.h>
/******************************************
程序作用:倒计时显示器
实现步骤:1.输入数字
2.开始倒计时
3.蜂鸣器响1s提示计时结束
*******************************************/
sbit Key2=P3^4;
sbit Key3=P3^5;
sbit Key4=P3^6;
sbit Key5=P3^7;//定义按键端口
sbit wei1=P2^4;
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7;//定义数码管端口
sbit bing=P2^3;//定义蜂鸣器端口
/********************定义数组******************/
int base[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************定义数组******************/
/********************定义全局变量******************/
int num;
int time=0;
int time_1s=0;
int qian;//千位数字
int bai;//百位数字
int shi;//十位数字
int ge;//个位数字
/********************定义全局变量******************/
void xianshi();
void Time_begin();
int num_scp(int num);
int delay(int x);//函数声明
void main()
{
num=0;
/*************初始化端口*************/
wei1=0;//第一位数码管
wei2=0;//第二位数码管
wei3=0;//第三位数码管
wei4=0;//第四位数码管
Key2=1;//加一开关
Key3=1;//减一开关
Key4=1;//乘二开关
Key5=1;//计时开关
/*************初始化端口*************/
while(1){
Key2=1;//加一开关
Key3=1;//减一开关
Key4=1;//乘2开关
Key5=1;//开始计时
if(Key2==0)
{
delay(10);
while(Key2==1){num++;break;}
}//按下Key2键 时间加1s
if(Key3==0)
{
delay(10);
while(Key3==1){num--;break;}
}//按下Key3键 时间减1s
if(Key4==0)
{
delay(10);
while(Key4==1){num=num*2;break;}
}//按下Key4键 时间乘2
if(Key5==0)
{
delay(10);
while(Key5==1)
{
Time_begin();
while(1)
{
num_scp(time_1s);
xianshi();
if(time_1s==1){bing=0;delay(1000);bing=1;}
}
}
} //按下Key5键 开始计时
while(1)
{
num_scp(num);
xianshi();
if(Key2==0||Key3==0||Key4==0||Key5==0){break;}
}//显示设置的时间
}
}
/*****************************
定义函数num_scp
sc代表scanf;p代表put
函数作用:扫描数据并进行拆分
参数列表:x
*******************************/
int num_scp(int x)
{
qian=(x/1000)%10;//千位数字
bai=(x/100)%10;//百位数字
shi=(x/10)%10;//十位数字
ge=x%10;//个位数字
return 0;
}
/*****************************
定义函数delay
函数作用:延时x_ms
参数列表:x
*******************************/
int delay(int x)
{
unsigned int time;
time=9206*x-2;
while(time--);
return 0;//较粗略的延时函数,主要用于按键消抖,不可用于计时
}
/*****************************
定义函数Timer0
函数作用:定时计数
参数列表:time time_1s
*******************************/
void Timer0() interrupt 1 using 1//准确的时钟,可用于计时
{
TH0=0x4c;//定时器0装初值 定时50ms
TH1=0x00;
time++;
if(time>=20)
{
if(time_1s==0){time_1s=num+1;}
time_1s--;
time=0;
}
}
/*****************************
定义函数Time_begin
函数作用:开启定时计数器
参数列表:
*******************************/
void Time_begin(){
TMOD &=0xf0;//低四位全部置0 设置定时器0 方式1
TMOD |=0x01;//最低位置1
TH0=0x4c;//定时器0装初值 定时50ms
TH1=0x00;
TR0=1;//定时器0 启动计数
ET0=1;//打开ET0 中断允许位
EA=1;//打开总中断
}文章来源:https://www.toymoban.com/news/detail-499660.html
/*****************************
定义函数显示
函数作用:数码管显示
参数列表:qian bai shi ge
*******************************/
void xianshi(){
P0=0x00;
P0=base[qian];
wei1=1;
wei1=0;
P0=base[bai];
wei2=1;
wei2=0;
P0=base[shi];
wei3=1;
wei3=0;
P0=base[ge];
wei4=1;
wei4=0;//显示具体数字
}文章来源地址https://www.toymoban.com/news/detail-499660.html
到了这里,关于初学51单片机(STC89C52)一个倒计时显示器和大家分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!