RS485双机通信程序

合集下载

自己写的双机max485通讯

自己写的双机max485通讯

/*双机通讯*/#include<reg51.h>typedef unsigned char uint8;typedef unsigned int uint16;sbit MAX=P0^0;/*定义为MAX485使能控制端口*/code uint8table[17]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xaa,0xbd,0xee,0xdd,0x99 ,0xfd,0xff,0xff,0xff};/*定义灯的16种状态*/uint8 table1[10];uint8 num;uint8 num1;uint8 temp;uint8 Hands;uint8 i;uint8 flag=1;uint8 flag1=1; /*判断是发送机还是接收机*/uint8 flag2;/*判断是发送机还是接收机的变量*/uint8 flag3;/*判断是发送机还是接收机应该执行的程序*//************自延时函数************/void delay(uint16 z){uint16 x,y;for(x=z;x>0;x--)for(y=200;y>0;y--);/*延时1微秒*/}void UART_send_byte(uint8 dat)/*发送一个字节*/{REN=0;/*串口禁止接收*/SBUF=dat;while(TI==0);TI=0;REN=1;}/************单片机初始化************/void init(void){SCON=0x50;/*串行通信方式选择方式1*/TMOD=0x20;/*设置定时器1为工作方式2*/TH1=0xe8;/*赋计数初值,对应定时26us*/TL1=0xe8;TR1=1;/*T1定时器开启*/EX0=1;/*外部中断INT0开启*/IT0=1;/*INT0方式下降沿有效*/EA=1;/*总中断开启*/}/************键盘扫描************/void keyscan(void){P2=0xfe;/*11111110选中第四列*/temp=P2;temp=temp&0xf0;/*11110000取P2口数据的高四位,对应为按键的行扫描码*/ while(temp!=0xf0)/*如果有按键按下执行以下子函数,软件防抖动*/{delay(5);/*延时函数调用*/temp=P2;/*P2口数据送入temp*/temp=temp&0xf0;/*取P2口数据的高四位,对应为按键的行扫描码*/while(temp!=0xf0)/*如果有按键按下执行以下子函数*/{temp=P2;/*P2口数据送入temp*/switch(temp)/*选择所按键的键码*/{case 0xee:num=1;flag=0;break;/*11101110第四列第一行按键编号为1*/case 0xde:num=2;flag=0;break;/*11011110第四列第二行按键编号为2*/case 0xbe:num=3;flag=0;break;/*10111110第四列第三行按键编号为3*/case 0x7e:num=4;flag=0;break;/*01111110第四列第四行按键编号为4*/default: break;}while(temp!=0xf0)/*去抖动,并且实现下一次按键的扫描*/ {temp=P2;temp=temp&0xf0;}}}P2=0xfd;/*11111101选中第三列*/temp=P2;temp=temp&0xf0;/*取P2口数据的高四位,对应为按键的行扫描码*/while(temp!=0xf0)/*如果有按键按下执行以下子函数,软件防抖动*/delay(5);/*延时函数调用*/temp=P2;/*P2口数据送入temp*/temp=temp&0xf0;/*取P2口数据的高四位,对应为按键的行扫描码*/while(temp!=0xf0)/*如果有按键按下执行以下子函数*/{temp=P2;/*P2口数据送入temp*/switch(temp)/*选择所按键的键码*/{case 0xed:num=5;flag=0;break;/*11101101第三列第一行按键编号为5*/case 0xdd:num=6;flag=0;break;/*11011101第三列第二行按键编号为6*/case 0xbd:num=7;flag=0;break;/*10111101第三列第三行按键编号为7*/case 0x7d:num=8;flag=0;break;/*01111101第三列第四行按键编号为8*/default: break;}while(temp!=0xf0)/*去抖动,并且实现下一次按键的扫描*/{temp=P2;temp=temp&0xf0;}}}P2=0xfb;/*11111011选中第二列*/temp=P2;temp=temp&0xf0;/*取P2口数据的高四位,对应为按键的行扫描码*/while(temp!=0xf0)/*如果有按键按下执行以下子函数,软件防抖动*/{delay(5);/*延时函数调用*/temp=P2;/*P2口数据送入temp*/temp=temp&0xf0;/*取P2口数据的高四位,对应为按键的行扫描码*/while(temp!=0xf0)/*如果有按键按下执行以下子函数*/{temp=P2;/*P2口数据送入temp*/switch(temp)/*选择所按键的键码*/{case 0xeb:num=9;flag=0;break;/*11101011第二列第一行按键编号为9*/case 0xdb:num=10;flag=0;break;/*11011011第二列第二行按键编号为10*/case 0xbb:num=11;flag=0;break;/*10111011第二列第三行按键编case 0x7b:num=12;flag=0;break;/*01111011第二列第四行按键编号为12*/default: break;}while(temp!=0xf0)/*去抖动,并且实现下一次按键的扫描*/{temp=P2;temp=temp&0xf0;}}}P2=0xf7;/*11110111选中第一列*/temp=P2;temp=temp&0xf0;/*取P2口数据的高四位,对应为按键的行扫描码*/while(temp!=0xf0)/*如果有按键按下执行以下子函数,软件防抖动*/{delay(5);/*延时函数调用*/temp=P2;/*P2口数据送入temp*/temp=temp&0xf0;/*取P2口数据的高四位,对应为按键的行扫描码*/while(temp!=0xf0)/*如果有按键按下执行以下子函数*/{temp=P2;/*P2口数据送入temp*/switch(temp)/*选择所按键的键码*/{case 0xe7:num=13;flag=0;break;/*11100111第一列第一行按键编号为13*/case 0xd7:num=14;flag=0;break;/*11010111第一列第二行按键编号为14*/case 0xb7:num=15;num1=1;flag=0;break;/*10110111第一列第三行按键编号为15*/case 0x77:num=16;num1=2;flag=0;break;/*01110111第一列第四行按键编号为16*/default: break;}while(temp!=0xf0)/*去抖动,并且实现下一次按键的扫描*/{temp=P2;temp=temp&0xf0;}}}}main(){P1=0xff;/*P1口初始化*/init();/*单片机初始化*/while(flag1)/*判断是发送机还是接收机*/{keyscan();/*键盘扫描*/if(num1==1){flag2=1;/*判断是发送机*/flag1=0;/*变量为0,跳出循环*/}else if(num1==2){flag2=2;/*判断是接收机*/flag1=0;/*变量为0,跳出循环*/}}while(1)/*判断是发送机还是接收机应该执行的程序*/{if(flag2==1)/*发送机的工作程序*/{num=0;/*键盘扫描返回值*/flag=1;/*键盘扫描标志位复位为1*/while(flag==1)/*扫描键盘并暂停*/{keyscan();/*键盘扫描*/}MAX=1;/*准备发送*/delay(5);/*延时5毫秒*/ //要点UART_send_byte(1);/*发送握手信号,寻找接收机*/delay(5);/*延时5毫秒*/MAX=0;/*准备接收*/delay(500);/*延时等待1秒*/if(RI==1)/*接收中断*/{RI=0;/*RI接收中断标志位归位复位*/Hands=SBUF;/*Hands变量接收串口数据*/if(Hands==2){MAX=1;/*准备发送数据*/delay(5);/*延时5毫秒*/ //要点UART_send_byte(table[num]);/*发送对应于num的table[]数组数据*/delay(5);/*延时5毫秒*/P1=table[num];/*把table[num]发送到P1引脚显示出来*/ }}}else if(flag2==2)/*接收机*/{MAX=0;/*准备接收*/if(RI==1){RI=0;/*RI接收中断标志位归位复位*/Hands=SBUF;/*Hands变量接收串口数据*/if(Hands==1){MAX=1;/*准备发送数据*/delay(5);/*延时5毫秒*/ //要点UART_send_byte(2);/*发送握手信号2*/delay(5);/*延时5毫秒*/MAX=0;/*准备接收*/}P1=Hands;/*把Hands发送到P1引脚显示出来*/table1[i++]=Hands;/*把Hands发送到table1[i++]存储*/if(i>=5){i=0;}}}}}。

