stc89c52rc利用定时器实现数码管间隔1s显示1-99
时间: 2023-05-13 21:03:22 浏览: 275
51单片机实现数码管循环显示00~99字样,到99后返回00重新显示,时间间隔为100ms。
5星 · 资源好评率100%
STC89C52RC单片机内部包含多个定时器,可以通过编程控制定时器的工作模式、计数器值、中断等参数,实现各种定时操作。本题需要利用定时器实现数码管每隔1秒显示一个1-99的数字。
首先需要配置定时器的相关参数,选择计数器模式和工作模式,并设置计数器初值和重装值。对于本题,可以采用定时器0来实现,选择13位定时器模式,工作模式为模式1,计数器初值为0,重装值为12,即定时1ms。
在主程序中,需要先定义数码管段码数据和显示位选信号,然后编写定时器中断服务程序,在其中对计数器进行自加操作,当计数器值为100时,清零重新计数,并在数码管上显示1-99的数字。具体代码如下:
```
#include <reg52.h>
sbit LED1 = P2^0; //数码管段码定义
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit DS1 = P2^4; //数码管位选定义
sbit DS2 = P2^5;
unsigned char num = 0; //计数器初始值
void Timer0Init()
{
TMOD |= 0x01; //13位定时器模式
TH0 = 0xFC; //计数器重装值
TL0 = 0x66;
ET0 = 1; //开定时器0中断
TR0 = 1; //启动定时器0
EA = 1; //开总中断
}
void Timer0() interrupt 1 //定时器0中断服务程序
{
TH0 = 0xFC; //计数器重装值
TL0 = 0x66;
num++; //计数器自加
if(num == 100) //计数到100时清零
{
num = 0;
}
if(num < 10) //十位为0时不显示
{
DS1 = 0;
LED1 = num%10;
LED2 = 0xFF;
}
else //十位不为0时显示
{
DS1 = 1;
LED1 = num/10;
DS2 = 0;
LED2 = num%10;
}
}
void main()
{
Timer0Init(); //定时器初始化
while(1); //循环等待定时器中断
}
```
通过以上代码,可以实现数码管每隔1秒显示一个1-99的数字。其中利用定时器0的中断服务程序,不断更新计数器的值,并根据需要在数码管上显示相应的数字。这样就完成了本题要求的功能。
阅读全文