利用AT89c51设计一个系统。在设计的系统中,具有3个独立式按键和至少2位数码管。要求2位数码管进行动态扫描,显示的数字0-99,设定有加、减和清零功能键,当按下一个加1按键时,数码管上显示的数值加1;当按下一个减1按键时,数码管上显示的数值减1;当数值小于0时,数码管显示99,当数值大于99时,数码管显示0;在按下清零按键时,数码管上显示为0。
时间: 2023-06-17 22:02:38 浏览: 82
这个系统可以利用AT89c51单片机的IO口来控制数码管的显示和按键的输入,以下是一个基本的实现方法:
1. 按键输入
将3个独立式按键连接到AT89c51单片机的3个IO口上,设定按键输入为低电平有效。在程序中需要不断地检测按键的状态,当检测到按键按下时,执行相应的操作。例如,当按下加1按键时,数值加1;当按下减1按键时,数值减1;当按下清零按键时,数值清零。
2. 数码管动态扫描显示
将2位数码管的共阳极接到单片机的2个IO口上,将2个数码管的段选引脚连接到单片机的8个IO口上。在程序中需要不断地扫描2个数码管的显示状态,将要显示的数字转换为对应的段选信号,通过IO口输出到数码管上。为了避免眼睛看到闪烁的现象,需要进行动态扫描,即每隔一段时间切换显示的数码管,以达到平滑的显示效果。
下面是一个简单的程序框架,仅供参考:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar table[] = { // 数码管段选表
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
uchar key1 = 1, key2 = 1, key3 = 1; // 记录按键状态
uchar num = 0; // 记录显示的数值
void delay(uint t) { // 延时函数
uint i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 125; j++);
}
void display(uchar n) { // 数码管动态扫描显示
static bit flag = 0; // 记录当前扫描的数码管
uchar high, low;
if (flag == 0) { // 扫描第一个数码管
high = n / 10; // 计算高位数字
low = n % 10; // 计算低位数字
P2 = 0x01; // 选择第一个数码管
P0 = table[high]; // 显示高位数字
P2 = 0x02; // 切换到第二个数码管
P0 = table[low]; // 显示低位数字
} else { // 扫描第二个数码管
high = (n + 1) / 10; // 计算高位数字
low = (n + 1) % 10; // 计算低位数字(注意加1操作)
P2 = 0x02; // 选择第二个数码管
P0 = table[high]; // 显示高位数字
P2 = 0x01; // 切换到第一个数码管
P0 = table[low]; // 显示低位数字
}
flag = !flag; // 切换数码管
}
void main() {
while (1) {
if (key1 == 0) { // 检测加1按键
key1 = 1;
if (num < 99)
num++;
else
num = 0;
}
if (key2 == 0) { // 检测减1按键
key2 = 1;
if (num > 0)
num--;
else
num = 99;
}
if (key3 == 0) { // 检测清零按键
key3 = 1;
num = 0;
}
display(num); // 显示数值
delay(2); // 稍微延时一下,以达到动态扫描的效果
}
}
```
阅读全文