单片机串口通信485modbus.docx
- 文档编号:9999081
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:39
- 大小:173.88KB
单片机串口通信485modbus.docx
《单片机串口通信485modbus.docx》由会员分享,可在线阅读,更多相关《单片机串口通信485modbus.docx(39页珍藏版)》请在冰豆网上搜索。
单片机串口通信485modbus
项目七单片机通信实践
知识目标:
1.了解UART(UniversalAsynchronousReceive/Transmitter通用异步收发器。
2.了解MAX232通信原理及标准的通信协议。
3.了解MODBUS通信协议标准
2.采用通信芯片MAX485,及多机通信原理。
技能目标:
1,根据数据格式的协议,数据交换的协议要求硬件连接,实现串行通讯的硬环境。
2.MCU与PC机及多个单片机的硬件连接方法
3.应用PROTEUS仿真工具软件绘制硬件连接图
4.使用KeilC完成程序的编写和调试
5.使用最小系统板实现硬件调试
任务一基于RS232的点对点通信
任务提出
通过MAX232直接应用UART(UniversalAsynchronousReceive/Transmitter通用异步收发器,实现单片机与单片机,或单片机与PC微机之间数据传送。
知识准备
7.1.1串行与并行通信
在实际工作中,计算机与外部设备之间常常要进行信息交换,计算机与计算机之间也要交换信息,所有这些信息交换可称为通信。
在我们前面所学的知识中所涉及的数据传送都是采用并行方式,如单片机与存储器,的数据传送,存储器与存储器的数据传送,单片机与并行打印机之间的数据传送,CPU处理数据以8位数据并行方式同时一次传送一字节的数据,这样的传送方式要求用8条数据线和若于条控制信号线,传送距离较近。
当计算机与计算机之间的距离较远时过多的电缆使这种方式不够经济。
串行通信是用一位数据线传送数据,只用几条电缆线作控制信号线,串行通信适合远距离数据传送,处于两地的计算机之间采用串行通信就非常的经济,当然串行通信要求通信双方具有相同的数据转换格式,规定的时间控制,相等的逻辑电路,通一的通信协议。
7.1.1.1串行与并行通信基本概念
1.串行通信与并行通信
通信方式有两种:
并行通信和串行通信。
通常是根据信息传送的距离决定采用哪种通信方式,如果距离小于30cm则可采用并行通信方式,当距离大于30cm时则要采用通信方式。
并行通信方式是指数据的各位同时进行传送的通信方式,其优点是传送速度高,缺点是数据有多少位,就需要多少根数据传送线,单片机与外部设备之间的数据传送属于并行通信图7-1-1(a)所示为AT89C51系列单片机与外部设备间的8位数据并行通信的连接方法,并行通信方式在位数多、传送距离远的情况下就不太合适了。
串行通信间数据是一位一位按顺序传送的通信方式,图7-1-1(b)所示为单片机与外部设备间的串行通信连接方式,可以看出最单间的串行连接只需三条线,因此利用电话线就可作为传输线,这样大大降低了成本,特别适用于远距离通信;串行通信的缺点是传送速度较低。
假设并行传送N位数据所需时间为T,那么串行传送的时间至少为NT,实际上总是大于NT的。
图7-1-1两种通信方式连接
2.单工、半双工和全双工
串行通信的传送方式通常有3种:
⑴单向(或单工),只允许数据向一个方向传送;
⑵半双向(或半双工),允许数据向两个方向中的任一方向传送,但每次只能有一个站点发送;
⑶全双向(或全双工),允许同时双向传送数据,全双工配置是一对单向配置,它要求两端的通信设置具有完整和独立的发送和接收能力。
7.1.1.2单片机串行口发送与接受数据
1.串行通信协议
串行通信协议是通信双方为保证通信成功而制定的一系列约定。
包括数据格式定义和数据位定义等。
通信双方必须遵守统一的通信协议,串行通信协议包括同步协议的异步协议两种。
异步串行通信协议规定了字符的传送格式和字符传送的波特率。
51系列单片机串行行口数据的发送的数据的接受采用异步通信方式,在MCU内部有一个UART(UniversalAsynchronousReceive/Transmitter通用异步收发器。
在异步通信中数据是一帧一帧(包括一个字符代码或一字节数据)传送的,每一帧的数据格式如图7-1-2所示。
图7-1-2串行异步通信的数据格式
在帧格式中,一个字符由4部分组成:
起始位、数据位、奇偶校验位和停止位。
首先是一个起始位(0),起始位信号只占用一位,用来通知接收设备一个待接收的字符开始到达,线路上在不传送字符时应保持为1。
接收端不断检测线的状态,若连续为1以后又测到一个0,就知道发来一个新的字符,应马上准备接收,字符的起始位还被用作同步接收端的的时钟,以保证以后的接收能正确进行。
然后是5—8位数据位(规定低位在前,高位在后),它可以是5位(D0—D4)、7位或8位(D0—D7)。
其次是奇偶校验位(该位可省略),但在字符中也可以规定不用奇偶校验位,则这一位就可省去。
民可和这一位(0/1)来确定这一帧中的字符代表代表的性质(地址/数据等)。
最后是停止位
(1),用来表征字符的结束,它一定是高电位(逻辑1)。
停止位可以是1位、1.5位或2位。
接收端收到停止位后,知道上一字符已传送完毕,同时也为接收下一个字符作好准备,只要再接收藏夹0,就是新字符。
2.波特率
通信线上传送的所有位信号都保持一致的信号持续时间,每一位的信号持续时间都由数据传送速度确定,而传送速度是以每秒多少个二进制位来衡量的,这个速度叫波特率。
波特率是串行通信中的一个重要指标,它反映了对传输通道的要求。
波特率越高,要求传输通道的频带越宽。
一般异步通信的波特率为50—9600b/s
7.1.1.3单片机串行口控制寄存器
1.串行口控制寄存器SCON
SCON是串行口控制和状态寄存器,其格式如下:
D7D6D5D4D3D2D1D0
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
.SM0、SM1:
串行口工作方式控制位,具体工作方式见表。
表7-1-1串行口工作方式控制
SMOSM1
工作方式
说明
波特串
00
方式0
同步移位寄存器
fosc/12
01
方式1
10位异步收发
由定时器控制
10
方式2
11位异步收发
fosc/32或fosc/64
11
方式3
11位异步收发
由定时器控制
.SM2:
多机通信控制位(方式2,3)。
1一只有接收到第9位(RB8)为1,RI才置位。
0一接收到字符N就置位。
.REN:
串行口接收允许位。
1一允许串行口接收。
0一禁止串行口接收。
.TB8:
方式2和方式3时,为发送的第9位数据,也可以作奇偶校验位。
.RB8:
方式2和方式3时,为接收到的第9位数据;方式1时,为接收到的停止位
.TI:
发送中断标志。
由硬件置位,必须由软件清0。
.RI:
接收中断标志。
由硬件置位,必须由软件清0。
2.电源控制寄存器PCON
PCON的第7位SMOD是与串行口的波特率设置有关的选择位。
D7D6D5D4D3D2D1D0
SMOD
GF1
GF0
PD
IDL
.SMOD:
串行口波特率加倍位。
1——方式1,3波特率=定时器1溢出率/16;方式2波特率为fosc/32;·
0——方式1,3波特率=定时器1溢出率/32;方式2波特率为fosc/64。
.GF0、GF1:
两个通用标志位。
.PD、IDL:
CHMOS器件的低功耗控制位。
7.1.1.4串行口工作模式及波特率设置
1.串行通信的工作方式
⑴方式0
方式0为移位寄存器输入/输出方式。
串行数据通过RXD输入/输出,TXD则用于输出移位时钟脉冲。
方式0时,收发的数据为8位,低位在前。
波特率固定为fosc/12,其中fosc为单片机外接晶振频率。
数据发送是以写SBUF寄存器的指令开始的,8位输出结束时TI被置位。
方式0接收是在REN=1和RI=0同时满足时开始的。
接收的数据装入SBUF中,结束时RI被置位。
移位寄存器方式在用最小的硬件扩展接口时很有用。
串行口外接一片移位寄存器74LSl64可构成输出接口电路;串行口外接一片移位寄存器74LSl65可构成输入接口电路。
在典型1MHz时钟,8位加载大约用10us。
任何数目的移位寄存器可串接用于输出和输入,通过一系列的SBUF的写和读。
若移位时的波动不重要或移位寄存器中包含并行加载锁存,这可构成非常经济的I/O扩展小系统。
移位寄存器方式的第二种用法是用于两个单片机之间的通信。
与通常波特率9600相比,以1MHz通信能力对短距离通信很吸引人。
⑵方式1
方式1是10位异步通信方式,1位起始位(0),8位数据位和1位停止位
(1)。
其中的起始位和停止位在发送时是自动插入的。
任何一条以SBUF为目的寄存器的指令都启动一次发送,发送的条件是TI=0,发送完置位TI。
方式1接收的前提条件是SCON中的REN为1,同时以下两个条件都满足,本次接收有效,将其装入SBUF和RB8位。
否则放弃接收结果。
两个条件是:
1)RI=0;
2)SM2=0或接收到的停止位为1。
方式1的波特率是可变的,波特率可由以下计算公式计算得到:
方式1波特率=2SMOD·(定时器1的溢出率)/32
其中的SMOD为PCON的最高位。
定时器1的方式0,1,2,都可以使用,其溢出率为定时时间的倒数值。
⑶方式2和方式3
这两种方式都是11位异步接收/发送方式,它们的操作过程完全一样,所不同的是波特率:
方式2波特率=
×(振荡器频率fosc)
方式3波特率同方式1(定时器1作波特率发生器)。
方式2和方式3的发送起始于任何一条“写SBUF”指令。
当第9位数据(TB8)输出之后,置位TI。
方式2和方式3的前提条件也是REN为1。
在第9位数据接收到后,如果下列条件同时满足:
1)RI=0;
2)SM2=0或接收到的第9位为1
则将已接收的数据装入SBUF和RB8,并置位RI;如果条件不满足,则接收无效。
51系列单片机串行口的不同寻常的特征是包括第九位方式。
这允许在串行口通信增加的第九位用于标志特殊字节的接收。
对简单网络,第九位方案允许接收单片机仅当字节具有一个第九位时才能被中断。
用这种方法,发送器可以广播一个字节让第九位为高作为“每个人请注意”字节。
字节可以为节点地址,地址相同的节点可以打开接收接下来的字符。
所接续字节(第九位为低)不能引起其它单片机中断,因为未送它们的地址。
用这种方式。
一个单片机可以和大量的其它单片机对话而不打扰不寻址的单片机。
这种系统必须工作在严格的主从方式,由软件进行取舍安排。
2.通信波特率设置
在异步通信中,收、发双方各用自己的的时钟源,要保证捕捉到的信号正确,最好采用较高频率的时钟,一般选择时钟频率比波特率16倍或64倍,若时钟频率等于波特率,则频率稍有偏差便会产生接收错误。
各方式波特率的取值方法如下:
⑴方式0状态:
当软件设置SCON的SM0、SM1为“00”时串行通信则以方式0工作,串行通信工作在同步移位寄存器方式下。
其波特率固定为(1/12)×fosc。
⑵方式1状态:
当软件设置SCON的SM0、SM1为“01”时串行通信则以方式1工作,串行通信的波特率由定时器T1的溢出率获得:
串行通信方式1波特率=
×(定时器/计数器1的溢出率)
定时器/计数器1的溢出率定义为:
单位时间(秒)内定时器/计数器回0溢出的次数,即定时器/计数器1的溢出率=定时器/计数器1的溢出次数/秒。
定时器/计数器1的溢出率=
(次/秒)
当T1工作于方式2其初始值为:
初值N=256-
⑶串行通信方式2波特率=
×(振荡器频率)
通常情况下,使用单片机的串行口时,选用的晶振比较固定6MHz,12MHz,11.0592MHz。
常用于和微机的通信;选用的波特率也相对固定。
串行口常用的波特率及相应的设置见表7-1-1串行口常用波特率表。
表7-1-1串行口常用波特率
串行口工作方式
波特率
Fosc=6MHz
Fosc=12MHz
Fosc=11.0592MHz
SMODTMODTH1
SMODTMODTH1
SMODTMODTH1
方式0
1MHz
XXX
方式2
375k
187.5k
1XX
1XX
0XX
方式1
或
方式3
62.5k
020FFH
19.2k
120FDH
9.6k
020FDH
4.8k
120F3H
020FAH
2.4k
020FFH
120F3H
020F4H
1.2k
120E6H
020E6H
020E8H
600
120CCH
020CCH
020D0H
300
020CCH
02098H
020A0H
137.5
1201DH
0201DH
0202EH
110
02072H
010FEEBH
010FEFFH
7.1.1.5单片机之间的通信波特率查询表
51系列单片机内部集成有一个功能很强的全双工串行通信口,属UART方式。
设有2个互相独立的接收、发送缓冲器,可以同时发送和接收数据。
发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,因而两个缓冲器可以用一个地址码(99H)。
两个缓冲器统称串行通信特殊功能寄存器SBUF。
51系列单片机的串行通信根据应用可分为双机通信和多机通信两种,又可分为单片机与单片机间的通信和单片机与微机通信。
1.单片机双机通信技术
如果两个AT89S52系列单片机相距很近距离的机间通信可使用UART的TTL电平,可将它们的串行端口直接相连(TXD—RXD,RXD—TXD,GND—GND—GND,即可实现双机通信。
2.单片机与微机通信为了增加通信距离,减少通道及电源干扰,可采用RS-232C或RS-422、RS-485标准进行双机通信。
RS-232是串行数据接口标准, 最初都是美国EIA(电子工业联合会)制订并发布的,1969年公布的通信协议。
国际上规定了一个标准波特率系列,标准波特率也是最常用的波特率,标准波特率系列为110、300、600、1200、4800、9600和19200。
在通信为保证通信正确,必须通信双方必须同一波特率。
RS-232-C标准:
RS-232-C标准对逻辑电平的各种信号线的功能作了规定,即信号电平标准和控制信号线的定义。
RS-232-C采用负逻辑规定逻辑电平,信号电平与通常的TTL电平不兼容,逻辑“1”=-3V~-15V逻辑“0”=+3V~+15V与TTL电平不一样可用TTL/EIA转换器进行转换。
RS232接口芯片实现了TTL标准和RS-232-C标准之间的电平转换。
使用驱动芯片(MAX232或1488/1489)可接成RS232C和通用微机进行通信。
任务实施
7.1.2通信系统设计
应用MCU内部的增强型全双工UART功能,实现智能开发板与智能开发板的通讯,可以用智能开发板上的4个键每个键发送一串不同的字符串,另一个智能开发板接收字符串,并显示。
实现与PC机通讯。
将从智能开发板键盘上键入的数字,字母显示到PC机显示器上,将PC机键盘输入的字符(0-F)显示到实验机的数码管上。
1.单片机与微机通信的接口电路设计
利用微机配置的异步通信适配器,可以很方便地完成微系列与AT89C51单片机的数据通信。
微机与单片机的连接是零调制3线经济型,这是进行全双工通信所必须的最少数目的线路。
由于AT89C52单片机输入、输出电平为TTL电平,而微机配置的RS-232C标准串行接口二的电气规范不一致,因此,要完成微机与单片机的数据通信,必须进行电平转换。
现在采用MAX232单芯片实现AT89C51单片机与微机的RS-232标准接口通信电路。
MAX232芯片的接口连接如图7-1-2所示。
图7-1-3MAX232接口芯片连接图
2.单片机与PC微机通信接口硬件连接:
(PC端口是9针插口单片机板上是9针插头(RS232)
1脚DCD1脚
2脚发出数据(RXD)-------3脚T1OUT
3脚接受数据(TXD)-------2脚R1IN
4脚DRT4脚
5脚GND-----------------5脚地(GND)
6脚DSR
7脚RTS
8脚CTS
9脚RI
现从MAX232芯片中两路发送接收中任选一路作为接口,应注意发送、接收的引脚要对应。
实现与PC机通讯。
将从智能开发板键盘上键入的数字,字母显示到PC机显示器上,将PC机键盘输入的字符(1-8)显示到单片机的数码管上。
3.单片机和单片机通信连接
单片机与单片机通信连接如图7-1-4所示,P3.0(RXD)-P3.1(TXD)、P3.1(TXD)-P3.0(RXD)、GND-GND。
要注意的是这样的连接不能远距离。
P3.1(TXD)
P3.0(RXD)
GND
2#单片机
P3.0(RXD)
P3.1(TXD)
GND
1#单片机
图示7-1-4单片机与单片机通信连接图
4.通信程序设计流程图
通信程序中在使用串行口之前,应对它进行编程初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。
具体步骤如下:
⑴确定定时器1的工作方式——编程TMOD寄存器;
⑵计算定时器1的初值——装载TH1、TL1;
⑶启动定时器1——编程TCON中的TR1位;
⑷确定串行口的控制——编程SCON和PCON;
⑸串行口在中断方式工作时,须开CPU和源中断——编程IE寄存器。
图7-1-5通信程序设计流程图
5.编程举例
⑴汇编程序例子
ORG30H
START:
MOVSP,#60H
MOVSCON,#01010000B;设定串行方式:
;8位异步,允许接收
MOVTMOD,#20H;设定计数器1为模式2
ORLPCON,#10000000B;波特率加倍
MOVTH1,#0FDH;设定波特率为9600
MOVTL1,#0FDH
SETBTR1;计数器1开始计时
AGAIN:
JNBRI,$;等待接收完成
CLRRI;清接收标志
MOVA,SBUF;接收数据送缓冲区
MOVSBUF,A;发送收到的数据
JNBTI,$;等待发送完成
CLRTI;清发送标志
SJMPAGAIN
END
⑵C51初始化串口程序
i=0;//初值
flag=0x00;//
aa=0xfe;//位码初值
TMOD=0x20;//方式寄存器初值
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
TR1=1;
SCON=0x50;
⑶单片机串行口发送程序,每发送一串字符“MCS—51”后延时一段时间重复发送,和微机相接后,微机运行BASIC程序即可在屏幕上显示接收到的字符串,此程序证明单片机串行口发送正常。
程序tetr.c如下:
#include<reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharidatatrdata[10]={‘M’,’C’,’S’,’-’,’5’,’1’,0x0d,0x0a,0x00};
main()
{uchari;
uintj;
TMOD=0x20;/*设置9600波特串的定时器1方式*/
TL1=0xfd;TH1=0xfd;/*设置初始值
SCON=0xd8;PCON=0x00;/*设置串行口方式*/
TR1=1;/*起动定时器1
while
(1){
i=0;
while(trdata[i]!
=0x00){/*发送字符串*/
SBUF=trdata[i];
while(TI==0);
TI=0;
i++;
}
for(j=0;j<12500;j++;/*延时*/
}
}
⑷单片机串行口发送/接收程序,每接收到字节即刻发送出去;和微机相接后微机键人的字符回显在屏幕上,此程序证明单片机串行口发送/接收都正常。
可先用此程序测试,若不正常,再使用单独的发送程序测试以判断是单片机串行口发送还是接收不正常。
程序trrev.c如下:
#include<reg51.h>
voidmain(void)
{unsignedchara;
TMOD=0x20;/*在11.0592MHz下,设置串行口9600波特率,方式3*/
TL1=oxfd;TH1=0xfd;
SCON=0xd8;PCON=0x00;
TR1=1;
while
(1)
{while(RI==0):
RI=0;
a=SBUF;/*接收到的字节,立即发送出去*/
SBUF=a;
while(TI==0);
TI=0;
}
}
7.1.3系统仿真
1.在PROTEUS中画好通信电路原理图如图7-1-6所示。
图7-1-6在PROTEUS中绘制智能系统通信原理图
2.在KEIL或WF中编写单片机C51通讯程序。
编好后调试产生HEX文件。
3.在PROTEUS中链接HEX文件并仿真调试。
4.PROTEUS仿真调试功能正确后,在最小系统板的扩展部分按照PROTEUS中的电路原理图安装并焊接。
5.利用EasyISP在线下载软件将HEX文件烧入51系列单片机芯片中写入电路图中的单片机,实现用单片机通讯。
7.1.4安装与调试
1.硬件安装
⑴单片机与单片机间通信线连接,在硬件连线时要注意2、3脚对换,但用购买的串口线不用对换。
⑵单片机与单片机间通信线通信线不易太长,最好小于50CM。
⑶在焊接时要注意断开5V电源,焊接时间不要太长,如果太长会使焊盘脱落。
2.系统调试
单片机的串行口主要用于和通用微机的通信、单片机间的通信和主从结构的分布式控制系统机间通信。
串行口通信常使用缓冲区。
单片机和通用微机进行通信时,要求使用的波特率、传送的位数等相同。
要能够进行数据传送也必须首先测试双方是否可以可靠通信。
可在微机和单片机上各编制非常短小的程序,具体可分成微机串行口发送接收程序、单片机串行口发送程序和单片机串行口发送接收程序。
这三个程序能运行通过,即可证明串行口工作正常。
通信程序接收程序尽量采用中断程序,通信中断函数不要太长,会影响接收数据。
微机串行口发送接收程序设置串行口为波特率9600、8位数据、1位停止位、无奇偶校验的简单设置。
从键盘接收的字符可从串行口发送出去,从串行口接收的字符在屏幕上显示。
通过让串行口发送线和接收线短接可测试微机串行口,通过让串行口和单片机系统相接,使用此程序可进一步测试单片机的串行通信状况。
具体程序用VB编制,简单易懂。
直接输入即可运行。
思考与练习:
用中断方式数据接收程序的练习。
任务二基于RS485的点对多点通信
任务提出:
MAX485芯片与51系列单片机的仿硬件连接,PC机与多个站点智能单机的硬件连接,通信程序的编写,熟悉Keil、伟福、AEDK系列实验机开发工具。
VB程序学习。
实现任务如图7-2-1:
图7-2-1多机机通信原理图
如上图PC通过RS232与485转换接口与多个站点的智能
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 串口 通信 485 modbus