多机通信(主从机程序成功)

合集下载

多机通信(主从机程序成功)

多机通信(主从机程序成功)

//---------------------------------------------------------------------------------------主机程序//---------------------------------------------------------------------------------------#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define slave 0x03#define BN 4uchar code tbuf[BN]={0x3f,0x5b,0x66,0x7d};//uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};void init() //初始化{TR1=1;TH1=0xf3;TL1=0xf3;TMOD=0x20;SM0=0;SM1=1;SM2=1;REN=1;}void error() //错误{TB8=1;SBUF=0xf0;while(TI!=1);TI=0;}void send_date(unsigned char data1){SBUF = data1; //将待发送的字符送入发送缓冲器while(!TI); //等待发送完成TI = 0; //发送中断标志请0}/*//向串口发送一个字符串,strlen为该字符串长度void send(uchar *str,uint strlen){uchar p=0;uint k;do{for(k=0;k<strlen;k++){send_date(*(str + k));p+=*(str + k);}send_date(p);while(!RI);RI=0;} while(SBUF!=0);}*/void send() //发送数据并校验和{uchar i;uint p;do{p=0;for(i=0;i<BN;i++){send_date(tbuf[i]);p+=tbuf[i]; P1=0xf0;while(!RI);RI=0;}send_date(p); P1=0x00;while(!RI);RI=0;}while(SBUF!=0);}void chuankou(uchar add,uchar command) //串口函数(地址,命令) {uchar a;while(1){send_date(add);while(!RI);RI=0;if(SBUF!=add)error();else{TB8=0;send_date(command);while(!RI);RI=0;a=SBUF;if((a&0x80)==0x80)error();else{if((a&0x01)==0x01) //从机准备好接收并主机发送数据{ P1=0xef;send(/*tbuf,BN*/);TB8=1;}}}}}void main(){init();chuankou(slave,0x01);while(1);}//-------------------------------------------------------------------------------------------------从机程序//-------------------------------------------------------------------------------------------------- #include<reg52.h>#define uchar unsigned char#define uint unsigned int#define slave 0x03#define BN 4uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; uchar rbuf[BN];bit rready;void delay(void) //误差0us{unsigned char a,b,c;for(c=167;c>0;c--)for(b=171;b>0;b--)for(a=16;a>0;a--);}void init() //初始化{TR1=1;TH1=0xf3;TL1=0xf3;TMOD=0x20;SM0=0;SM1=1;SM2=1;REN=1;EA =1;ES =1;P2=0xff;}void error() //错误{SM2=1;ES=1;}void send_date(unsigned char data1) //发送字符{SBUF = data1; //将待发送的字符送入发送缓冲器while(!TI); //等待发送完成TI = 0; //发送中断标志请0}void receive() //接收并校验和{uchar a,i,p;rready=0;while(1){p=0;for(i=0;i<BN;i++){while(!RI);RI=0;rbuf[i]=SBUF;a=SBUF;P2=a;p+=rbuf[i];delay();send_date(0);} P2=tab[9];while(!RI);RI=0;if(SBUF==p){send_date(0x00);break;}elsesend_date(0xff);}}void main(){init();while(1){rready=1;}}void ssio()interrupt 4{uchar a;ES=0;RI=0;if(SBUF!=slave){error();goto reti;}else{send_date(slave);while(!RI);RI=0;a=SBUF;SM2=0;if((a!=0x01)&&(RB8==1)){send_date(0x80);error();goto reti;}else{if((a==0x01)&&(rready==1)){send_date(0x01);receive();}}}reti:;}。

多机通信的原理及过程

多机通信的原理及过程

多机通信的原理及过程多机通信指的是多台计算机之间通过网络进行通信。

其原理和过程可以分为以下几个步骤:1. 网络连接:首先,多台计算机需要建立起网络连接,常见的连接方式有有线连接和无线连接。

通过物理设备(例如交换机、路由器等)将不同计算机连接起来,构建起一个局域网或者广域网。

2. IP寻址:每台计算机都需要分配一个唯一的IP地址,用于在网络中标识这台计算机。

IP地址可以由网络管理员手动分配,或者通过DHCP(动态主机配置协议)自动分配。

3. 网络协议:在多机通信中,需要使用各种网络协议来进行数据传输和通信。

常见的网络协议有TCP/IP协议、UDP协议等。

TCP/IP协议是一种可靠的传输协议,UDP协议则是一种不可靠但效率较高的传输协议。

4. 数据封装和解封:在发送数据时,数据会被封装成数据包,并通过网络传输到目标计算机。

数据包通常由数据的头部和正文组成,头部中包含了源IP地址、目标IP地址等信息。

在接收端,目标计算机会解封数据包,然后提取出其中的数据。

5. 路由选择和转发:在网络中,数据包需要经过多个路由器的转发才能到达目标计算机。

每个路由器根据转发表来进行数据包的转发,选择最佳路径将数据包转发给下一个路由器,最终到达目标计算机。

6. 数据传输检验:为了保证数据传输的可靠性,通常会对数据进行检验,例如使用校验和、循环冗余检验等方法来验证数据的完整性。

如果数据在传输过程中出现损坏或丢失,接收端可以通过检验结果来发现并请求重新传输。

7. 应用层协议:在多机通信中,应用层协议定义了不同应用程序之间的通信规则。

例如HTTP协议用于在Web浏览器和服务器之间传输网页;FTP协议用于在计算机之间进行文件传输;SMTP协议用于电子邮件的发送等。

