两个51单片机基于rs485接受方的程序
时间: 2023-12-01 10:04:35 浏览: 130
51单片机实现的RS485通讯程序
以下是两个51单片机基于RS485接收方的程序示例:
主控单片机(发送方)程序:
```c
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS485_EN=P1^0; //RS485芯片使能引脚
void main()
{
uchar dat=0;
TMOD=0x20; //定时器1工作模式2
TH1=0xfb; //定时器1初值,用于115200波特率
TL1=0xfb; //定时器1初值,用于115200波特率
SCON=0x50; //串口工作模式1,允许接收
PCON=0x00; //波特率不加倍
TR1=1; //启动定时器1
RS485_EN=0; //使能RS485芯片
while(1)
{
SBUF=dat; //将数据发送给从机
while(!TI); //等待发送完毕
TI=0; //清除发送标志
dat++; //递增数据
if(dat>255) dat=0; //数据范围为0~255
_nop_();
_nop_();
_nop_();
_nop_();
}
}
```
从机单片机(接收方)程序:
```c
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS485_EN=P1^0; //RS485芯片使能引脚
void uart_init() //串口初始化函数
{
TMOD=0x20; //定时器1工作模式2
TH1=0xfb; //定时器1初值,用于115200波特率
TL1=0xfb; //定时器1初值,用于115200波特率
SCON=0x50; //串口工作模式1,允许接收
PCON=0x00; //波特率不加倍
TR1=1; //启动定时器1
}
void main()
{
uchar dat=0;
RS485_EN=1; //禁止RS485芯片
uart_init(); //初始化串口
while(1)
{
if(RI) //接收到数据
{
dat=SBUF; //读取数据
RI=0; //清除接收标志
if(dat==0xff) //根据协议判断数据是否有效
{
//处理数据
}
}
}
}
```
需要注意的是,RS485通信需要使用特殊的通信协议,通常包括起始位、数据位、校验位和停止位等内容。在实际应用中,需要根据具体需求进行调整和修改。同时,以上程序仅供参考,具体实现还需要根据具体硬件环境进行适当调整。
阅读全文