C51单片机利用2位静态数码管来显示串口输入的数据,PC机使用串口助手发送数据。串口采用中断的方式编程,接收到数据后,如果数据是 0~255之间的数值,那么转换为16进制在数码管上显示。如果是数值,但是超过了255,在数码管上显示“HL” ;如果是数值,但是小于0,在数码管上显示“LL”;如果不是数值,在数码管上显示“HH ”。代码
时间: 2024-02-28 17:53:42 浏览: 21
以下是C51单片机利用2位静态数码管来显示串口输入的数据的代码:
```c
#include <reg52.h>
// 定义数码管端口
sbit DIG1 = P1^0;
sbit DIG2 = P1^1;
sbit LED_SEG = P0;
unsigned char data rx_data; // 串口接收数据
unsigned char data hex_data; // 转换成16进制后的数据
void init_serial() // 串口初始化函数
{
TMOD = 0x20; // 设置计数器T1为模式2
SCON = 0x50; // 设置串口为工作方式1
TH1 = 0xfd; // 计数器初值,设置波特率为9600
TL1 = 0xfd; // 计数器初值,设置波特率为9600
TR1 = 1; // 启动计数器T1
ES = 1; // 开启串口中断
EA = 1; // 开启总中断
}
void timer0_delay() // 延时函数
{
unsigned char i, j;
for (i = 0; i < 100; i++)
for (j = 0; j < 200; j++);
}
void display() // 数码管显示函数
{
unsigned char i, j, k;
unsigned char led_code[16] = { // 数码管编码表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
DIG1 = 1; // 数码管1亮
DIG2 = 0; // 数码管2灭
if (hex_data < 0) {
LED_SEG = led_code[14]; // 显示“L”
timer0_delay(); // 延时一段时间
LED_SEG = led_code[14]; // 显示“L”
} else if (hex_data > 255) {
LED_SEG = led_code[15]; // 显示“H”
timer0_delay(); // 延时一段时间
LED_SEG = led_code[15]; // 显示“H”
} else {
i = hex_data / 16; // 获取高4位
j = hex_data % 16; // 获取低4位
LED_SEG = led_code[i]; // 显示高4位
timer0_delay(); // 延时一段时间
DIG1 = 0; // 数码管1灭
DIG2 = 1; // 数码管2亮
LED_SEG = led_code[j]; // 显示低4位
}
}
void serial_isr() interrupt 4 // 串口中断函数
{
if (RI == 1) { // 判断是否接收到数据
RI = 0; // 清除接收中断标志
rx_data = SBUF; // 获取接收到的数据
if (rx_data >= '0' && rx_data <= '9') {
hex_data = rx_data - '0'; // 转换成数字
} else if (rx_data >= 'a' && rx_data <= 'f') {
hex_data = rx_data - 'a' + 10; // 转换成数字
} else if (rx_data >= 'A' && rx_data <= 'F') {
hex_data = rx_data - 'A' + 10; // 转换成数字
} else {
hex_data = 256; // 不是数值
}
display(); // 显示数据
}
}
void main()
{
init_serial(); // 初始化串口
while (1); // 等待串口中断
}
```
这个程序利用中断的方式实现了串口接收数据,并将接收到的数据转换成16进制后在2位静态数码管上显示。如果接收到的数据不是数值,则在数码管上显示“HH”,如果是数值但超过了255,则显示“HL”,如果是数值但小于0,则显示“LL”。