总的来说,多机通信的原理和过程包括网络连接、IP寻址、网络协议、数据封装和解封、路由选择和转发、数据传输检验以及应用层协议等步骤。

这些步骤共同构成了多机通信的基本原理和过程。

单片机多机通信实现

单片机多机通信实现

单片机多机通信实现随着科技的进步和应用的需求,单片机成为了嵌入式系统中不可或缺的一部分。

在很多应用场景中,我们需要将多个单片机之间进行通信,以实现数据的传输和协同工作。

本文将介绍单片机多机通信的实现方法。

一、串口通信串口通信是最常见和简单的单片机通信方式之一。

单片机通过串口将数据以字节的形式传输给另一个单片机。

常见的串口通信协议有RS232、RS485和UART等。

其中,RS232是单片机与计算机之间的标准通信协议,而RS485适用于单片机与多个设备之间的通信。

串口通信需要注意以下几个方面:1. 波特率的设置:通信双方需要设定相同的波特率,以确保数据的准确传输。

2. 数据格式的规定:包括数据位、校验位和停止位等,通讯双方需要设置相同的数据格式。

3. 通信控制的实现:通过编程控制单片机的串口发送和接收功能,实现数据的传输。

二、I2C通信I2C(Inter-Integrated Circuit)是一种串行总线协议,它可实现多个单片机的通信和协同工作。

I2C通信需要引入一个主设备和多个从设备的概念,主设备控制通信的起止和数据的传输,从设备用于接收和发送数据。

I2C通信需要注意以下几个方面:1. I2C地址的分配:每个从设备通过唯一的地址与主设备进行通信,地址的分配需要事先规划好。

2. 数据的读写操作:通过发送特定的控制信号,主设备可以向从设备发送读或写的命令,并接收从设备返回的数据。

3. 时序的控制:I2C通信依赖于时钟信号和数据信号的同步,通信双方需要根据协议规定好时序的控制。

三、SPI通信SPI(Serial Peripheral Interface)通信是一种全双工、同步的通信协议。

它通过4根线进行通信,包括时钟、数据输入、数据输出和片选信号。

SPI通信适用于多个主设备与多个从设备之间的通信,可以实现数据的传输和设备的控制。

SPI通信需要注意以下几个方面:1. 主从设备的选定:SPI通信中,每次只有一个主设备能够与从设备进行通信,其他设备通过片选信号进行选择。

modbus一主多从的连接方式__概述说明以及解释

modbus一主多从的连接方式__概述说明以及解释

modbus一主多从的连接方式概述说明以及解释1. 引言1.1 概述本文将介绍和解释一主多从的Modbus连接方式。

Modbus是一种通信协议,常被用于工业自动化系统中的设备之间的数据交换。

在一些应用场景中,一个主设备(也称为主站)需要同时与多个从设备(也称为从站)进行通信。

因此,了解和掌握实现这种连接方式的方法对于工程师和技术人员来说至关重要。

1.2 文章结构本文将按照以下结构组织内容:首先,我们将简要介绍Modbus协议及其功能特点。

其次,我们将解释主从模式,并说明它在一主多从连接方式中的作用。

然后,我们将详细阐述实现该连接方式的硬件和软件配置要点。

接下来,我们将列举一些常见问题,并提供相应的解决方法。

最后,在实例分析和应用场景说明部分,我们将通过案例分析和参数设定说明来进一步展示该连接方式在实际应用中的作用。

1.3 目的本文旨在提供关于Modbus一主多从连接方式的全面概述、说明和解释。

读者通过阅读本文可以获得以下收益:- 了解Modbus协议及其在工业自动化系统中的应用;- 理解主从模式在一主多从连接方式中的作用;- 掌握实现一主多从连接方式的硬件和软件配置要点;- 学习解决一主多从连接中的常见问题的方法;- 通过实例分析和应用场景说明,了解该连接方式在实际应用中的具体情境和效果。

通过对这些内容的了解,读者将能够更好地理解并运用Modbus一主多从连接方式,并可以为工业自动化系统中设备之间的通信提供有效的解决方案及优化策略。

2. Modbus一主多从的连接方式2.1 Modbus协议简介Modbus是一种常用的串行通信协议,用于在工业自动化领域中连接不同设备。

它基于主从架构,其中一个设备作为主机(Master),负责发起通信请求;其他设备作为从机(Slave),接收并处理主机的请求。

2.2 主从模式说明在Modbus通信中,主从模式是指一个主机控制多个从机的通信过程。

主机负责发送请求数据并获取响应数据,而从机则接收来自主机的请求,并提供相应的数据。

基于51的MODBUS-RTU多机主从通信

基于51的MODBUS-RTU多机主从通信

基于51的MODBUS-RTU多机通信实验环境:Proteus编程语言:汇编编程环境:KEIL单片机: AT89C51,AT89C52晶振:11.0592MHz功能说明:本实验运用了MODBUS-RTU通信协议的功能码03多寄存器读和功能码10多寄存器写,其中主机首先通过03功能码读取1号从机的时,分和秒的值,并将它们用液晶LCD显示器显示出来。

然后利用10功能将读取的值送入2号从机,2号从机在接收到主机送来的数据后再将它们以与1号从机相同的方式显示出来。

为1号从机设置了按钮,可调节它的时间,同是主机和2号从机也随之显示相同的时间。