RS485通讯实验

RS485通讯实验

RS485通讯实验与CAN 类似,RS-485 是一种工业控制环境中常用的通讯协议,它具有抗干扰能力强、传输距离远的特点。

RS-485 通讯协议由RS-232 协议改进而来,协议层不变,只是改进了物理层,因而保留了串口通讯协议应用简单的特点。

RS-485 协议主要是把RS-232 的信号改进成差分信号,从而大大提高了抗干扰特性。

对比CAN 通讯网络,可发现它们的网络结构组成是类似的,每个节点都是由一个通讯控制器和一个收发器组成,在RS-485 通讯网络中,节点中的串口控制器使用RX 与TX 信号线连接到收发器上,而收发器通过差分线连接到网络总线,串口控制器与收发器之间一般使用TTL 信号传输,收发器与总线则使用差分信号来传输。

发送数据时,串口控制器的TX 信号经过收发器转换成差分信号传输到总线上,而接收数据时,收发器把总线上的差分信号转化成TTL 信号通过RX引脚传输到串口控制器中。

RS-485 通讯网络的最大传输距离可达1200 米,总线上可挂载128 个通讯节点,而由于RS-485 网络只有一对差分信号线,它使用差分信号来表达逻辑,当AB 两线间的电压差为-6V~-2V 时表示逻辑1,当电压差为+2V~+6V 表示逻辑0,在同一时刻只能表达一个信号,所以它的通讯是半双工形式的。

RS-485 与RS-232 的差异只体现在物理层上,它们的协议层是相同的,也是使用串口数据包的形式传输数据。

由于RS-485 与RS-232 的协议层没有区别,进行通讯时,我们同样是使用STM32 的USART 外设作为通讯节点中的串口控制器,再外接一个RS-485 收发器芯片把USART 外设的TTL 电平信号转化成RS-485 的差分信号即可。

RS-485—双机通讯实验本小节演示如何使用STM32 的USART 控制器与MAX485 收发器,在两个设备之间使用RS-485协议进行通讯,本实验中使用了两个实验板,无法像CAN 实验那样使用回环测试(把STM32USART 外设的TXD 引脚使用杜邦线连接到RXD 引脚可进行自收发测试,不过这样的通讯不经过RS-485 收发器,跟普通TTL 串口实验没有区别),本教程主要以“USART—485 通讯”工程进行讲解。

RS485多机通信一主机两个下位机

