资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第七章 串行通信,7.1,串行通信的基本概念,7.2,串行口的工作方式,7.3,串行口的多机通信,7.4,串行口的编程与应用,HOME,7.1,串行通信的基本概念,7.1.1,通信数据的传输方式,传输方式,并行方式,串行方式,同步方式,异步方式,单工方式,半双工方式,全双工方式,多工方式,NEXT,HOME,7.1.2,串行通信的通信标准,串行通信的通信标准主要是指通信的电气和硬件标准,常用的有,RS-232,;,RS-485/422,等。,8051,单片机的通讯方式有两种,并行通讯:数据的各位同时发送或接收。串行通讯:数据一位一位顺序发送或接收。,BACK,NEXT,HOME,RS-232,标准,电气特性:逻辑“,1”=-3V,-15V,;逻辑“,0”=+3V,+15V,。在与,TTL,标准连接时必须进行电平转换,常用芯片有,MC1488,、,MC1489,及,MAX202,MAX232,等,。,机械特性:常用,DB-9,和,DB-25,两种连接器,经常只使用其中的,9,个引脚。,接口信号:标准,RS-232,接口定义了,25,条线,包括,4,条数据线、,11,条控制线、,3,条定时线、,7,条备用和未定义线,一般只用其中的,9,条。而在实际控制系统中,为了尽量减少连接线的数量,只使用其中的,3,条线,即:发送数据(,TXD,)、接收数据(,RXD,)、地线(,GND,)。,RS-485/422,标准,电气特性:逻辑“,1”=0.2V,7,(,12,),V,;,逻辑“,0”=-0.2V,-7,(,-12,),V,。在与,TTL,标准连接时同样必须进行电平转换,常用芯片有,MC1485,等。,机械特性:通常采用双线制(双绞线)平衡方式传输。,BACK,NEXT,HOME,7.1.3,串行通信的通信方式,串行通信又可分为异步通信和同步通信。异步通信的接受器和发送器使用各自的时钟,每次只传送一字节数据,允许时钟产生误差;同步通信每次传送的数据量较大,要求精度高,因此接受器和发送器使用同一时钟。,异步通讯,以字符为传送单位用起始位和停止位标识每个字符的开始和结束字符间隔不固定,只需字符传送时同步。异步通讯数据常用一帧为单位,一帧字符位数的规定:起始位,数据位,校验位和停止位,校验位紧跟在数据位后,也可以省略。下图为省略校验位后一帧数据的示意图。,D,0,D,1,D,2,D,3,D,4,D,5,D,6,D,7,停止位,起始位,优点是硬件要求低,可靠性高,传送距离远,但速度较慢。,BACK,NEXT,HOME,同步通信,以一串字符为一个传送单位,字符间不加标识位,在一串字符开始用同步字符标识,硬件要求高,通讯双方须严格同步。,【,提示,】,:在单片机与外设进行数据通信时,多采用异步串行通信。,7.1.4,串行通信数据的传送速率,数据传送的速率又称为波特率,其定义是每秒钟传送的二进制数的位数。例如,数据传送的速率是,120,字符,/s,,而每个字符如上述规定包含,10,数位,则传送波特率为,1200,波特。,数据在单片机中都是以并行的方式处理和存储的,要进行串行数据通信时,就必须将并行数据转换成串行数据,这部分工作由单片机中的串行通讯口来完成。,7.1.5,串行通信数据的校验,数据传送的过程中经常会出现错误,因而必须对数据的正确性进行校验,常分为横向校验和纵向校验。,7.2,串行口的工作方式,7.2.1,串行口控制寄存器,控制单片机串行口工作的寄存器有两个,即串行口控制寄存器,SCON,和特殊功能寄存器,PCON,。,串行口控制寄存器,SCON,,字节地址,98H,串行口控制寄存器用于定义串行口的工作方式及实施接收和发送控制。字节地址为,98H,,其各位定义如下表,:,RI,TI,RB8,TB8,REN,SM2,SM1,SM0,模式选择 多机通讯位 允许接收位 发送、接收第,9,位 发送、接收标志,BACK,NEXT,HOME,SM0,、,SM1,:串行口工作方式选择位,其定义如下,:,可变,1+9+1,位异步通信,UART,3,1 1,Fosc/64,或,/32,1+9+1,位异步通信,UART,2,1 0,可变,1+8+1,位异步通信,UART,1,0 1,Fosc/12,同步移位寄存器模式,0,0 0,波特率,功 能,模式,SM0 SM1,其中,fosc,为晶振频率,SM2,:多机通讯控制位。在方式,0,时,,SM2,一定要等于,0,。在方式,1,中,当(,SM2,),=1,时,只有接收到有效停止位时,,RI,才置,1,。在方式,2,或方式,3,当(,SM2,),=1,且接收到的第九位数据,RB8=1,时,,RI,才置,1,。,BACK,NEXT,HOME,BACK,NEXT,HOME,REN,:接收允许控制位。由软件置位以允许接收,又由软件清,0,来禁止接收。,TB8,:是要发送数据的第,9,位。在方式,2,或方式,3,中,作为要发送的第,9,位数据,根据需要由软件置,1,或清,0,。例如,可约定作为奇偶校验位,或在多机通讯中作为区别地址帧或数据帧的标志位。,RB8,:接收到的数据的第,9,位。在方式,0,中不使用,RB8,。在方式,1,中,若(,SM2,),=0,,,RB8,为接收到的停止位。在方式,2,或方式,3,中,,RB8,为接收到的第,9,位数据。,TI,:发送中断标志。在方式,0,中,第,8,位发送结束时,由硬件置位。在其它方式的发送停止位前,由硬件置位。,TI,置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用软件查询的方法获得数据已发送完毕的信息,或用中断的方式来发送下一个数据。,TI,必须用软件清,0,。,RI,:接收中断标志位。在方式,0,,当接收完第,8,位数据后,由硬件置位。在其它方式中,在接收到停止位的中间时刻由硬件置位(例外情况见于,SM2,的说明)。,RI,置位表示一帧数据接收完毕,可用查询的方法获知或者用中断的方法获知。,RI,也必须用软件清,0,。,BACK,NEXT,HOME,特殊功能寄存器,PCON,,字节地址,87H,特殊功能寄存器,PCON,中只有最高位,D,7,(,SMOD,位)作为波特率选择位使用,其余位与串行通信无关。,PCON,只能字节寻址,因此须用字节寻址指令对其进行赋值,,SMOD=1,:波特率加倍;,SMOD=0,:波特率不变。,7.2.2,工作方式,0,方式,0,为移位寄存器输入,/,输出方式。可外接移位寄存器以扩展,I/O,口,也可以外接同步输入,/,输出设备。,8,位串行数据者是从,RXD,输入或输出,,TXD,用来输出同步脉冲。,输出:串行数据从,RXD,引脚输出,,TXD,引脚输出移位脉冲。,CPU,将数据写入发送寄存器时,立即启动发送,将,8,位数据以,fos/12,的固定波特率从,RXD,输出,低位在前,高位在后。发送完一帧数据后,发送中断标志,TI,由硬件置位,必须由软件复位。,输入:当串行口以方式,0,接收时,先置位允许接收控制位,REN,。此时,,RXD,为串行数据输入端,,TXD,仍为同步脉冲移位输出端。当(,RI,),=0,和(,REN,),=1,同时满足时,开始接收。当接收到第,8,位数据时,将数据移入接收寄存器,并由硬件置位,RI,,同样必须由软件复位,。,下图是方式,0,扩展输出和输入的接线图。,focs/12,方式,0,串行口的波特率,B,B=focs/12,发送、接收控制器,BACK,NEXT,HOME,方式,0,时,波特率为固定的,focs/12,。,BACK,NEXT,HOME,7.2.3,工作方式,1,方式,1,为波特率可变的,10,位异步通讯接口方式。发送或接收一帧信息,包括,1,个起始位,0,,,8,个数据位和,1,个停止位,1,。,输出:当,CPU,执行一条指令将数据写入发送缓冲,SBUF,时,就启动发送。串行数据从,TXD,引脚输出,发送完一帧数据后,就由硬件置位,TI,。,输入:在(,REN,),=1,时,串行口采样,RXD,引脚,当采样到,1,至,0,的跳变时,确认是开始位,0,,就开始接收一帧数据。只有当(,RI,),=0,且停止位为,1,或者(,SM2,),=0,时,停止位才进入,RB8,,,8,位数据才能进入接收寄存器,并由硬件置位中断标志,RI,;否则信息丢失。所以在方式,1,接收时,应先用软件清零,RI,和,SM2,标志。,1/16,1/2,T1,溢出,1,0,SMOD,方式,1,、,3,时串行口的波特率,B,B=1/32,T1,溢出率,或,=1/16T1,溢出率,发送、接收控制器,方式,1,时,波特率是可变的,由定时,/,计数器,T1,的溢出率决定,如左图所示:,7.2.4,工作方式,2,方式,2,为可选定波特率的,11,位,UART,方式。它比方式,1,增加了一位可程控为,1,或,0,的第,9,位数据。,输出,:,发送的串行数据由,TXD,端输出一帧信息为,11,位,附加的第,9,位来自,SCON,寄存器的,TB8,位,用软件置位或复位。它可作为多机通讯中地址,/,数据信息的标志位,也可以作为数据的奇偶校验位。当,CPU,执行一条数据写入,SUBF,的指令时,就启动发送器发送。发送一帧信息后,置位中断标志,TI,。,输入,:,在(,REN,),=1,时,串行口采样,RXD,引脚,当采样到,1,至,0,的跳变时,确认是开始位,0,,就开始接收一帧数据。在接收到附加的第,9,位数据后,当(,RI,),=0,且(,SM2,),=0,时,接收完停止位后,第,9,位数据进入,RB8,,,8,位数据进入接收寄存器,并由硬件置位中断标志,RI,;否则信息丢失。且不置位,RI,。再过一位传送时间后,不管上述条件是否满足,接收电路即行复位,并重新检测,RXD,上从,1,到,0,的跳变。当(,SM2,),=1,时,若第,9,位数据为,0,,则不置位,RI,,只有第,9,位数据为,1,,才激活,RI,。,波特率的计算公式为:波特率,=2,SMOD,(振荡器频率),/64,BACK,NEXT,HOME,7.2.5,工作方式,3,方式,3,为波特率可变的,11,位,UART,方式。除波特率外,其余与方式,2,相同。,1/2,focs/2,1,0,SMOD,方式,2,串行口的波特率,B,1/16,B=focs/32,或,=fosc/64,发送、接收控制器,BACK,NEXT,HOME,方式,2,时,波特率是可选择的,由,PCON,中的,SMOD,位决定,如左图所示:,BACK,NEXT,HOME,7.2.6,工作方式,1,、,3,时波特率的计算,定时器,T1,作为波特率发生器,其公式如下,:,波特率,=2,SMOD,/32,定时器,T1,溢出率,T1,溢出率,=T1,计数率,/,产生溢出所需的周期数,式中,T1,计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,,T1,计数率为,fosc/12;,当工作于计数器状态时,,T1,计数率为外部输入频率,此频率应小于,fosc/24,。产生溢出所需周期与定时器,T1,的工作方式、,T1,的预置值有关。,定时器,T1,工作于方式,0,:溢出所需周期数,=8192-x,定时器,T1,工作于方式,1,:溢出所需周期数,=65536-x,定时器,T1,工作于方式,2,:溢出所需周期数,=256-x,因为方式,2,为自动重装入初值的,8,位定时器,/,计数器模式,所以用它来做波特率发生器最恰当。,当时钟频率选用,11.0592MHZ,时,极易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶振就是这个道理。,下表列出了定时器,T1,工作于方式,2,常用波特率及初值:,常用波特率,Fosc(MHZ,),SMOD,TH1,初值,19200,11.0592,1,FDH,9600,11.0592,0,FDH,4800,11.0592,0,FAH,2400,11.0592,0,F4h,1200,11.0592,0,E8h,BACK,NEXT,HOME,BACK,NEXT,HOME,方式,发送条件,接收条件,接收方式,主要应用,0,TI=0,RI=0,REN=1,查询、中断,同步移位,系统扩并口,1,TI=0,RI=0,REN=1,查询、中断,8,位数据异步传送,2,、,3,TI=0,RI=0,REN=1,SM2=0,查询,(无中断),8,位数据,+,奇偶位的,异步收发,UART,RI=0,REN=1,RB8=1,若,SM2=0,时查询。,若,SM2=1,时引发中断,8,位数据,+,控制位的,异步收发,UART,四种模式的接收、发送条件,7.2.7,应用举例,1,工作方式,0,应用举例,8051,单片机串行口方式,0,为移位寄存器方式,外接一个串入并出的移位寄存器,就可以扩展一个并行口。,【,例,】,:,用,8051,串行口外接,CD4094,扩展,8,位并行输出口,如图所示,,8,位并行口的各位都接一个发光二极管,要求发光管呈流水灯状态。串行口方式,0,的数据传送可采用中断方式,也可采用查询方式,无论哪种方式,都要借助于,TI,或,RI,标志。,串行发送时,可以靠,TI,置位(发完一帧数据后)引起中断申请,在中断服务程序中发送下一帧数据,或者通过查询,TI,的状态,只要,TI,为,0,就继续查询,,TI,为,1,就结束查询,发送下一帧数据。在串行接收时,则由,RI,引起中断或对,RI,查询来确定何时接收下一帧数据。无论采用什么方式,在开始通讯之前,都要先对控制寄存器,SCON,进行初始化。在方式,0,中将,00H,送,SCON,就可以了。,BACK,NEXT,HOME,【,解,】,:,程序清单如下,ORG2000H,START,:,MOVSCON,#00H,;置串行口工作方式,0,MOVA,#80H,;最高位灯先亮,CLRP1.0,;关闭并行输出,(,避免传输过程;中,各,LED,的,暗红,现象,),CLRTI,;清,TI,标志,OUT0,:,MOVSBUF,A,;开始串行输出,OUT1,:,JNBTI,$,;输出完否,CLRTI,;完了,清,TI,标志,以备下次;发送,SETBP1.0,;打开并行口输出,ACALLDELAY,;延时一段时间,RRA,;循环右移,CLRP1.0,;关闭并行输出,JMPOUT0,;循环,BACK,NEXT,HOME,2,工作方式,1,应用举例,发送程序(查询方式):,T1,初始化,启动,T1,串行口初始化,输入数据到,A,发送一帧数据,MOV SBUF,A,TI=1?,软件清,TI,Y,N,BACK,NEXT,HOME,编写发送程序的一般方法是:先初始化串行口和,T1,,然后将发送数据送入,SBUF,,查询,TI,位,当,TI,为,1,后,复位,TI,并立即发送下一帧数据,直至数据发送完毕。框图如右图所示:,M0,M1,C/T,GATE,M0,M1,C/T,GATE,设定定时器,T1,的工作模式,00100000B,RI,TI,RB8,TB8,REN,SM2,SM1,SM0,设定串行口模式寄存器,SCON,为,01000000B,BACK,NEXT,HOME,程序清单如下:,org0000h,ljmp,0100h,org0100h,Start,:,mov,tmod,#20h,;设定定时器,T1,为模式,2,mov,tl1,#0f4h,;送定时初值(,fosc,=11.059,),mov,th1,#0f4h,;波特率,B=2400,setb,tr1,;启动定时器,T1,mov,scon,#40h,;设定串行口为模式,1,mov,pcon,#00h,;,PCON,中的,SMOD=0,clr,ti,Loop2,:,mov,p1,#0ffh,mov,a,p1,;从,P1,口输入数据,mov,sbuf,a,;数据送,SBUF,发送,Loop1,:,jnb,ti,loop1,;判断数据是否发送完毕?,clr,ti,;发送完一帧后清标志,sjmp,loop2,;返回继续,end,接收程序(查询方式):,M0,M1,C/T,GATE,M0,M1,C/T,GATE,定时器,TMOD,(,89H,),的工作模式,00100000B,RI,TI,RB8,TB8,REN,SM2,SM1,SM0,串行口模式寄存器,SCON,(,98H,),为,01010000B,T1,初始化,启动,T1,串行口初始化,输出数据到,P1,数据送,A,MOV A,SBUF,RI=1?,软件清,TI,Y,N,编写接收程序与发送程序类似:先初始化串行口和,T1,,然后查询,RI,位,当,RI,为,1,后,复位,RI,并立即接收一帧数据,直至数据接收完毕。框图如右图所示:,BACK,NEXT,HOME,程序清单如下:,org0000h,ljmp,0100h,org0100h,Start,:,mov,tmod,#20h,;选定,T1,为模式,2,(自动重装),mov,tl1,#0f4h,;设定初值,mov,th1,#0f4h,;同上,mov,pcon,#00h,;,PCON,的,SMOD=0,setb,tr1,;启动,T1,定时器,clr,ri,;清接收标志,mov,scon,#50h,;设定串行口为方式,1,Loop1,:,jnb,ri,loop1,;判断是否接收到数据?,clr,ri,;接收到数据后清接收标志,mov,a,sbuf,;数据送累加器,A,mov,p1,a,;从,P1,口输出,sjmp,loop1,;继续,end,BACK,NEXT,HOME,【,习题,】,:将上述程序用中断方式编写。,3,工作方式,2,、,3,应用举例,与模式,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,被激活时可以引发中断!,根据上面特点,模式,2,、,3,可以,:,1,利用第,9,位数据来传送、接收每一字节的“奇偶效验位”。,2,利用,SM2,、,RB8,实现多机通讯功能。,BACK,NEXT,HOME,利用模式,2,3,进行带奇校验的串行通讯程序流程图,数据送累加器,A,PSW.P=1?,SET SCON.TB8,CLR SCON.TB8,MOV SBUF,A,TI=1?,CLR SCON.TI,YES,NO,NO,YES,发送端程序,RI=1?,MOV A,SBUF,PSW.P,RB8=0?,出错处理,CLR SCON.RI,YES,NO,接收端程序,N,Y,数据送内存,BACK,NEXT,HOME,7.3,串行口的多机通信,主机,从机,N,从机,4,从机,3,从机,2,从机,1,串行数据线(,2,条),BACK,NEXT,HOME,1,、,主从式多机通讯原理,1,,主机发送的数据可以传送到各个从机,从机发送的数据只能为主机接收,从机之间不能直接通讯。,2,,主机和从机的设置为模式,2,或,3,,其中,:,主机的,SM2=0,(单机方式);,从机的,SM2=1,(多机方式)。,3,,主机发送地址码来寻找从机(地址码特征是第,9,位数据为“,1”,),所有从机都接收主机发出的地址码(因为,RB8=1,),既,RI=1,引发中断。在中断服务程序中,将接收到地址码与自己的地址进行比较,被选中的从机将自己的,SM2=0,,并维持在中断服务程序中保持与主机的联系。而未被选中的从机仍保持,SM2=1,,并退出中断服务程序。,4,,当主机找到从机后,开始向从机发数据、命令(其特征为第,9,位,=0,)。由于选中的从机,SM2=0,,从机仍可以使用查询或中断的方式接收主机发出的数据或命令(而未选中的从机因,RB8=0,不会引发它们的中断)。当主机与从机的通讯完成后,该从机再将其,SM2=1,并退出中断服务程序。主机重新发出另一个从机的地址,所有从机可以马上响应并接收地址信息。,BACK,NEXT,HOME,2,、,多机通讯中主机与从机之间的控制、状态信息,主机发送的通信请求命令:主机发送,从机接收;,从机回送通信应答命令:主机接收,从机发送。,从机状态字:从机向主机发送的用于表征从机工作状态的信息(如下图)。,BACK,NEXT,HOME,TB8=1,地址码,主机发送的地址码,RRDY,TRDY,ERR,0,:合法命令,0,:发送未就绪,0,:接收未就绪,1,:非法命令,1,:发送就绪,1,:接收就绪,从机返回的状态字,TB8=0,主机程序框图,T1,为定时,模式,2,B=1200,,,启动,T1,设串口为模式,3,REN=1,SM2=0,TB8=1,设定程序数据:,R0,R5,调用,MCOMMU,停机,MCOMMU,发送从机地址,从机应答?,地址相符?,发送命令字,TB8=0,从机应答?,命令正确?,命令分类,接收数据块,发送数据块,从机接收就绪?,从机发送就绪?,RET,命令从,机复位,N,N,Y,Y,N,N,Y,Y,N,N,Y,Y,接收,发送,BACK,NEXT,HOME,从机程序框图,T1,为定时,模式,2,B=1200,,,启动,T1,设串口为模式,3,REN=1,SM2=0,TB8=1,设定程序参数:,R0,R3,开串行口中断,停机,主程序,BACK,NEXT,HOME,保护现场,接收地址符合本机?,回送本机地址,接收下一字符,是命令吗?,命令分类,本机发送准备就绪?,本机接收准备就绪?,发,TRDY=1,状态字,发,RRDY=1,状态字,发送数据,接收数据,发送完?,接收完?,保护现场返回,N,N,Y,Y,发送命令,接收命令,非法命令,送TRDY=0,送RRDY=0,N,N,N,Y,中断服务程序,BACK,NEXT,HOME,7.4,串行口的编程与应用,7.4.1,常规编程方式,串行口初始化编程格式:,SIO,:,MOVSCON,,,#,控制状态字;写方式字且,TI=RI=0,MOVPCON,,,#X0H,;选择波特率,MOVTMOD,,,#20H,;,T1,作波特率发生器,MOVTH1,,,#X,;选定波特率,MOVTL1,,,#X,SETBTR1,SETBES,;开串行口中断,SETBEA,;开中断,【,注意,】,:若采用查询方式,最后两条指令可以省略。,BACK,NEXT,HOME,发送程序:先发送一个字符,等待,TI=1,后再发送下一个字符。,1.,查询方式:,TRAM,:,MOV A,,,R0,;取数据,MOVSBUF,,,A,;发送一个字符,WAIT,:,JBCTI,,,NEXT,;等待发送结束,SJMPWAIT,NEXT,:,INCR0,;准备下一次发送,SJMPTRAM,2.,中断方式:,ORG0023H,;串行口中断入口,AJMP SINT,MAIN,:,;初始化编程,TRAM,:,MOVA,,,R0,;取数据,MOVSBUF,,,A,;发送第一个字符,H,:,SJMPH,;其它工作,SINT,:,CLR TI,;中断服务程序,INCR0,MOVA,,,R0,;取数据,MOVSBUF,,,A,;发送下一个字符,RETI,BACK,NEXT,HOME,BACK,NEXT,HOME,接收程序:,REN=1,、,RI=0,等待接收,当,RI=1,,从,SBUF,读取数据,1.,查询方式:,WAIT,:,JBCRI,,,NEXT,;查询等待,SJMPWAIT,NEXT,:,MOVA,,,SBUF,;读取接收数据,MOVR0,,,A,;保存数据,INCR0,;准备下一次接收,SJMPWAIT,2.,中断方式:,ORG0023H,AJMPRINT,MAIN,:,;初始化编程,H,:,SJMPH,;其它任务,RINT,:,CLRRI,;清中断标志,MOVA,,,SBUF,;读取接收数据,MOVR0,,,A,;保存数据,INCR0,RETI,7.4.2,编程举例,【,例,】,:,设有两单片机进行异步通信,发送方,将片内,RAM 50H,起始单元的,16,个数由串行口发送,接收方以查询和中断两种方式进行接收。要求串行口波特率为,2400(,设晶振为,11.0592MHz),,并进行奇偶校验。,【,解,】,:,根据题目要求,通信波特率可变,且需进行奇偶校验,因此选择工作方式,3,,先进行初始化,发送方和接收方相同,程序如下:,BACK,NEXT,HOME,ORG0000H,LJMPMAIN,MAIN,:,MOVSCON,,,#0B0H,;写方式字且,TI=RI=0,MOVPCON,,,#00H,;选择波特率,MOVTMOD,,,#20H,;,T1,作波特率发生器,MOVTH1,,,#0F4H,;选定波特率,MOVTL1,,,#0F4H,SETBTR1,LCALL,TXD,;调用发送子程序,SJMP$,;,CPU,转去执行其它任务,BACK,NEXT,HOME,发送方程序。,1,,查询方式:,TXD,:,MOV R0,,,#50H,;设数据指针,MOV R7,,,#10H,;数据长度,LOOP,:,MOV A,,,R0,;取一个字符,MOV C,,,P,;加奇偶校验,MOV TB8,,,C,MOV SBUF,,,A,;启动一次发送,LOOP1,:,JBCTI,,,LOOP2,;查询是否发送完成,LJMPLOOP1,LOOP2,:,INCR0,;数据地址指针加,1,DJNZR7,,,LOOP,;全部数据发送完成则返回,RET,发送方程序。,2,,中断方式:,ORG0023H,LJMPTINT,MAIN,:。,SETBES,;开串行口中断,SETBEA,;开中断,MOV R0,,,#50H,;设数据指针,MOV R7,,,#10H,;数据长度,CLRTI,;复位发送标志,MOV A,,,R0,;取一个字符,MOV C,,,P,;加奇偶校验,MOV TB8,,,C,MOV SBUF,,,A,;启动一次发送,SJMP$,;,CPU,执行其它任务,BACK,NEXT,HOME,中断服务子程序:,TINT,:,PUSHA,;保护现场,PUSHPSW,CLRTI,;清发送标志,DJNZR7,,,NEXT,;是否发送完?,CLRES,;发送完,关闭串行口中断,SJMPTEND,NEXT,:,INC R0,;未发送完,修改指针,MOV A,,,R0,;取下一个字符,MOV C,,,P,;加奇偶校验,MOV TB8,,,C,MOV SBUF,,,A,;发送一个字符,POPPSW,;恢复现场,POPA,TEND,:,RETI,;中断返回,BACK,NEXT,HOME,BACK,NEXT,HOME,接收方程序。,1,,查询方式:,ORG0000H,LJMPMAIN,MAIN,:;初始化,SETBTR1,LCALLRXD,;调用发送子程序,SJMP$,;,CPU,转去执行其它任务,RXD,:,MOV R0,,,#50H,;设数据指针,MOV R7,,,#10H,;接收数据长度,WAIT,:,JBC RI,,,NEXT,;等待串行口接收,SJMPWAIT,NEXT,:,MOV A,,,SBUF,;读取接收字符,MOV R0,,,A,;保存一个字符,INC R0,;修改指针,DJNZR7,,,WAIT,;全部字符接收完,?RET,BACK,NEXT,HOME,接收方程序。,2,,中断方式:,ORG0023H,LJMPRINT,MAIN,:。,SETBES,;开串行口中断,SETBEA,;开中断,MOV R0,,,#50H,;设数据指针,MOV R7,,,#10H,;数据长度,SETB00H,;发送完标志置位,CLRRI,;复位接收标志,CLR10H,;接收错误标志复位,SJMP$,;,CPU,执行其它任务,JNB00H,,,LOOP1,JB10H,,,LOOP2,中断服务子程序:,RINT,:,PUSHA,;保护现场,PUSHPSW,CLRRI,;清接收标志,BACK,NEXT,HOME,MOV A,,,SBUF,;取一个接收字符,JNB P,,,COMP,;,P=0,转,COMP,JNBRB8,,,ERR,;,PRB8,,数据出错,SJMPRIGHT,;,P=RB8,,数据正确,COMP:JB RB8,,,ERR,RIGHT:MOV R0,,,A,;保存一个字符,INC R0,;修改指针,DJNZR7,,,WAIT,;全部字符接收完,?,CLR00H,POPPSW,;恢复现场,POPA,RETI,ERR,:,DECR7,SETB10H,;,10=1,,接收数据出错,WAIT,:,POPPSW,;恢复现场,POPA,RETI,BACK,HOME,本章总结,本章介绍了,MCS-51,单片机串行口的工作原理,,设置方法及常用的应用软件;同时介绍了串行通信,的一些基本知识和常用标准。,作业:,P111 13,。,
展开阅读全文