图示:部分程序源代码:1、主机ORG 000HLJMP MAINORG 000BHLJMP TMR0ORG 0023HLJMP USARTORG 0040HMAIN: ACALL INITHERE: CLR RS0CLR RS1JB FLAG2.7,TXWORKJB UFLAG.7,RXWORK;AJMP HERETXWORK: AJMP TXWORK1RXWORK: CLR UFLAG.7;**********接收完成,显示操作JB UFLAG.3,RXWMB03RXWMB10: JNB UFLAG.5,HEREAJMP RXMBW101RXWMB03: CLR UFLAG.3MOV R0,#HOUR1MOV A,CND3CLR CRRC AMOV R7,AMOV R1,#CND5 RWORK1: MOV A,@R1MOV @R0,AINC R1INC R1INC R0DJNZ R7,RWORK1MOV DSPC,#8 TIMDIS: MOV A,DSPCMOV DPTR,#DISTBMOVC A,@A+DPTRMOV LCDD,AACALL LCDWPMOV A,#HOUR1ADD A,DSPCMOV R1,AMOV A,@R1MOV B,#10DIV ABACALL DISPMOV A,BACALL DISPDEC DSPCJNB DSPC.7,TIMDIS CLR RENSETB URDMOV CND1,#0A1H MOV CND2,#10H MOV CND3,#0MOV CND4,#50H MOV CND5,#0MOV CND6,#3MOV CND7,#6MOV CND8,#0MOV CND9,HOUR1 MOV CND10,#0 MOV CND11,MIN1 MOV CND12,#0 MOV CND13,SEC1MOV CND15,#0A5HMOV CNDT,#0MOV CNDT1,#15SETB TB8MOV SBUF,CND1AJMP HERE;******************************** RXMBW101: CLR UFLAG.5MOV CNDT,#0MOV CNDT1,#8AJMP HERE;************************************** TXWORK1:CLR FLAG2.7;1S定时CLR RENSETB URD/* MOV CND1,#30HMOV CND2,#31HMOV CND3,#32HMOV CND4,#33HMOV CND5,#34HMOV CND6,#35HMOV CND8,#37HMOV CND9,#38H*/MOV CND1,#0A0H;地址MOV CND2,#03H ;功能码MOV CND3,#0 ;起始地址2字节MOV CND4,#3BHMOV CND5,#0 ;数据长度MOV CND6,#3MOV CND7,#5AHMOV CND8,#0A5HMOV CNDT,#0MOV CNDT1,#8SETB TB8MOV SBUF,CND1AJMP HERE;*******************************DISTB: DB81H,84H,87H,0C1H,0C4H,0C7H,91H,94H,97H,0D1H,0D4H,0D 7H;*************USART: PUSH PSWPUSH ACCSETB RS0SETB RS1JBC RI,RXINT;发送中断,清中断标志位并转中断处理TXINT: CLR TIINC CNDTMOV A,CNDTCJNE A,CNDT1,TXGN;必须在发送前检测,若在后的话,则最后一个字节可能不能正确传输TXSTP: SETB UFLAG.6;发送结束标志MOV CNDT,#0MOV CNDT1,#8CLR URDSETB RENAJMP UOUT;********************TXGN: MOV A,#CND1ADD A,CNDTMOV R0,ACLR TB8MOV SBUF,@R0UOUT: POP ACCPOP PSWRETI;*************************RXINT: MOV RXDT,SBUFMOV A,CNDTCJNE A,#1,RXINT1MOV A,RXDTCJNE A,#03H,RXMD10MOV CNDT1,#5SETB UFLAG.3;MODBUS03功能AJMP RXSTOR;********************** RXMD10: CJNE A,#10H,RXERORMOV CNDT1,#8SETB UFLAG.5;MODBUS10功能AJMP RXSTOR;********************** RXINT1: JNB UFLAG.3,RXSTORCJNE A,#2,RXSTORMOV A,RXDTADD A,CNDT1MOV CNDT1,ARXSTOR: MOV A,#CND1ADD A,CNDTMOV R0,AMOV @R0,RXDT;CLR RIINC CNDTMOV A,CNDTCJNE A,CNDT1,RXOUTCRCCK: MOV A,@R0 ;发送来的数据变形与否的最简单校验SWAP ADEC R0XRL A,@R0JNZ RXERORSETB UFLAG.7MOV CNDT1,#16MOV CNTM_OV,#200RXEROR: MOV CNDT,#0AJMP UOUTRXOUT: MOV CNTM_OV,#200AJMP UOUT;****************************** DELA Y: MOV R2,#250DELA Y1: DJNZ R2,DELA Y1RET;***************************;**************定时器0中断处理程序TMR0: PUSH PSWPUSH ACCCLR RS1SETB RS0/*MOV A,CNTM_OVJZ TMR01DEC CNTM_OVMOV A,CNTM_OVJNZ TMR01CLR URDSETB REN*/TMR01: DJNZ TM0T1,RETIFMOV TM0T1,#10 ;1msDJNZ TM0TB,RETIFMOV TM0TB,#100DJNZ TM0TS,RETIFMOV TM0TS,#10SETB FLAG2.7;***************** ;中断返回RETIF: CLR RS0POP ACCPOP PSWRETI;***********HD44780读写子程序BUSY: MOV P0,#0FFHCLR LCDRSSETB LCDRWSETB LCDEMOV BIT0,P0CLR LCDEJB BIT0.7,BUSYRETLCDWP: ACALL BUSYCLR LCDRSSJMP LCD1LCDWD: ACALL BUSYSETB LCDRSLCD1: CLR LCDRWSETB LCDEMOV P0,LCDDNOPCLR LCDESETB LCDRSRETLCDW: MOV A,@R0ACALL LCDWDINC R0DJNZ R2,LCDWRET;***************DISP: MOV DPTR,#TIMETBMOVC A,@A+DPTRMOV LCDD,AACALL LCDWDRETTIMETB: DB "0123456789:/abcd" ;****************初始化子程序INIT: MOV SP,#0EFHMOV R1,#TM0TCLR0: MOV @R1,#0INC R1CJNE R1,#FRAM_OV,CLR0LCDINT: MOV LCDD,#38H;LCD初始化子程序ACALL LCDWPMOV LCDD,#01HACALL LCDWPMOV LCDD,#06HACALL LCDWPMOV LCDD,#0CHACALL LCDWPMOV LCDD,#83HACALL LCDWPMOV A,#10ACALL DISPMOV LCDD,#86HACALL LCDWPMOV A,#10ACALL DISPMOV LCDD,#0C3HACALL LCDWPMOV A,#10ACALL DISPMOV LCDD,#0C6HACALL LCDWPMOV A,#10ACALL DISPMOV LCDD,#93HACALL LCDWPMOV A,#10ACALL DISPMOV LCDD,#96HACALL LCDWPMOV A,#10ACALL DISPMOV LCDD,#0D3HACALL LCDWPMOV A,#10ACALL DISPMOV LCDD,#0D6HACALL LCDWPMOV A,#10ACALL DISP;***********************MOV TMOD,#22H;定时器0和1均工作于方式2,定时器1用于串口波特率MOV TH0, #0A3H;11.0592M,100usMOV TL0,#0A3HMOV TM0T,#1MOV TM0T1,#1MOV TM0TB,#5MOV TM0TS,#10;USART初始化MOV TH1,#0FDHMOV TL1,#0FDH; SETB P3.0MOV SCON,#0D0H;串行工作方式3,9为数据传输MOV PCON,#00HSETB URDMOV CNDT,#0MOV CNDT1,#8MOV DSPC,#8MOV UFLAG,#0MOV FLAG2,#0SETB TR0SETB ET0SETB TR1;运行定时器1,但不开中断SETB ES;开串行口中断SETB PSSETB EARET;*************************** END2、1号从机ORG 000HAJMP MAINORG 000BHAJMP TMR0ORG 0023HAJMP USARTORG 0040HMAIN: ACALL INITHERE: CLR RS0CLR RS1JNB UFLAG.7,TIMDC HERE2: CLR UFLAG.7CLR RENSETB URDMOV A,CND6MOV R7,ACLR CRLC AMOV CND3,AADD A,#5MOV CNDT1,AMOV R0,CND4MOV R1,#CND4 MDBS03T:MOV @R1,#0INC R1MOV A,@R0MOV @R1,AINC R0INC R1DJNZ R7,MDBS03TMOV @R1,#5AHINC R1MOV @R1,#0A5HMOV CNDT,#0ACALL DELA YCLR TB8MOV SBUF,CND1TIMDC: JB FLAG2.7,KEYSCAN TIMEDC: MOV A,HOURMOV B,#10DIV ABJNZ TIMH1MOV DIS7,#11AJMP TIMH2;************************ TIMH1: MOV DIS7,ATIMH2: MOV DIS6,B TIMEM: MOV A,MINUTEMOV B,#10DIV ABMOV DIS4,AMOV DIS3,BTIMES: MOV A,SECONDMOV B,#10DIV ABMOV DIS1,AMOV DIS0,BAJMP HERE;*************************KEYSCAN:CLR FLAG2.7MOV A,P1ORL A,#0E0HMOV P1,ANOPNOPMOV A,P1ANL A,#0E0HXRL A,#0E0HJZ NKEYMOV KTEMP,AAJMP HERENKEY: JB KTEMP.KEY0,KSET JB KTEMP.KEY1,KADDJNB KTEMP.KEY2,KOUTAJMP KSUBKSET: JB FLAG2.0,KSET1SETB FLAG2.0AJMP KOUTKSET1: INC FLAG2SETB FLAG2.0JNB FLAG2.2,KOUTMOV FLAG2,#0 KOUT: MOV KTEMP,#0AJMP TIMEDCKADD: JNB FLAG2.0,KOUT MOV R0,#MINUTEJNB FLAG2.1,KADD1MOV R0,#HOURKADD1: INC @R0JB FLAG2.1,HOURACJNE @R0,#60,KOUT KADD2: MOV @R0,#0AJMP KOUTHOURA: CJNE @R0,#24,KOUT AJMP KADD2KSUB: JNB FLAG2.0,KOUTMOV R0,#MINUTEJNB FLAG2.1,KSUB1MOV R0,#HOURKSUB1: DEC @R0MOV A,@R0JNB ACC.7,KOUTJB FLAG2.1,KSUBH0MOV @R0,#59AJMP KOUTKSUBH0: MOV @R0,#23AJMP KOUT;****************定时器0中断处理TMR0: PUSH PSWPUSH ACCSETB RS0CLR RS1DJNZ TM0T,TIMEMOV TM0T,#20T0DIS: MOV P0,#0MOV A,P1ANL A,#0F8HORL A,DSPCMOV P1,AMOV A,#DIS0ADD A,DSPCMOV R0,AMOV A,@R0MOV DPTR,#LEDTBMOVC A,@A+DPTRMOV P0,ADEC DSPCJNB DSPC.7,TIMEMOV DSPC,#7;********************************************** TIME: DJNZ TM0T1,RETIFMOV TM0T1,#10 ;1msDJNZ TM0TB,RETIFMOV TM0TB,#100SETB FLAG2.7DJNZ TM0TS,RETIFMOV TM0TS,#10INC SECONDMOV A,SECONDCJNE A,#60,TIMEHMOV SECOND,#00HINC MINUTEMOV A,MINUTECJNE A,#60,TIMEHMOV MINUTE,#00HINC HOURMOV A,HOURCJNE A,#24,TIMEHMOV HOUR,#00HTIMEH:RETIF: POP ACCPOP PSWRETI;*********************;***********七段共阴数码管LEDTB: DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H,00H ;******************************/*TIMEH1: SETB URDSETB UFLAG.4MOV CND1,#0A0HMOV CND2,#10HMOV CND3,#0MOV CND4,#40HMOV CND5,#0MOV CND6,#3MOV CND7,#6MOV CND8,#0MOV CND9,HOURMOV CND11,MINUTEMOV CND12,0MOV CND13,SECONDMOV CND14,#5AHMOV CND15,#0A5HMOV CNDT,#0MOV CNDT1,#15SETB UFLAG.6CLR UFLAG.5AJMP RETIF;******************/;*************USART: PUSH PSWPUSH ACCSETB RS0SETB RS1JBC RI,RXINT;发送中断,清中断标志位并转中断处理TXINT: CLR TIINC CNDTCJNE A,CNDT1,TXGN;必须在发送前检测,若在后的话,则最后一个字节可能不能正确传输TXSTP: MOV CNDT,#0MOV CNDT1,#8CLR URDSETB RENAJMP UOUT;********************TXGN: MOV A,#CND1ADD A,CNDTMOV R0,ACLR TB8MOV SBUF,@R0UOUT: POP ACCPOP PSWRETIRXAD: MOV A,RXDTCJNE A,#0A0H,RXERORCLR SM2AJMP RXSTORRXINT: MOV RXDT,SBUFJZ RXADCJNE A,#1,RXSTORMOV CNDT1,#8RXSTOR: MOV A,#CND1ADD A,CNDTMOV R0,AMOV @R0,RXDTINC CNDTMOV A,CNDTCJNE A,CNDT1,RXOUTCRCCK: MOV A,@R0 ;接收到的数据变形与否的简单校验SWAP ADEC R0XRL A,@R0JNZ RXERORSETB UFLAG.7MOV CNDT1,#16RXEROR: SETB SM2MOV CNDT,#0RXOUT: AJMP UOUT;***********************DELA Y: MOV R2,#250DELA Y1: DJNZ R2,DELA Y1RET;****************初始化子程序INIT: MOV SP,#5FHMOV R1,#DIS0MOV DSPC,#0CLR URDCLR0: MOV @R1,#0INC R1CJNE R1,#HOUR,CLR0MOV DSPC,#7MOV DIS2,#10MOV DIS5,#10MOV TMOD,#22H;定时器0和1均工作于方式2,定时器1用于串口波特率MOV TH0, #0A3H;11.0592M,100usMOV TL0,#0A3HMOV TM0T,#1MOV TM0T1,#1MOV TM0TB,#5MOV TM0TS,#10;USART初始化MOV TH1,#0FDHMOV TL1,#0FDHMOV SCON,#0F0H;串行工作方式2,9为数据传输MOV PCON,#00HCLR URDMOV CNDT,#0MOV CNDT1,#8MOV UFLAG,#0MOV FLAG2,#0SETB TR0SETB ET0SETB TR1;运行定时器1,但不开中断SETB ES;开串行口中断SETB PSSETB EARET;***************************END3、2号从机ORG 000HLJMP MAINORG 000BHLJMP TMR0ORG 0023HLJMP USARTORG 0040HMAIN: ACALL INITHERE: CLR RS0CLR RS1JB UFLAG.7,HERE2 AHERE: AJMP HEREHERE2: CLR RENCLR UFLAG.7;**********接收完成,显示操作MOV R0,CND4MOV R7,CND6MOV R1,#CND9HERE1: MOV A,@R1MOV @R0,AINC R1INC R1INC R0DJNZ R7,HERE1 TIMEDC: MOV A,HOURMOV B,#10DIV ABJNZ TIMH1MOV DIS7,#11AJMP TIMH2TIMH1: MOV DIS7,A TIMH2: MOV DIS6,B TIMEM: MOV A,MINMOV B,#10DIV ABMOV DIS4,AMOV DIS3,B TIMES: MOV A,SECMOV B,#10DIV ABMOV DIS1,AMOV DIS0,BSETB URD;从机接收指令后回复报文SECHO: MOV CND7,#5AHMOV CNDT,#0MOV CNDT1,#8CLR TB8MOV SBUF,CND1AJMP HERE;*******************************DISTB: DB81H,84H,87H,0C1H,0C4H,0C7H,91H,94H,97H,0D1H,0D4H,0D7H;*************USART: PUSH PSWPUSH ACCSETB RS0SETB RS1JBC RI,RXINT;发送中断,清中断标志位并转中断处理TXINT: CLR TIINC CNDTMOV A,CNDTCJNE A,CNDT1,TXGN;必须在发送前检测,若在后的话,则最后一个字节可能不能正确传输MOV CNDT1,#8CLR URDSETB RENAJMP UOUT;******************** TXGN: MOV A,#CND1ADD A,CNDTMOV R0,ACLR TB8MOV SBUF,@R0 UOUT: POP ACCPOP PSWRETIRXAD: MOV A,RXDTCJNE A,#0A1H,RXERORCLR SM2AJMP RXSTOR RXINT: MOV RXDT,SBUFMOV A,CNDTJZ RXADCJNE A,#1,RXINT1AJMP RXSTORRXINT1: CJNE A,#6,RXSTORMOV A,RXDTADD A,CNDT1MOV CNDT1,ARXSTOR: MOV A,#CND1ADD A,CNDTMOV R0,AMOV @R0,RXDTINC CNDTMOV A,CNDTCJNE A,CNDT1,RXOUTCRCCK: MOV A,@R0 ;接收到的数据变形与否的简单校验SWAP ADEC R0XRL A,@R0JNZ RXERORSETB UFLAG.7MOV CNDT1,#16RXEROR: SETB SM2RXOUT: AJMP UOUT;****************************** DELAY: MOV R2,#250DELAY1: DJNZ R2,DELAY1RET;***************************;**************定时器0中断处理程序TMR0: PUSH PSWPUSH ACCSETB RS0CLR RS1DJNZ TM0T,TIMEMOV TM0T,#20T0DIS: MOV P0,#0MOV A,P1ANL A,#0F8HORL A,DSPCMOV P1,AMOV A,#DIS0ADD A,DSPCMOV R0,AMOV DPTR,#LEDTBMOVC A,@A+DPTRMOV P0,ADEC DSPCJNB DSPC.7,TIMEMOV DSPC,#7;********************************************** TIME: DJNZ TM0T1,RETIFMOV TM0T1,#10 ;1msDJNZ TM0TB,RETIFMOV TM0TB,#100SETB FLAG2.7DJNZ TM0TS,RETIFMOV TM0TS,#10;***************** ;中断返回RETIF: CLR RS0POP ACCPOP PSWRETI;***********七段共阴数码管LEDTB: DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H,00H ;****************初始化子程序INIT: MOV SP,#05FHCLR URDMOV R1,#TM0TCLR0: MOV @R1,#0INC R1CJNE R1,#RXDT,CLR0;***********************MOV TMOD,#22H;定时器0和1均工作于方式2,定时器1用于串口波特率MOV TH0, #0A3H;11.0592M,100usMOV TL0,#0A3HMOV TM0T,#1MOV TM0T1,#1MOV TM0TB,#5MOV TM0TS,#10;USART初始化MOV TH1,#0FDHMOV TL1,#0FDH; SETB P3.0MOV SCON,#0F0H;串行工作方式3,9位数据传输MOV PCON,#00HMOV CNDT,#0MOV CNDT1,#16MOV DSPC,#7MOV DIS2,#10MOV DIS5,#10MOV UFLAG,#0SETB TR0SETB ET0SETB TR1;运行定时器1,但不开中断SETB ES;开串行口中断SETB PSSETB EARET;***************************END。

