基于51的MODBUS-RTU多机通信
实验环境:Proteus
编程语言:汇编
编程环境:KEIL
单片机: AT89C51,AT89C52
晶振:11.0592MHz
功能说明:本实验运用了MODBUS-RTU通信协议的功能码03多寄存器读和
功能码10多寄存器写,其中主机首先通过03功能码读取1号从机的时,分和秒的值,并将它们用液晶LCD显示器显示出来。然后利用10功能将读取的值送入2号从机,2号从机在接收到主机送来的数据后再将它们以与1号从机相同的方式显示出来。为1号从机设置了按钮,可调节它的时间,同是主机和2号从机也随之显示相同的时间。
图示:
部分程序源代码:
1、主机
ORG 000H
LJMP MAIN
ORG 000BH
LJMP TMR0
ORG 0023H
LJMP USART
ORG 0040H
MAIN: ACALL INIT
HERE: CLR RS0
CLR RS1
JB FLAG2.7,TXWORK
JB UFLAG.7,RXWORK;
AJMP HERE
TXWORK: AJMP TXWORK1
RXWORK: CLR UFLAG.7
;**********接收完成,显示操作
JB UFLAG.3,RXWMB03
RXWMB10: JNB UFLAG.5,HERE
AJMP RXMBW101
RXWMB03: CLR UFLAG.3
MOV R0,#HOUR1
MOV A,CND3
CLR C
RRC A
MOV R7,A
MOV R1,#CND5 RWORK1: MOV A,@R1
MOV @R0,A
INC R1
INC R1
INC R0
DJNZ R7,RWORK1
MOV DSPC,#8 TIMDIS: MOV A,DSPC
MOV DPTR,#DISTB
MOVC A,@A+DPTR
MOV LCDD,A
ACALL LCDWP
MOV A,#HOUR1
ADD A,DSPC
MOV R1,A
MOV A,@R1
MOV B,#10
DIV AB
ACALL DISP
MOV A,B
ACALL DISP
DEC DSPC
JNB DSPC.7,TIMDIS CLR REN
SETB URD
MOV CND1,#0A1H MOV CND2,#10H MOV CND3,#0
MOV CND4,#50H MOV CND5,#0
MOV CND6,#3
MOV CND7,#6
MOV CND8,#0
MOV CND9,HOUR1 MOV CND10,#0 MOV CND11,MIN1 MOV CND12,#0 MOV CND13,SEC1
MOV CND15,#0A5H
MOV CNDT,#0
MOV CNDT1,#15
SETB TB8
MOV SBUF,CND1
AJMP HERE
;******************************** RXMBW101: CLR UFLAG.5
MOV CNDT,#0
MOV CNDT1,#8
AJMP HERE
;************************************** TXWORK1:CLR FLAG2.7;1S定时
CLR REN
SETB URD
/* MOV CND1,#30H
MOV CND2,#31H
MOV CND3,#32H
MOV CND4,#33H
MOV CND5,#34H
MOV CND6,#35H
MOV CND8,#37H
MOV CND9,#38H*/
MOV CND1,#0A0H;地址
MOV CND2,#03H ;功能码
MOV CND3,#0 ;起始地址2字节
MOV CND4,#3BH
MOV CND5,#0 ;数据长度
MOV CND6,#3
MOV CND7,#5AH
MOV CND8,#0A5H
MOV CNDT,#0
MOV CNDT1,#8
SETB TB8
MOV SBUF,CND1
AJMP HERE
;*******************************
DISTB: DB
81H,84H,87H,0C1H,0C4H,0C7H,91H,94H,97H,0D1H,0D4H,0D 7H
;*************
USART: PUSH PSW
PUSH ACC
SETB RS0
SETB RS1
JBC RI,RXINT;发送中断,清中断标志位并转中断处理
TXINT: CLR TI
INC CNDT
MOV A,CNDT
CJNE A,CNDT1,TXGN;必须在发送前检测,若在后的话,则最后一个字节可能不能正确传输
TXSTP: SETB UFLAG.6;发送结束标志
MOV CNDT,#0
MOV CNDT1,#8
CLR URD
SETB REN
AJMP UOUT
;********************
TXGN: MOV A,#CND1
ADD A,CNDT
MOV R0,A
CLR TB8
MOV SBUF,@R0
UOUT: POP ACC
POP PSW
RETI
;*************************
RXINT: MOV RXDT,SBUF
MOV A,CNDT
CJNE A,#1,RXINT1
MOV A,RXDT
CJNE A,#03H,RXMD10
MOV CNDT1,#5
SETB UFLAG.3;MODBUS03功能
AJMP RXSTOR
;********************** RXMD10: CJNE A,#10H,RXEROR
MOV CNDT1,#8
SETB UFLAG.5;MODBUS10功能
AJMP RXSTOR
;********************** RXINT1: JNB UFLAG.3,RXSTOR
CJNE A,#2,RXSTOR
MOV A,RXDT
ADD A,CNDT1
MOV CNDT1,A
RXSTOR: MOV A,#CND1
ADD A,CNDT
MOV R0,A
MOV @R0,RXDT
;CLR RI
INC CNDT
MOV A,CNDT
CJNE A,CNDT1,RXOUT
CRCCK: MOV A,@R0 ;发送来的数据变形与否的最简单校验
SWAP A
DEC R0
XRL A,@R0
JNZ RXEROR
SETB UFLAG.7
MOV CNDT1,#16
MOV CNTM_OV,#200
RXEROR: MOV CNDT,#0
AJMP UOUT
RXOUT: MOV CNTM_OV,#200
AJMP UOUT
;****************************** DELA Y: MOV R2,#250
DELA Y1: DJNZ R2,DELA Y1
RET
;***************************
;**************定时器0中断处理程序TMR0: PUSH PSW
PUSH ACC
CLR RS1
SETB RS0
/*MOV A,CNTM_OV
JZ TMR01
DEC CNTM_OV
MOV A,CNTM_OV
JNZ TMR01
CLR URD
SETB REN*/
TMR01: DJNZ TM0T1,RETIF
MOV TM0T1,#10 ;1ms
DJNZ TM0TB,RETIF
MOV TM0TB,#100
DJNZ TM0TS,RETIF
MOV TM0TS,#10
SETB FLAG2.7
;***************** ;中断返回RETIF: CLR RS0
POP ACC
POP PSW
RETI
;***********HD44780读写子程序BUSY: MOV P0,#0FFH
CLR LCDRS
SETB LCDRW
SETB LCDE
MOV BIT0,P0
CLR LCDE
JB BIT0.7,BUSY
RET
LCDWP: ACALL BUSY
CLR LCDRS
SJMP LCD1
LCDWD: ACALL BUSY
SETB LCDRS
LCD1: CLR LCDRW
SETB LCDE
MOV P0,LCDD
NOP
CLR LCDE
SETB LCDRS
RET
LCDW: MOV A,@R0
ACALL LCDWD
INC R0
DJNZ R2,LCDW
RET
;***************
DISP: MOV DPTR,#TIMETB
MOVC A,@A+DPTR
MOV LCDD,A
ACALL LCDWD
RET
TIMETB: DB "0123456789:/abcd" ;****************初始化子程序INIT: MOV SP,#0EFH
MOV R1,#TM0T
CLR0: MOV @R1,#0
INC R1
CJNE R1,#FRAM_OV,CLR0
LCDINT: MOV LCDD,#38H;LCD初始化子程序ACALL LCDWP
MOV LCDD,#01H
ACALL LCDWP
MOV LCDD,#06H
ACALL LCDWP
MOV LCDD,#0CH
ACALL LCDWP
MOV LCDD,#83H
ACALL LCDWP
MOV A,#10
ACALL DISP
MOV LCDD,#86H
ACALL LCDWP
MOV A,#10
ACALL DISP
MOV LCDD,#0C3H
ACALL LCDWP
MOV A,#10
ACALL DISP
MOV LCDD,#0C6H
ACALL LCDWP
MOV A,#10
ACALL DISP
MOV LCDD,#93H
ACALL LCDWP
MOV A,#10
ACALL DISP
MOV LCDD,#96H
ACALL LCDWP
MOV A,#10
ACALL DISP
MOV LCDD,#0D3H
ACALL LCDWP
MOV A,#10
ACALL DISP
MOV LCDD,#0D6H
ACALL LCDWP
MOV A,#10
ACALL DISP
;***********************
MOV TMOD,#22H;定时器0和1均工作于方式2,
定时器1用于串口波特率
MOV TH0, #0A3H;11.0592M,100us
MOV TL0,#0A3H
MOV TM0T,#1
MOV TM0T1,#1
MOV TM0TB,#5
MOV TM0TS,#10
;USART初始化
MOV TH1,#0FDH
MOV TL1,#0FDH
; SETB P3.0
MOV SCON,#0D0H;串行工作方式3,9为数据传输
MOV PCON,#00H
SETB URD
MOV CNDT,#0
MOV CNDT1,#8
MOV DSPC,#8
MOV UFLAG,#0
MOV FLAG2,#0
SETB TR0
SETB ET0
SETB TR1;运行定时器1,但不开中断
SETB ES;开串行口中断
SETB PS
SETB EA
RET
;*************************** END
2、1号从机
ORG 000H
AJMP MAIN
ORG 000BH
AJMP TMR0
ORG 0023H
AJMP USART
ORG 0040H
MAIN: ACALL INIT
HERE: CLR RS0
CLR RS1
JNB UFLAG.7,TIMDC HERE2: CLR UFLAG.7
CLR REN
SETB URD
MOV A,CND6
MOV R7,A
CLR C
RLC A
MOV CND3,A
ADD A,#5
MOV CNDT1,A
MOV R0,CND4
MOV R1,#CND4 MDBS03T:MOV @R1,#0
INC R1
MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R7,MDBS03T
MOV @R1,#5AH
INC R1
MOV @R1,#0A5H
MOV CNDT,#0
ACALL DELA Y
CLR TB8
MOV SBUF,CND1
TIMDC: JB FLAG2.7,KEYSCAN TIMEDC: MOV A,HOUR
MOV B,#10
DIV AB
JNZ TIMH1
MOV DIS7,#11
AJMP TIMH2
;************************ TIMH1: MOV DIS7,A
TIMH2: MOV DIS6,B TIMEM: MOV A,MINUTE
MOV B,#10
DIV AB
MOV DIS4,A
MOV DIS3,B
TIMES: MOV A,SECOND
MOV B,#10
DIV AB
MOV DIS1,A
MOV DIS0,B
AJMP HERE
;*************************
KEYSCAN:CLR FLAG2.7
MOV A,P1
ORL A,#0E0H
MOV P1,A
NOP
NOP
MOV A,P1
ANL A,#0E0H
XRL A,#0E0H
JZ NKEY
MOV KTEMP,A
AJMP HERE
NKEY: JB KTEMP.KEY0,KSET JB KTEMP.KEY1,KADD
JNB KTEMP.KEY2,KOUT
AJMP KSUB
KSET: JB FLAG2.0,KSET1
SETB FLAG2.0
AJMP KOUT
KSET1: INC FLAG2
SETB FLAG2.0
JNB FLAG2.2,KOUT
KOUT: MOV KTEMP,#0
AJMP TIMEDC
KADD: JNB FLAG2.0,KOUT MOV R0,#MINUTE
JNB FLAG2.1,KADD1
MOV R0,#HOUR
KADD1: INC @R0
JB FLAG2.1,HOURA
CJNE @R0,#60,KOUT KADD2: MOV @R0,#0
AJMP KOUT
HOURA: CJNE @R0,#24,KOUT AJMP KADD2
KSUB: JNB FLAG2.0,KOUT
MOV R0,#MINUTE
JNB FLAG2.1,KSUB1
MOV R0,#HOUR
KSUB1: DEC @R0
MOV A,@R0
JNB ACC.7,KOUT
JB FLAG2.1,KSUBH0
51单片机串口通信,232通信,485通信,程序代码1:232通信 #include
while(1) { if(flag==1) { ES=0; for(i=0;i<6;i++) { SBUF=table[i]; while(!TI); TI=0; } SBUF=a; while(!TI); TI=0; ES=1; flag=0; } } } void ser() interrupt 4 {
RI=0; a=SBUF; flag=1; } 代码2:485通信 #include
} void main() { init_1602(); init(); while(1) { if(flag==1) { display(0,a); } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; } Love is not a maybe thing. You know when you love someone.
1号机程序 #in clude
51单片机实现的485通讯程序 #ifndef __485_C__ #define __485_C__ #include
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使用工作方式2 TH1 = 250; // 设置初值 TL1 = 250; TR1 = 1; // 开始计时 PCON = 0x80; // SMOD = 1 SCON = 0x50; // 工作方式1,波特率9600bps,允许接收 ES = 0; // 关闭串口中断 IT0 = 0; // 外部中断0使用电平触发模式 EX0 = 1; // 开启外部中断0
《专业综合实习报告》 专业:电子信息工程 年级:2013级 指导教师: 学生:
目录 一:实验项目名称 二:前言 三:项目内容及要求 四:串口通信原理 五:设计思路 5.1虚拟串口的设置 5.2下位机电路和程序设计 5.3串口通信仿真 六:电路原理框图 七:相关硬件及配套软件 7.1 AT89C51器件简介 7.2 COMPIN简介 7.3 MAX232器件简介 7.4友善串口调试助手 7.5 虚拟串口软件Virtual Serial Port Driver 6.9八:程序设计 九:proteus仿真调试 十:总结 十一:参考文献 一:实验项目名称:
基于51单片机的单片机与PC机通信 二:前言 在国内外,以PC机作为上位机,单片机作为下位机的控制系统中,PC机通常以软件界面进行人机交互,以串行通信方式与单片机进行积极交互,而单片机系统根据被控对象配置相应的前向,后向信息通道,工作时作为主控机测对象,作为被控机接受PC机监督,指挥,定期或受命向上位机提供对象及本身的工作状态信息。 目前,随着集成电路集成度的增加,电子计算机向微型化和超微型化方向发展,微型计算机已成为导弹,智能机器人,人类宇宙和太空和太空奥妙复杂系统不可缺少的智能部件。在一些工业控制中,经常需要以多台单片机作为下位机执行对被控对象的直接控制,以一台PC机为上位机完成复杂的数据处理,组成一种以集中管理、分散控制为特点的集散控制系统。 为了提高系统管理的先进性和安全性,计算机工业自动控制和监测系统越来越多地采用集总分算系统。较为常见的形式是由一台做管理用的上位主计算机(主机)和一台直接参与控制检测的下位机(单片机)构成的主从式系统,主机和从机之间以通讯的方式来协调工作。主机的作用一是要向从机发送各种命令及参数:二是要及时收集、整理和分析从机发回的数据,供进一步的决策和报表。从机被动地接受、执行主机发来的命令,并且根据主机的要求向主机回传相应烦人实时数据,报告其运行状态。 用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时,系统的更改和扩充极为容易。MCS-51系列单片机,由于内部带有一个可用于异步通讯的全双工的穿行通讯接口,阴齿可以很方便的构成一个主从式系统。 串口是计算机上一种非常通用的设备通讯协议,大多数计算机包容两个基于RS232的串口。串口同时也是仪器仪表设备通过用的通讯协议,很多GPIB兼容的设备也带有RS-232口。同时串口通讯协议也可以用于获取远程采集设备数据。所以,深入的理解学习和研究串口通信相关知识是非常必要的。此次毕业设计选题为“PC机与MCS-51单片机的串口通讯”,使用51单片机来实现一个主从式
51串口通信程序(带详细注释) #include#include //后面有一个比较函数#define uchar unsigned char#define uint unsigned intbit UART_Flag=0; //定义串口接收标志位 uchar str[50]; //定义一数组uchar length=0; //数组长度从0 开始void init() //初 始化uart{ TMOD=0X20; //定时器1 定时器方式工作模式2,可自动重载的8 位计数器常把定时/计数器1 以模式2 作为串行口波特率发生器 SCON=0X50; //选择工作模式1 使能接收,允许发送,允许接收 EA=1; //开总中断 ES=1; //打开串口中断ET1=0; //打开定时器中断 PCON=0X80; //8 位自动重载,波特率加倍 TH1=0XFF; //用22.1184 mhz 波特率 TL1=0XFF;TR1=1; //打开中时器 }void UART_Putch(uchar dat) //输出一个字符{SBUF=dat; //把数据送给sbuf 缓 存器中 while(TI!=1);//发送标志位TI 如果发送了为1,没发送为0,没发送等待,到 了退出循环 TI=0; //到了,TI 清为0 }void init1() interrupt 4 //uart 中断,4 为串口中断{ if(RI==1) //收到数据{ uchar m=SBUF; //m 为计算机发送给串口的数据,例,open //总体思想是,计算 机通知串口,我要发数据了RI=0; //收到清0 if(m==) //判断m 这位数据有无{ UART_Putch(); //回车UART_Putch(); // 换行str[length]=; //数据最后位加0 标 志位表示发完了数据UART_Flag=1; // 传完标志位} else if(m==) { } else if(m==)//b表退格//下面几句表删锄{ UART_Putch();
标签:modbus8051源程序 modbus协议--51端程序的实现 RTU需要一个定时器来判断3.5个流逝时间。 #define ENABLE 1 #define DISABLE 0 #define TRUE 1 #define FAULT 0 #define RECEIVE_EN 0 #define TRANSFER_EN 1 #define MAX_RXBUF 0x20 extern unsigned char emissivity; extern unsigned char tx_count,txbuf[15]; extern unsigned char rx_count,rxbuf[15]; extern unsigned char tx_number,rx_number; extern bit rx_ok; unsigned char rx_temp; void InitTimer1() //针对标准8051 { TMOD=(TMOD|0xf0)&0x1f; //将T1设为16位定时器 TF1=0; TH1=0x62; //设T1位3.5位的接收时间35bit/9600bit/s=3.646ms TL1=0x80;//晶振为11.0592MHz,T= 65535-3.646ms*11.0592MHz/12=0xf2df //0x6280是22.1184M下LPC9XX下的值。 ET1=1; //允许T1中断 TR1=1; //T1开始计数 } void timer1() interrupt 3 using 2 //定时器中断 { TH1=0x62; //3.646ms interrupt TL1=0x80; if(rx_count>=5) //超时后,若接收缓冲区有数则判断为收到一帧 { rx_ok=TRUE; } } void scomm() interrupt 4 using 3 //modbus RTU模式 {
8.用C语言或汇编语言实现串口通信(PC和单片机间) 上位机和下位机的主从工作方式为工业控制及自动控制系统所采用。由于PC 机分析能力强、处理速度更快及单片机使用灵活方便等特点,所以一般都将PC 机作为上位机,单片机作为下位机,二者通过RS-232或者RS-485接收、发送数据和传送指令。单片机可单独处理数据和控制任务,同时也将数据传送给PC机,由PC机对这些数据进行处理或显示 1 硬件电路的设计 MCS-51单片机有一个全双工的串行通讯口UART,利用其RXD和TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。所以单片机和PC机之间可以方便地进行串口通讯。单片机串口有3条引线:TXD(发送数据),RXD(接收数据)和GND(信号地)。因此在通信距离较短时可采用零MODEM方式,简单三连线结构。IBM-PC机有两个标准的RS-232串行口,其电平采用的是EIA电平,而MCS-51单片机的串行通信是由TXD(发送数据)和RXD(接收数据)来进行全双工通信的,它们的电平是TTL电平;为了PC机与MCS-51 机之间能可靠地进行串行通信,需要用电平转换芯片,可以采用MAXIM公司生产的专用芯片MAX232进行转换。电路如图1所示。硬件连接时,可从MAX232中的2路发送器和接收器中任选一路,只要注意发送与接收的引脚对应关系即可。接口电路如图3.5所示。
总体设计按照整体设计思路方案绘制原理图如下所示: 2 系统软件设计 软件设计分上位机软件设计和下位机软件设计。这两部分虽然在不同的机器上编写和运行,但它们要做的工作是对应的:一个发送,另一个接收。为了保证数据通信的可靠性,要制定通信协议,然后各自根据协议分别编制程序。现约定通信协议如下:PC机和单片机都可以发送和接收。上位机和下位机均采用查询方式发送控字符和数据、中断方式接收控制字符和数据。采用RS-232串口异步通信, 1上位PC机与下位单片机异步串行通信的通信协议
RS-485协议简介及MAX485芯片介绍 1 RS-485协议简介及MAX485芯片介绍 由于RS-232的种种缺点,新的串行通讯接口标准RS-449被制定出来,与之相对应的是RS-485的电气标准。RS -485是美国电气工业联合会(EIA)制定的利用平衡双绞线作传输线的多点通讯标准。它采用差分信号进行传输;最大传输距离可以达到1.2 km;最大可连接32个驱动器和收发器;接收器最小灵敏度可达±200 mV;最大传输速率可达2.5 Mb /s。由此可见,RS-485协议正是针对远距离、高灵敏度、多点通讯制定的标准。 MAX485接口芯片是Maxim公司的一种RS-485芯片。 采用单一电源+5 V工作,额定电流为300 μA,采用半双工通讯方式。它完成将TTL电平转换为RS-485电平的功能。其引脚结构图如图1所示。从图中可以看出,MAX485芯片的结构和引脚都非常简单,内部含有一个驱动器和接收器。RO和DI端分别为接收器的输出和驱动器的输入端,与单片机连接时只需分别与单片机的RXD和TXD相连即可;/RE和DE端分别为接收和发送的使能端,当/RE为逻辑0时,器件处于接收状态;当DE为逻辑1时,器件处于发送状态,因为MAX 485工作在半双工状态,所以只需用单片机的一个管脚控制这两个引脚即可;A端和B端分别为接收和发送的差分信号端,当A引脚的电平高于B时,代表发送的数据为1;当A的电平低于B端时,代表发送的数据为0。在与单片机连接时接线非常简单。只需要一个信号控制MAX485的接收和发送即可。同时将A和B端之间加匹配电阻,一般可选100Ω的电阻。 2用PC机实现与8031单片机的多点通讯 用8031单片机实现与PC机之间的通讯时,必须使用电平转换接口芯片,因为单片机输出的是TTL电平,必须经过电平转换才能和PC机的一致。本文中采用的是RS-485协议,所以单片机需要采用RS-485接口;而在PC机侧使用的是RS-232与RS-485的电平转换接口。在本文中采用的是武汉新特电子公司的电平转换接口,该接口使用简便、无需外加电源、数据传输速率最高可达10 Mb/s,而且不用任何软件初始化和修改。另外实现多点通讯还需要了解器件的驱动能力,当器件的驱动能力足够大时,我们就可以根据需要加入所需要的节点。 本文中所举的例子就是利用一台PC控制64块单片机的工作,采用多点通讯形式。通过发送控制字和工作方式字给相应的单片机,使其进行相应的操作。单片机在接收到数据后,进行数据的采集工作,等到PC机再发指令,将采集到的数据反馈给PC机,PC机对数据进行分析和计算。 PC机的程序可以采用Windows下任何一种面向对象的高级语言来编写,它比在DOS下的利用串口中断的方式进行更加简便,应用程序将控制权交向串口的驱动程序,接收和发送的中断完全由串口驱动程序来控制,减轻了编写过程中的很多麻烦。本程序中选用的是Delphi的串口通讯控件Spcomm来实现。参数的设置可以自动完成。单片机采用中断工作
机电高等专科学校2015-2016学年第1学期通信实训报告 系别:电子通信工程系 班级: xxxxxx 学号: 13xxxxxxxxx : xxxxxxx 2015年12月
基于51单片机的双机串行通信 摘要:串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。在通信过程中,使用通信协议进行通信。 关键字:通信双机 一、总体设计 1设计目的 1.通过设计相关模块充分熟悉51单片机的最小系统的组成和原理; 2.通过软件仿真熟悉keil和proteus的配合使用; 3.通过软件编程熟悉51的C51编程规; 4.通过实际的硬件电路搭设提高实际动手能力。 2.设计要求: 两片单片机之间进行串行通信,A机将0x06发送给B机,在B机的数码管上静态显示1,B机将0~f动态循环发送到A机,并在其数码管上显示。 3.设计方案: 软件部分,通过通信协议进行发送接收,A机先送0x06(B机数码管显示1)给B机(B机静态显示),当从机接收到后,向B机发送代表0-f的数码管编码数组。B收到0x06后就把数码表TAB[16]中的数据送给从机。 二、硬件设计 1.51单片机串行通信功能 计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。 51单片机的串行接口是一个全双工的接口,它可以作为UART(通用异步接受和发送器)用,也可以作为同步移位寄存器用。51单片机串行接口的结构如下:
附录一、主机源程序 #include
while(cm1!=0xf0) { table[i]=cm1; while(RI!=1); cm1=SBUF;//接收后续的数据 RI=0; i++; } for(i=0;i<4;i++) sum0=sum0+table[i];//计算校验和 sum1=table[4];//获取收到的校验和 if(sum0==sum1) { ctrl=1; SBUF=0xf0; //发送数据确认信号 while(TI!=1); TI=0; for(i=0;i<4;i++) show(table[i]); } else goto lab; } else goto lab; ctrl=1;//将MAX485设置为发送方式return ; } void main(void) { SCON = 0x50; //串口方式1,允许接收TMOD = 0x20; //定时器1 定时方式2 PCON=0x80; //设SMOD=1; TH1 = 0xFA; //11.0592MHz 9600 波特率TL1 = 0xFA; TR1 = 1; //启动定时器 EX0=1; //开外部中断0 IT0=0; EA=1; //开总中断 ctrl=1;//将MAX485设置为发送方式while(1); //等待中断 }
单片机多机通信系统 一、引言 随着单片机技术的不断发展,单片机的应用已经从单机向多机互联化方向发展。单片机在实时数据采集与数据处理方面,有着成本低、能满足一般要求、开发周期短等优点,其在智能家居、计算机的网络通信与数据传输、工业控制自动化等方面有着广泛的应用。 本系统就是面向智能家居应用而设计的。在初期,采用红外无线通信方式,其传输距离短,适于一般家庭应用,且成本相对较低;待方案成熟、成本允许,可以改用GSM无线通信方式。 二、系统原理及方案设计 1 、系统框架介绍 本系统为基于51单片机的多机红外无线通信系统,由三个51单片机模块组成。其中一个作为主机(即上位机),负责接收来自从机1(即下位机)采集的数据信息,以及向从机2(即下位机)发送控制信息。从机1就是数据采集模块,采集温度、光强等室内数据,并将其发送给主机。主机经分析处理,作出相应判断,并给从机2发送控制信息,使由从机2控制的电机作出相应反应,调节室内环境状况。 系统总体框图如下图1所示,图2为红外收发模块简图:
图1 系统总体框图 图2 红外收发模块简图 2 、多机通信原理介绍 在多机通信系统中,要保证主机与从机间可靠的通信,必须要让通信接口具有识别功能,51单片机串行口控制寄存器SCON中的控制位SM2正就是为了满足这一要求而设置的。当串行口以方式2或方式3工作时,发送或接收的每一帧信息都就是11位的,其中除了包含SBUF 寄存器传送的8位数据之外,还包含一个可编程的第9位数据TB8或RB8。主机可以通过对TB8赋予1或0,来区别发送的就是数据帧还就是地址帧。 根据串行口接收有效条件可知,若从机的SCON控制位SM2为1,则当接收的就是地址帧时,接收数据将被装入SBUF并将RI标志置1,向
#include
一、程序代码 #include
TI = 0; } T_counter = 0; } uart_receive(void) interrupt 4 { if(RI) { RI = 0; indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { R_counter = 0; flag = 1; } } } void system_initial(void) { P1M1 = 0x00; P1M0 = 0xff; P1 = 0xff; //初始化为全部关闭 temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0; } void initial_comm(void) { SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload PCON = 0x80; //波特率不加倍SMOD = 1 TH1 = 0xfa; //baud: 9600;fosc = 11.0596 IE = 0x90; // enable serial interrupt TR1 = 1; // timer 1 RI = 0; TI = 0; ES = 1; EA = 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所示。 图1SN75176芯片及其逻辑关系 3RS-485方式构成的多机通信原理 在由单片机构成的多机串行通信系统中,一般采用主从式结构:从机不主动发送命令或数据,一切都由主机控制。并且在一个多机通信系统中,只有一台单机作为主机,各台从机之间不能相互通讯,即使有信息交换也必须通过主机转发。采用RS-485构成的多机通讯原理框图,如图2所示。
图2采用RS-485构成的多机通讯原理框图 在总线末端接一个匹配电阻,吸收总线上的反射信号,保证正常传输信号干净、无毛刺。匹配电阻的取值应该与总线的特性阻抗相当。 当总线上没有信号传输时,总线处于悬浮状态,容易受干扰信号的影响。将总线上差分信号的正端A+和+5电源间接一个10K的电阻;正端A+和负端B-间接一个10K的电阻;负端B-和地间接一个10K的电阻,形成一个电阻网络。当总线上没有信号传输时,正端A+的电平大约为3.2V,负端B-的电平大约为1.6V,即使有干扰信号,却很难产生串行通信的起始信号0,从而增加了总线抗干扰的能力。 4通信规则 由于RS-485通讯是一种半双工通讯,发送和接收共用同一物理信道。在任意时刻只允许一台单机处于发送状态。因此要求应答的单机必须在侦听到总线上呼叫信号已经发送完毕,并且没有其它单机发出应答信号的情况下,才能应答。半双工通讯对主机和从机的发送和接收时序有严格的要求。如果在时序上配合不好,就会发生总线冲突,使整个系统的通讯瘫痪,无法正常工作。要做到总线上的设备在时序上的严格配合,必须要遵从以下几项原则: 1) 复位时,主从机都应该处于接收状态。 SN75176芯片的发送和接收功能转换是由芯片的RE*,DE端控制的。RE*=1,DE=1时,SN75176发送状态;RE*=0,DE=0时,SN75176处于接收状态。一般使用单片机的一根口线连接RE*,DE端。在上电复位时,由于硬件电路稳定需要一定的时间,并且单片机各端口复位后处于高电平状态,这样就会使总线上各个分机处于发送状态,加上上电时各电路的不稳定,可能向总线发送信息。因此,如果用一根口线作发送和接收控制信号,应该将口线反向后接入 SN75176的控制端,使上电时SN75176处于接收状态。 另外,在主从机软件上也应附加若干处理措施,如:上电时或正式通讯之前,对串行口做几次空操作,清除端口的非法数据和命令。 2) 控制端RE*,DE的信号的有效脉宽应该大于发送或接收一帧信号的宽度。 在RS-232,RS-422等全双工通讯过程中,发送和接收信号分别在不同的物理链路上传输,发送端始终为发送端,接收端始终为接收端,不存在发送、接收控制信号切换问题。在RS -485半双工通讯中,由于SN75176的发送和接收都由同一器件完成,并且发送和接收使用同一物理链路,必须对控制信号进行切换。控制信号何时为高电平,何时为低电平,一般以单片机的TI,RI信号作参考。
《单片机应用与仿真训练》设计报告 单片机多机通信 姓名: 学号: 专业班级: 指导老师: 所在学院: 2011年7月5日
摘要 本设计是基于AT89S52单片机温度检测传输的三机通信系统,有三个单片机组成,其中一个作为主机(上位机),控制并负责接收来自从机1号和从机2号采集的数据信息,并显示在数码管上。由主机发送控制信息(通过按键控制),确定是接收来自想要得到各从机数据。从机1号和2号是数据采集模块,用来采集室内或室外温度信息,并通过通信协议传送给主机。为保证三机通信可靠性,通信口要有识别功能,51单片机串行口控制寄存器SCON中SM2位正是满足这一要求而设置的。当串行口以工作方式三工作时,接收和发送的信息都是11位数据,既包含SBUF寄存器传送的8位数据,还包括SCON中可编程第9位数据即TB8或RB8,主机可通过设定TB8是0或1,来区别发送的是地址还是数据。从机都先将SCON中的SM2设置为1,待主机发送地址信息,与本身的地址对照,如果是,则令从机SM2为0,准备接收主机信息并发送温度信息,如果不是,则继续等待。主机通过中断口接收数据,处理后显示在数码管上。此次设计由于只有一个18b20温度传感器,这里用三个任意的数据代替从机2采集温度数据,由于传输距离较短,这里不用MAX232,直接将主机的发送端接从机接收端,主机接收端连接从机发射端,仿真结果正常显示,实验结果正常。
目录 1概述 (1) 1.1设计概述 (1) 1.2多机通信基本原理 (1) 1.3 通信协议 (2) 2系统总体方案及硬件设计 (3) 2.1总体设计方案 (3) 2.2硬件电路设计 (3) 3软件设计 (7) 3.1控制流程图 (7) 3.2串行口采集步骤 (7) 3.3软件流程图 (8) PROTEUS仿真 (9) 课程设计体会 (11) 参考文献: (12) 附件1:主机A源程序代码 (13) 附件2:原理图 (24)
//****************************************************************// // DHT 使用范例 //单片机 AT89S5 或 STC89C5 RC // 功能 串口发送温湿度数据波特率 9600 //硬件连接 P .0口为通讯口连接DHT ,DHT 地电源和地连接单片机地 电源和地 单片机串口加MAX 3 连接电脑 // 公司 济南联诚创发科技有限公司 //****************************************************************// #include
51串口通信协议(新型篇) C51编程:这是网友牛毅编的一个C51串口通讯程序! //PC读MCU指令结构:(中断方式,ASCII码表示) //帧:帧头标志|帧类型|器件地址|启始地址|长度n|效验和|帧尾标志 //值: 'n' 'y'| 'r' | 0x01 | x | x | x |0x13 0x10 //字节数: 2 | 1 | 1 | 1 | 1 | 1 | 2 //求和: ///////////////////////////////////////////////////////////////////// //公司名称:*** //模块名:protocol.c //创建者:牛毅 //修改者: //功能描述:中断方式:本程序为mcu的串口通讯提供(贞结构)函数接口,包括具体协议部分 //其他说明:只提供对A T89c51具体硬件的可靠访问接口 //版本:1.0 //信息:QQ 75011221 ///////////////////////////////////////////////////////////////////// #include