C51单片机P0口连接第一位数码管,P2口连接第二位数码管静态显示串口输入的数据,PC机使用串口助手发送数据。串口采用中断的方式编程,接收到数据后,如果数据是 0~255之间的数值,那么转换为16进制在数码管上显示。如果不是数值,在数码管上显示“HH ”;如果是数值,但是超过了255,在数码管上显示“HL” ;如果是数值,但是小于0,在数码管上显示“LL”。Keil程序。
时间: 2024-02-28 18:56:28 浏览: 90
好的,以下是一个参考的 Keil 代码实现:
```c
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit LED1 = P0^0;
sbit LED2 = P0^1;
uchar data_input, data_hex, data_hex_high, data_hex_low;
bit is_num, is_valid;
void init_serial() {
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xFD;
TR1 = 1;
ES = 1;
EA = 1;
}
void putchar_serial(uchar c) {
SBUF = c;
while (!TI);
TI = 0;
}
void main() {
init_serial();
while (1) {
if (is_valid) {
if (is_num) {
if (data_input >= 0 && data_input <= 255) {
data_hex = data_input;
data_hex_high = data_hex / 16;
data_hex_low = data_hex % 16;
LED1 = 1;
LED2 = 0;
P2 = data_hex_high;
P0 = data_hex_low;
} else {
LED1 = 0;
LED2 = 1;
P2 = 0x48; // H
P0 = 0x48; // H
}
} else {
LED1 = 0;
LED2 = 1;
P2 = 0x48; // H
P0 = 0x20; // space
}
is_valid = 0;
}
}
}
void serial_interrupt() interrupt 4 {
if (RI) {
RI = 0;
data_input = SBUF;
is_num = 1;
if (data_input < '0' || data_input > '9') {
is_num = 0;
}
is_valid = 1;
}
}
```
该程序的主要实现逻辑如下:
1. 定义了两个全局变量 `data_input` 和 `is_valid`,分别表示当前接收到的数据和数据是否有效。
2. 在 `init_serial()` 函数中初始化了串口,并启用了中断。
3. 在 `putchar_serial()` 函数中实现了向串口发送一个字符的功能。
4. `main()` 函数中不断循环,如果接收到了有效数据,则根据数据类型进行相应的处理。
5. 在串口中断函数 `serial_interrupt()` 中,如果接收到了新数据,则更新全局变量,并设置数据有效标志 `is_valid`。
需要注意的是,该程序只实现了数码管的静态显示,即每次接收到新的数据后,会在数码管上显示一次,然后一直保持这个显示状态,直到接收到下一个数据。如果需要实现动态显示,需要在 `main()` 函数中添加循环显示的逻辑。另外,该程序只使用了一个数码管,如果需要同时显示两个数码管,需要在代码中添加对应的逻辑。
阅读全文