51单片机串口多机通信的实现和编程

51单片机串口多机通信的实现和编程

51 单片机串口多机通信的实现和编程
一、51 单片机的主从模式,首先要设定工作方式3:(主从模式+波特率可变)
SCON 串口功能寄存器:SM0=1;SM1=1(工作方式3)
注:主机和从机都要为工作方式3。

【工作方式2 (SM0 SM1 :1 0):串行口为11 位异步通信接口。

发送或接收
一帧信息包括1 位起始位0、8 位数据位、1 位可编程位、1 位停止位1。


送数据:发送前,先根据通信协议由软件设置TB8 为奇偶校验位或数据标识位,然后将要发送的数据写入SBUF,即能启动发送器。

发送过程是由执行任何一条以SBUF 为目的寄存器的指令而启动的,把8 位数据装入SBUF,
同时还把TB8 装到发送移位寄存器的第9 位上,然后从TXD(P3.1)端口输出
一帧数据。

接收数据:先置REN=1,使串行口为允许接收状态,同时还要将RI 清0。

然后再根据SM2 的状态和所接收到的RB8 的状态决定此串行口在
信息到来后是否置R1=1,并申请中断,通知CPU 接收数据。

当SM2=0 时,
不管RB8 为0 还是为1,都置RI=1,此串行口将接收发送来的信息。


