51单片机定时器实现数码管前两位60s倒计时.
时间: 2023-07-18 16:21:27 浏览: 73
以下是基于51单片机的定时器程序,可实现数码管前两位60秒倒计时:
```c
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit LSA=P2^2; //定义数码管位选引脚LSA
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit beep=P1^5; //定义蜂鸣器控制引脚
uchar num=60; //计时器初始值为60秒
uchar code table[17]={ //数码管显示字符表
0x3f, //0
0x06, //1
0x5b, //2
0x4f, //3
0x66, //4
0x6d, //5
0x7d, //6
0x07, //7
0x7f, //8
0x6f, //9
0x77, //A
0x7c, //B
0x39, //C
0x5e, //D
0x79, //E
0x71, //F
0x00 //空
};
void delayms(uint xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void Display(uchar num) //数码管显示函数
{
LSA=1; //位选1
LSB=1;
LSC=1;
P0=table[num/100]; //显示百位
delayms(5); //延时5ms
LSA=0; //位选2
LSB=1;
LSC=1;
P0=table[num%100/10]; //显示十位
delayms(5); //延时5ms
LSA=1; //位选3
LSB=0;
LSC=1;
P0=table[num%10]; //显示个位
delayms(5); //延时5ms
}
void Timer0Init(void) //定时器初始化函数
{
TMOD|=0x01; //设置定时器0为模式1(16位定时器)
TH0=0xFC; //给定时器赋初值,定时1ms
TL0=0x66;
ET0=1; //打开定时器0中断允许
TR0=1; //启动定时器0
EA=1; //打开总中断允许
}
void main()
{
Timer0Init(); //初始化定时器
while(1)
{
Display(num); //数码管显示剩余时间
if(num==0) //计时结束
{
beep=1; //蜂鸣器响
delayms(500); //延时0.5秒
beep=0; //蜂鸣器停止响
num=60; //计时器重置为60秒
}
}
}
void Timer0() interrupt 1 //定时器0中断函数
{
TH0=0xFC; //给定时器赋初值,定时1ms
TL0=0x66;
num--; //计时器值减1
}
```
该程序在上一个程序的基础上,增加了数码管显示功能,以显示剩余时间。在每次计时结束时,蜂鸣器响起并重置计时器值为60秒。