51单片机串行口实现数据在lcd上显示代码
时间: 2024-03-15 10:44:11 浏览: 14
下面是51单片机串行口实现数据在LCD上显示的示例代码:
```c
#include <reg51.h>
#include <stdio.h>
#include <string.h>
// LCD1602的控制端口定义
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
// 串口通信波特率
#define BAUDRATE 9600
// LCD1602的初始化
void InitLCD()
{
// 将RS和RW都置0
RS = 0;
RW = 0;
// 先发送8位指令
P0 = 0x38;
EN = 1;
EN = 0;
// 再发送4位指令
P0 = 0x28;
EN = 1;
EN = 0;
// 开启显示,光标不闪烁
P0 = 0x0c;
EN = 1;
EN = 0;
// 清屏
P0 = 0x01;
EN = 1;
EN = 0;
}
// LCD1602写入指令
void WriteCmd(unsigned char cmd)
{
// 将RS置0,RW置0
RS = 0;
RW = 0;
// 先发送8位指令
P0 = cmd;
EN = 1;
EN = 0;
// 再发送4位指令
P0 = cmd << 4;
EN = 1;
EN = 0;
}
// LCD1602写入数据
void WriteData(unsigned char dat)
{
// 将RS置1,RW置0
RS = 1;
RW = 0;
// 先发送8位数据
P0 = dat;
EN = 1;
EN = 0;
// 再发送4位数据
P0 = dat << 4;
EN = 1;
EN = 0;
}
// 串口通信初始化
void InitUART()
{
// 设置波特率
TH1 = 0xfd;
TL1 = 0xfd;
// 启用接收和允许中断
SCON = 0x50;
// 启用定时器1
TMOD = 0x20;
TR1 = 1;
}
// 串口通信中断服务函数
void UARTInterrupt() interrupt 4
{
if (RI)
{
RI = 0;
// 读取串口接收到的数据
unsigned char dat = SBUF;
// 将接收到的数据显示到LCD上
WriteData(dat);
}
}
void main()
{
// 初始化LCD和串口通信
InitLCD();
InitUART();
// 显示欢迎信息
WriteCmd(0x80); // 光标移动到第1行第1列
WriteData('W');
WriteData('e');
WriteData('l');
WriteData('c');
WriteData('o');
WriteData('m');
WriteData('e');
WriteData('!');
WriteCmd(0xc0); // 光标移动到第2行第1列
WriteData('S');
WriteData('t');
WriteData('a');
WriteData('r');
WriteData('t');
WriteData('e');
WriteData('d');
WriteData('.');
while (1)
{
// 主循环
}
}
```
在该示例代码中,我们使用了51单片机的串口通信功能,将从串口接收到的数据显示到LCD1602上。在使用串口通信功能时,需要设置波特率(本代码中设置为9600),并启用定时器1和串口接收中断。在串口接收中断服务函数中,我们读取接收到的数据,然后使用`WriteData()`函数将数据显示到LCD1602上。在`main()`函数中,我们初始化LCD1602和串口通信,并显示欢迎信息。