用keil写基于rs485甲机发送乙机接受并在1602上显示数据经过实测的程序
时间: 2024-05-03 10:19:33 浏览: 86
以下是基于Keil开发环境的RS485通信程序范例,实现了甲机发送数据到乙机并在1602液晶屏上显示接收到的数据。
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0; //1602液晶屏控制引脚
sbit RW=P2^1;
sbit EN=P2^2;
sbit RXTX=P2^3; //RS485收发控制引脚
uchar idata buf[50]; //接收缓冲区
void delay(uint i) //延时函数
{
while(i--);
}
void init() //1602液晶屏初始化
{
RS = 0;
RW = 0;
EN = 0;
delay(1000);
P0 = 0x38;
EN = 1;
delay(1000);
EN = 0;
P0 = 0x0c;
EN = 1;
delay(1000);
EN = 0;
P0 = 0x01;
EN = 1;
delay(1000);
EN = 0;
P0 = 0x06;
EN = 1;
delay(1000);
EN = 0;
}
void write_com(uchar com) //写命令函数
{
RS = 0;
RW = 0;
P0 = com;
EN = 1;
delay(1000);
EN = 0;
}
void write_data(uchar dat) //写数据函数
{
RS = 1;
RW = 0;
P0 = dat;
EN = 1;
delay(1000);
EN = 0;
}
void send_data(uchar dat) //RS485发送函数
{
RXTX = 1; //置为发送模式
SBUF = dat;
while(TI==0);
TI = 0;
}
void main()
{
uchar i = 0, j = 0;
TMOD = 0x20; //定时器1工作在模式2
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1; //启动定时器1
SM0 = 0;
SM1 = 1; //设置串口工作方式
REN = 1; //启动串口接收
EA = 1;
ES = 1; //开启中断
init(); //初始化1602液晶屏
while(1) //主循环
{
write_com(0x80); //将光标移动到第一行第一列
for(i=0; i<16; i++)
{
if(buf[i] != '\0') //如果接收缓冲区中有数据
{
write_data(buf[i]); //将数据写入液晶屏
}
else
{
write_data(' '); //如果没有数据则填充空格
}
}
delay(5000);
}
}
void ser() interrupt 4 //串口中断服务函数
{
if(RI == 1) //接收到数据
{
RI = 0;
buf[j++] = SBUF; //将数据存入接收缓冲区
if(j >= 16) //接收缓冲区已经满
{
j = 0;
}
}
}
```
注:以上代码仅为示例,具体实现还需要根据具体硬件和通信协议进行修改。
阅读全文