PC 端通过串口(STC-ISP的串口助手,波特率4800)向开发板发送16进制数据(数据长度小于等于5位并以'h'字母结尾),并把该数据显示到数码显示管上,第二次输入的数据将替换之前的数据显示在数码管上,输入任意非16进制数据字符则清除显示内容(显示全0)。给我这道题目的代码
时间: 2024-02-15 14:02:54 浏览: 86
通过串口发送数据
4星 · 用户满意度95%
好的,这里是一个可能的解决方案,包含了PC端和开发板的代码。请注意,这只是一个示例代码,您需要根据您自己的硬件平台和需求进行修改。
PC端代码:
```python
import serial
ser = serial.Serial('COM1', 4800, timeout=1)
# 读取用户输入并发送到串口
def send_data():
data = input("请输入16进制数据(以'h'结尾):")
# 检查数据是否合法
if not check_data(data):
print("输入错误!")
return
ser.write(bytes.fromhex(data))
# 检查数据是否合法
def check_data(data):
if not data.endswith('h'):
return False
data = data[:-1] # 去除'h'
if len(data) > 5:
return False
for c in data:
if c not in '0123456789abcdefABCDEF':
return False
return True
while True:
send_data()
```
开发板代码(基于STC单片机,使用Keil C51编译器):
```c
#include <reg52.h>
sbit DIG1 = P0^0; // 数码管位选控制引脚
sbit DIG2 = P0^1;
sbit DIG3 = P0^2;
sbit DIG4 = P0^3;
sbit DIO = P1^0; // 数码管数据控制引脚
sbit CLK = P1^1; // 数码管时钟控制引脚
unsigned char data_buf[6]; // 存储接收到的数据
unsigned char data_len; // 接收到的数据长度
unsigned char data_changed; // 数据是否被修改过
// 初始化串口
void init_uart() {
TMOD = 0x20; // 定时器1,模式2
TH1 = 0xfd; // 波特率4800,定时器重载值
TL1 = 0xfd;
TR1 = 1; // 启动定时器1
SCON = 0x50; // 串口模式1,允许接收
ES = 1; // 开启串口中断
EA = 1; // 开启总中断
}
// 将一个16进制字符转换成10进制数值
unsigned char hex_to_dec(unsigned char hex) {
if (hex >= '0' && hex <= '9') {
return hex - '0';
} else if (hex >= 'a' && hex <= 'f') {
return hex - 'a' + 10;
} else if (hex >= 'A' && hex <= 'F') {
return hex - 'A' + 10;
} else {
return 0;
}
}
// 将一个10进制数值转换成一个7段数码管显示的字符
unsigned char dec_to_disp(unsigned char dec) {
switch (dec) {
case 0: return 0xc0;
case 1: return 0xf9;
case 2: return 0xa4;
case 3: return 0xb0;
case 4: return 0x99;
case 5: return 0x92;
case 6: return 0x82;
case 7: return 0xf8;
case 8: return 0x80;
case 9: return 0x90;
default: return 0xff; // 不显示
}
}
// 在数码管上显示数据
void show_data() {
unsigned char i, disp_code;
for (i = 0; i < 4; i++) {
if (i < data_len) {
disp_code = dec_to_disp(hex_to_dec(data_buf[i]));
} else if (i == data_len && data_changed) {
disp_code = 0xff; // 显示空
} else {
disp_code = 0xc0; // 显示0
}
switch (i) {
case 0: DIG1 = 1; DIG2 = 0; DIG3 = 0; DIG4 = 0; break;
case 1: DIG1 = 0; DIG2 = 1; DIG3 = 0; DIG4 = 0; break;
case 2: DIG1 = 0; DIG2 = 0; DIG3 = 1; DIG4 = 0; break;
case 3: DIG1 = 0; DIG2 = 0; DIG3 = 0; DIG4 = 1; break;
}
DIO = disp_code;
CLK = 0;
CLK = 1;
}
}
// 串口中断处理函数
void uart_isr() interrupt 4 {
unsigned char c;
if (RI) { // 接收中断
c = SBUF; // 读取接收数据
if (c == 'h') { // 数据接收完毕
data_buf[data_len] = '\0'; // 添加字符串结束符
data_changed = 1; // 数据已经被修改
} else if (data_len < 5 && ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))) {
data_buf[data_len++] = c;
data_changed = 1; // 数据已经被修改
} else {
data_len = 0; // 数据长度清零
data_changed = 1; // 数据已经被修改
}
RI = 0; // 清除接收中断标志位
}
}
// 主函数
void main() {
init_uart();
while (1) {
if (data_changed) {
show_data(); // 显示数据
data_changed = 0; // 数据已经被处理
}
}
}
```
希望这个示例代码能够帮到您!
阅读全文