基于stc90c516rd单片机rs485简单现场总线通信系统实现单发单收从0~99的发送程序和接收程序
时间: 2023-12-02 20:02:51 浏览: 101
chuankoutongxin.rar_stc90C516RD_串口
好的,以下是基于stc90c516rd单片机rs485串口通信实现单发单收从0~99的发送程序和接收程序代码示例:
发送程序:
```
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS485_EN = P1^7; //定义RS485使能端口
void InitUart(void)
{
SCON = 0x50; //设置串口工作方式
TMOD = 0x20; //设置定时器工作方式
TH1 = 0xfd; //设置波特率为9600
TL1 = 0xfd;
TR1 = 1; //启动定时器1
ES = 1; //使能串口中断
EA = 1; //使能总中断
}
void SendData(uchar dat)
{
SBUF = dat; //将数据放入发送缓冲区
while(!TI); //等待发送完成
TI = 0; //清零发送完成标志
}
void SendCmd(uchar cmd)
{
RS485_EN = 0; //将RS485芯片使能
SendData(cmd); //发送指令
RS485_EN = 1; //关闭RS485芯片使能
}
void main()
{
InitUart(); //初始化串口
while(1)
{
uchar i;
for(i=0; i<100; i++)
{
SendCmd(i); //发送数据
delay(1000); //延时1秒
}
}
}
void UartIsr() interrupt 4
{
uchar dat;
if(RI) //接收到数据
{
RI = 0; //清零接收标志
dat = SBUF; //读取接收缓冲区数据
}
}
```
接收程序:
```
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS485_EN = P1^7; //定义RS485使能端口
void InitUart(void)
{
SCON = 0x50; //设置串口工作方式
TMOD = 0x20; //设置定时器工作方式
TH1 = 0xfd; //设置波特率为9600
TL1 = 0xfd;
TR1 = 1; //启动定时器1
ES = 1; //使能串口中断
EA = 1; //使能总中断
}
void SendData(uchar dat)
{
SBUF = dat; //将数据放入发送缓冲区
while(!TI); //等待发送完成
TI = 0; //清零发送完成标志
}
void SendCmd(uchar cmd)
{
RS485_EN = 0; //将RS485芯片使能
SendData(cmd); //发送指令
RS485_EN = 1; //关闭RS485芯片使能
}
void main()
{
InitUart(); //初始化串口
while(1)
{
uchar dat;
if(RI) //接收到数据
{
RI = 0; //清零接收标志
dat = SBUF; //读取接收缓冲区数据
//处理接收到的数据
}
}
}
void UartIsr() interrupt 4
{
uchar dat;
if(RI) //接收到数据
{
RI = 0; //清零接收标志
dat = SBUF; //读取接收缓冲区数据
}
}
```
在程序中,发送程序通过 `SendCmd` 函数发送数据,接收程序通过串口中断接收数据,并在 `main` 函数中处理接收到的数据。需要注意的是,在发送数据时需要将 `RS485_EN` 置为 0,将芯片使能,发送完成后再将其置为 1,关闭芯片使能。在实际使用中,还需要根据具体的硬件连接和协议规定进行适当的修改。
阅读全文