基于stc90c516rd单片机rs485模块的简单现场总线通信系统实现从0~99的单发单收的发送程序和接受程序
时间: 2024-02-20 17:56:40 浏览: 22
好的,针对您的问题,我可以给出以下的单发单收的发送程序和接收程序供您参考:
发送程序:
```C
#include "reg90c516rd.h"
#include "intrins.h"
// 定义发送缓冲区
unsigned char sendData[4] = {0x01, 0x02, 0x03, 0x04};
void initUART(void)
{
// 定义波特率为9600
unsigned int baud = 256 - FOSC / 32 / 9600;
SCON = 0x50; // 8位数据,无校验,1位停止位
TMOD &= 0x0F;
TMOD |= 0x20; // 设置定时器1为8位自动重载模式
TH1 = baud;
TL1 = baud;
TR1 = 1; // 启动定时器1
}
void sendRS485(unsigned char *buf, unsigned char len)
{
unsigned int i;
// 设置为发送模式
P2 &= ~(1 << 3);
_nop_(); // 延时
_nop_();
for (i = 0; i < len; i++)
{
SBUF = buf[i];
while (!TI)
; // 等待发送完成
TI = 0; // 清除发送中断标志位
}
// 设置为接收模式
P2 |= (1 << 3);
}
void main(void)
{
initUART(); // 初始化串口
while (1)
{
sendRS485(sendData, 4); // 发送数据
// 延时一段时间
for (unsigned int i = 0; i < 65535; i++)
;
}
}
```
接收程序:
```C
#include "reg90c516rd.h"
#include "intrins.h"
// 定义接收缓冲区
unsigned char recvData[4];
void initUART(void)
{
// 定义波特率为9600
unsigned int baud = 256 - FOSC / 32 / 9600;
SCON = 0x50; // 8位数据,无校验,1位停止位
TMOD &= 0x0F;
TMOD |= 0x20; // 设置定时器1为8位自动重载模式
TH1 = baud;
TL1 = baud;
TR1 = 1; // 启动定时器1
}
void recvRS485(unsigned char *buf, unsigned char len)
{
unsigned int i;
// 设置为接收模式
P2 |= (1 << 3);
while (!RI)
; // 等待接收完成
RI = 0; // 清除接收中断标志位
for (i = 0; i < len; i++)
{
buf[i] = SBUF;
while (!RI)
; // 等待接收完成
RI = 0; // 清除接收中断标志位
}
// 设置为发送模式
P2 &= ~(1 << 3);
_nop_(); // 延时
_nop_();
}
void main(void)
{
initUART(); // 初始化串口
while (1)
{
recvRS485(recvData, 4); // 接收数据
// 处理接收到的数据
for (unsigned int i = 0; i < 4; i++)
{
// 输出接收到的数据
printf("%d ", recvData[i]);
}
printf("\n");
}
}
```
这里的发送程序和接收程序都实现了单发单收的功能,发送程序会发送固定的数据,接收程序会将接收到的数据输出到串口终端。您可以根据您的具体需求,修改发送程序中的数据,或者在接收程序中进行数据处理。同时,为了保证通信的可靠性,建议在程序中添加适当的校验机制,如CRC校验等。