当前位置:
文档之家› 基于RS485总线的PC与多个单片机通信的C语言程序
基于RS485总线的PC与多个单片机通信的C语言程序
思路:
PC方面:可以用MSCOMM控件先发一个字符表示接收地址,后延迟1ms,(注意PC端在485通讯在字符发送过程中一定要加延迟,这是我多次测试的总结,如果是用调试助手的话,他内部代码已经加过延迟了,就不必考虑这个问题)再发控制指令,初学者建议直接用调试助手
单片机方面:首先对接收数据进行核对,如果不是本地地址,放弃,如果是本地地址,在检测命令是否正确,如果正确,做出处理后返回PC本地地址并发送命令
{
while(RI==0);
RI=0;
if(SBUF==0x01) //发送指令
{
MAX485_DIR=1; //开发送
SBUF=AddressID;
while(TI==0);
TI=0;
SBUF=0x6f; //发送o
while(TI==0);
TI=0;
SBUF=0x6b; //发送k
MAX485_DIR=0; //开接收
sbit MAX485_DIR=P3^7;
main()
{
//****************通讯设置
SCON = 0xF0; //REN=1允许串行接受状态,串口工作模式3,SM2=1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80; //波特率提高一倍
IP=0x10; //串口优先级高
}
if(SBUF==0x00) //收
{
//这里怎么处理就看你自己要怎么做了,你没要求,我也不好怎么写,就自己写吧
}
}
}
程序调试通过,可以直接套用
//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无(11.0592)
TH1 = 0xf4;//fa// //baud*2 /*波特率4800、数据位8、停止位1。效验位无(11.0592M)
TL1 = 0xf4;
TR1 = 1; //开启定时器1
EA = 1; //开总中断
ES = 1; //开串口中断
RS485E=0; // RS5485E=0为接收状态RS5485E=1为发送状态
while(1);
}
void counter4(void) interrupt 4 using 2 //串口中断
{
while(RI==0);
RI=0;
if(SBUF==AddressID)
我举个例子教你怎么玩多站通讯,下面是我已经通过测试的一个程序
#include <reg51.h> //选用晶振11.0592MHz
#include <absacc.h>
#define DATA51 DBYTE[0x80] //80H存数据
#define AddressID 0x31 //本机地址1
sbit RS485E=P3^7; //定义485的使能脚// RS5485E=0为接收状态RS5485E=1为发送状态