RS485多机通信一主机两个下位机
RS485一主机两个下位机,上位机通过发送下位机地址查询下位机两个按钮的状态,仿真时同时在P1口和P2口显示按钮状态
一、原理图
二、程序
1、上位机程序
#include "main_host.h"
/*延时t毫秒*/
void delay(uint t)
{
uint i;
while(t--)
{
/*对于11.0592M时钟,约延时1ms */
}
/*主程序*/
void main()
{
uchar i = 0;
uchar addr_tmp;
uchar data_tmp;
init_serial();//串口初始化
EA = 0;//关闭所有中断
/*发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧*/
P0=0xff;
addr=P0; //下位机地址初值(第一个下位机地址)
P1=addr;
/*进入设备应答*/
while(1)
{
SM2 = 1;//只接收地址帧
/*如果接收到的地址帧不是本机地址,则继续等待*/
addr_tmp = addr-1;
while (addr_tmp!=addr)
{
addr_tmp=ReciveUart();
}
/*发送本机地址作为应答信号,准备接收数据*/
#define uint unsigned int
/*握手信号宏定义*/
#define DataCMD 0x55//接收成功
#define ERR 0xaa//接收错误
#define BASE_ADDR 0x51 //下位机地址基址

RS485双机通信程序

RS485双机通信程序
0x99,0x92,0x66,0xf8};
void delay(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void master(uchar command)
{
uchar aa,i;
DR=1;
SBUF=command;
while(TI!=1);
0xb0,0x92,0x66,0xfF};
uchar rebuf[8];
void delay(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
uchar j;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
RS-485双机通信程序
主机程序
此程序的主要特点是加的的校验少,适合初学者利用max485模拟单片机双机通信
建议看程序前看看郭天祥的单片机双机通信或者对于单片机双机通信协议有一个总体的了解,如果有了这个基础我相信你能够很快看明白下面的程序。
#include <reg52.h>
#define uchar unsigned char
PCON=0x00;
TR1=1;
SCON=0xd0;
EA=1;
while(1)
{
DR=0;
ES=1;
for(j=0;j<8;j++)
{
P0=rebuf[j];
delay(1000);
}
}

RS485通信原理图及程序实例详解

RS485通信原理图及程序实例详解

RS485通信原理图及程序实例详解RS232 标准是诞⽣于 RS485 之前的,但是 RS232 有⼏处不⾜的地⽅:接⼝的信号电平值较⾼,达到⼗⼏ V,使⽤不当容易损坏接⼝芯⽚,电平标准也与TTL 电平不兼容。

传输速率有局限,不可以过⾼,⼀般到⼀两百千⽐特每秒(Kb/s)就到极限了。

接⼝使⽤信号线和 GND 与其它设备形成共地模式的通信,这种共地模式传输容易产⽣⼲扰,并且抗⼲扰性能也⽐较弱。

传输距离有限,最多只能通信⼏⼗⽶。

通信的时候只能两点之间进⾏通信,不能够实现多机联⽹通信。

针对 RS232 接⼝的不⾜,就不断出现了⼀些新的接⼝标准,RS485 就是其中之⼀,它具备以下的特点:采⽤差分信号。

我们在讲 A/D 的时候,讲过差分信号输⼊的概念,同时也介绍了差分输⼊的好处,最⼤的优势是可以抑制共模⼲扰。

尤其当⼯业现场环境⽐较复杂,⼲扰⽐较多时,采⽤差分⽅式可以有效的提⾼通信可靠性。

RS485 采⽤两根通信线,通常⽤ A 和 B 或者 D+和D-来表⽰。

逻辑“1”以两线之间的电压差为+(0.2~6)V 表⽰,逻辑“0”以两线间的电压差为-(0.2~6)V 来表⽰,是⼀种典型的差分通信。

RS485 通信速率快,最⼤传输速度可以达到 10Mb/s 以上。

RS485 内部的物理结构,采⽤的是平衡驱动器和差分接收器的组合,抗⼲扰能⼒也⼤⼤增加。

传输距离最远可以达到 1200 ⽶左右,但是它的传输速率和传输距离是成反⽐的,只有在 100Kb/s 以下的传输速度,才能达到最⼤的通信距离,如果需要传输更远距离可以使⽤中继。

可以在总线上进⾏联⽹实现多机通信,总线上允许挂多个收发器,从现有的 RS485芯⽚来看,有可以挂 32、64、128、256 等不同个设备的驱动器。

RS485 的接⼝⾮常简单,与 RS232 所使⽤的 MAX232 是类似的,只需要⼀个 RS485转换器,就可以直接与单⽚机的 UART 串⼝连接起来,并且使⽤完全相同的异步串⾏通信协议。

基于RS485的多机串口通信网络.

基于RS485的多机串口通信网络.

基于RS485的多机串口通信网络葛姣,高清维(安徽大学,安徽合肥200039[摘要]本文介绍了一种基于RS485多机串口通信网络,详细阐述了系统通信网络的组建,自定义通信协议和实现程序。

[关键词]口通信;RS485;单片机;多机通信系统[中图分类号]TN915.02[文献标识码]B1.引言RS485总线是一种多点、差分数据传输的通信接口,其简洁灵活、硬件接口简单、软件易实现、性价比较高、传输距离较远、误码率较低、抗干扰能力强等优点在工业控制系统中特别是中小型数据采集和控制系统得到了广泛的应用。

由于RS485只规定了平衡驱动器和接收器的电气特性,而没有规定插件传输电缆和通信协议,所以为了保证数据传输的正确性,除了硬件上的抗干扰措施外,还在软件设计和通信协议的制订上采取必要的措施。

本文以生物培养装置为例,讨论PC 机与多个单片机之间串行通信的问题。

2.系统硬件设计2.1PC/104与RS485总线之间的连接本系统的PC 主机采用PC/104模板,其通信接口可以与RS485总线直接相连接,不需要在PC 主机和RS485总线之间加装RS232/RS485标准转换芯片。

单片机采用RS 485进行串行通信,只需要将TTL 电平的串行接口通过芯片转换为RS485串行接口,这种转换比较简单,本系统采用的是MAX485芯片。

其连接如图1所示。

图1系统总体连接图2.2RS485总线连接的多单片机通信在生物培养系统中,利用一台PC 机与四个单片机组成多机通信系统,采用主从式结构:主机(PC/104控制多个单片机(C51单片机,作为从机的单片机在正常状态下不主动向主机发送命令或数据,一切都由PC 主机控制;在该系统中,只有一台主机,各台从机相对独立,从机间不能相互通信。

采用RS 485构成的多机通信系统原理框图,如图2所示。

在总线末端接一个匹配电阻,吸收总线上的反射信号,使得正常传输信号无毛刺。

匹配电阻的取值应该与总线的特性阻抗相当。

新华龙基于RS485的多机通信程序

新华龙基于RS485的多机通信程序

//-----------------------函数声明,变量定义---------------------#include <reg51.h>sbit RE_DE=P1^0;#define COUNT 10 // 定义接收缓冲区大小#define Slaver_NUM 10unsigned char bdata flag; //在可位寻址去定义一个标志变量sbit time_over_flag =flag^0; //接收超时标志unsigned char buffer[COUNT]; //定义缓冲区unsigned char point; //定义缓冲区位置指示unsigned char Slave_AD[Slaver_NUM]; //定义有效地址存放区unsigned char ADD_num; //有效地址个数unsigned char idata count_10ms; //用于表示有多少次10ms中断unsigned char idata send_data[7]={0x31,0x32,0x33,0x34,0x35,0x36,0x37}; //与定义发送数据,共7位void UART_init(); //串口初始化函数void COM_send(void); //串口接收函数unsigned char CLU_checkdata(void); //计算校验位函数//---------------------------------------------------------------// 函数名称: UART_init()串口初始化函数// 函数功能:在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s // 串口接收中断允许,发送中断禁止,设定定时器中断允许//---------------------------------------------------------------void UART_init(){//初始化串行设置SCON =0x58; //选择串口工作方式为1,打开接收允许,TB8=1 TMOD =0x21; //定时器1工作在方式2,定时器0工作在方式1TR1 =1; //启动定时器T1ES=1; //允许串行口中断PS=1; //设计串行口中断优先级//初始化定时器1TH1 =0xfd; //实现波特率9600(系统时钟11.0592MHZ)ET1 =0; //定时器1中断禁止}//---------------------------------------------------------------// 函数名称: timer0_init()初始化定时器0// 函数功能:设置timer0工作模式//---------------------------------------------------------------void timer0_init(){time_over_flag=0;count_10ms=0;ADD_num=0;TL0=0x0F0; //T0用于产生10ms的中断TH0=0x0D8; //50次T0中断产生1次超时溢出ET0=1; //允许定时器0中断}//---------------------------------------------------------------// 函数名称: system_init()系统初始化// 函数功能:调用串口、定时器初始化函数,完成系统初始化//---------------------------------------------------------------void system_init(void){//系统总设置UART_init();timer0_init();EA =1; //单片机中断允许}//---------------------------------------------------------------// 函数名称: com_interrup()串口接收中断处理函数// 函数功能:接收包括起始位"S"在内的十位数据到数据缓冲区//---------------------------------------------------------------com_interrupt(void) interrupt 4 using 3{unsigned char RECEIVR_buffer;if(RI) //处理接收中断{RI=0; //清除中断标志位RECEIVR_buffer=SBUF; //接收串口数据if(point==0) //如果还没有接收到起始位{if(RECEIVR_buffer==0xFE) //判断是否起始标志位{buffer[point++]=RECEIVR_buffer;//把接收到的数据放入接收缓存区}elsepoint=0; //不是,继续等待起始位}else if(point>0&&point<10) //判断是否接收够十位数据buffer[point++]=RECEIVR_buffer; //不够,把接收到的数据放入接收缓存区else if(point==10){if(RECEIVR_buffer==0xEF) //判断结束标志位是否正确{buffer[point]=RECEIVR_buffer; //把接收到的数据放入接收缓存区 Slave_AD[ADD_num++]=buffer[2]; //把接收到的地址放到地址存储器//表示该地址有有效设备}elsepoint=0; //不是,继续等待起始位}else point=0; //缓冲区已满,清除缓存区内数据重新接收}if(TI) //串口发送中断{TI=0; //清除发送中断}}//---------------------------------------------------------------// 函数名称: timer0_interrup()// 函数功能:定时器T0中断服务程序// 函数说明:T0枚10ms中断一次,连续中断50次置time_over_flag=1;timer0_interrupt(void) interrupt 1 using 2{count_10ms++;if(count_10ms==50){ET0=0; //关闭定时器T0中断TR0=0; //停止定时器T0time_over_flag=1;//设置接收超时标志count_10ms=0x00; //10ms计数器复位}else{TL0=0x0F0; //重装定时器初始值TH0=0x0D8;}}//---------------------------------------------------------------// 函数名称: COM_send()串口发送函数// 函数功能:把数据缓冲区的十位数据发送出去//---------------------------------------------------------------void COM_send(void){RE_DE=1; //设置MAX483进入发送状态for(point=0;point<=10,TI=1;point++) //连续发送十位数据 //把缓存区的数据都发送到串口{SBUF=buffer[point];TI=0;}RE_DE=0; //设置MAX483进入接收状态}//---------------------------------------------------------------// 函数名称: write_buffer()// 函数功能:写发送缓冲区十位数据void write_buffer(unsigned char slaver_add){unsigned char i;TB8=1; //打开多机通信方式buffer[0]=0xFE;buffer[1]=slaver_add;for(i=2;i<9;i++) //连续发送十位数据//把缓存区的数据都发送到串口{buffer[i]=send_data[i-2];}buffer[9]=0xEF;}//---------------------------------------------------------------// 函数名称:主函数// 函数功能:调度个子函数,完成通信过程//---------------------------------------------------------------void main(void){unsigned char i=0;system_init(); //系统初始化do{ //查旬0到10好地址有没有对应设备write_buffer(i++); //写查询第i号设备的发送信息COM_send(); //调用发送函数,完成发送timer0_init(); //完成一次查询,重新初始定时器0,准备下一次查询}while(time_over_flag&&i<10);}。

RS485主从式多机通讯协议

RS485主从式多机通讯协议

RS485主从式多机通讯协议1.RS485简介2.主从式多机通信协议RS485主从式多机通信协议允许一个主设备控制多个从设备,实现主设备与从设备之间的数据传输和通信协调。

主从式通信分为两个角色,即主机和从机。

主机是整个系统的控制中心,负责向从机发送指令和收集数据。

从机是被控制的设备,负责执行主机发送的指令并向主机发送数据。

3.数据传输格式4.通信流程-主机发送请求:主机向从机发送请求指令。

-从机应答:从机接收到请求指令后,执行相应操作,并向主机发送应答数据。

-主机接收应答:主机接收到从机的应答数据。

-主机发送下一个请求:主机根据需要继续发送下一个请求指令,重复上述步骤。

5.地址识别与从机选择在RS485主从式多机通信协议中,每个从机都有一个唯一的地址,主机通过地址来识别并选择要与之通信的从机。

通常采用软件设置的方式,主机在发送请求指令时会将目标从机的地址加入请求帧中,从机在接收到请求帧后,会根据地址判断是否为自己的请求。

6.错误处理机制RS485主从式多机通信协议中,为了保证通信的可靠性,需要引入一些错误处理机制。

例如,可以使用CRC校验来检测数据传输过程中的错误,并进行错误重传。

此外,还可以使用超时机制来处理通信过程中出现的超时情况。

7.适用范围总结:RS485主从式多机通信协议是一种常用于工业控制领域的通信标准。

它采用主从式通信模式,支持一个主设备控制多个从设备。

数据传输以帧为单位,采用差分技术提高信号传输的可靠性和抗干扰能力。

通信流程包括主机发送请求、从机应答、主机接收应答和主机发送下一个请求。

地址识别与错误处理机制是确保通信可靠性的重要部分。

RS485主从式多机通信协议适用于工业自动化等环境中的数据传输和控制应用。

RS485实验指导书

RS485实验指导书

实验一实验板点对点通信【实验目的】1. 建立双机通信的概念2. 掌握单片机串行口通信的编程和调试方法。

3. 掌握异步串行通信的数据格式及数据协议设定。

【实验环境】PC机一台,keil开发环境一套,RS232通信线【实验重点及难点】串行口通信的程序的设计,以及硬件的连接数据通信的协议等。

【实验原理介绍】1.1 程序下载方式介绍1.1.1 RS232与上位机通信下载程序由于要从上位机中下载程序到单片机中,所以需要建立他们之间的通信线路。

本实验采用MAX232芯片,max232是一种把电脑的串行口rs232信号电平(-10 ,+10v)转换为单片机所用到的TTL信号点平(0 ,+5)的芯片,下面介绍一下max232引脚图,看下面的图。

图3.1 max232引脚图本实验中采用11、12、13、14号管脚作输入输出,其中13、14与DB9连接,11、12与单片机连接。

1.1.2 485通信485通信的过程如下:从DB9接收数据,经过max485芯片实现电平转换,然后max485芯片经过高速光耦与单片机通信,将数据送入单片机中进行处理;处理完成后将数据返回至max485,再经DB9输出。

如此就可实现两单片机之间的通信或单片机与上位机间的通信。

下面介绍一下max485芯片接线方法,如下图示:图2 max485接线图其中1、4为输入输出管脚,经光耦与单片机连接,2、3为使能端,6、7为与外部通信接口。

1.2 MCU功能介绍本实验中选择stc12c5a60s2系列单片机,其管脚图如下:图3 tc12c5a60s2单片机管脚图stc12c5a60s2系列单片机是单时钟的单片机,增强型8051内核,速度比普通8051快8~12倍,宽电压:5.5~3.5V,2.2~3.8V,低功耗设计:空闲模式,掉电模式,工作频率:0~35MHz.时钟:外部晶体或内部RC振荡器可选,在ISP下载编程用户程序时设置。

全双工异步串行口,兼容8051的串口。

RS485总线实现多机通信

RS485总线实现多机通信
处理接收字符 * * 发送消息,
图 $ 也涵盖了前两种方式的应用,在上层计算机上由网络 实现两台计算机的相互通信, 实行双机热备, 下层设备采用双机 切换模块。
!
双机切换的程序解决方式 当两台监控计算机不存在主辅机之分时,都可作为独立的
工作站对下层进行监控时, 以 上方式将不适用,必须寻求新 的解决方式。当 与 下 层 ,-.&/ 设备的 ) * + 驱动程序可由自己 开发时, 可采用程序解决方式。 它既可满足双机热备,也可满 足工作站独立监控。其原理如 图 !。
!
已有的解决方式 实 现 !"#$% 网 络 多 主 节 点 通 信 的 方 式 在 以 往 的 论 文 中 也
H 驱动程序都启动了,只是从机不从自身的 G F H 驱动程序采集
数据而 以 , 但 这 样 不 能 保 证 启 动 后 的 G F H 驱 动 程 序 不 对 !"#$% 总线进行通信访问。
图! 程序解决方式的应用
__B4K:J?KK9O? @@Y8ZCFD<8E6[ ZUAAFM
8JS1+JJSZ+=)‘a[
ZUAA[
895:‘4>-5EOV?+Tb?;:@OS<89:;<I3?E:[ )Z‘)Z)=IFM * * 重新启动事件 ,?K?:I3?E:@OS<89:;<I3?E:FM 6H=57?N5O5E P Q?:=5;L14RE:@FM c * * 如果超过一定时间没有接收到数据则认为主机故障 , 辅 机 转 换 为 主
(D* 增加一个 !"#$% 双机切换模块 为 了 解 决 !"#$% 多 主 通 信 问 题 还 可 以 增 加 一 个 硬 件 模 块

RS485双机程序2010下

RS485双机程序2010下

RS485双机程序:Main.c //文件名#include”../inc/drivers.h”//包含驱动相关头文件、#include”../inc/lib.h”//包含库相关头文件#include<string.h> //包含字处理相关函数头文件#include <stdio.h> //包含标准输入/输出头文件#include”../inc/macro.h> // 包含宏定义头文件#pragma import (__ __ use_no_semihosting_ swi )#define WrUTXHo (ch) (*(volatile unsigned cher * )0x50000020)=(unsigned cher)(ch) #define WrUTXHo (ch) (*(volatile unsigned cher * )0x50004020)=(unsigned cher)(ch) #define GPHCON (*(volatile unsigned cher * )0x56000070) //GPH控制寄存器#define GPHCON (*(volatile unsigned cher * )0x6000074) //GPH数据寄存器int main (void){char cl (1);char err;ARMTargetInit ( );GPHCON = (GPHCON&0x3ffff3) ︴(0x01<< 2); //配置成输出Uart_Print(0.”\n”); //输出换行Uart_Print (0.”please input 1 or 2,1 is master,2 is slave “);//提示选择主机或从机err = Uart_Getchn (cl,0,0); //从键盘输入接收字符if (*cl= = …1‟) { // 如果输入1,选择主机Uart_Printf (0,”\nyou have input 1”); //输出提示信息While ( 1 ){GPHDAT ︴= ( 1<< 1 ); //GPH1 置1,发送使能Uart_SendByte ( 0,0xa ); //换行Uart_SendByte ( 0,0xd ); //回车err = Uart_Getchn (cl,0,0); //从串口采集数据Uart_SendByte ( 0, cl[0] ); //显示采集数据Uart_SendByte ( 2, cl[0]); //向总线发送数据}}else if ( * cl = = …2 … )Uart_ Printf ( 0, “\\ nyou have input 2” );While (1){GPHDAT & = = ~( 1 < < 1 );Uart_SendByte ( 0,0xa );Uart_SendByte ( 0,0xd );err = Uart _ Getchn ( cl, 2,0 );Uart_SendByte ( 0, cl[0]);}}return 0;}。

RS485通讯

RS485通讯

精通RS485通讯系列教程一、通讯基础知识1.1什么是通讯要搞清楚RS485通讯我们要先搞明白什么是通讯,通讯就是两个设备之间0、1代码的传递,0-低电平1-高电平。

举例:A设备向B设备传递数据,首先A设备和B设备之间必须通过电缆连接(硬件连接)。

如果A设备要向B设备发送101010这样一串代码,那么A设备就要在他的通讯端口产生如下图所示的高低电平的组合,通过电缆这个介质B设备的通讯端口就会接收到A设备发出高低电平的组合,同时就会将接收到的高低电平组合翻译成101010,这就完成了A设备向B设备数据的传递,B 设备向A设备数据传递也是同样的道理。

与通讯有个的概念。

【全双工与半双工】全双工是通讯端口在发送数据的同时可以接收数据。

而半双工指的是同一时刻通讯端口要么只能发送数据,要么只能接收数据。

举例:全双工-打电话时双方都可以说。

半双工:对讲机-同一时刻只能一个人说另一个人听。

【通讯速率】通讯速率也叫通讯波特率是1S内通讯端口发送01代码(或者说是高低电平)的数量。

举例:我们说通讯速率是9.6kbps,就表示通讯端口每秒发送9600个bit的数据,也就是每秒可以产生9600个高低电平(注意:是高低电平总共加起来9600个)。

【主从通讯】是在一个通讯网络中一个站点是主站,其他站点作为从站。

主站和从站之间可以直接进行数据的传递,但是从站与从站之间不能直接进行数据的传递。

如果需要从站之间交换数据也必须要通过主站进行转发。

如下图所示1.2、485通讯定义明白了通讯的基本概念后再理解485通讯就相对容易了,下面我们从通讯介质、通讯方式、通讯类型、物理层四个方面来介绍485通讯。

通讯介质:屏蔽双绞线,也就是我们通常用的带有屏蔽层的两心电缆如下图所示。

通讯方式:半双工通讯类型:主从通讯物理层:9针接口,需要注意的是通常情况下485通讯的9针接口,只需要将两芯电缆接到3号脚和8号脚上,3是信号“﹢”,8是信号“-”。

基于RS485的多主机对等通信系统的设计与实现

基于RS485的多主机对等通信系统的设计与实现

软件优化:提高 通信效率,降低 资源消耗
主从机连接与通信流程实现
硬件连接:RS485 总线连接多个主机, 实现数据传输
通信协议:制定并 实现通信协议,保 证数据传输的准确 性和可靠性
数据传输:实现数 据的发送和接收, 保证数据的完整性 和实时性
错误处理:实现错 误检测和恢复机制 ,保证通信的可靠 性和稳定性
A
B
C、以太网等
降低功耗:优化硬件设 计,降低系统功耗,提
高能源利用率
增强安全性:采用加密 技术,提高通信数据的
安全性
提高兼容性:支持多种 硬件平台和操作系统,
提高系统的通用性
总结与展望
系统特点与优势总结
基于RS485的多主机对等通信系统,实 现了多主机之间的实时通信和数据共享。
03
测试方案:功能测试、性能测试、兼容性 测试等
02
软件环境:操作系统、测试软件、驱动程 序等
04
测试结果分析:测试数据、测试报告、问 题定位等
测试过程及结果分析
测试环境搭建:搭建 测试环境,包括硬件
和软件
测试方法:选择合适 的测试方法,如黑盒 测试、白盒测试等
测试数据准备:准备 测试数据,包括正常

增强系统稳定 性:优化系统 设计,提高系 统抗干扰能力
降低功耗:采 用低功耗器件, 降低系统能耗
扩展应用领域: 将RS485技术 应用于更多领 域,如工业自 动化、智能家
居等
THANK YOU
0 终端电阻:在总线两端添加终端 4 电阻,防止信号反射和干扰
0 硬件测试:通过测试验证硬件设 6 计的正确性和可靠性
通信软件设计
01
02
03
04

485双机通信程序设计说明

485双机通信程序设计说明

“485双机通信”程序设计说明1 程序设计思路与方法本案例程序设计主要分为:串行口通信、按键检测和数码管显示3个部分。

两块单片机初始化后均为接收状态,通过按键扫描模块对KEY1,KEY2,KEY3进行按键判断,单片机通过对P3.3和P1.7的电平检测,每检测到端口有低电平产生则相应实现变量display的加减,使P2.3=0将数据传递给P0口通过数码管显示出来,当按下KEY1键触发外部中断0,单片机由接收态转换为发送态,将数据通过485模块传递给另一块单片机显示出来,然后立即返回接收状态,从而实现双机通信。

1.1 宏定义#define S2RI 0x01 //接收中断请求标志位#define S2TI 0x02 //发送中断请求标志位#define NONE_PARITY 0 //无校验#define PARITYBIT NONE_PARITY //定义校验位#define FOSC 11059200L //系统时钟频率#define BAUD 9600 //串口波特率#define TM (65536-(FOSC/4/BAUD)) //定时器初始时间1.2 定义变量bit busy ; //串口忙信号标志(1表示正在发送,0表示空闲)uint8 rev_data ; //串口接收的数据uint8 display ; //数码管显示数据uint8 seg_sel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00}; //数码管段选数组,显示0-f 1.3 相关函数void Uart2Init(void); //串行口初始化函数void CPUInit(void); //CPU初始化函数,配置相关寄存器和IO口模式void delay(void); //延时函数void ser2_int(void) interrupt 8 using 1 //串口中断处理函数void ex_int0() interrupt 0 //外部中断0处理函数开始If 按键3被按下Then 当前值加一If 按键2被按下Then 当前值减一按键扫描初始化(串口、数码管等)485处于接收态485转换为发送态发送数据(串口中断)485转换回接收态退出按键中断进入按键中断当按键1被按下时,进入中断图1 双机通信流程图2 相关寄存器的配置 2.1 选择485芯片引脚:P_SW2:外围设备功能切换控制寄存器2(不可位寻址)串口2可在2个地方切换,由S2_S 控制位来选择。

RS-485多主机通信的组网方式

RS-485多主机通信的组网方式

RS-485多主机通信的组网方式________ 武汉波仕电子有限公司传统的RS-485组网方式只允许一个主机(上位机),但是在许多情况下要求有多台RS-485主机进行组网。

本文以波仕电子的产品为例介绍两种RS-485多主机通信产品及其组网方式----采用RS-485共享器和采用RS-485交换机。

采用共享器可以允许2台主机,而且可以对这2太主机的发送信号按照发送顺序进行优先排序,避免同时发送导致的系统瘫痪。

而采用交换机可以允许4台主机(上位机)控制下位机,而且光电隔离,但是不能够2个上位机同时发送。

1、采用共享器的RS-485多主机通信方式波仕电子的型号为HUB2485Z的RS-485智能共享器用于两个RS-485主机(上位机)共同控制一个RS-485下位机的通信连接。

HUB2485Z使RS-485总线从传统的允许一个主机扩展到允许2个主机。

HUB2485Z已经有2个上位机插座(DB-9针并且配接线端子)和1个下位机的接线端子,无需修改软件、5V供电。

HUB2485Z适用于两台上位机的RS-485口同时驱动一台下位机的RS-485口。

图1 RS-485的2对1智能共享器HUB2485Z的外型为DB-9(针)/ DB-9(针)转接盒大小,其中DB-9针的RS-485的引脚分配同波仕485A型号的转换器并且配接线端子。

两个DB-9针的上位机RS-485口,如图RS-485(1)和RS-485(2)是完全一样的,可以互换。

下位机RS-485为接线端子,位于如图产品的上侧面,与电源接线端子在一起。

HUB2485Z需要外接5V电源,配套提供。

波仕HUB2485Z智能RS-485集线器能够识别两个上位机RS-485(1)和RS-485(2)的发送顺序,避免同时发送导致的系统瘫痪。

也就是说,即使两个上位机正在同时发送,HUB2485Z会选取发送开始时间领先的上位机正确发送数据,而只有等到这一个上位机的数据发送完毕后,另外一个上位机才可以开始发送数据。

RS485主从式多机通讯协议

RS485主从式多机通讯协议

RS485主从式多机通讯协议一、数据传输协议此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。

它描述了一控制器请求访问其它设备的过程,如何回应来自其它设备的请求,以及怎样侦测错误并记录。

它制定了消息域格局和内容的公共格式。

此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。

如果需要回应,控制器将生成反馈信息按本协议发出。

1、数据在网络上转输控制器通信使用主—从技术,即仅一设备(主设备)能初始化传输(查询)。

其它设备(从设备)根据主设备查询提供的数据作出相应反应。

主设备可单独和从设备通信,也能以广播方式和所有从设备通信。

如果单独通信,从设备返回一消息作为回应,如果是以广播方式查询的,则从设备不作任何回应。

协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、一错误检测域。

从设备回应消息也由协议构成,包括确认要行动的域、任何要返回的数据、和一错误检测域。

如果在消息接收过程中发生一错误(无相应的功能码),或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。

2、在对等类型网络上转输在对等网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。

这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。

在消息位,本协议仍提供了主—从原则,尽管网络通信方法是“对等”。

如果一控制器发送一消息,它只是作为主设备,并期望从设备得到回应。

同样,当控制器接收到一消息,它将建立一从设备回应格式并返回给发送的控制器。

3、查询—回应周期1)查询查询消息中的功能代码告之被选中的从设备要执行何种功能。

数据段包含了从设备要执行功能的任何附加信息。

错误检测域为从设备提供了一种验证消息内容是否正确的方法。

(2)回应如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。

数据段包括了从设备收集的数据。

RS-485的多机通信方案

RS-485的多机通信方案

76 Microcontrollers &Embedded Systems 2012年第10期www.mesnet.com.cn RS 485的多机通信方案探究魏金文,马维华,吴侨(南京航空航天大学计算机科学与技术学院,南京210016)引 言在嵌入式系统中,多个孤立节点之间的通信越来越重要,尤其是物联网时代的到来,多节点间通信已经成为必不可少的功能。

由此出现了许多通信手段,如RS 232、RS 485、CAN总线、ZigBee等,综合考虑性能和成本,RS485通信无疑是性价比最高的通信方式。

因此探究高效、实用的多机通信方案具有重大的意义。

1 系统框图RS 485多机通信结构图如图1所示。

若干个RS485节点通过总线连接,由网关节点轮询访问索要数据,每个网关节点可以动态地配置IP地址,以便上位机可以通过以太网控制网关节点,从而获得每个RS 485终端节点的数据。

图1中C节点为控制节点,具有RS 485通信功能,T节点为网关节点,除了RS 485功能外,还具有以太网功能,其作用就是将C节点的数据通过以太网功能传送给上位机。

图1 RS 485多机通信结构图2 硬件设计本文采用新唐科技公司的Cortex M054探究RS485多机通信协议。

Cortex M054有两个UART,均可以配置成RS 485模式,此时Cortex M054通过RTSX引脚自动控制RS 485通信方向。

RS 485通过差分传输,A和B两根信号线铰链在一起来抵消各自的干扰。

当A、B信号的电压差大于200mV时,视为逻辑1;当B、A信号的电压差大于200mV时,视为逻辑0。

RS 485硬件原理图如图2所示。

整套RS 485电路独立供电,通过光电耦合器TLP781B+,与系统其他部件分开,以此来隔离干扰。

和CAN总线相同,在机群的两端(第一个节点和最后一个节点),必须加上匹配电阻,吸收反射信号,大小为75Ω左右。

中间节点则不需要如此,因此留出了R1的位置,当节点位于机群两端的时候,则焊接上R1,这种方式大大地增强了电路的灵活性。

rs485通信程序

rs485通信程序

r s485通信程序(总6页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March#ifndef __485_C__#define __485_C__#include <>#include <>#define unsigned char uchar#define unsigned int uint/* 通信命令 */#define __ACTIVE_ 0x01 // 主机询问从机是否存在#define __GETDATA_ 0x02 // 主机发送读设备请求#define __OK_ 0x03 // 从机应答#define __STATUS_ 0x04 // 从机发送设备状态信息#define __MAXSIZE 0x08 // 缓冲区长度#define __ERRLEN 12 // 任何通信帧长度超过12则表示出错uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息uchar dev; // 该字节用于保存本机设备号sbit M_DE = P1^0; // 驱动器使能,1有效sbit M_RE = P1^1; // 接收器使能,0有效void get_status(); // 调用该函数获得设备状态信息,函数代码未给出void send_data(uchar type, uchar len, uchar *buf); // 发送数据帧bit recv_cmd(uchar *type); // 接收主机命令,主机请求仅包含命令信息void send_byte(uchar da); // 该函数发送一帧数据中的一个字节,由send_data()函数调用void main(){uchar type;uchar len;/* 系统初始化 */P1 = 0xff; // 读取本机设备号dev = (P1>>2);TMOD = 0x20; // 定时器T1使用工作方式2TH1 = 250; // 设置初值TL1 = 250;TR1 = 1; // 开始计时PCON = 0x80; // SMOD = 1SCON = 0x50; // 工作方式1,波特率9600bps,允许接收ES = 0; // 关闭串口中断IT0 = 0; //外部中断0使用电平触发模式EX0 = 1; // 开启外部中断0EA = 1; // 开启中断/* 主程序流程 */while(1) // 主循环{if(recv_cmd(&type) == 0) // 发生帧错误或帧地址与本机地址不符,丢弃当前帧后返回continue;switch(type){case __ACTIVE_: // 主机询问从机是否存在send_data(__OK_, 0, dbuf); // 发送应答信息,这里buf的内容并未用到break;case __GETDATA_:len = strlen(dbuf);send_data(__STATUS_, len, dbuf); // 发送设备状态信息break;default:break; // 命令类型错误,丢弃当前帧后返回}}}void READSTATUS() interrupt 0 using 1 // 产生外部中断0时表示设备状态发生改变,该函数使用寄存器组1{get_status(); // 获得设备状态信息,并将其存入dbuf指向的存储区,数据最后一字节置0表示数据结束}/* 该函数接收一帧数据并进行检测,无论该帧是否错误,函数均会返回* 函数参数type保存接收到的命令字* 当接收到数据帧错误或其地址位不为0时(非主机发送帧),函数返回0,反之返回1 */bit recv_cmd(uchar *type){bit db = 0; // 当接收到的上一个字节为0xdb时,该位置位bit c0 = 0; // 当接收到的上一个字节为0xc0时,该位置位uchar data_buf[__ERRLEN]; // 保存接收到的帧uchar tmp;uchar ecc = 0;uchar i;M_DE = 0; // 置发送禁止,接收允许M_RE =/* 接收一帧数据 */i = 0;while(!c0) // 循环直至帧接收完毕{RI = 0;while(!RI);tmp = SBUF;RI = 0;if(db == 1) // 接收到的上一个字节为0xdb {switch(tmp){case 0xdd:data_buf[i] = 0xdb; // 0xdbdd表示0xdb ecc = ecc^0xdb;db = 0;break;case 0xdcdata_buf[i] = 0xc0; // 0xdbdc表示0xc0 ecc = ecc^0xc0;db = 0;break;defaultreturn 0; // 帧错误,返回}i++;}switch(tmp) // 正常情况{case 0xc0: // 帧结束c0 = 1;break;case 0xdb: // 检测到转义字符db = 1;break;default: // 普通数据data_buf[i] = tmp; // 保存数据ecc = ecc^tmp; // 计算校验字节i++;}if(i == __ERRLEN) // 帧超长,错误,返回 return}/* 判断帧是否错误 */if(i<4) // 帧过短,错误,返回return 0;if(ecc != 0) // 校验错误,返回return 0;if(data_buf[0] != dev) // 非访问本机命令,错误,返回return 0;*type = data_buf[1]; // 获得命令字return 1; // 函数成功返回}/* 该函数发送一帧数据帧,参数type为命令字、len为数据长度、buf为要发送的数据内容 */void send_data(uchar type, uchar len, uchar *buf){uchar i;uchar ecc = 0; // 该字节用于保存校验字节M_DE = 1; // 置发送允许,接收禁止M_RE = 1;send_byte(dev); // 发送本机地址ecc = dev;send_byte(type); // 发送命令字ecc = ecc^type;send_byte(len); // 发送长度ecc = ecc^len;for(i=0; i<len; i++) // 发送数据{send_byte(*buf);ecc = ecc^(*buf);buf++;}send_byte(ecc); // 发送校验字节TI = 0; // 发送帧结束标志SBUF = 0xc0;while(!TI);TI = 0;}/* 该函数发送一个数据字节,若该字节为0xdb,则发送0xdbdd,若该字节为0xc0则,发送0xdbdc */void send_byte(ucharda){switch(da){case 0xdb: // 字节为0xdb,发送0xdbdd TI = 0;SBUF = 0xdb;while(!TI);TI = 0;SBUF = 0xdd;while(!TI)TI = 0;break;case 0xc0: // 字节为0xc0,发送0xdbdc TI = 0;SBUF = 0xdb;while(!TI);TI = 0;SBUF = 0xdc;while(!TI)TI = 0;break;default: // 普通数据则直接发送TI = 0;SBUF = da;while(!TI);TI = 0;}}#endif。

485双机通信案例原理与测试说明

485双机通信案例原理与测试说明

“485双机通信”功能实现说明1程序设计目标及程序运行效果说明程序设计目标:通过本例程理解RS485通信方式,实现双机通信。

程序运行效果:将两块带有485模块的51单片机通过485外接引脚A、B连接起来,单片机上电烧写程序后485模块的D/R引脚所对应的二极管均点亮,然后通过按键KEY3、KEY2控制数码管上的数值进行加减处理,两块单片机起始都默认为接收状态,最后按下KEY1发送键,将数据传送给另一块单片机,而此时接收方数码管上的数值发生相应的改变,与发送方数码管上的数值一致。

2程序相关电路及工作原理说明2.1 RS485通信原理RS232接口是1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。

针对RS232的不足,于是不断出现了新的接口标准,RS485就是其中的一种。

RS485接口的最大传输距离标准值为4000英尺,实际上可达 3000米,另外RS232接口在总线上只允许连接1个收发器,即单站能力。

而RS485接口在总线上是允许连接多达128个收发器。

即具有多站能力,这样用户可以利用单一的RS485接口方便地建立起设备网络。

RS485属于半双工通信,数据可以在一个信号载体的两个方向上传输,但是不能同时进行传输。

电平转换采用差分电路方式,A、B两线的电压差大于0.2认为是逻辑“1”,小于-0.2认为是逻辑“0”,方便与TTL电路连接。

使用RS485进行通信与RS232通信的逻辑是一致的,但RS485抗干扰性更强,传输距离更远。

RS485广泛运用在工业自动化控制、视频监控、门禁对讲以及楼宇报警等各个领域。

图1 485模块电路原理图MAX485芯片的功能是将TTL电平转换为RS485电平,引脚功能如下:(1)485 D/R输出、接收信号控制引脚:当该引脚为低电平时,485为接收态,MAX485通过485_RXD把来自总线的信号输出给单片机;当该引脚为高电平时,485为发送态,来自485_TXD的输出信号通过A、B引脚加载到总线上。

单片机RS485多机通讯的实现

单片机RS485多机通讯的实现

单片机RS-485多机通讯的实现之邯郸勺丸创作摘要本文介绍一种能利用RS-485电气特性和简单的结构方式,采取自定义串行通信协议,实现单片机RS-485多机通讯的方法和技巧。

关键词单片机,RS-485总线,总线冲突,串行通信1 简介RS-485串行总线接口尺度以差分平衡方式传输信号,具有很强的抗共模干扰的能力,允许一对双绞线上一个发送器驱动多个负载设备。

工业现场控制系统中一般都采取该总线尺度进行数据传输,而且一般采取RS-485串行总线接口尺度的系统都使用8044芯片作为通信控制器或各分机的CPU。

8044芯片内部集成了SDLC,HDLC等通信协议,而且集成了相应的硬件电路,通过硬件电路和尺度协议的配合,使系统的通讯准确、可靠、快速。

8044在市场上日渐稀少,虽然有8344可替代,但几百元的价位与普通单片机几元至几十元的价位相差甚远,用户在开发一般的单片机应用系统时,都希望能用简单的电路和简单的通信协议完成数据交换。

譬如:利用单片机自己所提供的简单串行接口,加上总线驱动器如SN75176等组合成简单的RS-485通讯网络。

本文所述的方法已成功地应用于工程项目,一台主机与60台从机通讯,通讯波特率达64KBPS。

2 总线驱动器芯片SN75176经常使用的RS-485总线驱动芯片有SN75174,SN75175,SN75176。

SN75176芯片有一个发送器和一个接收器,非常适合作为RS-485总线驱动芯片。

SN75176及其逻辑如图1所示。

图1 SN75176芯片及其逻辑关系3 RS-485方式构成的多机通信原理在由单片机构成的多机串行通信系统中,一般采取主从式结构:从机不主动发送命令或数据,一切都由主机控制。

而且在一个多机通信系统中,只有一台单机作为主机,各台从机之间不克不及相互通讯,即使有信息交换也必须通过主机转发。

采取RS-485构成的多机通讯原理框图,如图2所示。

图2 采取RS-485构成的多机通讯原理框图在总线末端接一个匹配电阻,吸收总线上的反射信号,包管正常传输信号干净、无毛刺。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(a==0x02)
{
DR=1;
SBUF=0x02;
while(TI!=1);
TI=0;
for(j=0;j<8;j++)
{
SBUF=trbuf[j];
while(TI!=1);
TI=0;
}
}
if(a==0x01)
{
DR=1;
SBUF=0x01;
while(TI!=1);
TI=0;
for(i=0;i<8;i++)
while(TI!=1);
TI=0;
}
}
}
void main()
{
uchar j;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
TR1=1;
SCOБайду номын сангаас=0xd0;
ENLED=0; ADDR3=1;
ADDR0=0; ADDR1=1; ADDR2=1;
while(1)
{
master(0x01);
RS-485双机通信程序
主机程序
此程序的主要特点是加的的校验少,适合初学者利用max485模拟单片机双机通信
建议看程序前看看郭天祥的单片机双机通信或者对于单片机双机通信协议有一个总体的了解,如果有了这个基础我相信你能够很快看明白下面的程序。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define BN 8
sbit DR=P2^6;
sbit ENLED=P1^4;
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
uchar rbuf[8];
uchar trbuf[8]={0xc0,0xf9,0xa4,0xb0,
0xb0,0x92,0x66,0xfF};
uchar rebuf[8];
void delay(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
uchar j;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
0x99,0x92,0x66,0xf8};
void delay(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void master(uchar command)
{
uchar aa,i;
DR=1;
SBUF=command;
while(TI!=1);
PCON=0x00;
TR1=1;
SCON=0xd0;
EA=1;
while(1)
{
DR=0;
ES=1;
for(j=0;j<8;j++)
{
P0=rebuf[j];
delay(1000);
}
}
}
void ssio(void) interrupt 4
{
uchar a,j,i;
RI=0;
ES=0;
a=SBUF;
{
DR=0;
while(RI!=1);
RI=0;
rebuf[i]=SBUF;
}
}
DR=0;
ES=1;
}
master(0x02);
for(j=0;j<BN;j++)
{
P0=rbuf[j];
delay(1000);
}
}
}
从机程序
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DR=P2^6;
uchar trbuf[8]={0x00,0xa4,0xf9,0x90,
TI=0;
DR=0;
while(RI!=1);
RI=0;
aa=SBUF;
if(aa==0x02)
{
for(i=0;i<BN;i++)
{
while(RI!=1);
RI=0;
rbuf[i]=SBUF;
}
}
if(aa==0x01)
{
DR=1;
for(i=0;i<BN;i++)
{
SBUF=trbuf[i];
相关文档
最新文档