《单片机原理及应用》第七章 89C51串行口及串行通信技术_第1页
《单片机原理及应用》第七章 89C51串行口及串行通信技术_第2页
《单片机原理及应用》第七章 89C51串行口及串行通信技术_第3页
《单片机原理及应用》第七章 89C51串行口及串行通信技术_第4页
《单片机原理及应用》第七章 89C51串行口及串行通信技术_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.,第7章89C51串行口及串行通信技术,教学目标串行通信基本知识串行口及应用89C51与89C51点对点异步通信89C51与PC机间通信软件的设计,.,7.1串行通信基本知识,在实际工作中,计算机的CPU与外部设备之间常常要进行信息交换,一台计算机与其他计算机之间也往往要交换信息,所有这些信息交换均可称为通信。通信方式有两种,即并行通信和串行通信。通常根据信息传送的距离决定采用哪种通信方式。例如,PC机与外部设备(如打印机等)通信时,如果距离小于30m,可采用并行通信方式;当距离大于30m时,则要采用串行通信方式。89C51单片机具有并行和串行二种基本通信方式。,.,并行通信,并行通信是指数据的各位同时进行传送(发送或接收)的通信方式。优点:传送速度快;缺点:数据有多少位,就需要多少根传送线。例如,右图89C51单片机与外部设备之间的数据传送就属于并行通信。,.,串行通信,串行通信指数据是一位(bit)一位按顺序传送的通信方式。优点:只需一对传输线(利用电话线就可作为传输线),大大降低了传送成本,特别适用于远距离通信;缺点:传送速度较低。假设并行传送N位数据所需时间为T,那么串行传送的时间至少为NT,实际上总是大于NT。,.,串行通信的传输方式,串行通信的传输方式通常有三种:单向(或单工)方式,只允许数据向一个方向传送;半双向(或半双工)方式,允许数据向两个方向中的任一方向传送,但每次只能有一个站点发送;全双向(或全双工)方式,允许同时双向传送数据,因此,全双工配置是一对单向配置,它要求两端的通信设备都具有完整和独立的发送和接受能力。,.,串行通信中的数据传送方式,.,异步通信和同步通信,串行通信有两种基本通信方式,即异步通信和同步通信。异步通信在异步通信中,数据是一帧一帧(包括一个字符代码或一字节数据)传送的。在帧格式中,一个字符由四个部分组成:起始位、数据位、奇偶校验位和停止位。首先是一个起始位(0),然后是58位数据(规定:低位在前,高位在后),接下来是奇偶校验位(可省略),最后是停止位(1)。,.,异步通信数据格式,(b)有空闲位,.,异步串行通信协议起始位(0)信号只占一位,用来通知接收设备一个待接收的字符开始到达。线路上在不传送字符时应保持为1。接收端不断检测线路的状态,若连续为1以后又测到一个0,就知道发来一个新字符,应马上准备接收。字符的起始位还被用作同步接收端的时钟,以保证以后的接收能正确进行。起始位后面紧接着是数据位,它可以是5位(D0-D4)、6位、7位或8位(D0-D7)。若所传字符为ASCII码,则常取7位。奇偶校验(D8)只占一位,但在字符中也可以规定不用奇偶校验位,则这一位可省去。也可用这一位(1/0)来确定这一帧中的字符所代表信息的性质(地址/数据等)。停止位用来表征字符的结束,它一定是高电位(逻辑1)。停止位可以是1位、1.5位或2位。接收端收到停止位后,知道上一字符已传送完毕,同时,也为接收下一个字符做好准备。只要再接收到0,就是新的字符的起始位。若停止位以后不是紧接着传送下一个字符,则使线路电平保持为高电平(逻辑1)。,.,同步通信,同步通信中,在数据开始传送前用同步字符来指示(常约定1个-2个),并由时钟来实现发送端和接收端同步,即检测到规定的同步字符后,下面就连续按顺序传送数据,直到通信告一段落。同步传送时,字符与字符之间没有间隙,也不用起始位和停止位,仅在数据块开始时用同步字符SYNC来指示。,.,同步通信,同步字符的插入可以是单同步字符方式或双同步字符方式,然后是连续的数据块。同步字符可以由用户约定,也可采用ASCII码中规定的SYNC代码,即16H。按同步方式通信时,先发送同步字符,接收方检测到同步字符后,即准备接收数据。在同步传送时,要求用时钟来实现发送端与接收端之间的同步。为了保证接收正确无误,发送方除了传送数据外,还要同时传送时钟信号。同步传送可以提高传输速率(达56kb/s或更高),但硬件比较复杂。,.,波特率(Baudrate),波特率,即数据传送速率,表示每秒钟传送二进制代码的位数,它的单位是b/s(bitspersecond)。假设数据传送速率是120字符/s,而每个字符包含的代码位有:1个起始位、8个数据位、1个停止位。这时,传送的波特率为:10b/字符120字符/s1200b/s每一位代码的传送时间Td为波特率的倒数。Td1/12000.833ms异步通信的传送速率在50b/s19200b/s之间,常用于计算机到终端机和打印机之间的通信、直通电报以及无线电通信的数据发送等。,.,串行通信的过程,1、串并转换与设备同步两个通信设备在串行线路上成功地实现通信必须解决两个问题:1)串并转换,即如何把要发送的并行数据串行化,把接收的串行数据并行化;2)设备同步,即发送设备与接收设备的工作节拍同步,以确保发送数据在接收端被正确读出。,.,1、串并转换与设备同步,1)串并转换串行通信是将计算机内部的并行数据转换成串行数据,将其通过一根通信线传送;并将接收的串行数据再转换成并行数据送到计算机中。在计算机串行发送数据之前,计算机内部的并行数据被送入移位寄存器并一位一位地输出,将并行数据转换成串行数据。如图7-5所示。在接收数据时,来自通信线路的串行数据被压入移位寄存器,满8位后并行送到计算机内部。如图7-6所示。在串行通信控制电路中,串-并、并-串转换逻辑被集成在串行异步通信控制器芯片中。89C51单片机的串行口和IBM-PC相同。,.,图7-5,.,图7-6,.,2)设备同步进行串行通信的两台设备必须同步工作才能有效地检测通信线路上的信号变化,从而采样传送数据的脉冲。设备同步对通信双方有两个共同要求:通信双方必须采用统一的编码方法;通信双方必须能产生相同的传送速率。采用统一的编码方法确定了一个字符二进制表示值的位发送顺序和位串长度,当然还包括统一的逻辑电平规定,即电平信号高低与逻辑1和逻辑0的固定对应关系。通信双方只有产生相同的传送速率,才能确保设备同步,这就要求发送设备和接收设备采用相同频率的时钟。发送设备在统一的时钟脉冲上发出数据,接收设备才能正确检测出与时钟脉冲同步的数据信息。,.,7.289C51串行口及应用,89C51单片机除具有4个8位并行口外,还具有串行接口。此串行接口是一个全双工串行通信接口,即能同时进行串行发送和接收数据。它可以作UART(通用异步接收和发送器)用,也可以作同步移位寄存器用。使用串行接口可以实现89C51单片机系统之间点对点的单机通信和89C51与系统机(如IBM-PC机等)的单机或多机通信。,.,串行口结构,89C51通过引脚RXD(P3.0,串行数据接收端)和引脚TXD(P3.1,串行数据发送端)与外界进行通信。有两个物理独立的接收、发送缓冲器SBUF,它们占用同一地址99H,可同时发送、接收数据。发送缓冲器只能写入,不能读出;接收缓冲器只能读出,不能写入。串行发送与接收的速率与移位时钟同步。89C51用定时器T1作为串行通信的波特率发生器,T1溢出率经2分频(或不分频)后又经16分频作为串行发送或接收的移位脉冲。移位脉冲的速率即是波特率。,.,串行口结构,串行口内部结构示意简图,.,从图中可看出,接收器是双缓冲结构,在前一个字节被从接收缓冲器SBUF读出之前,第二个字节即开始被接收(串行输入至移位寄存器),但是,在第二个字节接收完毕而前一个字节CPU未读取时,会丢失前一个字节。(出现溢出错误)串行口的发送和接收都是以特殊功能寄存器SBUF的名义进行读或写的。当向SBUF发“写”命令时(执行“MOVSBUF,A”指令),即是向发送缓冲器SBUF装载并开始由TXD引脚向外发送一帧数据,发送完便使发送中断标志位TI=1。在满足串行口接收中断标志位RI(SCON.0)=0的条件下,置允许接收位REN(SCON.4)=1就会接收一帧数据进入移位寄存器,并装载到接收SBUF中,同时使RI=1。当发读SBUF命令时(执行“MOVA,SBUF”命令),便由接收缓冲器(SBUF)取出信息通过89C51内部总线送CPU。对于发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误,一般不需要用双缓冲器结构来保持最大传送速率。,.,串行口控制字及控制寄存器,89C51串行口是可编程接口,对它初始化编程只用两个控制字分别写入特殊功能寄存器SCON(98H)和电源控制寄存器PCON(87H)中即可。(1)SCON(98H)89C51串行通信的方式选择、接收和发送控制以及串行口的状态标志等均由特殊功能寄存器SCON控制和指示。,.,串行口控制寄存器SCON,.,SCON(98H),SM0和SM1(SCON.7,SCON.6)串行口工作方式选择位。两个选择位对应4种通信方式,如下表所示。其中,fosc是振荡频率。,.,SM2(SCON.5)多机通信控制位,主要用于方式2和方式3。若置SM2=1,则允许多机通信。当一片89C51(主机)与多片89C51(从机)通信时,所有从机的SM2位都置1。主机首先发送的一帧数据为地址,即从机机号,其中第9位为1,所有的从机接收到数据后,将其中第9位装入RB8中。各个从机根据收到的第9位数据(RB8中)的值来决定从机可否再接收主机的信息。若(RB8)0,说明是数据帧,则使接收中断标志位RI0,信息丢失;若(RB8)1,说明是地址帧,数据装入SBUF并置RI1,中断所有从机,被寻址的目标从机清除SM2以接收主机发来的一帧数据。其他从机仍然保持SM21。若SM2=0,即不属于多机通信情况,则接收一帧数据后,不管第9位数据是0还是1,都置RI=1,接收到的数据装入SBUF。根据SM2这个功能,可实现多个89C51应用系统的串行通信。在方式1时,若SM2=1,则只有接收到有效停止位时,RI才置1,以便接收下一帧数据。在方式0时,SM2必须是0。,.,REN(SCON.4)允许接收控制位。由软件置1或清0,只有当REN1时才允许接收,相当于串行接收的开关;若REN0,则禁止接收。在串行通信接收控制过程中,如果满足RI0和REN1(允许接收)的条件,就允许接收,一帧数据就装载入接收SBUF中。TB8(SCON.3)发送数据的第9位(D8)装入TB8中。在方式2或方式3中,根据发送数据的需要由软件置位或复位。在许多通信协议中可用作奇偶校验位,也可在多机通信中作为发送地址帧或数据帧的标志位。对于后者,TB81,说明该帧数据为地址;TB80,说明该帧数据为数据字节。在方式0或方式1中,该位未用。,.,RB8(SCON.2)接收数据的第9位。在方式2或方式3中,接收到的第9位数据放在RB8位。它或是约定的奇/偶校验位,或是约定的地址/数据标识位。在方式2和方式3多机通信中,若SM21,如果RB81,说明收到的数据为地址帧。在方式1中,若SM20(即不是多机通信情况),RB8中存放的是已接收到的停止位。在方式0中,该位未用。TI(SCON.1)发送中断标志。在一帧数据发送完时被置位。在方式0串行发送第8位结束或其他方式串行发送到停止位的开始时由硬件置位,可用软件查询。它同时也申请中断,TI置位意味着向CPU提供“发送缓冲器SBUF已空”的信息,CPU可以准备发送下一帧数据。串行口发送中断被响应后,TI不会自动清0,必须由软件清0。,.,RI(SCON.0)接收中断标志。在接收到一帧有效数据后由硬件置位。在方式0中,当接受到数据的第8位时,由硬件置位;在其他三种方式中,当接收到停止位中间时由硬件置位。RI1,申请中断,表示一帧数据接收结束,并已装入接收SBUF中,要求CPU取走数据。CPU响应中断,取走数据。RI也必须由软件(指令)清0,清除中断申请,并准备接收下一帧数据。串行发送中断标志TI和接收中断标志RI是同一个中断源,CPU事先不知道是发送中断TI还是接收中断RI产生的中断请求,所以,在全双工通信时,必须由软件来判别。复位时,SCON所有位均清0。,.,(2)PCON(87H),电源控制寄存器PCON中只有SMOD位与串行口工作有关。复位时,SMOD0。,.,串行通信工作方式,根据实际需要,89C51串行口可设置4种工作方式,可有8位、10位或11位帧格式。方式0:以8位数据为一帧,不设起始位和停止位,先发送或接收最低位。方式0为同步移位寄存器输入/输出方式,常用于扩展I/O口。串行数据通过RXD输入或输出,而TXD用于输出移位时钟,作为外接部件的同步信号。其帧格式如下:,.,方式0的应用,例如,74LS164可用于扩展并行输出口,74LS165可用于扩展输入口。在这种方式下,收/发的数据为8位,低位在前,无起始位、奇偶校验位及停止位,波特率是固定的。,.,74LS164功能概述74LS164是8位串行输入平行输出的移位寄存器;其中:Q0Q7为并行输出端;DSA、DSB是串行输入端。MR是清除端,为0时,输出清零。CP为时钟输入端。当DSA、DSB任一输入端为低电平时,则禁止新数据输入,在时钟端CP脉冲上升沿作用下Q0为低电平。DSA、DSB有一个为高电平时,则允许另一个输入数据,并在CP脉冲上升沿作用下决定Q0的状态。两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。时钟(CP)每次由低变高时,数据右移一位,输入数据到Q0,Q0是两个数据输入端(DSA和DSB)的逻辑与。主复位(MR)输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。,.,方式1:以10位为一帧传输,设有1个起始位(0),8个数据位和1个停止位(1)。真正用于串行发送或接收,TXD与RXD分别用于发送与接收数据。在接收时,停止位进入SCON的RB8,此方式的传送波特率可调。其帧格式为:,.,方式1的发送过程在TI=0的情况下(表示串行口发送控制电路处于空闲状态),任何写缓冲器SBUF指令,如“MOVSBUF,A”,会触发串行发送过程:51机的串行口自动在8个数据位的前、后分别添加1位起始位和停止位,构成10位信息帧,按设定的波特率依次送出。当8位数据发送结束后(即开始发送停止位)时,串行口自动将中断标志TI置1。TI标志可用来查询发送过程是否完成。在中断处于开放状态下,TI有效时,将产生串行中断。方式1的接收过程在接收中断标志RI=0(串行口接收缓冲器SBUF处于空闲)情况下,当REN位置1时,串行口处于接收状态。按设定的波特率依次读出数据位和停止位。在接收到第9数据位(即停止位时),接收电路必须同时满足两个条件:RI=0和SM2=0或接收到的停止位为“1”,才能把接收到的内容存入接收缓冲器SBUF中,把停止位送入RB8中,并将RI置1和发出串行口中断请求(若中断开放)。否则,这次收到的数据将被舍去,而这是不被允许的。RI标志可用来查询接收过程是否完成。在方式1下,SM2应设为0。,.,方式2和方式3(两种方式唯一的区别是方式2的波特率固定,方式2和方式3的发送、接收时序与方式1类似,只是增加了一位第9位):以11位为1帧传输,设有1位起始位(0),8位数据位,1位可编程的第9位和1位停止位(1)。发送前,第9位数据位(D8)存放在TB8中,由软件置1或清0。也可将奇偶位装入TB8,从而进行奇偶校验。发送时串行口能自动把TB8取出,并装入到第9位数据位的位置,再逐一发送出去。如指令“SETBTB8”将D8置1。当满足RI=0且SM2=0,或接收到的第9位数据为1时,前8位数据送入SBUF,第9位数据位送入SCON中的RB8,置RI为1;否则,这次接收无效,也不置位RI。其帧格式为:,.,波特率设计,方式0:波特率=fosc/12,方式2:SMOD=0时,波特率=fosc/64;SMOD=1时,波特率=fosc/32。方式1,方式3:波特率=T1溢出率/n当SMOD=0时,n=32;SMOD=1时,n=16。所以,可用下式确定方式1和方式3的波特率:方式1、方式3波特率=2SMOD/32(T1溢出速率)其中,T1溢出速率取决于T1的计数速率(计数速率=fosc/12)和T1预置的初值。若定时器T1采用模式2时,波特率公式如下:方式1、方式3波特率=2SMOD/32(fosc/12)/(256-初值),.,定时器T1用作波特率发生器时,通常选用定时器模式2(自动重装初值定时器)比较实用。要设置定时器T1为定时方式(使C/T=0),让T1计数内部振荡脉冲,即计数速率为fosc/12(注意应禁止T1中断,以免溢出而产生不必要的中断)。先设定TH1和TL1的计数初值为X,那么每过“256-X”个机器周期,定时器T1就会产生一次溢出。因此,T1溢出速率为T1溢出速率=(fosc/12)/(256-X),.,波特率计算举例,89C51单片机时钟振荡频率为11.0592MHz,选用定时器T1工作模式2作为波特率发生器,波特率为2400b/s,求初值。解:设置波特率控制为(SMOD)=02400=2SMOD/32(fosc/12)/(256-初值)所以,(TH1)=(TL1)=F4H。,.,常用波特率与其它参数选取关系,.,串行口方式1的发送和接收,例2:89C51串行口按全双工方式收、发ASCII字符,最高位用来作奇偶校验位,采用奇校验方式,要求传送的波特率为1200b/s。编写有关的通信程序。解:7位ASCII码加1位奇校验位共8位数据,故可采用串行口方式1。89C51单片机的奇偶校验位P:当累加器A中1的个数为奇数时,P=1,否则,P=0。如果直接把P的值放入ASCII码的最高位,恰好成了偶校验,与要求不符。因此,要把P的值取反后放入ASCII码最高位,才是要求的奇校验。,.,双工通信要求收、发能同时进行。实际上,收、发操作主要是在串行接口进行,CPU只是把数据从接收缓冲器读出和把数据写入发送缓冲器。数据传送用中断方式进行,响应中断以后,通过检测是RI置位还是TI置位来决定CPU是进行发送操作还是接收操作。发送和接收都通过调用子程序来完成,设发送数据区的首地址为20H,接收数据区的首地址为40H,fosc为6MHz,通过查波特率初值(表7-2)可知定时器的初装值为F3H。定时器T1采用工作模式2,可避免计数溢出后用软件重装定时初值的工作。,.,串行口初始化编程步骤,在串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1,串行口控制寄存器SCON和中断控制器IE,步骤如下:确定T1的工作方式(编程TMOD寄存器)计算T1的初值,装载TH1、TL1;启动T1(编程TCON中的TR1位)确定串行口控制(编程SCON寄存器)串行口工作在中断方式时,要进行中断设置(编程IE、IP寄存器),.,主程序清单:ORG0000HAJMPSTARTORG0023H;串行口中断入口AJMPSBR1;转至中断服务程序ORG0030HSTART:MOVTMOD,#20H;定时器1设为模式2MOVTL1,#0F3H;定时器初值MOVTH1,#0F3H;8位重装值SETBTR1;启动定时器1MOVSCON,#50H;设置为方式1,;REN=1MOVR0,#20H;发送数据区首址MOVR1,#40H;接收数据区首址ACALLSOUT;先输出一个字符SETBESSETBEASJMP$;等待中断,中断服务子程序ORG0100HSBR1:JNBRI,SEND;RI=0,为发送中断ACALLSIN;否则,RI=1,为接;收中断SJMPNEXT;转至统一的出口SEND:ACALLSOUT;调用发送子程序NEXT:RETI;中断返回,.,发送子程序SOUT:CLRTIMOVA,R0;取发送数据到AMOVC,P;奇偶标识赋予CCPLC;奇校验MOVACC.7,C;ACC.7补0或1MOVSBUF,A;发送ASCII码INCR0;修改发送数据指针RET;返回,接收子程序SIN:CLRRIMOVA,SBUF;读出接收缓冲区内容MOVC,P;取出校验位,P=1CPLC;奇校验JCERRORANLA,#7FH;删去校验位MOVR1,A;读入接收缓冲区INCRI;修改接收数据指针SJMPSIN_1ERROR:;出错处理,略SIN_1:RET;返回END,.,采用查询方式由串行口发送带奇偶校验位的数据块。例3:设从内部RAM单元30H-4FH取出ASCII码数据,在最高位上加偶校验位后由串行口发出。采用10位异步通信方式,波特率为1200b/s,fosc=11.059MHz。由要求可知,应把串行口设置为方式1,采用定时器1模式2作为波特率发生器,预置值(TH1)=0E8H。,.,主程序;MOVTMOD,#20H;设置定时器1为模式2MOVTL1,#0E8H;初值,波特率为1200b/sMOVTH1,#0E8HSETBTR1;启动T1运行MOVSCON,#01000000B;设置串行口为方式1MOVR0,#30H;设置数据块起始地址MOVR7,#32;设置数据块长度LOOP:MOVA,R0ACALLS-OUT;调用发送子程序INCR0DJNZR7,LOOP,.,串行口发送子程序(偶校验);S-OUT:MOVC,PSW.0;设置偶校验位MOVACC.7,C;ACC.7补0或1MOVSBUF,A;启动串行口发送过程JNBTI,$;等待发送完CLRTI;清TI标志,允许再发送RETEND,.,串行口方式2和方式3的发送和接收,串行口方式2与方式3基本一样(只是波特率设置不同),接收/发送11位信息:开始为1位起始位(0),中间8位数据位,数据位之后为1位程控位(由用户置SCON的TB8决定),最后是1位停止位(1)。只比方式1多了一位程控位。,.,例4:设计一个发送程序,将片内RAM50H5FH中的数据串行发送;串行口设定为方式2,TB8作奇偶校验位。在数据写入发送缓冲器之前,先将数据的奇偶位P写入TB8,这时,第9位数据作奇偶校验用。,.,程序清单如下:TRT:MOVSCON,#80H;方式2设定MOVPCON,#80H;取波特率为fosc/32MOVR7,#10H;数据长度10HR7LOOP:MOVA,R0;取数据AMOVC,PSW.0;PTB8MOVTB8,CMOVSBUF,A;数据SBUF,启动发送WAIT:JBCTI,CONT;判断是否发送完SJMPWAITCONT:INCR0DJNZR7,LOOPRET,.,例5:编制一个串行口方式2接收程序,并核对奇偶标志位。解:根据上面介绍的特点,在方式2、方式3的发送过程中,将数据和附加在TB8中的奇偶标志位一块发向对方。因此,作为接收的一方应设法取出该奇偶标志位进行核对,相应的接收程序段为:,.,RRR:MOVSCON,#90H;选方式2,并允许接收(REN=1)LOOP:JBCRI,RECEIV;等待接收数据并清RISJMPLOOPRECEIV:MOVA,SBUF;将接收到的字符取出后,送到A。注意,;传送指令影响PSW,产生接收端的奇偶值JBPSW.0,ONE;判断接收端的奇偶值JBRB8,ERR;判断发送端的奇偶值SJMPRIGHTONE:JNBRB8,ERRRIGHT:;接收正确ERR:;接收有误当接收到一个字符时,从SBUF转移到A中时会产生接收端的奇偶值,而保存在RB8中的值为发送端的奇偶值,两个奇偶值应相等,否则接收字符有错。发现错误要及时通知对方重发。,.,89C51与89C51点对点异步通信,1通信协议要想保证通信成功,通信双方必须有一系列的约定,比如:作为发送方,必须知道什么时候发送信息,发什么,对方是否收到,收到的内容有没有错,要不要重发,怎样通知对方结束等等。作为接收方,必须知道对方是否发送了信息,发的是什么,收到的信息是否有错,如果有错怎样通知对方重发,怎样判断结束等。这种约定就叫做通信规程或协议,它必须在编程之前确定下来。要想使通信双方能够正确交换信息和数据,在协议中对什么时候开始通信,什么时候结束通信,何时交换信息等等都必须作出明确的规定。只有双方遵守这些规定才能顺利地进行通信。,.,2波特率设置在串行通信中,一个重要的指标是波恃率,它反映了串行通信的速率,也反映了对于传输通道的要求。波特率越高,要求传输通道的频带越宽。一般异步通信的波特率在50b/s19200b/s之间。由于异步通信双方各用自己的时钟源,要保证捕捉到的信号正确,最好采用较高频率的时钟。一般选择时钟频率比波特率高16倍或64倍。若是时钟频率等于波特率,则频率稍有偏差便会产生接收错误。,.,在异步通信中,收、发双方必须事先规定两件事:1、字符格式,即规定字符各部分所占的位数是否采用奇偶校验以及校验的方式(偶校验还是奇校验)等通信协议;2、采用的波特率以及时钟频率和波特率的比例关系。89C51的串行通信的波特率(由图7-16可知)由定时器T1的溢出率获得(仅指串行口方式1、方式3时),当串行口工作于方式1或方式3时,波特率为:其中,k为定时器1的位数,定时器模式0,k=13;定时器模式1,k=16;定时器模式2和摸式3,k=8。,.,例6:设甲机发送,乙机接收。串行接口工作于方式3(每帧数据为11位,第9位用于奇偶校验),两机均选用6.0000MHz的振荡频率,波特率为2400b/s。通信的功能为:甲机:将片外数据存储器4000H-407FH单元的内容向乙机发送,每发送一帧信息,乙机对接收的信息进行偶校验,将P位值放在TB8中。若校验正确,则乙机向甲机回发“数据发送正确”的信号(例中以00H作为应答信号)。甲机收到乙机“正确”的应答信号后再发送下一个字节。若奇偶校验有错,则乙机发出“数据发送不正确”的信号(例中以FFH作为应答信号)。甲机接收到“不正确”应答信号后,重新发送原数据,直至发送正确。甲机将该数据块发送完毕后停止发送。乙机:接收甲机发送的数据,并写入以4000H为首址的片外数据存储器中。每接收一帧数据,乙机对所接收的数据进行偶校验,并发出相应的应答信号,直至接收完所有数据。,.,解:(1)计算定时器计数初值X将已知数据fosc=6MHz,波特率=2400b/s代入下式:若取SMOD=0时,X=249.49。因取整数误差过大,故设SMOD=1,则X=242.98243=F3H因此,实际波特率=2403.85bS。,.,甲机发送流程图,乙机发送流程图,.,(3)源程序甲机主程序ORG0000HLJMPMAIN;上电,转向主程序ORG0023H;串行口的中断入口地址LJMPSERVE1;转向甲机中断服务程序ORG2000H;主程序MAIN:MOVTMOD,#20H;设T1工作与模式2MOVTH1,#0F3H;赋计数初值MOVTL1,#0F3H;赋计数值SETBTR1;启动定时器T1MOVPCON,#80H;设SMOD=1MOVSCON,#0D0H;置串行口方式3,允许接收MOVDPTR,#4000H;置数据块首址MOVR0,#80H;置发送字节数初值SETBES;允许串行口中断SETBEA;CPU开中断MOVXA,DPTR;取第一个数据发送MOVC,PMOVTB8,C;奇偶标志送TB8MOVSBUF,A;发送数据SJMP$;等待中断,.,甲机中断服务程序SERVE1:JBCRI,LOOP;是接收中断,清除RI,转入接收乙机的应答信息CLRTI;是发送中断,清除此中断标志SJMPENDTLOOP:MOVA,SBUF;取乙机的应答信息CLRCSUBBA,#01H;判应答信号是#00吗?JCLOOP1;是#00H,发送正确,(#00H-#01H),C=1,转LOOP1LOOP2:MOVXA,DPTR;否则甲机重发MOVC,PMOVTB8,CMOVSBUF,A;甲机重发原数据SJMPENDTLOOP1:INCDPTR;修改地址指针,准备发送下一个数据;MOVXA,DPTR;MOVC,P;MOVTB8,C;MOVSBUF,A;发送;DJNZR0,ENDT;数据块未发送完,返回继续发送DJNZR0,LOOP2;数据块未发送完,启动发送下一个数据CLRES;全部发送完,禁止串行口中断ENDT:RETI;中断返回END,.,乙机主程序;ORG0000HLJMPMAIN;上电,转向主程序ORG0023H;串行口的中断入口地址LJMPSERVE2;转向乙机中断服务程序ORG2000H;主程序MAIN:MOVTMOD,#20H;设T1工作于模式2MOVTH1,#0F3H;赋计数初值MOVTL1,#0F3H;赋计数初值SETBTR1;启动定时器T1MOVPCON,#80H;设SMOD=1MOVSCON,#0D0H;置串行口方式3,允许接收MOVDPTR,#4000H;置数据区首址MOVR0,#80H;置接收字节数初值SETBES;允许串行口中断SETBEA;CPU开中断SJMP$;等待中断,.,乙机中断服务程序:SERVE2:JBCRI,LOOP;是接收中断,清除此中断标志,转LOOP(接收)CLRTI;是发送中断,清除此中断标志,中断返回SJMPENDTLOOP:MOVA,SBUF;接收(读入)数据MOVC,P;奇偶标志送CJCLOOP1;为奇数,转LOOP1ORLC,RB8;为偶数,检测RB8JCLOOP2;奇偶校验错,转LOOP2SJMPLOOP3LOOP1:ANLC,RB8;检测RB8JCLOOP3;奇偶校验正确,转LOOP3LOOP2:MOVA,#0FFHMOVSBUF,A;发送“不正确”应答信号SJMPENDTLOOP3:MOVXDPTR,A;存放接收数据MOVA,#00HMOVSBUF,A;发送“正确”应答信号INCDPTR;修改数据区指针DJNZR0,ENDT;数据块未接收完,返回CLRES;所有数据接收完毕,禁止串行口中断ENDT:RETI;中断返回END,.,89C51与PC机间通信软件的设计,一、PC机通信软件设计1.通信协议波特率:1200b/s;信息格式:8位数据位,1位停止位,无奇偶检验;传送方式:PC机采用查询方式收发数据;89C51采用中断方式接收,查询方式发送;校验方式:累加和校验;握手信号:采用软件握手。发送方在发送之前先发一联络信号(用“?”号的ASCII码,接收方接到“?”号后回送一个“”号作为应答信号),随后依次发送数据块长度(字节数),发送数据,最后发送校验和。收方在收到发送方发过来的校验和后与自己所累加的校验和相比较,相同则回送一个“0”,表示正确传送并结束本次的通信过程;若不相同则回送一个“F”,并使发送方重新发送数据,直到接收正确为止。,.,2.PC机发送文件子程序首先介绍通过串口发送一个文件的函数sendf()。规定欲发送的这个文件存在当前盘上,并且为了便于说明问题,只传送总字节小于256个字符的文件。3、PC机接收文件子程序接收函数receivef()采用查询方式从串口接收一个总字节数小于256个字符的文件,接收的文件也存于当前盘上。,.,PC机发送文件子函数sendf()流程图,PC机接收文件子函数receivef()流程图,.,PC机发送文件子函数sendf()程序清单,.,.,.,4、PC机主程序(函数)在有了上述发送和接收文件两个子函数之后,主函数的编写就非常简单了。主函数的工作只是在完成串口初始化后,根据键入的命令来决定是发送文件还是接收文件。PC机主函数如下:,.,PC机主函数流程图,.,这里采用的是带参主函数main(intargc,char*argv)。其中,argc是一个整型变量,argv是一个字符型指针数组。利用main函数的参数可以使主程序从系统得到所需数据(也就是说带参函数可直接从DOS命令行中得到参数值,当然,这些值是字符串)。当程序运行时(在DOS下执行.EXE文件),可以根据输入的命令行参数进行相应的处理。例如,执行程序mypro时,若要从当前盘上将名为f1.c的文件从串口发送出去,需键入下述命令:myprosf1.c其中,mypro是源文件mypro.c经编译连接后生成的可执行文件mypro.exe。键入命令:myprorf2.c可以从串口接收若干字符,并写入当前盘上名为f2.c的文件中去。,.,二、89C51通信软件设计1、单片机查询发送子程序本程序将片外RAM从1000H开始的小于256B的数据从串行口发送出去,发送的数据字节数在R7中,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论