SM2=1 时,且RB8=1,表示在多机通信情况下,接收的信息为地址帧, 此时
置RI=1,串行口将接收发来的地址。

当SM2=1 时,且RB8=0,表示在多机通
信情况下,接收的信息为数据帧, 但不是发给本从机的,此时RI 不置为1,。

日立电梯监视系统通讯协议(国产梯加进口梯)

小区电梯监视系统是我公司的一套对电梯运行状态实现远程监视的系统,通过该系统能实时监视、自动记录电梯的运行中的多项数据。

系统采用串行通信对各电梯的信号进行采集,用计算机进行电梯的状态显示,大大方便了用户对电梯的监视和管理,其主要适用于电梯台数较多的小区电梯的集中监视。

电梯电脑监视系统采用RS-485接口,主要由数据采集与终端监视软件两大部分组成,本说明为采用RS-485接口(BA 接口)通信协议及技术参数的说明。

小区电梯监视系统的基本组成如下图所示:当客户需要我司提供电梯BA 接口(RS-485接口,波特率:9600bps )时,我司只提供到监控终端RS-BAS 或RS400D 部分,RS-BAS 安装于控制柜内,RS400D 安装于机房,客户在组成系统时需要遵从本份协议资料。

一、RS-BAS 监控终端适用通讯协议1、通讯结构基于BA 接口板组建的电梯监控系统使用Master/Slave 主从式结构,所有的通信均由位于监控中心的上位机控制完成。

