单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,,本节主要介绍,串行通信概念,及51系列单片机的,串行口,问题,将具体介绍以下内容:,计算机串行通信基础,----基本概念、标准接口 51单片机串行口,----串行口结构、串行口的控制寄存器、串行口的工作方式、应用举例6.3 串行通信口,1,,6.3.1 数据通信概述,,随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能愈来愈显得重要通信的目的:,实现计算机与外部设备或计算机与计算机之间的,信息交换通信的方式:并行通信,和,串行通信,两种方式PS:在多微机系统以及现代测控系统中信息的交换多采用,串行通信方式,一、数据通信方式:,2,,计算机通信,是将计算机技术和通信技术的相结合,完成计算机与外部设备或计算机与计算机之间的信息交换,可以,分为两大类:并行通信与串行通信1、并行通信,通常是将数据字节的各位用多条数据线同时进行传送,优点:,控制简单、传输速度快;,,缺点:,由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难3,,优点:,,传输线少,长距离传送时,,成本低,且可以利用,,网等现成的设备;,,缺点:,,数据的传送控制比并行通,,信复杂。
2、串行通信,是将数据字节分成一位一位的形式在一条传输线,,上逐个地传送4,,二、异步通信与同步通信,,1、异步通信,,,异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程为使双方的收发协调,要求发送和接收设备的时钟尽可能一致5,,异步串行通信的帧格式 :,异步通信的特点,:异步串行通信是以字符为单位的间歇传输形式传送时按字符进行包装,(在数据位之外要增添起始位、奇偶校验位、停止位)不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起止位,各帧之间还有间隔,因此传输效率不高6,,*五、串行通信的错误校验,,,1、奇偶校验,,在发送数据时,数据位尾随的1位为奇偶校验位(1或0)奇校验时,数据中“1”的个数与校验位“1”的个数之和应为奇数;偶校验时,数据中“1”的个数与校验位“1”的个数之和应为偶数接收字符时,对“1”的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错2、代码和校验,,代码和校验是发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾接收方接收数据同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,相符则无差错,否则即认为传送过程中出现了差错。
3、循环冗余校验,,这种校验是通过某种数学运算实现有效信息与校验位之间的循环校验,常用于对磁盘信息的传输、存储区的完整性校验等这种校验方法纠错能力强,广泛应用于同步通信中7,,串行通信的传输速率与传输距离,,1、传输速率,,传输速率是用来说明数据传送的快慢在串行通信中,用波特率来表示数据传送的快慢波特率是指串行通信中,单位时间传送的二进制位数,单位为bps例:如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的波特率为:,10位×240个/秒 = 2400 bps(位/秒),8,,*2、传输距离与传输速率的关系,,串行接口或终端直接传送串行信息位流的最大距离与传输速率及传输线的电气特性有关当比特率超过1000 bps 时,最大传输距离迅速下降,如9600 bps 时最大距离下降到只有76m(约250英尺)9,,同步通信(Synchronous Communication)是按数据块,,传送的把要传送的字符顺序地连接起来,组成数据块,在数据,,块的前面加上特殊的同步字符,作为数据块的起始符号在数据块后面加上校验字符,用于校验通信中的错误,(2)同步通信,10,,三、串行通信的传输方式,,1、单工,,,单工是指数据传输仅能沿一个方向,不能实现反向传输。
2、半双工,,,半双工是指数据传输可以沿两个方向,但需要,分时,进行3、全双工,,,全双工是指数据可以,同时,进行双向传输11,,4.串行通信的信号传输,(1)通信线路的连接方式,12,,信号的调制与解调,:,,利用调制器(Modulator)把数字信号转换成模拟信号,然后送到通信线路上去,再由解调器(Demodulator)把从通信线路上收到的模拟信号转换成数字信号由于通信是双向的,调制器和解调器合并在一个装置中,这就是调制解调器MODEMData Communications Equipment(数据通信设备),它在DTE和传输线路之间提供信号变换和编码功能,,,并负责建立、保持和释放链路的连接,如Modem"DataTerminalEquipment(,数据终端设备,)",13,,2)串行通信总线标准及其接口,UART:能够完成异步通信的硬件电路,,即通用异步接收器/发送器,,(Universal Asychronous Receiver/Transmitter),USRT:能够完成同步通信的硬件电路,,即通用同步接收器/发送器,,(Universal Sychronous Receiver/Transmitter),USART:既能完成异步通信又能完成同步通信的硬件电路,,(Universal Sychronous Asychronous Receiver/Transmitter),,14,,三类异步串行通信接口 :,RS-232接口;RS-449、RS-422和RS-485接口以及,,20mA电流环。
RS-232接口标准 :,RS是Recommended Standard的缩写,代表推赠标准,15,,*五,、串行通信的错误校验,,,1、奇偶校验,,在发送数据时,数据位尾随的1位为奇偶校验位(1或0)奇校验时,数据中“1”的个数与校验位“1”的个数之和应为奇数;偶校验时,数据中“1”的个数与校验位“1”的个数之和应为偶数接收字符时,对“1”的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错2、代码和校验,,代码和校验是发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾接收方接收数据同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,相符则无差错,否则即认为传送过程中出现了差错3、循环冗余校验,,这种校验是通过某种数学运算实现有效信息与校验位之间的循环校验,常用于对磁盘信息的传输、存储区的完整性校验等这种校验方法纠错能力强,广泛应用于同步通信中16,,六、串行通信的传输速率与传输距离,,,,1、传输速率,,传输速率是用来说明数据传送的快慢在串行通信中,用,波特率,来表示数据传送的快慢波特率,是指串行通信中,单位时间传送的二进制位数,单位为bps。
例:,如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的波特率为:,10位×240个/秒 = 2400 bps(位/秒),17,,*,2、传输距离与传输速率的关系,,串行接口或终端直接传送串行信息位流的最大距离与传输速率及传输线的电气特性有关当比特率超过1000 bps 时,最大传输距离迅速下降,如9600 bps 时最大距离下降到只有76m(约250英尺)18,,串行通信接口标准,,一、RS-232C接口,,RS-232C是EIA(,Electronic Industry Association,美国电子工业协会)1969年修订RS-232C标准RS-232C定义了数据终端设备(DTE)与数据通信设备(DCE)之间的物理接口标准1、机械特性,,RS-232C接口规定使用25针连接器,连接器的尺寸及每个插针的排列位置都有明确的定义19,,2、功能特性,,表6.3,RS-232C串口引脚定义表,9,针,RS-232,串口(,DB9,),,,.,25,针,RS-232,串口(,DB25,),,,引脚,简写,功能说明,,引脚,简写,功能说明,1,CD,载波侦测(,Carrier Detect,),,8,CD,载波侦测(,Carrier Detect,),2,RXD,接收数据(,Receive,),,3,RXD,接收数据(,Receive,),3,TXD,发送数据(,Transmit,),,2,TXD,发送数据(,Transmit,),4,DTR,数据终端准备(,Data Terminal Ready,),,20,DTR,数据终端准备(,Data Terminal Ready,),5,GND,地线(,Ground,),,7,GND,地线(,Ground,),6,DSR,数据准备好(,Data Set Ready,),,6,DSR,数据准备好(,Data Set Ready,),7,RTS,请求发送(,Request To Send,),,4,RTS,请求发送(,Request To Send,),8,CTS,清除发送(,Clear To Send,),,5,CTS,清除发送(,Clear To Send,),9,RI,振铃指示(,Ring Indicator,),,22,RI,振铃指示(,Ring Indicator,),20,,3、过程特性,,过程特性规定了信号之间的时序关系,以便正确地接收和发送数据,,。
远程通信连接,21,,近程通信连接,22,,4、RS-232C的其它规定,RS-232C是一种电压型总线标准,以不同的电压表示逻辑值:,,-3V~-15V表示逻辑“1”,,+3V~+15V表示逻辑“0”,,,标准数据传送速率有50、75、110、150、300、600、1200、2400、4800、9600、19200波特等23,,*5、采用RS-232C接口存在的问题,,1、传输距离短,传输速率低,,RS-232C总线标准受电容允许值的约束,使用时传输距离一般不要超过15米(线路条件好时也不超过几十米)最高传送速率为20Kbps2、有电平偏移,,RS-232C总线标准要求收发双方共地通信距离较大时,收发双方的地电位差别较大,在信号地上将有比较大的地电流并产生压降3、抗干扰能力差,,RS-232C在电平转换时采用单端输入输出,在传输过程中当干扰和噪声混在正常的信号中为了提高信噪比,RS-232C总线标准不得不采用比较大的电压摆幅24,,6.3.2,80C51的串行口,,1,80C51串行口的结构,CPU内部,MCS-51单片机串行口主要由,发送数据寄存器、发送控制器、输出控制门、接收数据寄存器、接收控制器、输入移位寄存器,等组成,,从用户使用的角度,,它由三个特殊功能寄存器组成:发送数据寄存器和接收数据寄存器合起用一个,特殊功能寄存器SBUF,(串行口数据寄存器),,串行口控制寄存器SCON,和,电源控制寄存器PCON。
25,,1)SCON --- 可位寻址的串行口控制寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志:,,2,80C51串行口寄存器,,SM0和SM1为工作方式选择位,可选择四种工作方式:,,26,,SM2:多机通信控制位REN:允许接收控制位当REN=1,则允许接收,当REN=0,则禁止接收TB8:发送数据的第9位RB8:接收数据的第9位TI:发送中断标志位RI:接收中断标志位27,,*,●,SM2,多机通信控制位,,主要用于方式2和方式3当,接收机的SM2=1时可以利用收到的RB8来控制是否激活RI,(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI,(即此时RB8不具有控制RI激活的功能)通过控制SM2,可以实现多机通信在方式0时,SM2必须是0在方式1时,若SM2=1,则只有接收到有效停止位时,RI才置1●,REN,允许串行接收位,由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收28,,●,TB8,在方式2或方式3中,是发送数据的第九位,,可以用软件规定其作用。
可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位在方式0和方式1中,该位未用●,RB8,在方式2或方式3中,是接收到数据的第九位,,作为奇偶校验位或地址帧/数据帧的标志位在方式1时,若SM2=0,则RB8是接收到的停止位29,,,●,TI,发送中断标志位,在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,,由内部硬件使TI置1,,向CPU发中断申请在中断服务程序中,必须用,软件将其清0,,取消此中断申请●,RI,接收中断标志位,在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,,由内部硬件使RI置1,,向CPU发中断申请也必须在中断服务程序中,用,软件将其清0,,取消此中断申请30,,2) PCON电源控制寄存器,,:,,SMOD(PCON.7) 波特率倍增位在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍复位时,SMOD=03) IE中断允许控制寄存器,,:,,EA----中断允许总控制位;ES----串行中断允许控制位,,4) IP中断优先级控制寄存器,,:,,PS----串行中断优先级设定位,,31,,6.3.3,80C51串行口的工作方式,,一、方式0,,方式0时,串行口为同步移位寄存器的输入输出方式。
主要用于扩展并行输入或输出口数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出发送和接收均为8位数据,,低位在先,高位在后,波特率固定为fosc/1232,,1、方式0发送过程:,,,在TI=0时,当CPU执行一条向SBUF写数据的指令时,如,,MOV SBUF,A,;就启动发送过程经过一个机器周期,写入发送数据寄存器中的数据按,低位在前,高位在后,从RXD依次发送出去,同步时钟从TXD送出8位数据(一帧)发送完毕后,由硬件使发送中断标志TI置位,向CPU申请中断33,,2、方式0接收过程,,在RI=0的条件下,将REN(SCON.4)置“1”就启动一次接收过程串行数据通过RXD接收,同步移位脉冲通过TXD输出在移位脉冲的控制下,RXD上的串行数据依次移入移位寄存器当8位数据(一帧)全部移入移位寄存器后,接收控制器发出“装载SBUF”信号,将8位数据并行送入接收数据缓冲器SBUF中,同时,由硬件使接收中断标志RI置位,向CPU申请中断34,,☞,常用于串行通讯除发/收8位数据外,还,,在D0位前有一个起始位“0”;,,在D7位后有一个停止位“1”☞,方式1工作时:,,发送端自动添加一个起始位和一个停止位;,,接收端自动去掉一个起始位和一个停止位。
二、方式1,--8位UART(1+8+1位)波特率可变,,,☞,波特率可变,,——,用定时器T1作波特率发生器,:,,公式:波特率 =(2,SMOD,/32),T1的溢出率,35,,波特率=(2,SMOD,/32),T1的溢出率,☞,溢出率:T1溢出的频繁程度,,即:,T1溢出一次所需时间的倒数T1溢出时间=(256-X)×(12/fosc),☞,初值 X =,2,n,-,2,SMOD, fosc,,32,,波特率,,,12,☞,波特率 =,2,SMOD, fosc,,32, 12×(256,,- X),其中:X 是定时器初值,36,,☞,例,用T1工作于,方式2,来产生波特率1200,,,已知晶振频率=6MHz要求出T1的初值:,初值 X =,2,8,-,2,0, 610,6,,32,,1200,,,12,= 256,-,= 256,-,13.02,610,6,,460800,,243 = 0F3H,37,,,*,三、方式2和方式3,,方式2或方式3时为11位数据的异步通信口TXD为数据发送,,引脚,RXD为数据接收引脚,方式2和方式3时起始位1位,数据9位(含1位附加的第9位,发送时为SCON中的TB8,接收时为RB8),停止位1位,一帧数据为11位。
方式2的波特率固定为晶振频率的1/64或1/32,方式3的波特率由定时器T1的溢出率决定38,,1、方式2和方式3输出,发送开始时,先把起始位0输出到TXD引脚,然后发送移位寄存器的输出位(D0)到TXD引脚每一个移位脉冲都使输出移位寄存器的各位右移一位,并由TXD引脚输出第一次移位时,停止位“1”移入输出移位寄存器的第9位上 ,以后每次移位,左边都移入0当停止位移至输出位时,左边其余位全为0,检测电路检测到这一条件时,使控制电路进行最后一次移位,并置TI=1,向CPU请求中断39,,2、方式2和方式3输入,接收时,数据从右边移入输入移位寄存器,在起始位0移到最左边时,控制电路进行最后一次移位当RI=0,且SM2=0(或接收到的第9位数据为1)时,接收到的数据装入接收缓冲器SBUF和RB8(接收数据的第9位),置RI=1,向CPU请求中断如果条件不满足,则数据丢失,且不置位RI,继续搜索RXD引脚的负跳变40,,6.3.4 串行口的编程及应用,,一.串行口的初始化编程,1.串行口控制寄存器SCON位的确定根据工作方式确定SM0、SM1位;,,*,对于方式2和方式3还要确定SM2位;,,如果是接收端,则置允许接收位REN为1;,,*,如果方式2和方式3发送数据,则应将发送数据的第9位写入TB8中。
41,,2.设置波特率对于方式0,不需要对波特率进行设置对于方式2,设置波特率仅须对PCON中的SMOD位进行设置42,,对于方式1和方式3,设置波特率不仅须对PCON中的SMOD位进行设置,还要对定时/计数器T1进行设置,这时定时/计数器T1一般工作于方式2(8位可重置方式),初值可由下面公式求得:,,由于: 波特率=2SMOD×(T1的溢出率)/32,,则: T1的溢出率=波特率×32/2SMOD,,而T1工作于方式2的溢出率又可由下式表示:,,T1的溢出率=fosc/(12×(256-初值)),,所以:,,T1的初值=256 - fosc×2SMOD /(12×波特率×32),,43,,二.串行口的应用,通常用于三种情况:,,利用方式0扩展并行I/O口;,,利用方式1实现点对点的双机通信;,,利用方式2或方式3实现多机通信44,,1.利用方式0扩展并行I/O口,,MCS-51单片机的串行口在方式0时,当外接一个串入并出的移位寄存器,就可以扩展并行输出口,当外接一个并入串出的移位寄存器时,就可以扩展并行输入口45,,例6.3.1 用单片机的串行口外接并入串出和串入并出的芯片,输入一组8位的开关信息,使其控制一组8位的发光二极管,发光二极管的状态对应开关的状态。
1时,允许串行移位,,=0时,允许并行读入按键46,,汇编语言程序,,ORG 0000H,,AJMP MAIN,,ORG 0100H,,MAIN: MOV SCON,#10H ;REN=1,RI=0,SM0=0,SM1=0,,,;串行口工作在方式0,且启动;接收过程,,LOOP: CLR P1.0 ;S/L=0,允许并行读入按键到74LS165,,SETB P1.0 ; S/L=1,允许串行移位,,CLR RI ;启动接收,,JNB RI ,$ ;若RI=0,8位数据未接收完,等待,,MOV A ,SBUF ;若RI=1,8位数据接收完,读入A,,CLR TI ;清发送标志,准备发送,,MOV SBUF ,A ;启动发送,输出数据位0,将点亮对应LED,,;输出数据位1,LED不亮,,JNB TI ,$ ;8位数据未发送完,等待,,SJMP LOOP ;8位数据发送完,循环,,END,47,,C语言程序:,,#include ,,Sbit P1_0=P1^0;,,Void main(),,{,,unsigned char i,,SCON=0x10;,,While(1),,{,,P1_0=0;,,P1_0=1;,,RI=0;,,While (!RI) ;,,i=SBUF;,,TI=0;,,SBUF=i;,,While (!TI) ;,,},,},48,,【补充例1】用8051单片机的串行口外接串入并出的芯片74LS164扩展并行输出口控制一组发光二极管,使发光二极管从左至右延时轮流显示。
分析:,74LS164是一块8位的串入并出的芯片,带 有一个控制端STB,当STB=0时,打开串行输入控制门,在时钟信号CLK的控制下,数据从串行输入端DATA一个时钟周期一位依次输入;,当STB=1,打开并行输出控制门,,74LS164,中的8位数据并行输出使用时,8051串行口工作于方式0,8051的TXD接,74LS164,的CLK,RXD接DATA,STB用P1.0控制,8位并行输出端接8个发光二极管如图所示49,,50,,,汇编程序:,,ORG 0000H,,LJMP MAIN,,ORG 0100H,,MAIN: MOV SCON,#00H,,MOV A,#01H,,CLR P1.0,,START:MOV SBUF,A,,LOOP: JNB TI,LOOP,,SETB P1.0,,ACALL DELAY,,CLR TI,,RL A,,CLR P1.0,,SJMP START,,,DELAY:MOV R7,#05H,,LOOP2:MOV R6,#0FFH,,LOOP1:DJNZ R6,LOOP1,,DJNZ R7,LOOP2,,RET,,END,解:,设串行口采用查询方式,显示的延时依靠调用延时子程序来实现。
程序如下:,51,,C语言程序:,,# include ,,void main(),,{,,unsigned char i,j;,,SCON=0x00;//串口工作于方式0,发送数据,,j=0x01;,,while(1),,{,,SBUF=j;,,while (!TI) ;,,TI=0;,,for (i=0;i<=254;i++) ;// 延时,,j<<=1;,,if (j= =0x00) j=0x01;,,},,},52,,*,【补充例2】 用8051单片机的串行口外接并入串出的芯片CD4094扩展并行输入口,输入一组开关的信息CD4094是一块8位的并入串出的芯片,带有一个控制端P/S,当P/S=1时,8位并行数据置入到内部的寄存器;当P/S=0时,在时钟信号CLK的控制下,内部寄存器的内容按低位在前从QB串行输出端依次输出;使用时,8051串行口工作于方式0,8051的TXD接CD4094的CLK,RXD接QB,P/S用P1.0控制,另外,用P1.1控制8并行数据的置入如图所示8051,RXD,TXD,P1.0,QB,CLK,P/S,P1.1,K0,K7,K,53,,串行口方式0数据的接收,用SCON寄存器中的REN位来控制,采用查询RI的方式来判断数据是否输入。
程序如下:,,汇编程序:,,ORG 0000H,,LJMP MAIN,,ORG 0100H,,MAIN: SETB P1.1,,START:JB P1.1,START,,SETB P1.0 ;从并口读入数据,,CLR P1.0 ;启动串口在时钟作用下传输数据,,MOV SCON,#10H ;设定串口方式0,,LOOP:JNB RI,LOOP ;等待串口数据传输完成,,CLR RI,,MOV A,SBUF,,RET,54,,C语言程序:,,# include //包含特殊功能寄存器库,,sbit P1_0=P1^0;,,sbit P1_1=P1^1;,,void main(),,{,,unsigned char i;,,P1_1=1;,,while (P1_1= =1) {;},,P1_0=1;,,P1_0=0;,,SCON=0x10;,,while (!RI) {;},,RI=0;,,i=SBUF;,,……,,},55,,2.单片机的双机通信,,使用中断方式时,单片机串行通信程序的编程要点如下:,,① 选择正确的控制字,以保证串行口功能的初始化(即设置寄存器SCON的内容);,,② 选择合适的波特率,主要指设置定时器1的工作方式和时间常数(即设定TMOD和TH1、TL1寄存器的内容)。
③ 启动定时器1(使用SETB TR1指令)④ 开放串行口中断(使用SETB ES指令)⑤ 开放总的中断(使用SETB EA指令)⑥ 编制串行中断服务程序,在串行中断服务程序中要设置清除中断标志标志指令56,,例6.3.2 假定甲、乙两台单片机,以方式1进行串行数据通信,其波特率为1200,晶振频率为11.0592MHz甲机发送:发送数据在外部RAM以ADDRA为首址共128字节的单元中;乙机接收:把接收到的128字节的数据,顺序存放在以ADDRB为首址的外部RAM中8051,8051,甲机,RXD,TXD,GND,TXD,RXD,GND,乙机,57,,解:计算定时器1的计数初值:,,,X=256-,,,,=256-24=232=0E8H,,式中取位SMOD=0,则应使PCON=00H,58,,甲机汇编语言发送程序如下:,,ORG 0000H,,LJMP MAINA ;跳至主程序入口,,ORG 0023H,,AJMP SER_T1A ;转至串行中断服务程序,59,,ORG 0100H,,MAINA: MOV SP ,#60H ;设置堆栈指针,,MOV SCON ,#40H ;串行口置工作方式1,,MOV TMOD ,#20H ;定时器1为工作方式2,,MOV TL1 ,#0E8H ;定时器1计数初值,,MOV TH1 ,#0E8H ;计数重装值,,MOV PCON ,#00H ;波特率不倍增,,SETB TR1 ;启动定时器1,,SETB EA ;中断总允许,,SETB ES ;串行口开中断,,MOV DPTR ,#ADDRA ;发送数据的首地址,,;ADDRA送DPTR,,MOV R0 ,#00H ;传送字节数初值,,MOVX A ,@DPTR ;取第一个发送字节,,MOV SBUF ,A ;启动串行口发送,,SJMP $ ;等待中断,60,,ORG 0200H,,SER_T1A: CLR TI ;将中断标志清零,,CJNE R0 , #7FH,LOOPA ;判断128B是否发送,,;完,若没完,则转LOOPA,,;继续取下一发送数据,,CLR ES ;全部发送完毕,禁止串行口中断,,AJMP ENDA ;转中断返回,,LOOPA: INC R0 ;字节数加1,,INC DPTR ;地址指针加1,,MOVX A ,@DPTR ;取发送数据,,MOV SBUF ,A ;启动串行口,,ENDA: RETI ;中断返回,,END,61,,甲机对应的C语言发送程序如下:,,#include /* 包含8051单片机的寄存器定义头文件 */,,unsigned char xdata ADDRA [128]; /* 在外部RAM区定义128个单元 */,,unsigned char num=0; /* 声明计数变量 */,,unsigned char *p; /* 定义 p为指针 */,,void main(void) /* 主程序 */,,{,,SCON=0x40; /* 置串行口工作方式1 */,,TMOD=0x20; /* 定时器1为工作方式2 */,,PCON=0x00; /* SMOD=0 */,,TL1=0xe8; /* 置计数初值 */,,TH1=0xe8; /* 计数重装值 */,,TR1=1; /* 启动定时器1 */,,EA=1; /* 开中断 */,,ES=1; /* 串行口开中断 */,,p=ADDRA; /* 设置发送数据缓冲器区指针 */,,SBUF=*p; /* 发送第一个数据 */,,while (1); /* 等待中断 */,,},62,,void Ser_T1A (void) interrupt 4 /* 中断号4是串行中断 */,,{,,TI=0; /* 清发送中断标志 */,,num++; /* 计数变量加1 */,,if (num==0x7F) ES=0; /* 判断是否发送完,若已完,则关中断 */,,else /* 否则,修改指针,发送下一个数据 */,,{,,p++;,,SBUF=*p;,,},,},63,,ORG 0000H,,LJMP MAINB ;转主程序,,ORG 0023H,,AJMP SER_T1B ;转串行口中断服务程序,64,,ORG 0100H,,MAINB: MOV SP ,#60H ;设置堆栈指针,,MOV SCON ,#50H ;串行口置工作方式1,允许接收,,MOV TMOD ,#20H ;定时器1为工作方式2,,MOV PCON ,#00H ;波特率不倍增,,MOV TL1 ,#0E8H ;设置计数初值,,MOV TH1 ,#0E8H ;计数重装值,,SETB TR1 ;启动定时器1,,SETB EA ;开中断,,SETB ES ;串行口开中断,,MOV DPTR ,#ADDRB,,;数据缓冲区首地址送DPTR,,MOV R0 ,#00H ;置传送字节数初值,,SJMP $ ;等待中断,65,,;中断服务程序,,SER_T1B: CLR RI ;清接收中断标志,,MOV A ,SBUF ;取接收的数据,,MOVX @DPTR ,A ;接收的数据送缓冲区,,CJNE R0 ,#7FH ,LOOPB,,;判别接收完没有。
若没有,转LOOPB,继续接收,,CLR ES ;若接收完,则关串行口中断,,LJMP ENDB,,LOOPB: INC R0 ;计数指针加1,,INC DPTR ;地址指针加1,,ENDB: RETI ;中断返回,,END,66,,乙机对应的C语言程序如下:,,#include ,,unsigned char xdata ADDRB [128];,,unsigned char num=0; /* 声明计数变量 */,,unsigned char *p; /* 定义 p为指针 */,,void main(void) /* 主程序 */,,{,,SCON=0x50; /* 置串行口工作方式1,允许接收 */,,TMOD=0x20; /* 定时器1为工作方式2 */,,PCON=0x00; /* SMOD=0 */,,TL1=0xe8; /* 置计数初值 */,,TH1=0xe8; /* 计数重装值 */,,TR1=1; /* 启动定时器1 */,,EA=1; /* 开中断 */,,ES=1; /* 串行口开中断 */,,p=ADDRB; /* 设置接收数据缓冲器区指针 */,,while (1); /* 等待中断 */,,},67,,void Ser_T1B (void) interrupt 4 /* 中断号4是串行中断 */,,{,,RI=0; /* 清接收中断标志 */,,num++; /* 计数变量加1 */,,if (num==128),,ES=0;,/* 判断是否接收完,若已完,则关中断 */,,else /* 否则,接收数据,修改指针 */,,{,,,*p=SBUF,,p++;,,},,},,68,,例6.3.3 设有A、B两台单片机,,当A机开始发送时,先送一个“AA”信号,B机收到后回答一个“BB”,表示同意接收。
当A机收到“BB”后,开始发送数据,每发送一次求“校验和”,假定数据块长度为16个字节,数据缓冲区为BUF,数据块发送完后马上发送“校验和”B机接收数据并将其转储到数据缓冲区BUF,每接收到一个数据便计算一次“校验和”,当收齐一个数据块后,再接收A机发来的校验和,并将它与B机求出的校验和进行比较若两者相等,说明接收正确,B机回答00H;若两者不等,说明接收不正确,B机回答0FFH,请求重发A机收到00H的回答后,结束发送;若收到的答复非零,则将数据再重发一次双方约定的传输速率为2400bps,晶振频率为12MHz,T1工作在定时器模式2,SMOD=069,,A机汇编语言程序如下:,,ORG 0000H,,LJMP MAINA,,ORG 0100H,,MAINA: CLR EA ;禁止中断,,MOV SCON ,#50H ;串行口置工作方式1,允许接收,,MOV TMOD ,#20H ;定时器1为工作方式2,,MOV PCON ,#00H ;波特率不倍增,,MOV TL1 ,#0F3H ;设置计数初值,,MOV TH1 ,#0F3H ;计数重装值,,SETB TR1 ;启动定时器1,70,,TLP1: MOV SBUF ,#0AAH ;发联络信号“AAH”,,JNB TI ,$ ;等待一帧发送完毕,,CLR TI ;允许再发送,,JNB RI ,$ ;等待B机的应答信号,,CLR RI ;允许再接收,,MOV A ,SBUF ;B机应答后读到A机,,XRL A ,#0BBH ;判断B机是否准备好,,JNZ TLP1 ;B机未准备好,继续联络,,TLP2: MOV DPTR ,#BUF ;B机准备好,设定缓冲,,;区BUF地址指针初值,,MOV R7 ,#10H ;设定数据块长度初值,,MOV R0 ,#00H ;清校验和单元,71,,TLP3: MOVX A,@DPTR,,MOV SBUF,A ;发送一个数据字节,,ADD A,R0 ;求校验和,,MOV R0,A ;保存校验和,,INC DPTR,,JNB TI,$ ;未发送完一个字节等待,,CLR TI,,DJNZ R7,TLP3 ;整个数据块未发送完转TLP3,,MOV SBUF,R0 ;发送校验和,,JNB TI,$,,CLR TI,,JNB RI,$ ;等待B机的应答信号,,CLR RI,,MOV A,SBUF ;B机应答读到A,,XRL A,#00H ;判断B机是否正确接收,,JNZ TLP2 ;B机应答错误,重新发送,,RET ;B机应答正确,返回,72,,B机汇编语言程序如下:,,ORG 0000H,,LJMP MAINB,,ORG 0100H,,MAINB: CLR EA ;禁止中断,,MOV SCON ,#50H ;串行口置工作方式1,允许接收,,MOV TMOD ,#20H ;定时器1为工作方式2,,MOV PCON ,#00H ;波特率不倍增,,MOV TL1 ,#0F3H ;设置计数初值,,MOV TH1 ,#0F3H ;计数重装值,,SETB TR1 ;启动定时器1,,RLP1: JNB RI ,$ ;等待A机的联络信号,,CLR RI ;允许再接收,,MOV A,SBUF ;收到A机信号,,XRL A,#0AAH ;判断是否A机联络信号,,JNZ RLP1 ;不是A机联络信号,继续等待,,MOV SBUF,#0BBH ;是A机联络信号,发准备好信号,,JNB TI ,$ ;未发送完一帧等待,,CLR TI ;允许再发送,,MOV DPTR ,#BUF ;设定缓冲区BUF地址指针初值,,MOV R7 ,#10H ;设定数据块长度初值,,MOV R0 ,#00H ;清校验和单元,73,,RLP2: JNB RI,$ ;等待接收数据,,CLR RI ;允许再接收,,MOV A,SBUF ;收到数据,,MOVX @DPTR,A ;存储数据,,INC DPTR,,ADD A,R0 ;求校验和,,MOV R0,A,,DJNZ R7,RLP2 ;数据未接收完毕转RLP2,,JNB RI,$ ;完毕,接收B机发来的校验和,,CLR RI,,MOV A,SBUF,,XRL A,R0 ;比较校验和,,JZ ENDB ;校验和相等,跳至发正确标志,,MOV SBUF,#0FFH ;校验和不相等,发错误标志,,JNB TI,$,,CLR TI,,AJMP RLP2 ;转重新接收,,ENDB: MOV SBUF,#00H ;发正确标志,,RET,74,,【补充例3】 用汇编语言编程通过串行实现将甲机的片内RAM中30H~3FH单元的内容传送到乙机的片内RAM的40H~4FH单元中。
分析:,甲、乙两机都选择方式1:8位异步通信方式,最高位用作奇偶校验,波特率为1200bps,甲机发送,乙机接收,因此甲机的串口控制字SCON为40H,乙机的串口控制字SCON为50H75,,由于选择的是方式1,波特率由定时/计数器T1的溢出率和电源控制寄存器PCON中的SMOD位决定则须对定时/计数器T1初始化设SMOD=0,甲、乙两机的振荡频率为12MHZ,由于波特率为1200定时/计数器T1选择为方式2,则初值为:,,初值=256 - fosc×2SMOD /(12×波特率×32),,=/(12×1200×32)≈230=E6H,,根据要求定时/计数器T1的方式控制字TMOD为20H甲机的发送程序:,,TSTART: MOV TMOD,#20H,,MOV TL1,#0E6H,,MOV TH1,#0E6H,,MOV PCON,#00H,,MOV SCON,#40H,,MOV R0,#30H,,MOV R7,#10H,,SETB TR1,,LOOP: MOV A,@R0,,MOV SBUF,A,,WAIT:JNB TI,WAIT,,CLR TI,,INC R0,,DJINZ R7,LOOP,,RET,76,,乙机接收程序:,,RSTART:MOV TMOD,#20H,,MOV TL1,#0E6H,,MOV TH1,#0E6H,,MOV PCON,#00H,,MOV R0,#40H,,MOV R7,#10H,,SETB TR1 ;启动定时器1,,LOOP:MOV SCON,#50H,,WAIT: JNB RI,WAIT,,MOV A,SBUF,,MOV @R0,A,,INC R0,,DJNZ R7,LOOP,,RET,77,,*,3.多机通信,通过MCS-51单片机串行口能够实现一台主机与多台从机进行通信,主机和从机之间能够相互发送和接收信息。
但从机与从机之间不能相互通信MCS-51单片机串行口的方式2和方式3是9位异步通信,发送信息时,发送数据的第9位由TB8取得,接收信息的第9位放于RB8中,而接收是否有效要受SM2位影响,当SM2=0时,无论接收的RB8位是0还是1,接收都有效,RI都置1;当SM2=1时,只有接收的RB8位等于1时,接收才有效,RI才置1利用这个特性便可以实现多机通信多机通信时,主机每一次都向从机传送两个字节信息,先传送从机的地址信息,再传送数据信息,处理时,地址信息的TB8位设为1,数据信息的TB8位设为0多机通信过程如下:,,(1)所有从机的SM2位开始都置为1,都能够接收主机送来的地址2)主机发送一帧地址信息,包含8位的从机地址,TB8置1,表示发送的为地址帧78,,(3)由于所有从机的SM2位都为1,从机都能接收主机发送来的地址,从机接收到主机送来的地址后与本机的地址相比较,如接收的地址与本机的地址相同,则使SM0位为0,准备接收主机送来的数据,如果不同,则不作处理4)主机发送数据,发送数据时TB8置为0,表示为数据帧5)对于从机,由于主机发送的第9位TB8为0,那么只有SM2位为0的从机可以接收主机送来的数据。
这样就实现主机从多台从机选择一台从机进行通信了例4】要求设计一个一台主机,255台从机的多机通信的系统1)硬件线路图如下图,RXD,TXD,8051,GND,主机,…..,RXD,TXD,GND,从#FE,RXD,TXD,GND,从#01,RXD,TXD,GND,从#00,79,,2)软件设计,,① 通信协议,,通信时,为了处理方便,通信双方应制定相应的协议,在本例中主、从机串行口都设为方式3,波特率为1200bps,PCON中的SMOD位都取0,设fosc为12MHZ,根据例5.7定时/计数器T1的方式控制字为20H,初值为E6H,主机的SM2位设为0,从机的SM2开始设为1,从机地址从00H~FEH另外还制定如下几条简单的协议:,,主机发送的控制命令:,,00H:要求从机接收数据TB8=0),,01H:要求从机发送数据TB8=0),,FFH:命令所有从机的SM2位置1,准备接收主机送来的地址TB8=1),,从机发给主机状态字格式如图,其中:,,ERR=1,表示从机接收到非法命令TRDY=1,表示从机发送准备就绪RRDY=1,表示从机接收准备就绪80,,开始,串口初始化,发送地址帧,发送命令帧,命令从机复位,命令分类,主机发送数据,主机接收数据,从机应答否?,从机应答地址?,从机应答否?,命令正确否?,从机接收就绪?,从机发送就绪?,未发完?,未接收完?,结束,否,否,否,否,否,否,否,否,是,是,是,是,是,是,是,是,01,00,② 主机的通信程序流程,81,,从机采用中断处理,主程序中对串口初始化,中断系统初始化。
中断服务程序中实现信息的接收与发送,从机中断服务程序流程见图,主程序略中断服务程序,CLR RI,现场保护,地址相符?,SM2=0,本机地址送主机,接收下一帧,是命令帧?,命令帧分类,ERR=1送主机,接收就绪?,发送就绪?,RRDY=0送主机,RRDY=1送主机,TRDY=1送主机,接收数据,发送数据,接收完?,发送完?,TRDY=0送主机,SM2=1,恢复现场,中断返回,否,否,否,否,否,否,是,是,是,是,是,是,01H,00H,非法命令,82,,③ 主机的通信程序设计,,设发送、接收数据块长度为16字节这里仅编写主机发16个字节到01号从机的程序和主机从02号从机接收16个字节的程序略),④ 从机的通信程序设计,,从机接收、发送数据块长度为16字节,所有的从机的程序相同,只是不同的从机的本机号SLAVE不一样 (略),83,,作业,P176,,16,17,18,19,84,,。