用keil写两个 51 单片机基于rs485进行双机通信并把数据显示在1602上的完整程序
时间: 2024-05-01 08:23:00 浏览: 116
51单片机驱动多个18b20 1602液晶显示温度keil工程文件C源文件_1602液晶显示器程序
5星 · 资源好评率100%
以下是一个基于RS485进行双机通信的完整程序,使用Keil编写,使用了1602液晶屏来显示数据。
```
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
sbit RS485_TX_EN = P1^0; //RS485发送使能端口
uchar code table[] = "Hello, World!"; //发送的数据
void Delay(uint n) //延时函数
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<256;j++);
}
void Lcd_Write_Com(uchar com) //写命令函数
{
RS = 0;
RW = 0;
P0 = com;
EN = 1;
_nop_();
_nop_();
EN = 0;
Delay(5);
}
void Lcd_Write_Data(uchar dat) //写数据函数
{
RS = 1;
RW = 0;
P0 = dat;
EN = 1;
_nop_();
_nop_();
EN = 0;
Delay(5);
}
void Lcd_Init() //液晶屏初始化函数
{
Lcd_Write_Com(0x38); //8位数据接口,2行显示,5*7点阵字符
Lcd_Write_Com(0x0c); //开显示,不显示光标,不闪烁
Lcd_Write_Com(0x06); //写一个字符后指针加1,整屏不移动
Lcd_Write_Com(0x01); //清屏
}
void Lcd_Display(uchar *p, uchar n) //在液晶屏上显示字符串
{
uchar i;
for(i=0;i<n;i++)
{
Lcd_Write_Data(*p++);
}
}
void Uart_Init() //串口初始化函数,波特率为9600
{
TMOD = 0x20; //定时器1工作在模式2,8位自动重装载
TH1 = 0xfd; //9600波特率
TL1 = 0xfd;
TR1 = 1; //启动定时器1
SCON = 0x50; //8位数据,可变波特率
RI = 0; //清接收中断标志位
TI = 0; //清发送中断标志位
EA = 1; //开全局中断
ES = 1; //开串口中断
}
void Uart_Send(uchar dat) //发送一个字节数据
{
SBUF = dat;
while(!TI);
TI = 0;
}
void Uart_Send_String(uchar *p, uchar n) //发送字符串
{
uchar i;
for(i=0;i<n;i++)
{
Uart_Send(*p++);
}
}
void main()
{
Lcd_Init();
Uart_Init();
Lcd_Display(table, 13); //显示Hello, World!到液晶屏上
while(1);
}
void Uart_Isr() interrupt 4 //串口中断函数
{
uchar dat;
if(RI)
{
RI = 0;
dat = SBUF;
Lcd_Write_Data(dat); //将接收到的数据显示到液晶屏上
Uart_Send_String(table, 13); //将发送的数据发送出去
RS485_TX_EN = 1; //打开RS485发送使能端口
Delay(100);
RS485_TX_EN = 0; //关闭RS485发送使能端口
}
}
```
此程序中,使用了一个1602液晶屏来显示发送和接收到的数据。程序中还使用了一个RS485发送使能端口。在接收到数据后,程序将数据显示到液晶屏上,然后将发送的数据发送出去,并且在发送数据时打开RS485发送使能端口,等待发送完成后关闭RS485发送使能端口。
阅读全文