1、基本概念基本概念RS-232RS-232接口接口MCS-51MCS-51的串行接口的串行接口单片机与单片机之间的通信单片机与单片机之间的通信编成练习编成练习第第7 7章章串串行行口口通通信信技技术术 本章内容本章内容Single Chip Microcomputer1 1实训目的实训目的(1)复习掌握定时器的功能和编程使用。(2)理解串行通信与并行通信的两种方式。(3)掌握串行通信的重要指标:字符帧和波特率。(4)初步了解MCS-51单片机串行口的使用方法。实训实训8 8单片机之间的双机通信单片机之间的双机通信 2 2实训引入实训引入 单片机间经常需要互相传递信息通信.3 3实训程序实训程序甲
2、机发送程序参考如下:甲机发送程序参考如下:MOV TMOD,#20H MOV TL1,#0F4H MOV TH1,#0F4H SETB TR1 MOV SCON,#40H MOV R0,#20H MOV R7,#08H START:MOV A,R0MOV SBUF,A WAIT:JBC TI,CONT AJMP WAIT CONT:INC R0 DJNZ R7,START SJMP$乙机接收及显示程序参考如下:乙机接收及显示程序参考如下:MOV TMOD,#20H MOV TL1,#0F4H MOV TH1,#0F4H SETB TR1 MOV SCON,#40H MOV R0,#20H MO
3、V R7,#08H SETB RENWAIT:JBC RI,READ AJMP WAIT READ:MOV A,SBUF MOV R0,A INC R0 DJNZ R7,WAITDISP:LCALL DISPLAY SJMP DISP4.4.实训分析与总结实训分析与总结 分析程序可以看出,通信双方都有对单片机定时器的编程(注意发送、接收程序的前4条指令),而且双方对定时器的编程完全相同。这说明,MCS-51单片机在进行串行通信时,是与定时器的工作有关的。定时器用来设定串行通信数据的传输速度。在串行通信中,传输速度是用波特率来表征的,有关波特率与定时器的关系以及编程在8.3.3节介绍。MCS-5
4、1MCS-51单片机串行接口单片机串行接口一、串行通信概述一、串行通信概述1 1、什么叫串行通信?、什么叫串行通信?在生活中同学们排横队行走在生活中同学们排横队行走 并行;排纵队行走并行;排纵队行走 串行。串行。计算机中在传输信息、数据时也有并行、串行的问题。计算机中在传输信息、数据时也有并行、串行的问题。0010001001P1.0P1.1P1.2P1.3RXDTXD单片机单片机外设外设1外设外设2111111 0 1 01 0 0 0接收设备接收设备发送设备发送设备2、同步通信、异步通信、同步通信、异步通信 同步同步发送设备时钟与接收设备时钟严格一致。发送设备时钟与接收设备时钟严格一致。校
5、验字符校验字符2校验字符校验字符1 数 据数 据 n 数 据数 据 2 数 据数 据 1同步字符同步字符2同步字符同步字符1异步异步 发送时钟与接收时钟不一定相等。发送时钟与接收时钟不一定相等。空闲位空闲位停止位停止位奇偶校验位奇偶校验位58位数据位数据起始位起始位空闲位空闲位3、串行通信的方向、串行通信的方向单工单工 A 发发 B 发发半双工半双工 A 发发 收收 B 收收 发发例如:广播电台例如:广播电台 收音机收音机例如:例如:对讲机对讲机全双工全双工 A 发发 收收 B 收收 发发例如:例如:电话机电话机4、波特率、波特率即串行通信速率。即串行通信速率。b/s 、bps 在异步通信中,
6、单位时间内所传送的有效二进制位数在异步通信中,单位时间内所传送的有效二进制位数波特率。波特率。举例、设有一帧信息,举例、设有一帧信息,1个起始位、个起始位、8个数据位、个数据位、1个停止位,传输个停止位,传输速率为每秒速率为每秒240个字符。求波特率。个字符。求波特率。解:解:(181)240=2400 b/s=2400波特。波特。5、串行通信接口、串行通信接口发送:发送:CPUD7D6D5D4D3D2D1D0发送寄存器发送寄存器SBUF 0 1D0D1D2D3D4D5D6D7发送时钟发送时钟:接收接收:D0D1D2D3D4D5D6D7 1 0D7D6D5D4D3D2D1D0CPU接收时钟接收
7、时钟接收数据寄接收数据寄存器存器SBUF二、二、MCS-51机串行接口机串行接口单片机内有通用异步接收单片机内有通用异步接收/发送器发送器 UART。全双工,全双工,4种工作方式,波特率可编程设置,可中断。种工作方式,波特率可编程设置,可中断。1、串口的组成、串口的组成 从编程角度讲来看主要由以下寄存器组成。从编程角度讲来看主要由以下寄存器组成。SBUF 串行发送串行发送/接收数据缓冲器接收数据缓冲器 是两个物理单元,共用一个地址(是两个物理单元,共用一个地址(99H)SMODSMOD位用于决定波特率的倍数。位用于决定波特率的倍数。0 20=1倍倍 1 21=2倍倍PCON 电源控制寄存器电源
8、控制寄存器SCON 串行口控制寄存器串行口控制寄存器SM0SM1SM2RENTB8RB8 TI RITI /RI:中断请求标志位(前面已讲过)中断请求标志位(前面已讲过)RB8:接收的第九位数接收的第九位数TB8:发送的第九位数发送的第九位数REN:允许接收控制位允许接收控制位SM2:多机通信控制位(常与多机通信控制位(常与RB8配合,决定是否激活配合,决定是否激活RI)SM0、SM1:工作方式选择位(四种工作方式)工作方式选择位(四种工作方式)内部结构框图51内部总线SBUF零检测器移位时钟START SHIFT 发送控制器TXCLOCK TI SENDD S QCLSTART RI REC
9、EIVERX 接收控制器 SHIFTCLOCK 1 1 1 1 1 1 1 0输入移位寄存器SBUF51内部总线读SBUF写SBUF串行口中断P3.1TXD装载SBUFREN/RI返回前一次P3.0RXD串型口的工作模式和控制寄存器SCON SM0 SM1模式功 能波特率 0 00同步移位寄存器模式Fosc/12 0 111+8+1位异步通信UART可变 1 021+9+1位异步通信UARTFosc/64或/32 1 131+9+1位异步通信UART可变SM0 SM1SM2RENTB8RB8TIRI 模式选择 多机通讯位 允许接收位 发送、接收第9位 发送、接收标志返回本节目录 2、串行口的工
10、作方式、串行口的工作方式 (1)方式)方式0:同步移位寄存器方式:同步移位寄存器方式 波特率固定为波特率固定为fosc/12 RXD 接收发送数据接收发送数据 TXD 产生同步移位脉冲产生同步移位脉冲 接收接收/发送完,置位发送完,置位RI/TI,(,(要求要求SM2=0)D7 D6 D5 D4 D3 D2 D1 D0 D0 D1 D2 D3 D4 D5 D6 D7发送发送接收接收无起始位,无停止位无起始位,无停止位。可用于并口的扩展。可用于并口的扩展。方式0内部结构框图51内部总线SBUF零检测器移位时钟START SHIFT 发送控制器TXCLOCK TI SENDD S QCLSTART
11、 RI RECEIVERX 接收控制器 SHIFTCLOCK 1 1 1 1 1 1 1 0输入移位寄存器SBUF51内部总线读SBUF写SBUF串行口中断P3.1TXD装载SBUFREN/RI返回前一次P3.0RXD(S6)Fosc/12(2)方式)方式1:8位位UART 波特率为(波特率为(2SMODT1的溢出率)的溢出率)/32,可变。,可变。一帧信息一帧信息10位。位。D0D1D2D3D4D5D6D7停止位停止位起始位起始位发送发送D7D6D5D4D3D2D1D0起始位起始位停止位停止位接收接收送送 RB8发送完置位发送完置位TI。当接收到数据后,置位当接收到数据后,置位RI是有条件的
12、。即:是有条件的。即:REN=1,RI=0 且且SM2=0或或SM2=1但是接收到的停止位为但是接收到的停止位为1。此时,数据装载此时,数据装载SBUF,RI置置1,停止位进入停止位进入RB8。(3)方式)方式2、方式、方式3:9位位UART 一般一般用于多机通信。一帧信息用于多机通信。一帧信息1111位位。D0D1D2D3D4D5D6D7TB8停止位停止位起始位起始位发送发送发送完数据置位发送完数据置位TI。TB8D7D6D5D4D3D2D1D0起始位起始位停止位停止位接收接收接收到有效数据完毕,置位接收到有效数据完毕,置位RI的条件的条件:REN=1,RI=0 且且SM2=0或接收到第或接
13、收到第9位数据为位数据为1,此时,数据装载此时,数据装载SBUF,RI置置1,第,第9位数据(位数据(TB8)RB8。送送RB81/161/2T1溢出10SMOD1/2focs/210SMOD模式2串行口的波特率 B模式1、3时串行口的波特率 B1/16focs/12模式0串行口的波特率 B串行口四种模式时,因移位脉冲来源不同而使串行口的波特率 B不同(如图所示)B=focs/12B=focs/32或=fosc/64 B=1/32T1溢出率或=1/16T1溢出率发送、接收控制器发送、接收控制器发送、接收控制器TL1(8位)TH1(8位)震荡器1/12TF1中断控制T1 引脚TR1GATEINT
14、1C/T=1C/T=0返回8位+1计数器8位初值寄存器模式0、2时的波特率的计算1.模式0:波特率B=fosc/12 fosc为系统频率2.模式2:B=1/64*fosc (SMOD=0时)或 B=1/32*fosc (SMOD=1时)其中:SMOD为电源控制寄存器PCON 的最高位。返回本节目录模式1、3时的波特率的计算 B=1/16T1溢出率(SMOD=1时)或:B=1/32T1溢出率(SMOD=0时)其中:T1溢出率=fosc/12 1/(256-TH1);TH1为初值所以:B=fosc/192 1/(256-TH1)(SMOD=1时)或:B=fosc/384 1/(256-TH1)(S
15、MOD=0时)这样,我们可以得到求TH1(初值)的计算公式:TH1=256-fosc/(384XB);(SMOD=0时)TH1=256-fosc/(192XB);(SMOD=1时)【举例】:设fosc为11.0592MHz,波特率为1200Hz,求TH(设:SMOD=0)。【解】:用上述公式 TH1=256-11.059MHz/(384X1200)=232 =0E8H 返回本节目录方式方式2波特率:(固定)波特率:(固定)2SMOD/64 fosc3、波特率的设置、波特率的设置方式方式0、方式、方式2固定。固定。方式方式1,方式,方式3可变。波特率可变。波特率=2SMOD/32(T1的溢出率)
16、的溢出率)T1溢出率溢出率=单位时间内溢出次数单位时间内溢出次数=1/(T1的定时时间)的定时时间)而而T1的定时时间的定时时间t就是就是T1溢出一次所用的时间。此情况下,一般设溢出一次所用的时间。此情况下,一般设T1工作在模式工作在模式2(8位自动重装初值)。位自动重装初值)。N=28 t/T,t=(28N)T=(28N)12/fosc所以,所以,T1溢出率溢出率=1/t=fosc/12(28N),),故,故,波特率波特率=2SMOD/32 fosc/12(256N)。)。若已知波特率,则可求出若已知波特率,则可求出T1的计数初值:的计数初值:y=2562SMODfosc/(波特率波特率32
17、12)波特率/(b/s)fosc/MHzSMOD定时器1C/模式初始值方式0:1 M方式2:375 k方式1、3:62.5 k19.2 k9.6 k4.8 k2.4 k1.2 k137.5 k11011012121211.05911.05911.05911.05911.05911.9866121110000000000000000222222221FFHFDHFDHFAHF4HE8H1DH72HFEEBHT波特率=)x256(12f322oscsmod串行口的应用v在编制串行通讯程序时,首先要确定两个参数:1,通讯双方的“波特率”,必须保持严格一致;2,传输数据的格式“字符帧格式”必须统一。v
18、MCS-51串口的4种模式中:0、2模式的波特率是固定的;1和3模式时波特率是可变且由定时器T1来作为波特率发生器,以模式2的方式工作。v用T1作为波特率发生器时,根据波特率来计算T1的初值就成为串口程序初始化的主要任务之一。v在通讯过程中,对标志(RI、TI)的判断是控制通讯全过程的关键环节。四种模式的接收、发送条件模式发送条件接收条件接收方式主要应用0TI=0RI=0,REN=1查询、中断同步移位,系统扩并口1TI=0RI=0,REN=1查询、中断8位数据异步传送2、3TI=0RI=0,REN=1,SM2=0查询(无中断)8位数据+奇偶位的异步收发 UARTRI=0,REN=1,RB8=1
19、 若SM2=0时查询。若SM2=1时引发中断8位数据+控制位的异步收发 UART返回本节目录模式1举例(一)发送程序TXD.ASM org 0000h ljmp 0100h org 0100hstart:mov tmod,#20h ;设定定时器T1为模式2 mov tl1,#0f4h ;送定时初值(fosc=11.059)mov th1,#0f4h ;波特率B=2400 mov pcon,#00h ;PCON中的SMOD=0 setb tr1 ;启动定时器T1 mov scon,#40h ;设定串行口为模式1loop2:mov p1,#0ffh mov a,p1 ;从P1口输入数据 mov s
20、buf,a ;数据送SBUF发送loop1:jnb ti,loop1 ;判断数据是否发送完毕?clr ti ;发送完一帧后清标志 sjmp loop2 ;返回继续 endTXD.ASM发送程序框图(查询方式)SM0SM1SM2RENTB8RB8TIRIT1初始化启动T1串行口初始化输入数据到A发送一帧数据MOV SBUF,ATI=1?软件清TIGATEC/TM1M0GATEC/T M1M0设定定时器T1的工作模式 00000010B设定串行口模式寄存器SCON为01000000BYN(二)接收程序:RXD.ASMorg 0000hljmp 0100horg 0100hstart:mov tmo
21、d,#20h ;选定T1为模式2(自动重装)mov tl1,#0f4h ;设定初值mov th1,#0f4h ;同上mov pcon,#00h ;PCON的SMOD=0setb tr1 ;启动T1定时器clr ri ;清接收标志mov scon,#50h ;设定串行口为方式1loop1:jnb ri,loop1 ;判断是否接收到数据?clr ri ;接收到数据后清接收标志mov a,sbuf ;数据送累加器Amov p1,a ;从P1口输出sjmp loop1 ;回继续endRXD.ASM接收程序框图(查询方式)T1初始化启动T1串行口初始化输出数据到P1数据送AMOV A,SBUFRI=1?
22、软件清TISM0SM1SM2RENTB8RB8 TIRIGATEC/TM1M0GATEC/T M1M0定时器TMOD(89H)的工作模式 00000010B串行口模式寄存器SCON(98H)为01010000BYN思考题:用中断的方式 接收数据org 0000hljmp startorg 0023hljmp rxd1org 0100hstart:mov tmod,#20h ;选定T1为模式2(自动重装)mov tl1,#0f4h ;设定初值mov th1,#0f4h ;同上mov pcon,#00h ;PCON的SMOD=0setb tr1 ;启动T1定时器clr ri ;清接收标志mov s
23、con,#50h ;设定串行口为方式1mov ie,#90h ;开串行口中断sjmp$org 0200hrxd1:clr ri ;接收到数据后清接收标志mov a,sbuf ;数据送累加器Amov p1,a ;从P1口输出reti endLJMPLJMPMOVCLR0000H0023H0100H0200HRXD.ASM接收程序框图(中断方式)T1初始化并启动T1串行口初始化开串行口中断等待RI中断输出数据到P1接收一帧数据MOV A,SBUF软件清TIRETI主程序框图中断服务程序框图EAXXESET1EX1ET0EX0设定中断允许寄存器IE(A8H)为10010000B 模式2、3应用举例v
24、与模式1相比,模式2、3的主要特点:1,9位数据的传送格式:其中:发送时第9位在TB8;接收时第9位在RB8中。2,SM2:多机通讯位:在模式0、1中:SM2=0。当RI=1时便可以引发中断。在模式2、3中:如果SM2=0,TI和RI 虽然可以被激活,但不能引发中断!如果SM2=1,且RB8=1时,RI被激活时可以引发中断!v根据上面特点,模式2、3可以:1,利用第9位数据来传送、接收每一字节的“奇偶效验位”。2,利用SM2、RB8 实现多机通讯功能。利用模式2,3进行带奇校验的串行通讯程序流程图数据送累加器APSW.P=1?SET SCON.TB8CLR SCON.TB8MOV SBUF,A
25、TI=1?CLR SCON.TIYESNONOYES发送端程序RI=1?MOV A,SBUFPSW.P RB8=1?出错处理CLR SCON.RIYESNO接收端程序使用“查询法”编制的发送、接收程序NY数据送内存使用模式3进行多机通讯主机从机 N从机 4从机 3从机 2从机 1串行数据线(2条)主从式多机通讯原理1,主机发送的数据可以传送到各个从机,从机发送的数据只能为主机接收,从机之间不能直接通讯。2,主机和从机的设置为模式2或3,其中:主机的SM2=0(单机方式);从机的SM2=1(多机方式)。3,主机发送地址码来寻找从机(地址码特征是第9位数据为“1”),所有从机都接收主机发出的地址码
26、(因为RB8=1),既RI=1引发中断。在中断服务程序中,将接收到地址码与自己的地址进行比较,被选中的从机将自己的SM2=0,并维持在中断服务程序中保持与主机的联系。而未被选中的从机仍保持SM2=1,并退出中断服务程序。4,当主机找到从机后,开始向从机发数据、命令(其特征为第9位=0)。由于选中的从机SM2=0,从机仍可以使用查询RI的方式接收主机发出的数据或命令(而未选中的从机因RB8=0不会引发它们的中断)。当主机与从机的通讯完成后,该从机再将其SM2=1并退出中断服务程序。主机重新发出另一个从机的地址,所有从机可以马上响应并接收地址信息。多机通讯中主机与从机之间的控制、状态信息v主机的控
27、制命令:00H 主机发送,从机接收;(控制从机的操作)01H 主机接收,从机发送。v从机状态字:从机向主机发送的用于表征从机工作状态的信息(如下图)。ERRTRDYRRDY0:合法命令 0:发送未就绪 0:接收未就绪1:非法命令 1:发送就绪 1:接收就绪从机返回的状态字主机程序框图T1为定时,模式2B=1200,启动T1设串口为模式3REN=1,SM2=0TB8=1设定程序数据:R0R5调用MCOMMU停机MCOMMU发送从机地址从机应答?地址相符?发送命令字TB8=0从机应答?命令正确?命令分类接收数据块发送数据块从机接收就绪?从机发送就绪?RET命令从机复位NNYYNNYYNNYY接收发
28、送一:主机程序(初始化部分)ORG 2000HSTART:MOV TMOD,#20H;定时器T1为模式2MOV TH1,#0F4HMOV TL1,#0F4H;波特率为1200(设外接MHz晶体)SETB TR1;启动T1MOV SCON,#0D8H;串口为模式3允许接收,SM2=0,TB8=1MOV PCON,#00H;设PCON中的SMOD=0MOV R0,#40H;发送数据块首地址送R0MOV R1,#20H;接收数据块首地址送R1MOV R2,#SLAVE;被寻从机地址送R2MOV R3,#00H/#01H;主发、从收命令。或主收、从发命令MOV R4,#14H;发送数据块长度送R4(2
29、0)MOV R5,#14H;接收数据块长度送R5(20)ACALL MCOM;调用主机通讯子程序SJMP$二:主机通讯子程序(MCOM)ORG 2100HMCOM:MOV A,R2;取从机地址MOV SBUF,AJNB RI,$CLR RIMOV A,SBUFXRL A,R2;核对两个地址JZ MTXD2;相符时,转MTXD2MTXD1:MOV SBUF,#0FFH;返回地址错误时,发送从机复位信号SETB TB8;设定地址标志SJMP MCOM ;重发从机地址,使所有从机重新判断地址MTXD2:CLR TB8;准备发送命令MOV SBUF,R3;送出命令JNB RI,$;等待从机应答CLR
30、RI;从机应答后清标志MOV A,SBUF;接收从机应答命令JNB ACC.7,MTXD3;命令无错时,则命令分类SJMP MTXD1;命令错返回重新联络MTXD3:CJNE R3,#00H,MRXD;从机发送主机接收时,转MRXDJNB ACC.0,MTXD1;从机接收时,若从机未准备好转回MTXD4:MOV SBUF,R0;若从机准备好,则开始发送JNB TI,$CLR TIINC R0DJNZ R4,MTXD4RETMRXD:JNB ACC.1,MTXD1;从机发送未准备好返回MRXD1:JNB RI,$;等待接收CLR RIMOV A,SBUFINC R1;接收数据区指针加一DJNZ
31、R5,MRXD1;未接收完则继续(R5接收数据计数器)RETENDERR从机返回的状态字TRDYRRDY0:合法命令 0:发送未就绪 0:接收未就绪1:非法命令 1:发送就绪 1:接收就绪从机程序框图T1为定时,模式2B=1200,启动T1设串口为模式3REN=1,SM2=0TB8=1设定程序参数:R0R3开串行口中断停机保护现场接收地址符合本机?回送本机地址接收下一字符是命令吗?命令分类 本机发送准备就绪?本机接收准备就绪?发TRDY=1状态字发RRDY=1状态字发送数据接收数据发送完?接收完?保护现场返回NNYY发送命令接收命令非法命令送TRDY=0送RRDY=0NNNY主程序中断服务程序
32、三:从机主程序ORG 1000HSTART:MOV TMOD,#20H;设定定时器T1为模式2MOV TH1,#0F4H;设定波特率为1200MOV TL1,#0F4HSETB TR1;启动定时器T1MOV SCON,#0F8H;设串口模式3,REN=1,SM2=1,TB8=1MOV PCON,#00HMOV R0,#20H;R0指向发送数据块首地址MOV R1,#40H;R1指向接收数据块首址MOV R2,#14H;R2赋发送数据块长度MOV R3,#14H;R3赋接收数据块长度SETB EASETB ES;开中断CLR RI;清标志RI准备接收数据SJMP$;等待中断四:从机中断服务程序O
33、RG 0023HLJMP 0100HORG 0100HSINTS:CLR RI;接收到地址后清RI PUSH ACCPUSH PSW;保护现场MOV A,SBUF;接收主机送来得从机地址XRL A,#SLAVE;核实从机地址JZ SRXD1;若是本机地址转SRXD1RETU:POP PSW;返回主程序POP ACC;恢复现场RETI;中断返回SRXD1:CLR SM2;准备接收主机数据/命令MOV SBUF,#SLAVE;向主机发回从机地址JNB RI,$;等待主机的命令CLR RI;接收到主机命令后清RIJNB RB8,SRXD2;若是命令(RB8=0)则转SRXD2继续SJMP RETU;
34、接收的不是命令时(RB8=1),返回SRXD2:MOV A,SBUF;将接收到的命令送ACJNE A,#02H,NEXT;命令合法NEXT:JC SRXD3;若命令合法(A02H)则继续CLR TI;命令不合法则清TI准备发回ERR=1MOV SBUF,#80H;发送ERR=1的状态字SETB SM2;SM2重新置位SJMP RETU;返回主程序SRXD3:JZ SCHRX;若A=00H既主机发送从机接收转SCHRXJB F0H,STXD;若从机准备好(F0H=1)时,转STXDMOV SBUF,#00H;未准备好时,向主机发回TRXD=0信息SETB SM2SJMP RETU;返回主程序ST
35、XD:MOV SBUF,#02H;向主机发送TRDY=1的状态字JNB TI,$;等待发送完毕CLR TI;发送完毕后清标志TILOOP1:MOV SBUF,R0;开始发送数据块JNB TI,$CLR TIINC R0DJNZ R2,LOOP1SETB SM2;数据块发送完毕SJMP RETU;返回主程序SCHRX:JB PSW.1,SRXD;本机接收就绪时转SRXDMOV SBUF,#00H;接收未准备好时,向主机发RRDY=0SETB SM2SJMP RETU;返回主程序SRXD:MOV SBUF,#01H;向主机发送RRDY=1状态字LOOP2:JNB RI,$;等待接收数据块,开始接收数据块CLR RIMOV R1,SBUFINC R1DJNZ R3,LOOP2SETB SM2;数据块接收完毕SJMP RETU;返回主程序END返回本节目录 推荐C51教程:单片机的C语言应用程序设计 马忠梅 籍顺心等编著 北京航空航天大学出版社 第3版