2、主从多机通讯流程主从多机通信过程为:“主”为监控中心的上位机,“从”为RS-BAS 监控终端。

任意一块RS-BAS 板接入网络后自动进入监听状态,等待接收主机发送的包含分机地址信息的指令包。

地址匹配的分机在收到指令包后,将根据包中的指令执行不同的操作。

在完成指定的操作后,该分机将再次进入监听状态。

2.1、主机指令包说明主机查询指令格式为:(以下数据均为十六进制格式)STX SA TA CMD DAT SUM ETX内容说明:内容十六进制码说明STX A5H Start of text帧起始标志SA 81H Source Address帧源地址TA --Target Address帧目标地址CMD--Command帧指令电梯监视室计算机 显示串行通信接口监控终端RS-BAS 或RS400D控制柜NO.1监控终端RS-BAS 或RS400D控制柜NO.n…………DAT--Data指令数据SUM--Summary帧校验和ETX5AH End of text帧结束标志其中:SUM=(SA+TA+CMD+DAT) & FFH,值为SA、TA、CMD、DAT的和与0FFH“与”运算的结果。

单片机多机通信的原理

单片机多机通信的原理一、引言随着科技的发展,单片机在各个领域中得到了广泛的应用。

而多机通信作为单片机应用的重要组成部分,对于实现系统的互联互通起着至关重要的作用。

