使用单片机语言,51单片机向PC机发送数据,按键S1控制数码管从00到99加计数循环显示,按下按键S2将当前显示的数字发送到串口调试助手的接收缓存区
时间: 2024-03-23 15:36:10 浏览: 138
51单片机实现数码管循环显示00~99字样,到99后返回00重新显示,时间间隔为100ms。
5星 · 资源好评率100%
以下是基于C语言的51单片机程序,实现了按键S1控制数码管从00到99加计数循环显示,按下按键S2将当前显示的数字发送到串口调试助手的接收缓存区的功能。
```c
#include <reg51.h>
void delay(unsigned int t); // 延时函数
void display(unsigned char num); // 显示函数
void send_data(unsigned char data); // 发送数据函数
unsigned char code DispTab[] = { // 数码管显示表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90
};
void main() {
unsigned char cnt = 0; // 计数器
unsigned char key; // 按键状态
unsigned char disp_num = 0; // 当前显示的数字
while (1) {
key = P3 & 0x03; // 读取按键状态
if (key == 0x01) { // 按键S1按下,计数器加1
cnt++;
if (cnt >= 100) cnt = 0;
} else if (key == 0x02) { // 按键S2按下,发送当前数字
send_data(disp_num);
while (P3 & 0x02); // 等待按键释放
}
display(disp_num); // 显示当前数字
delay(1000); // 延时1s
disp_num = cnt % 100; // 计算当前显示的数字
}
}
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 high, low;
high = num / 10; // 计算高位数字
low = num % 10; // 计算低位数字
P2 = 0xFF; // 关闭所有数码管
P0 = DispTab[high]; // 显示高位数字
P2 = 0xFE; // 打开第1个数码管,显示高位数字
delay(1); // 延时一段时间
P2 = 0xFF; // 关闭所有数码管
P0 = DispTab[low]; // 显示低位数字
P2 = 0xFD; // 打开第2个数码管,显示低位数字
delay(1); // 延时一段时间
}
void send_data(unsigned char data) {
SBUF = data; // 发送数据到串口调试助手接收缓存区
while (!TI); // 等待发送完成
TI = 0; // 发送完成,清除发送完成标志
}
```
在程序中,通过P3口读取按键状态,当按键S1按下时,计数器加1,当计数器达到100时,重新从0开始计数。当按键S2按下时,将当前显示的数字发送到串口调试助手的接收缓存区,等待发送完成后,清除发送完成标志。在显示函数中,先计算出当前数字的高位和低位数字,然后先显示高位数字,再显示低位数字,从而实现了数码管的显示。
阅读全文