AT89C51使用定时器数码管4位显示,每1s数码管数字加1,可以显示0-9999

每秒显示的数字加1,并在数码管上显示出来。
程序要求:

  定时器定时,数码管显示时间,并且数码管数字显示每1s数字加1,显示0-9999。
  使用74LS373控制I/O口,可以节省I/O口。

74LS373简介:

  74LS373是三态输出的八D锁存器,共有54S373和74LS373两种线路。373 的输出端 Q0~Q7 可直接与总线相连。当锁存允许端LE为高电平时,Q 随数据D而变,当LE为低电平时,D 被锁存在已建立的数据电平。

真值表:

在这里插入图片描述

电路原理图:

在这里插入图片描述

程序代码:
#include<reg52.h>
sbit duan=P2^6;
sbit wei=P2^7;
#define uchar unsigned char
#define uint unsigned int
uint num,count;

uchar code table[]={
   0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
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的断服务程序,不断更新计数器的值,并根据需要在数码管显示相应的数字。这样就完成了本题要求的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值