AT89C51单片机利用2位静态数码管来显示串口输入的数据,串口采用中断的方式编程,接收到数据后,如果数据是 0~255之间的数值,那么转换为16进制在数码管上显示,如果小于0,在数码管上显示“HL”,如果超过了255,在数码管上显示“LL”,如果不是数值,在数码管上显示“HH ”的程序代码
时间: 2024-02-23 19:00:41 浏览: 79
以下是基于AT89C51单片机的代码实现:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar hexCode[16] = { // 16进制数码管编码表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
uchar isHex(uchar data) { // 判断是否为16进制数值
if ((data >= '0' && data <= '9') || (data >= 'A' && data <= 'F') || (data >= 'a' && data <= 'f')) {
return 1;
}
else {
return 0;
}
}
uchar hexToDec(uchar data) { // 将16进制数值转换为10进制数值
if (data >= '0' && data <= '9') {
return data - '0';
}
else if (data >= 'A' && data <= 'F') {
return data - 'A' + 10;
}
else {
return data - 'a' + 10;
}
}
void displayHex(uchar data) { // 在数码管上显示16进制数值
uchar high = hexCode[data >> 4];
uchar low = hexCode[data & 0x0f];
P1 = high << 8 | low;
}
void displayError() { // 在数码管上显示错误信息
P1 = hexCode['H'] << 8 | hexCode['H'];
}
void serialISR() interrupt 4 { // 串口中断服务程序
uchar data = SBUF;
if (data >= 0 && data <= 255) { // 如果是0~255之间的数值,转换为16进制并显示
displayHex(data);
}
else if (data < 0) { // 如果小于0,显示HL
displayError();
}
else if (data > 255) { // 如果超过了255,显示LL
displayError();
}
else if (!isHex(data)) { // 如果不是数值,显示HH
displayError();
}
}
void main() {
TMOD = 0x20; // 设定定时器1为模式2,用于串口波特率发生器
TH1 = 0xfd; // 设定波特率为9600
TL1 = 0xfd;
TR1 = 1; // 启动定时器1
SCON = 0x50; // 定义串口工作模式
IE = 0x90; // 开启全局中断以及串口中断
P1 = 0x0000; // 初始化数码管
while (1); // 进入死循环
}
```
以上代码实现了通过串口输入数据并在2位静态数码管上显示对应的16进制数值,或者显示错误信息。
阅读全文