单片机实现数码管00到99显示
在嵌入式开发中,数码管是最常用的显示设备之一,特别适合用于显示数字信息。本项目的目标是利用8051单片机控制数码管实现数字显示,从00到99的循环显示。我们将通过按键或定时器来控制数字的增减,并通过数码管来显示数字。
一、项目需求
- 显示功能:在数码管上显示00到99之间的数字,并能循环显示。
- 控制功能:通过按键或者定时器的触发来更新数码管上的显示。
- 数码管连接:使用共阳数码管或共阴数码管显示数字。
二、系统设计
2.1 数码管显示原理
数码管由7个LED段组成,可以通过点亮不同的LED来显示数字。每个数码管的数字显示都可以通过指定不同的段码来实现。例如,数字0
对应的段码为0x3F
,数字1
对应的段码为0x06
,依此类推。
我们使用4位数码管显示两位数字,其中每一位显示0-9的数字,通过切换不同的显示位置,来显示一个完整的00-99范围内的数字。
2.2 硬件设计
- 单片机:使用8051单片机(如AT89C51)。
- 数码管:使用2位数码管,分别显示十位和个位数字。
- 按键控制:通过按键或定时器控制数字的增减。
2.3 软件设计
- 数码管驱动:通过控制数码管的段选择和位选择来实现数字显示。
- 数字更新:通过计数器控制数字的增减。
- 按键控制:通过按键触发增减操作。
三、程序设计
3.1 数码管的段码定义
首先,我们需要定义每个数字的段码。常见的7段数码管(共阳或共阴)段码如下:
数字 | 段码 (0x3F) |
---|---|
0 | 0x3F |
1 | 0x06 |
2 | 0xB6 |
3 | 0x76 |
4 | 0xEE |
5 | 0x7A |
6 | 0xFA |
7 | 0x06 |
8 | 0xFE |
9 | 0x7E |
其中,每个数字对应一个7段数码管的段码,我们将这些段码存储在数组中,便于后续的数字显示。
3.2 主程序框架
- 初始化数码管和按键。
- 控制数字的增减(按键控制或定时器中断)。
- 显示当前数字。
3.3 完整代码实现
cpp
#include <reg51.h> // 包含8051单片机的寄存器定义
// 数码管段码(共阴数码管)
unsigned char code digit_code[] = {
0x3F, // 0
0x06, // 1
0xB6, // 2
0x76, // 3
0xEE, // 4
0x7A, // 5
0xFA, // 6
0x06, // 7
0xFE, // 8
0x7E // 9
};
// 数码管连接端口
#define DIGIT1 P0 // 十位数码管连接到P0口
#define DIGIT2 P1 // 个位数码管连接到P1口
// 定义数码管选择信号
#define SELECT_DIGIT1 P2_0 // 控制十位数码管
#define SELECT_DIGIT2 P2_1 // 控制个位数码管
// 当前数字
unsigned char tens = 0; // 十位
unsigned char ones = 0; // 个位
// 延时函数(用来调整数码管刷新时间)
void delay_ms(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 120; j++) {
// 空循环,产生延时
}
}
}
// 数码管显示函数
void display_number(unsigned char tens, unsigned char ones) {
// 显示十位
DIGIT1 = digit_code[tens]; // 显示十位数
SELECT_DIGIT1 = 0; // 激活十位数码管
delay_ms(5); // 延时,避免闪烁
SELECT_DIGIT1 = 1; // 关闭十位数码管
// 显示个位
DIGIT2 = digit_code[ones]; // 显示个位数
SELECT_DIGIT2 = 0; // 激活个位数码管
delay_ms(5); // 延时,避免闪烁
SELECT_DIGIT2 = 1; // 关闭个位数码管
}
// 主程序
void main() {
while (1) {
// 循环显示00到99
for (tens = 0; tens < 10; tens++) {
for (ones = 0; ones < 10; ones++) {
display_number(tens, ones); // 显示当前数字
delay_ms(500); // 延时500ms,每秒更新一次
}
}
}
}
四、程序说明
-
数码管段码定义:
digit_code[]
数组存储了0到9的数字对应的段码。每个数字的段码对应7个LED的开关状态。
-
数码管显示函数:
display_number(unsigned char tens, unsigned char ones)
函数将十位和个位的数字分别显示在两个数码管上。通过控制不同的数码管位和段码来实现数字显示。
-
任务调度:
- 主程序中的
for
循环从00到99循环显示,通过更新tens
和ones
变量来显示不同的数字。
- 主程序中的
-
延时函数:
delay_ms()
用于延时,调整数码管的刷新时间。为了避免数码管闪烁,刷新时间不宜过短。
五、总结
通过本项目,我们使用8051单片机控制数码管显示00到99的数字。通过控制数码管的段码和位选择,我们可以显示任意数字。该项目不仅实现了数码管的基本显示功能,还通过延时函数和控制逻辑避免了显示的闪烁问题。
如果需要增加更多的功能,例如通过按键控制数字的增减,或者通过外部输入改变显示内容,可以在此基础上进一步扩展。