本文将介绍单片机多机通信的原理。

二、单片机多机通信的概念单片机多机通信是指在多个单片机之间进行数据交换和传输的过程。

通过多机通信,不同的单片机可以实现相互之间的数据传输和共享,从而协同工作,提高系统的整体性能。

三、多机通信的基本原理1. 通信协议:多机通信的实现离不开通信协议的支持。

通信协议规定了数据的格式、传输方式和通信规则等,确保数据能够正确、高效地传输。

常见的通信协议有UART、SPI、I2C等。

2. 硬件连接:多机通信需要通过物理连接来实现。

通常使用串口、总线等方式进行连接。

通过连接线将多个单片机连接在一起,形成一个通信网络。

3. 主从模式:多机通信中通常存在主从模式。

主机负责控制整个通信过程,从机负责接收和处理主机发送的数据。

主机发送命令或请求,从机接收并返回响应。

这样可以实现通信的协同工作。

4. 数据传输:在多机通信过程中,数据的传输是核心环节。

主机将数据封装成指令或数据包发送给从机,从机接收到数据后进行解析和处理,然后返回相应的结果给主机。

数据的传输可以通过串口、总线等方式进行。

5. 数据校验:为了确保数据的正确性,在数据传输过程中需要进行校验。

常见的校验方式有奇偶校验、CRC校验等。

通过校验,可以检测出数据传输过程中产生的错误,保证数据的准确性。

四、多机通信的应用场景1. 工业控制:在工业自动化领域中,常常需要多个单片机之间进行数据交换和传输。

通过多机通信,可以实现各个设备之间的协同工作,提高生产效率和质量。

2. 物联网:在物联网应用中,多机通信可以实现各个终端设备之间的数据传输和共享。

通过多机通信,可以实现智能家居、智能交通等应用场景。

3. 军事领域:在军事系统中,多机通信可以实现指挥系统和各个终端之间的数据交互。

通过多机通信,可以实现指挥决策的快速响应和准确执行。

单片机多机通信

单片机多机通信在单片机多机通信过程中,PC机将指令打包后发给智能接口单元(以下简称主单片机)。

主单片机收到完整一包后将包解开,按对每个从机的指令分别发送,同时将各从机发给PC机的指令送给PC机。

由于64个从机和主单片机使用同一串口通信线,为避免发生冲突,主单片机处于主动状态,按一定的定时间隔与每一台从机顺序通信。

主单片机在与每一台从机通信过程中先发送地址,从机收到地址后若与自己的地址一致,则继续接收主单片机发来的一个字节的命令码,从机收到命令后,将自己的一个字节的命令发送到主单片机。

主单片机完成与64个从机的通信需要64个定时间隔,只要定时间隔足够短,主单片机与从机基本上可以实现实时通信。

在整个通信过程中,主单片机起着通信枢纽的作用。

单片机多机通信过程安排如下:使所有从机的SM2位置1,处于只接收地址帧的状态;主机发送一帧地址信息,其中包含8位地址,第9位为地址、数据标志位,第9位置1表示发送的是地址;从机接收到地址帧后,各自将所接收的地址与本从机的地址相比较,对于地址相符的从机,使SM2清0以接收主机随后发来的信息,对于地址不相符的从机,仍保持SM2=1状态,对主机随后发送的数据不予理睬,直至发送新的地址帧;主机发送控制指令与数据,给被寻址的从机数据帧的第9位置0,表示发送的是数据。

&#65533;单片机程序采用PLM51语言设计,主单片机定时中断服务程序框图如图4所示。

主单片机RS-485串行口接收和发送中段服务程序框图如图5所示。

主单片机RS-232C串行口接收中断服务程序如图6所示。

从单片机RS-485串行口接收和发送中段服务程序框图如图7所示。

主单片机在主程序中以查询方式将各从机送来的数据从内存中读出后顺序发送给上位PC机。

程序清单略。

图1 RS485通信接口原理图2 单片机多机通信硬件电路设计中需注意的问题2.1 电路基本原理某节点的硬件电路设计如图1所示,在该电路中,使用了一种RS-485接口芯片SN75LBC184,它采用单一电源Vcc,电压在+3~+5.5 V范围内都能正常工作。

用单片机实现一主三从式多机通信(包括论文)

