单片机两个数码管动态显示0~99代码
时间: 2023-11-24 11:11:14 浏览: 235
两位数码管循环显示00~99的实验简介
5星 · 资源好评率100%
这里提供一个基于51单片机的两个数码管动态显示0~99的代码,使用定时器中断实现:
```c
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
// 数码管共阳极接口定义
sbit LED_A = P2^0;
sbit LED_B = P2^1;
sbit LED_C = P2^2;
sbit LED_D = P2^3;
sbit LED_E = P2^4;
sbit LED_F = P2^5;
sbit LED_G = P2^6;
sbit LED_DP = P2^7;
// 数码管位选接口定义
sbit LED_L = P1^0;
sbit LED_H = P1^1;
// 定义全局变量,存储要显示的数字
uchar num1, num2;
// 数码管显示字符数组
uchar code LEDChar[] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f, // 9
0x00 // 空白
};
// 定时器中断服务函数
void Timer0_ISR() interrupt 1 {
static uint cnt = 0;
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
cnt++;
if (cnt == 100) { // 每个数码管显示100次
cnt = 0;
num1++;
if (num1 == 100) {
num1 = 0;
num2++;
if (num2 == 100) {
num2 = 0;
}
}
}
}
// 数码管显示函数
void LED_Display(uchar num, uchar bit) {
uchar high, low;
high = num / 10; // 十位数
low = num % 10; // 个位数
if (bit == 0) { // 第一个数码管
LED_H = 1;
LED_L = 0;
P0 = LEDChar[high];
delay(5);
P0 = 0x00;
LED_H = 0;
LED_L = 1;
P0 = LEDChar[low];
delay(5);
P0 = 0x00;
} else if (bit == 1) { // 第二个数码管
LED_H = 0;
LED_L = 1;
P0 = LEDChar[high];
delay(5);
P0 = 0x00;
LED_H = 1;
LED_L = 0;
P0 = LEDChar[low];
delay(5);
P0 = 0x00;
}
}
void main() {
TMOD = 0x01; // 定时器0,模式1
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
while (1) {
LED_Display(num1, 0); // 显示第一个数码管
LED_Display(num2, 1); // 显示第二个数码管
}
}
```
说明:
- 使用定时器0实现中断,每个数码管显示100次后切换到下一个数字。
- 数码管采用共阳极接口,位选使用P1.0和P1.1接口。
- 数码管显示函数中的`delay`函数需要自己实现,这里可以使用`_nop_`空指令实现简单的延时。
阅读全文