利用89C52定时器和实验系统提供的数码显示电路,设计一个2位的LED数码秒表。显示格式为: XX。显示时间为00-99秒,每秒自动加1,另设计一个“开始”键和一个“复位”键。
时间: 2024-02-20 17:57:20 浏览: 96
以下是一个基于89C52单片机和数码管显示电路的2位LED数码秒表程序:
```c
#include <REG52.H>
sbit startBtn = P3^0; //开始按钮,低电平有效
sbit resetBtn = P3^1; //复位按钮,低电平有效
sbit digSel1 = P2^6; //第一个数码管位选端口
sbit digSel2 = P2^7; //第二个数码管位选端口
sbit segA = P0^0; //数码管段选端口A
sbit segB = P0^1; //数码管段选端口B
sbit segC = P0^2; //数码管段选端口C
sbit segD = P0^3; //数码管段选端口D
sbit segE = P0^4; //数码管段选端口E
sbit segF = P0^5; //数码管段选端口F
sbit segG = P0^6; //数码管段选端口G
unsigned char count = 0; //秒表计数值,范围为0-99
unsigned char digCount = 0; //数码管位选计数值,用于分时复用
unsigned char displayBuff[2] = {0, 0}; //数码管显示缓存
void delay(unsigned int t) { //延时函数
unsigned int i, j;
for (i = t; i > 0; i--)
for (j = 110; j > 0; j--);
}
void display(unsigned char num, unsigned char dig) { //数字显示函数
unsigned char segCode[] = { //数字段码表
0x3F, //0
0x06, //1
0x5B, //2
0x4F, //3
0x66, //4
0x6D, //5
0x7D, //6
0x07, //7
0x7F, //8
0x6F //9
};
unsigned char segVal = segCode[num]; //获取数字对应的段码
switch (dig) { //根据数码管位选计数值选择对应的数码管
case 0: //第一个数码管
digSel1 = 0; //使第一个数码管位选端口为低电平
digSel2 = 1; //使第二个数码管位选端口为高电平
P0 = segVal; //将数字段码输出到P0上
break;
case 1: //第二个数码管
digSel1 = 1; //使第一个数码管位选端口为高电平
digSel2 = 0; //使第二个数码管位选端口为低电平
P0 = segVal; //将数字段码输出到P0上
break;
default:
break;
}
}
void main() {
TMOD = 0x01; //定时器0工作方式1
TH0 = 0x3C; //赋初值,使定时器从65536-15000=50536开始计数,以获得10ms的定时效果
TL0 = 0xAF;
ET0 = 1; //开定时器0中断
EA = 1; //开总中断
while (1) { //程序进入死循环
if (startBtn == 0) { //如果开始按钮被按下
while (startBtn == 0); //等待开始按钮松开
TR0 = 1; //启动定时器0
while (1) { //进入计时循环
displayBuff[0] = count / 10; //获取十位数字
displayBuff[1] = count % 10; //获取个位数字
display(displayBuff[digCount], digCount); //显示数码
digCount = (digCount + 1) % 2; //更新数码管位选计数值
delay(5); //延时5ms
if (resetBtn == 0) { //如果复位按钮被按下
while (resetBtn == 0); //等待复位按钮松开
TR0 = 0; //停止定时器0
count = 0; //计数值清零
digCount = 0; //数码管位选计数值清零
displayBuff[0] = 0; //数码管显示缓存清零
displayBuff[1] = 0;
display(0, 0); //将数码管清零
display(0, 1);
break; //退出计时循环
}
if (count >= 99) { //如果计数值达到99
TR0 = 0; //停止定时器0
break; //退出计时循环
}
}
}
}
}
void timer0() interrupt 1 { //定时器0中断服务函数
TH0 = 0x3C; //重置定时器初值
TL0 = 0xAF;
count++; //计数值自加1
}
```
该程序使用定时器0中断实现计时功能,每经过1秒,LED数码显示器显示的数字会加1,最大显示值为99秒。同时,程序还提供了一个“开始”按钮和一个“复位”按钮,用于控制计时的启动和复位。在按钮被按下时,程序会停止计时,直到“复位”按钮被按下后,计数值、数码管位选计数值和显示缓存被清零,数码管显示清零,程序重新进入等待“开始”按钮被按下的状态。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![](https://img-home.csdnimg.cn/images/20250102104920.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![](https://img-home.csdnimg.cn/images/20250102104920.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)