目录一、题目要求与功能分析 (2)1.1题目要求 (2)1.2功能及整体模块分析 (2)二方案论证 (3)2.1设计目的 (3)2.2设计思路 (3)2.2.1原理分析和讨论 (3)2.2.2题设分析 (4)三、电路设计 (6)3.1 整体功能框架设计 (6)3.2 硬件电路设计 (7)3.2.1 主机硬件电路设计 (8)3.2.2 从机硬件电路设计 (11)3.3软件电路设计 (13)3.3.1 协议设计 (13)3.3.2 主机程序流程图设计 (14)3.3.3 从机程序流程图设计 (15)四系统的调试与实现 (17)4.1主机模块功能调试 (17)4.2从机模块调试 (17)4.3整体设计功能调试 (17)五总结与体会 (19)参考文献 (20)附录 (21)一、题目要求与功能分析1.1题目要求本小组的试验题目如下:一、任务:设计实现多台单片机系统之间的串行通信二、基本要求(难度系数0.8):(1)设计一个主从式多机通信系统,包含1台主机和3台从机,主机和从机全部为单片机;(2)选择合适总线接口芯片,正确连接主机和从机;(3)编程实现分布式数据采集功能,主机可以获取各分机当前AD转换结果,并显示。

三、发挥部分:(1)完善通信功能。

(根据完成情况加分,上限+0.2)1.2功能及整体模块分析随着工业化要求提高,分布式系统发展以及控制设备与监控设备之间通讯需要,多机通信系统设计的监控系统逐步普及。

此多机通信系统具有友好的人机操作界面、强大的IO设备端口驱动能力,可与各种PLC、智能仪表、智能模块、板卡、变频器等实时通讯。

在检测大量模拟量的工业现场使用相似的多机通讯系统;单片机接口丰富,与A/D转换模块组合可以完成相同的工作,并且系统可靠、成本低。

本次实验的目的是就是应用单片机的串口通信功能实现一个分布式采集系统。

整个系统中包含一片主机和三片从机,主机的任务是实现对三片从机的AD 转换结果的采集并在数码管上显示之。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//---------------------------------------------------------------------------------------
主机程序
//--------------------------------------------------------------------------------------- #include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define slave 0x03
#define BN 4
uchar code tbuf[BN]={0x3f,0x5b,0x66,0x7d};
//uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void init() //初始化
{
TR1=1;
TH1=0xf3;
TL1=0xf3;
TMOD=0x20;
SM0=0;
SM1=1;
SM2=1;
REN=1;
}
void error() //错误
{
TB8=1;
SBUF=0xf0;
while(TI!=1);
TI=0;
}
void send_date(unsigned char data1)
{
SBUF = data1; //将待发送的字符送入发送缓冲器
while(!TI); //等待发送完成
TI = 0; //发送中断标志请0
}
/*
//向串口发送一个字符串,strlen为该字符串长度
void send(uchar *str,uint strlen)
{
uchar p=0;
uint k;
do
{
for(k=0;k<strlen;k++)
{
send_date(*(str + k));
p+=*(str + k);
}
send_date(p);
while(!RI);
RI=0;
} while(SBUF!=0);
}
*/
void send() //发送数据并校验和
{
uchar i;
uint p;
do
{
p=0;
for(i=0;i<BN;i++)
{
send_date(tbuf[i]);
p+=tbuf[i]; P1=0xf0;
while(!RI);
RI=0;
}
send_date(p); P1=0x00;
while(!RI);
RI=0;
}
while(SBUF!=0);
}
void chuankou(uchar add,uchar command) //串口函数(地址,命令) {
uchar a;
while(1)
{
send_date(add);
while(!RI);
RI=0;
if(SBUF!=add)
error();
else
{
TB8=0;
send_date(command);
while(!RI);
RI=0;
a=SBUF;
if((a&0x80)==0x80)
error();
else
{
if((a&0x01)==0x01) //从机准备好接收并主机发送数据
{ P1=0xef;
send(/*tbuf,BN*/);
TB8=1;
}
}
}
}
}
void main()
{
init();
chuankou(slave,0x01);
while(1);
}
//-------------------------------------------------------------------------------------------------
从机程序
//-------------------------------------------------------------------------------------------------- #include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define slave 0x03
#define BN 4
uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar rbuf[BN];
bit rready;
void delay(void) //误差0us
{
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
}
void init() //初始化
{
TR1=1;
TH1=0xf3;
TL1=0xf3;
TMOD=0x20;
SM0=0;
SM1=1;
SM2=1;
REN=1;
EA =1;
ES =1;
P2=0xff;
}
void error() //错误
{
SM2=1;
ES=1;
}
void send_date(unsigned char data1) //发送字符
{
SBUF = data1; //将待发送的字符送入发送缓冲器while(!TI); //等待发送完成
TI = 0; //发送中断标志请0
}
void receive() //接收并校验和
{
uchar a,i,p;
rready=0;
while(1)
{
p=0;
for(i=0;i<BN;i++)
{
while(!RI);
RI=0;
rbuf[i]=SBUF;
a=SBUF;
P2=a;
p+=rbuf[i];
delay();
send_date(0);
} P2=tab[9];
while(!RI);
RI=0;
if(SBUF==p)
{
send_date(0x00);
break;
}
else
send_date(0xff);
}
}
void main()
{
init();
while(1)
{
rready=1;
}
}
void ssio()interrupt 4
{
uchar a;
ES=0;
RI=0;
if(SBUF!=slave)
{
error();
goto reti;
}
else
{
send_date(slave);
while(!RI);
RI=0;
a=SBUF;
SM2=0;
if((a!=0x01)&&(RB8==1))
{
send_date(0x80);
error();
goto reti;
}
else
{
if((a==0x01)&&(rready==1))
{
send_date(0x01);
receive();
}
}
}
reti:;
}。

相关文档
最新文档