使用慧净的51单片机开发板PC 端通过串口(STC-ISP 的串口助手,波特率 4800)向开发板发送 16 进制数据(数据长度小于等于 5 位并以’h’字母结尾),并把该数据显示到数码显示管上,第二次输入的数据将替换之前的数据显示在数码管上,输入任意非 16 进制数据字符则清除显示内容(显示全 0)。
时间: 2024-02-15 07:01:21 浏览: 83
51单片机串口发送16进制数并在数码管上显示
好的,你的问题是如何使用慧净的51单片机开发板PC 端通过串口(STC-ISP 的串口助手,波特率 4800)向开发板发送 16 进制数据(数据长度小于等于 5 位并以’h’字母结尾),并把该数据显示到数码显示管上,第二次输入的数据将替换之前的数据显示在数码管上,输入任意非 16 进制数据字符则清除显示内容(显示全 0)。
首先,你需要在慧净的51单片机开发板上编写程序,使其能够接收PC端通过串口发送过来的16进制数据,并将其显示在数码管上。
以下是一个简单的程序示例,可以实现上述功能:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit D1 = P2^0; // 数码管第一位
sbit D2 = P2^1; // 数码管第二位
sbit D3 = P2^2; // 数码管第三位
sbit D4 = P2^3; // 数码管第四位
void delay(uint t); // 延时函数
void display(uchar num); // 数码管显示函数
void main()
{
uchar data[6]; // 存储接收到的数据
uchar i = 0; // 数据数组下标
uchar ch; // 接收到的字符
TMOD = 0x20; // 设置定时器1为模式2
TH1 = 0xfd; // 设置波特率为4800
TL1 = 0xfd;
TR1 = 1; // 启动定时器1
SCON = 0x50; // 设置串口为模式1
ES = 1; // 开启串口中断
EA = 1; // 开启总中断
while (1)
{
// 如果输入的不是16进制数据字符,则清除显示内容
if (ch < '0' || (ch > '9' && ch < 'A') || ch > 'F')
{
data[0] = data[1] = data[2] = data[3] = '0';
i = 0;
display(0);
continue;
}
// 如果输入的是'h',则将接收到的16进制数据显示在数码管上
if (ch == 'h')
{
display(data[0]);
display(data[1]);
display(data[2]);
display(data[3]);
continue;
}
// 将接收到的字符存入数组
data[i] = ch;
i++;
// 如果接收的数据长度为5,则将最后一个字符设置为'h',并将数组下标重置为0
if (i == 5)
{
data[4] = 'h';
i = 0;
}
}
}
void serial() interrupt 4
{
uchar ch;
if (RI)
{
RI = 0;
ch = SBUF;
while (!TI); // 等待发送寄存器为空
TI = 0;
SBUF = ch;
}
}
void delay(uint t)
{
uint i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 125; j++);
}
void display(uchar num)
{
switch (num)
{
case '0': D1 = D2 = D3 = D4 = 1; break;
case '1': D1 = 0; D2 = D3 = D4 = 1; break;
case '2': D2 = 0; D1 = D3 = D4 = 1; break;
case '3': D1 = D2 = 0; D3 = D4 = 1; break;
case '4': D3 = 0; D1 = D2 = D4 = 1; break;
case '5': D1 = D3 = 0; D2 = D4 = 1; break;
case '6': D2 = D3 = 0; D1 = D4 = 1; break;
case '7': D1 = D2 = D3 = 0; D4 = 1; break;
case '8': D4 = 0; D1 = D2 = D3 = 1; break;
case '9': D1 = D4 = 0; D2 = D3 = 1; break;
case 'A': D2 = D4 = 0; D1 = D3 = 1; break;
case 'B': D1 = D2 = D4 = 0; D3 = 1; break;
case 'C': D3 = D4 = 0; D1 = D2 = 1; break;
case 'D': D1 = D3 = D4 = 0; D2 = 1; break;
case 'E': D2 = D3 = D4 = 0; D1 = 1; break;
case 'F': D1 = D2 = D3 = D4 = 0; break;
}
delay(5);
D1 = D2 = D3 = D4 = 1;
}
```
程序的主要思路是:
1. 在主函数中,通过串口中断接收PC端发送的字符。
2. 根据接收到的字符判断是不是16进制数据字符,并将其存入一个数组中。
3. 如果接收到的字符不是16进制数据字符,则清除显示内容。
4. 如果接收到的字符是'h',则将数组中存储的16进制数据显示在数码管上。
5. 如果接收到的字符数量达到了5个,则将最后一个字符设置为'h',并将数组下标重置为0。
6. 数码管的显示函数根据输入的16进制数字进行相应的显示。
需要注意的是,由于串口接收到的数据是ASCII码,所以需要将字符转换成对应的16进制数字。例如,字符'1'对应的16进制数字是0x31,字符'A'对应的16进制数字是0x41。在程序中,将字符'0'-'9'和'A'-'F'对应的16进制数字存入一个数组中,显示函数根据数组中存储的数字进行相应的显示。
阅读全文