串行通信概念及51系列单片机的串行口问题.ppt
本节主要介绍串行通信概念及51系列单片机的串行口问题,将具体介绍以下内容:,计算机串行通信基础-基本概念、标准接口。,51单片机串行口-串行口结构、串行口的控制寄存器、串行口的工作方式、应用举例。,6.3 串行通信口,6.3.1 数据通信概述,随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能愈来愈显得重要。通信的目的:实现计算机与外部设备或计算机与计算机之间的信息交换。通信的方式:并行通信和串行通信两种方式。PS:在多微机系统以及现代测控系统中信息的交换多采用串行通信方式。,一、数据通信方式:,计算机通信是将计算机技术和通信技术的相结合,完成计算机与外部设备或计算机与计算机之间的信息交换。可以分为两大类:并行通信与串行通信。1、并行通信通常是将数据字节的各位用多条数据线同时进行传送。,优点:控制简单、传输速度快;缺点:由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。,优点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备;缺点:数据的传送控制比并行通信复杂。,2、串行通信是将数据字节分成一位一位的形式在一条传输线 上逐个地传送。,二、异步通信与同步通信1、异步通信 异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。,异步串行通信的帧格式:,异步通信的特点:异步串行通信是以字符为单位的间歇传输形式。传送时按字符进行包装(在数据位之外要增添起始位、奇偶校验位、停止位)。不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加23位用于起止位,各帧之间还有间隔,因此传输效率不高。,*五、串行通信的错误校验 1、奇偶校验在发送数据时,数据位尾随的1位为奇偶校验位(1或0)。奇校验时,数据中“1”的个数与校验位“1”的个数之和应为奇数;偶校验时,数据中“1”的个数与校验位“1”的个数之和应为偶数。接收字符时,对“1”的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错。2、代码和校验代码和校验是发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,相符则无差错,否则即认为传送过程中出现了差错。3、循环冗余校验这种校验是通过某种数学运算实现有效信息与校验位之间的循环校验,常用于对磁盘信息的传输、存储区的完整性校验等。这种校验方法纠错能力强,广泛应用于同步通信中。,串行通信的传输速率与传输距离 1、传输速率传输速率是用来说明数据传送的快慢。在串行通信中,用波特率来表示数据传送的快慢。波特率是指串行通信中,单位时间传送的二进制位数,单位为bps。例:如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的波特率为:,10位240个/秒=2400 bps(位/秒),*2、传输距离与传输速率的关系串行接口或终端直接传送串行信息位流的最大距离与传输速率及传输线的电气特性有关。当比特率超过1000 bps 时,最大传输距离迅速下降,如9600 bps 时最大距离下降到只有76m(约250英尺)。,同步通信(Synchronous Communication)是按数据块传送的。把要传送的字符顺序地连接起来,组成数据块,在数据块的前面加上特殊的同步字符,作为数据块的起始符号。在数据块后面加上校验字符,用于校验通信中的错误,(2)同步通信,三、串行通信的传输方式1、单工 单工是指数据传输仅能沿一个方向,不能实现反向传输。2、半双工 半双工是指数据传输可以沿两个方向,但需要分时进行。3、全双工 全双工是指数据可以同时进行双向传输。,4.串行通信的信号传输,(1)通信线路的连接方式,信号的调制与解调:利用调制器(Modulator)把数字信号转换成模拟信号,然后送到通信线路上去,再由解调器(Demodulator)把从通信线路上收到的模拟信号转换成数字信号。由于通信是双向的,调制器和解调器合并在一个装置中,这就是调制解调器MODEM。,Data Communications Equipment(数据通信设备),它在DTE和传输线路之间提供信号变换和编码功能,并负责建立、保持和释放链路的连接,如Modem。,DataTerminalEquipment(数据终端设备),2)串行通信总线标准及其接口,UART:能够完成异步通信的硬件电路 即通用异步接收器/发送器(Universal Asychronous Receiver/Transmitter),USRT:能够完成同步通信的硬件电路 即通用同步接收器/发送器(Universal Sychronous Receiver/Transmitter),USART:既能完成异步通信又能完成同步通信的硬件电路(Universal Sychronous Asychronous Receiver/Transmitter),三类异步串行通信接口:,RS-232接口;RS-449、RS-422和RS-485接口以及20mA电流环。,RS-232接口标准:,RS是Recommended Standard的缩写,代表推赠标准,*五、串行通信的错误校验 1、奇偶校验在发送数据时,数据位尾随的1位为奇偶校验位(1或0)。奇校验时,数据中“1”的个数与校验位“1”的个数之和应为奇数;偶校验时,数据中“1”的个数与校验位“1”的个数之和应为偶数。接收字符时,对“1”的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错。2、代码和校验代码和校验是发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,相符则无差错,否则即认为传送过程中出现了差错。3、循环冗余校验这种校验是通过某种数学运算实现有效信息与校验位之间的循环校验,常用于对磁盘信息的传输、存储区的完整性校验等。这种校验方法纠错能力强,广泛应用于同步通信中。,六、串行通信的传输速率与传输距离 1、传输速率传输速率是用来说明数据传送的快慢。在串行通信中,用波特率来表示数据传送的快慢。波特率是指串行通信中,单位时间传送的二进制位数,单位为bps。例:如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的波特率为:,10位240个/秒=2400 bps(位/秒),*2、传输距离与传输速率的关系串行接口或终端直接传送串行信息位流的最大距离与传输速率及传输线的电气特性有关。当比特率超过1000 bps 时,最大传输距离迅速下降,如9600 bps 时最大距离下降到只有76m(约250英尺)。,串行通信接口标准 一、RS-232C接口RS-232C是EIA(Electronic Industry Association美国电子工业协会)1969年修订RS-232C标准。RS-232C定义了数据终端设备(DTE)与数据通信设备(DCE)之间的物理接口标准。1、机械特性RS-232C接口规定使用25针连接器,连接器的尺寸及每个插针的排列位置都有明确的定义。,2、功能特性,表6.3 RS-232C串口引脚定义表,3、过程特性过程特性规定了信号之间的时序关系,以便正确地接收和发送数据。,远程通信连接,近程通信连接,4、RS-232C的其它规定,RS-232C是一种电压型总线标准,以不同的电压表示逻辑值:3V15V表示逻辑“1”3V15V表示逻辑“0”标准数据传送速率有50、75、110、150、300、600、1200、2400、4800、9600、19200波特等。,*5、采用RS-232C接口存在的问题1、传输距离短,传输速率低 RS-232C总线标准受电容允许值的约束,使用时传输距离一般不要超过15米(线路条件好时也不超过几十米)。最高传送速率为20Kbps。2、有电平偏移 RS-232C总线标准要求收发双方共地。通信距离较大时,收发双方的地电位差别较大,在信号地上将有比较大的地电流并产生压降。3、抗干扰能力差 RS-232C在电平转换时采用单端输入输出,在传输过程中当干扰和噪声混在正常的信号中。为了提高信噪比,RS-232C总线标准不得不采用比较大的电压摆幅。,6.3.2 80C51的串行口,1 80C51串行口的结构,CPU内部,MCS-51单片机串行口主要由发送数据寄存器、发送控制器、输出控制门、接收数据寄存器、接收控制器、输入移位寄存器等组成,从用户使用的角度,它由三个特殊功能寄存器组成:发送数据寄存器和接收数据寄存器合起用一个特殊功能寄存器SBUF(串行口数据寄存器),串行口控制寄存器SCON和电源控制寄存器PCON。,1)SCON-可位寻址的串行口控制寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志:,2 80C51串行口寄存器,SM0和SM1为工作方式选择位,可选择四种工作方式:,SM2:多机通信控制位。,REN:允许接收控制位。当REN=1,则允许接收,当REN=0,则禁止接收。,TB8:发送数据的第9位。,RB8:接收数据的第9位。,TI:发送中断标志位。,RI:接收中断标志位。,*SM2,多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB80时不激活RI,收到的信息丢弃;RB81时收到的数据进入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,则禁止接收。,TB8,在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式0和方式1中,该位未用。RB8,在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。,TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。RI,接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。,2)PCON电源控制寄存器:,SMOD(PCON.7)波特率倍增位。在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。,3)IE中断允许控制寄存器:EA-中断允许总控制位;ES-串行中断允许控制位,4)IP中断优先级控制寄存器:PS-串行中断优先级设定位,6.3.3 80C51串行口的工作方式,一、方式0 方式0时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接收均为8位数据,低位在先,高位在后。波特率固定为fosc/12。,1、方式0发送过程:在TI=0时,当CPU执行一条向SBUF写数据的指令时,如MOV SBUF,A;就启动发送过程。经过一个机器周期,写入发送数据寄存器中的数据按低位在前,高位在后从RXD依次发送出去,同步时钟从TXD送出。8位数据(一帧)发送完毕后,由硬件使发送中断标志TI置位,向CPU申请中断。,2、方式0接收过程,在RI=0的条件下,将REN(SCON.4)置“1”就启动一次接收过程。串行数据通过RXD接收,同步移位脉冲通过TXD输出。在移位脉冲的控制下,RXD上的串行数据依次移入移位寄存器。当8位数据(一帧)全部移入移位寄存器后,接收控制器发出“装载SBUF”信号,将8位数据并行送入接收数据缓冲器SBUF中,同时,由硬件使接收中断标志RI置位,向CPU申请中断。,常用于串行通讯。除发/收8位数据外,还 在D0位前有一个起始位“0”;在D7位后有一个停止位“1”。,方式1工作时:发送端自动添加一个起始位和一个停止位;接收端自动去掉一个起始位和一个停止位。,二、方式18位UART(1+8+1位)波特率可变,波特率可变 用定时器T1作波特率发生器:公式:波特率=(2SMOD/32)T1的溢出率,波特率=(2SMOD/32)T1的溢出率,溢出率:T1溢出的频繁程度 即:T1溢出一次所需时间的倒数。T1溢出时间(256X)(12/fosc),初值 X=2n-,2SMOD fosc 32 波特率 12,波特率=,2SMOD fosc32 12(256-X),其中:X 是定时器初值,例 用T1工作于方式2来产生波特率1200,已知晶振频率=6MHz。要求出T1的初值:,初值 X=28-,20 610632 1200 12,=256-=256-13.02,6106460800,243=0F3H,*三、方式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的溢出率决定。,1、方式2和方式3输出,发送开始时,先把起始位0输出到TXD引脚,然后发送移位寄存器的输出位(D0)到TXD引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位,并由TXD引脚输出。第一次移位时,停止位“1”移入输出移位寄存器的第9位上,以后每次移位,左边都移入0。当停止位移至输出位时,左边其余位全为0,检测电路检测到这一条件时,使控制电路进行最后一次移位,并置TI=1,向CPU请求中断。,2、方式2和方式3输入,接收时,数据从右边移入输入移位寄存器,在起始位0移到最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的第9位数据为1)时,接收到的数据装入接收缓冲器SBUF和RB8(接收数据的第9位),置RI=1,向CPU请求中断。如果条件不满足,则数据丢失,且不置位RI,继续搜索RXD引脚的负跳变。,6.3.4 串行口的编程及应用,一串行口的初始化编程,1串行口控制寄存器SCON位的确定。,根据工作方式确定SM0、SM1位;*对于方式2和方式3还要确定SM2位;如果是接收端,则置允许接收位REN为1;*如果方式2和方式3发送数据,则应将发送数据的第9位写入TB8中。,*,2设置波特率。,对于方式0,不需要对波特率进行设置。*对于方式2,设置波特率仅须对PCON中的SMOD位进行设置。,对于方式1和方式3,设置波特率不仅须对PCON中的SMOD位进行设置,还要对定时/计数器T1进行设置,这时定时/计数器T1一般工作于方式2(8位可重置方式),初值可由下面公式求得:由于:波特率=2SMOD(T1的溢出率)/32则:T1的溢出率=波特率32/2SMOD而T1工作于方式2的溢出率又可由下式表示:T1的溢出率=fosc/(12(256-初值)所以:T1的初值=256-fosc2SMOD/(12波特率32),二串行口的应用,通常用于三种情况:利用方式0扩展并行I/O口;利用方式1实现点对点的双机通信;利用方式2或方式3实现多机通信。,1利用方式0扩展并行I/O口,MCS-51单片机的串行口在方式0时,当外接一个串入并出的移位寄存器,就可以扩展并行输出口,当外接一个并入串出的移位寄存器时,就可以扩展并行输入口。,例6.3.1 用单片机的串行口外接并入串出和串入并出的芯片,输入一组8位的开关信息,使其控制一组8位的发光二极管,发光二极管的状态对应开关的状态。,=1时,允许串行移位,,=0时,允许并行读入按键。,汇编语言程序 ORG 0000H AJMP MAIN ORG 0100HMAIN: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,C语言程序:#include Sbit P1_0=P10;Void main()unsigned char iSCON=0 x10;While(1)P1_0=0;P1_0=1;RI=0;While(!RI);i=SBUF;TI=0;SBUF=i;While(!TI);,【补充例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个发光二极管。如图所示。,汇编程序:ORG 0000H LJMP MAIN ORG 0100HMAIN:MOV SCON,#00H MOV A,#01H CLR P1.0START:MOV SBUF,ALOOP:JNB TI,LOOP SETB P1.0 ACALL DELAY CLR TI RL A CLR P1.0 SJMP START,DELAY:MOV R7,#05HLOOP2:MOV R6,#0FFHLOOP1:DJNZ R6,LOOP1 DJNZ R7,LOOP2 RET END,解:设串行口采用查询方式,显示的延时依靠调用延时子程序来实现。程序如下:,C语言程序:#include void main()unsigned char i,j;SCON=0 x00;/串口工作于方式0,发送数据j=0 x01;while(1)SBUF=j;while(!TI);TI=0;for(i=0;i=254;i+);/延时j=1;if(j=0 x00)j=0 x01;,*【补充例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并行数据的置入。如图所示。,串行口方式0数据的接收,用SCON寄存器中的REN位来控制,采用查询RI的方式来判断数据是否输入。程序如下:汇编程序:ORG 0000HLJMP MAINORG 0100HMAIN:SETB P1.1START:JB P1.1,STARTSETB P1.0;从并口读入数据CLR P1.0;启动串口在时钟作用下传输数据MOV SCON,#10H;设定串口方式0LOOP:JNB RI,LOOP;等待串口数据传输完成CLR RIMOV A,SBUFRET,C语言程序:#include/包含特殊功能寄存器库sbit P1_0=P10;sbit P1_1=P11;void main()unsigned char i;P1_1=1;while(P1_1=1);P1_0=1;P1_0=0;SCON=0 x10;while(!RI);RI=0;i=SBUF;,2.单片机的双机通信使用中断方式时,单片机串行通信程序的编程要点如下:选择正确的控制字,以保证串行口功能的初始化(即设置寄存器SCON的内容);选择合适的波特率,主要指设置定时器1的工作方式和时间常数(即设定TMOD和TH1、TL1寄存器的内容)。启动定时器1(使用SETB TR1指令)。开放串行口中断(使用SETB ES指令)。开放总的中断(使用SETB EA指令)。编制串行中断服务程序,在串行中断服务程序中要设置清除中断标志标志指令。,例6.3.2 假定甲、乙两台单片机,以方式1进行串行数据通信,其波特率为1200,晶振频率为11.0592MHz。甲机发送:发送数据在外部RAM以ADDRA为首址共128字节的单元中;乙机接收:把接收到的128字节的数据,顺序存放在以ADDRB为首址的外部RAM中。,解:计算定时器1的计数初值:X=256-=256-24=232=0E8H 式中取位SMOD=0,则应使PCON=00H,甲机汇编语言发送程序如下:,ORG 0000H LJMP MAINA;跳至主程序入口 ORG 0023H AJMP SER_T1A;转至串行中断服务程序,ORG 0100HMAINA: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$;等待中断,ORG 0200HSER_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,甲机对应的C语言发送程序如下:#include/*包含8051单片机的寄存器定义头文件*/unsigned char xdata ADDRA 128;/*在外部RAM区定义128个单元*/unsigned char num=0;/*声明计数变量*/unsigned char*p;/*定义 p为指针*/void main(void)/*主程序*/SCON=0 x40;/*置串行口工作方式1*/TMOD=0 x20;/*定时器1为工作方式2*/PCON=0 x00;/*SMOD=0*/TL1=0 xe8;/*置计数初值*/TH1=0 xe8;/*计数重装值*/TR1=1;/*启动定时器1*/EA=1;/*开中断*/ES=1;/*串行口开中断*/p=ADDRA;/*设置发送数据缓冲器区指针*/SBUF=*p;/*发送第一个数据*/while(1);/*等待中断*/,void Ser_T1A(void)interrupt 4/*中断号4是串行中断*/TI=0;/*清发送中断标志*/num+;/*计数变量加1*/if(num=0 x7F)ES=0;/*判断是否发送完,若已完,则关中断*/else/*否则,修改指针,发送下一个数据*/p+;SBUF=*p;,ORG 0000H LJMP MAINB;转主程序 ORG 0023H AJMP SER_T1B;转串行口中断服务程序,ORG 0100HMAINB: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$;等待中断,;中断服务程序SER_T1B:CLR RI;清接收中断标志 MOV A,SBUF;取接收的数据 MOVX DPTR,A;接收的数据送缓冲区 CJNE R0,#7FH,LOOPB;判别接收完没有。若没有,转LOOPB,继续接收 CLR ES;若接收完,则关串行口中断 LJMP ENDBLOOPB:INC R0;计数指针加1 INC DPTR;地址指针加1ENDB:RETI;中断返回 END,乙机对应的C语言程序如下:#include unsigned char xdata ADDRB 128;unsigned char num=0;/*声明计数变量*/unsigned char*p;/*定义 p为指针*/void main(void)/*主程序*/SCON=0 x50;/*置串行口工作方式1,允许接收*/TMOD=0 x20;/*定时器1为工作方式2*/PCON=0 x00;/*SMOD=0*/TL1=0 xe8;/*置计数初值*/TH1=0 xe8;/*计数重装值*/TR1=1;/*启动定时器1*/EA=1;/*开中断*/ES=1;/*串行口开中断*/p=ADDRB;/*设置接收数据缓冲器区指针*/while(1);/*等待中断*/,void Ser_T1B(void)interrupt 4/*中断号4是串行中断*/RI=0;/*清接收中断标志*/num+;/*计数变量加1*/if(num=128)ES=0;/*判断是否接收完,若已完,则关中断*/else/*否则,接收数据,修改指针*/*p=SBUF p+;,例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=0。,A机汇编语言程序如下:ORG 0000H LJMP MAINA ORG 0100HMAINA:CLR EA;禁止中断 MOV SCON,#50H;串行口置工作方式1,允许接收 MOV TMOD,#20H;定时器1为工作方式2 MOV PCON,#00H;波特率不倍增 MOV TL1,#0F3H;设置计数初值 MOV TH1,#0F3H;计数重装值 SETB TR1;启动定时器1,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;清校验和单元,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机应答正确,返回,B机汇编语言程序如下:ORG 0000H LJMP MAINB ORG 0100HMAINB:CLR EA;禁止中断 MOV SCON,#50H;串行口置工作方式1,允许接收 MOV TMOD,#20H;定时器1为工作方式2 MOV PCON,#00H;波特率不倍增 MOV TL1,#0F3H;设置计数初值 MOV TH1,#0F3H;计数重装值 SETB TR1;启动定时器1RLP1: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;清校验和单元,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,【补充例3】用汇编语言编程通过串行实现将甲机的片内RAM中30H3FH单元的内容传送到乙机的片内RAM的40H4FH单元中。,分析:甲、乙两机都选择方式1:8位异步通信方式,最高位用作奇偶校验,波特率为1200bps,甲机发送,乙机接收,因此甲机的串口控制字SCON为40H,乙机的串口控制字SCON为50H。,由于选择的是方式1,波特率由定时/计数器T1的溢出率和电源控制寄存器PCON中的SMOD位决定。则须对定时/计数器T1初始化。设SMOD=0,甲、乙两机的振荡频率为12MHZ,由于波特率为1200。定时/计数器T1选择为方式2,则初值为:初值=256-fosc2SMOD/(12波特率32)=256-12000000/(12120032)230=E6H根据要求定时/计数器T1的方式控制字TMOD为20H。甲机的发送程序:TSTART:MOV TMOD,#20H MOV TL1,#0E6HMOV TH1,#0E6HMOV PCON,#00HMOV SCON,#40HMOV R0,#30HMOV R7,#10HSETB TR1LOOP:MOV A,R0,MOV SBUF,AWAIT:JNB TI,WAIT CLR TI INC R0 DJINZ R7,LOOP RET,乙机接收程序:RSTART:MOV TMOD,#20H MOV TL1,#0E6H MOV TH1,#0E6HMOV PCON,#00HMOV R0,#40H MOV R7,#10HSETB TR1;启动定时器1LOOP:MOV SCON,#50H WAIT:JNB RI,WAITMOV A,SBUFMOV R0,AINC R0DJNZ R7,LOOPRET,*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,表示发送的为地址帧。,(3)由于所有从机的SM2位都为1,从机都能接收主机发送来的地址,从机接收到主机送来的地址后与本机的地址相比较,如接收的地址与本机的地址相同,则使SM0位为0,准备接收主机送来的数据,如果不同,则不作处理。(4)主机发送数据,发送数据时TB8置为0,表示为数据帧。(5)对于从机,由于主机发送的第9位TB8为0,那么只有SM2位为0的从机可以接收主机送来的数据。这样就实现主机从多台从机选择一台从机进行通信了。,【例4】要求设计一个一台主机,255台从机的多机通信的系统。1)硬件线路图如下图,2)软件设计 通信协议通信时,为了处理方便,通信双方应制定相应的协议,在本例中主、从机串行口都设为方式3,波特率为1200bps,PCON中的SMOD位都取0,设fosc为12MHZ,根据例5.7定时/计数器T1的方式控制字为20H,初值为E6H,主机的SM2位设为0,从机的SM2开始设为1,从机地址从00HFEH。另外还制定如下几条简单的协议:主机发送的控制命令:00H:要求从机接收数据。(TB8=0)01H:要求从机发送数据。(TB8=0)FFH:命令所有从机的SM2位置1,准备接收主机送来的地址。(TB8=1)从机发给主机状态字格式如图,其中:ERR=1,表示从机接收到非法命令。TRDY=1,表示从机发送准备就绪。RRDY=1,表示从机接收准备就绪。,主机的通信程序流程,从机采用中断处理,主程序中对串口初始化,中断系统初始化。中断服务程序中实现信息的接收与发送,从机中断服务程序流程见图,主程序略。,主机的通信程序设计设发送、接收数据块长度为16字节。这里仅编写主机发16个字节到01号从机的程序和主机从02号从机接收16个字节的程序。(略),从机的通信程序设计从机接收、发送数据块长度为16字节,所有的从机的程序相同,只是不同的从机的本机号SLAVE不一样。(略),作业,P17616,17,18,19,