资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第7章 89C51串行口及串行通信技术,教学目标,串行通信基本知识,串行口及应用,89C51与89C51点对点异步通信,89C51与PC机间通信软件设计,1/79,7.1 串行通信基本知识,在实际工作中,计算机CPU与外部设备之间经常要进行信息交换,一台计算机与其它计算机之间也往往要交换信息,,全部这些信息交换均可称为通信。,通信方式有两种,即,并行通信和串行通信,。,通常依据信息传送距离决定采取哪种通信方式。,比如,PC机与外部设备(如打印机等)通信时,假如距离小于30 m,可采取并行通信方式;当距离大于30 m时,则要采取串行通信方式。89C51单片机含有,并行和串行,二种基本通信方式。,2/79,并行通信,并行通信是指数据各位同时进行传送(发送或接收)通信方式。,优点:传送速度快;,缺点:数据有多少位,就需要多少根传送线。,比如,右图89C51单片机与外部设备之间数据传送就属于并行通信。,3/79,串行通信,串行通信指数据是一位(bit)一位按次序传送通信方式。,优点:只需一对传输线(利用电话线就可作为传输线),大大降低了传送成本,尤其适合用于远距离通信;,缺点:传送速度较低。假设并行传送N位数据所需时间为T,那么串行传送时间最少为NT,实际上总是大于NT。,接收设备,发送设备,D7,D6,D5,D4,D3,D2,D1,D0,4/79,串行通信传输方式,串行通信传输方式通常有三种:,单向(或单工)方式,,只允许数据向一个方向传送;,半双向(或半双工)方式,,允许数据向两个方向中任一方向传送,但每次只能有一个站点发送;,全双向(或全双工)方式,,允许同时双向传送数据,所以,全双工配置是一对单向配置,它要求两端通信设备都含有完整和独立发送和接收能力。,5/79,串行通信中数据传送方式,6/79,异步通信和同时通信,串行通信有两种基本通信方式,即异步通信和同时通信。,异步通信,在异步通信中,数据是一帧一帧(包含一个字符代码或一字节数据)传送。,在帧格式中,一个字符由四个部分组成:,起始位、数据位、奇偶校验位和停顿位,。首先是一个起始位(0),然后是58位数据(要求:低位在前,高位在后),接下来是奇偶校验位(可省略),最终是停顿位(1)。,7/79,异步通信数据格式,(,b)有空闲位,8/79,异步串行通信协议,起始位(0)信号只占一位,,用来通知接收设备一个待接收字符开始抵达。线路上在不传送字符时应保持为1。接收端不停检测线路状态,若连续为1以后又测到一个0,就知道发来一个新字符,应马上准备接收。字符起始位还被用作同时接收端时钟,以确保以后接收能正确进行。,起始位后面紧接着是,数据位,,它能够是5位(D0-D4)、6位、7位或8位(D0-D7)。若所传字符为ASCII码,则常取7位。,奇偶校验(D8)只占一位,,但在字符中也能够要求不用奇偶校验位,则这一位可省去。也可用这一位(1/0)来确定这一帧中字符所代表信息性质(地址/数据等)。,停顿位用来表征字符结束,它一定是高电位(逻辑1),。停顿位能够是1位、1.5位或2位。接收端收到停顿位后,知道上一字符已传送完成,同时,也为接收下一个字符做好准备。只要再接收到0,就是新字符起始位。若停顿位以后不是紧接着传送下一个字符,则使线路电平保持为高电平(逻辑1)。,9/79,同时通信,同时通信中,在数据开始传送前用同时字符来指示(常约定1个-2个),并由,时钟来实现发送端和接收端同时,,即检测到要求同时字符后,下面就连续按次序传送数据,直到通信告一段落。,同时传送时,字符与字符之间没有间隙,也不用起始位和停顿位,仅在数据块开始时用同时字符SYNC来指示。,10/79,同时通信,同时字符插入能够是单同时字符方式或双同时字符方式,然后是连续数据块。,同时字符能够由用户约定,也可采取ASCII码中要求SYNC代码,即16H。,按同时方式通信时,先发送同时字符,接收方检测到同时字符后,即准备接收数据。,在同时传送时,要求用,时钟来实现发送端与接收端之间同时,。为了确保接收正确无误,发送方除了传送数据外,还要同时传送时钟信号。,同时传送能够提升传输速率(达56kb/s或更高),但硬件比较复杂。,11/79,波特率(Baud rate),波特率,即数据传送速率,表示每秒钟传送二进制代码位数,它单位是b/s(bits per second)。,假设数据传送速率是120字符/s,而每个字符包含代码位有:1个起始位、8个数据位、1个停顿位。这时,传送波特率为:,10b/字符120字符/s1200b/s,每一位代码传送时间Td为波特率倒数。,Td1/12000.833ms,异步通信传送速率在50b/s19200b/s之间,惯用于计算机到终端机和打印机之间通信、直通电报以及无线电通信数据发送等。,12/79,串行通信过程,1、串并转换与设备同时,两个通信设备在串行线路上成功地实现通信必须处理两个问题:,1),串并转换,,即怎样把要发送并行数据串行化,把接收串行数据并行化;,2),设备同时,,即发送设备与接收设备工作节拍同时,以确保发送数据在接收端被正确读出。,13/79,1、串并转换与设备同时,1)串并转换,串行通信是将计算机内部并行数据转换成串行数据,将其经过一根通信线传送;并将接收串行数据再转换成并行数据送到计算机中。,在计算机串行发送数据之前,计算机内部并行数据被送入,移位存放器,并一位一位地输出,将并行数据转换成串行数据。如,图7-5,所表示。,在接收数据时,来自通信线路串行数据被压入移位存放器,满8位后并行送到计算机内部。如,图7-6,所表示。,在串行通信控制电路中,串-并、并-串转换逻辑被集成在,串行异步通信控制器芯片,中。89C51单片机串行口和IBM-PC相同。,14/79,图7-5,15/79,图7-6,16/79,2)设备同时,进行串行通信两台设备必须同时工作才能有效地检测通信线路上信号改变,从而采样传送数据脉冲。,设备同时对通信双方有两个共同要求:,通信双方必须采取统一编码方法;,通信双方必须能产生相同传送速率。,采取统一编码方法确定了,一个字符二进制表示值,位发送次序和位串长度,当然还包含统一逻辑电平要求,即电平信号高低与逻辑1和逻辑0固定对应关系。,通信双方只有产生相同传送速率,才能确保设备同时,这就要求发送设备和接收设备采取相同频率时钟。发送设备在统一时钟脉冲上发出数据,接收设备才能正确检测出与时钟脉冲同时数据信息。,17/79,7.2,89C51,串行口及应用,89C51单片机除含有4个8位并行口外,还含有串行接口。,此,串行接口是一个全双工串行通信接口,,即能同时进行串行发送和接收数据。,它能够作UART(通用异步接收和发送器)用,也能够作同时移位存放器用。,使用串行接口能够实现89C51单片机系统之间点对点单机通信和89C51与系统机(如IBM-PC机等)单机或多机通信。,18/79,串行口结构,89C51经过引脚RXD(P3.0,串行数据接收端)和引脚TXD(P3.1,串行数据发送端)与外界进行通信。有,两个物理独立接收、发送缓冲器SBUF,,它们占用同一地址99H,可同时发送、接收数据。发送缓冲器只能写入,不能读出;接收缓冲器只能读出,不能写入。,串行发送与接收速率与移位时钟同时,。89C51用定时器,T1,作为串行通信波特率发生器,T1溢出率经2分频(或不分频)后又经16分频作为串行发送或接收移位脉冲。移位脉冲速率即是波特率。,19/79,串行口结构,串行口内部结构示意简图,20/79,从图中可看出,接收器是双缓冲结构,在前一个字节被从接收缓冲器SBUF读出之前,第二个字节即开始被接收(串行输入至移位存放器),不过,在第二个字节接收完成而前一个字节CPU未读取时,会丢失前一个字节。,(出现溢犯错误),串行口发送和接收都是以特殊功效存放器SBUF名义进行读或写。当向SBUF发“写”命令时(执行“,MOV SBUF,A,”指令),即是向发送缓冲器SBUF装载并开始由TXD引脚向外发送一帧数据,发送完便使发送中止标志位TI=1。,在满足串行口接收中止标志位,RI(SCON.0)=0,条件下,置,允许接收位REN(SCON.4)=1,就会接收一帧数据进入移位存放器,并装载到接收SBUF中,同时使RI=1。当发读SBUF命令时(执行“,MOV A,SBUF,”命令),便由接收缓冲器(SBUF)取出信息经过89C51内部总线送CPU。,对于发送缓冲器,因为发送时CPU是主动,不会产生重合错误,普通不需要用双缓冲器结构来保持最大传送速率。,21/79,串行口控制字及控制存放器,89C51串行口是可编程接口,对它初始化编程只用两个控制字分别写入特殊功效存放器SCON(98H)和电源控制存放器PCON(87H)中即可。,(1)SCON(98H),89C51串行通信方式选择、接收和发送控制以及串行口状态标志等均由特殊功效存放器SCON控制和指示。,22/79,串行口控制存放器SCON,23/79,SCON(98H),SM0和SM1(SCON.7,SCON.6)串行口工作方式选择位。两个选择位对应4种通信方式,以下表所表示。其中,fosc是振荡频率。,SM0,SM1,工作方式,说明,波特率,0,0,方式0,同时移位存放器,f,osc,/12,0,1,方式1,10位异步收发,定时器T1控制,1,0,方式2,11位异步收发,f,osc,/32或f,osc,/64,1,1,方式3,11位异步收发,定时器T1控制,24/79,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。,25/79,REN(SCON.4)允许接收控制位。,由软件置1或清0,只有当REN1时才允许接收,相当于串行接收开关;若REN0,则禁止接收。,在串行通信接收控制过程中,,假如满足RI0和REN1(允许接收)条件,,就允许接收,一帧数据就装载入接收SBUF中。,TB8(SCON.3)发送数据第9位(D8)装入TB8中。,在方式2或方式3中,依据发送数据需要,由软件置位或复位。,在许多通信协议中可用作,奇偶校验位,,也可在多机通信中作为发送地址帧或数据帧标志位。对于后者,TB81,说明该帧数据为地址;TB80,说明该帧数据为数据字节。,在方式0或方式1中,该位未用。,26/79,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。,27/79,RI(SCON.0)接收中止标志。,在接收到一帧有效数据后由硬件置位。在方式0中,当接收到数据第8位时,由硬件置位;在其它三种方式中,当接收到停顿位中间时由硬件置位。RI1,申请中止,表示一帧数据接收结束,并已装入接收SBUF中,要求CPU取走数据。CPU响应中止,取走数据。,RI也必须由软件(指令)清0,去除中止申请,并准备接收下一帧数据。,串行发送中止标志TI和接收中止标志RI是同一个中止源,CPU事先不知道是发送中止TI还是接收中止RI产生中止请求,所以,,在全双工通信时,必须由软件来判别。,复位时,SCON全部位均清0。,28/79,(2)PCON(87H),电源控制存放器PCON中只有SMOD位与串行口工作相关。,复位时,SMOD0。,29/79,串行通信工作方式,依据实际需要,89C51串行口可设置,4种工作方式,,可有8位、10位或11位帧格式。,方式0:,以8位数据为一帧,不设起始位和停顿位,先发送或接收最低位。,方式0为,同时移位存放器输入/输出方式,,惯用于扩展I/O口。,串行数据经过RXD输入或输出,而TXD用于输出移位时钟,作为外接部件同时信号。,其帧格式以下:,.,D0,D1,D2,D3,D4,D5,D6,D7,.,30/79,方式0应用,比如,74LS164可用于扩展并行输出口,74LS165可用于扩展输入口。,在这种方式下,收/发数据为8位,低位在前,无起始位、奇偶校验位及停顿位,波特率是固定。,31/79,74LS164功效概述,74LS164是8位串行输入平行输出移位存放器;其中:Q0Q7 为并行输出端;DSA、DSB是串行输入端。MR是 去除端,为0时,输出清零。CP 为时钟输入端。,当DSA、DSB任一输入端为低电平时,则禁止新数据输入,在时钟端CP脉冲上升沿作用下Q0为低电平。DSA、DSB有一个为高电平时,则允许另一个输入数据,并在CP脉冲上升沿作用下决定Q0状态。,两个输入端或者连接在一起,或者把不用输入端接高电平,一定不要悬空。,时钟(CP)每次由低变高时,数据右移一位,输入数据到 Q0,Q0 是两个数据输入端(DSA和 DSB)逻辑与。,主复位(MR)输入端上一个低电平将使其它全部输入端都无效,同时非同时地去除存放器,强制全部输出为低电平。,32/79,方式1:,以10位为一帧传输,设有1个起始位(0),8个数据位和1个停顿位(1)。,真正用于串行发送或接收,TXD与RXD分别用于发送与接收数据。,在接收时,停顿位进入SCONRB8,此方式,传送波特率可调。,其帧格式为:,停顿位,D7,D6,D5,D4,D3,D2,D1,D0,起始位,33/79,方式1发送过程,在,TI=0,情况下(表示串行口发送控制电路处于空闲状态),任何写缓冲器SBUF指令,如,“MOV SBUF,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。,34/79,方式2和方式3,(,两种方式唯一区分是方式2波特率固定,,方式2和方式3发送、接收时序与方式1类似,只是增加了一位第9位,):,以11位为1帧传输,设有1位起始位(0),8位数据位,1位可编程第9位和1位停顿位(1)。,发送前,第9位数据位(D8)存放在TB8中,由软件置1或清0。也可将奇偶位装入TB8,从而进行奇偶校验。,发送时串行口能自动把TB8取出,并装入到第9位数据位位置,再逐一发送出去。,如指令“,SETB TB8”将D8置1。,当满足RI=0且SM2=0,或接收到第9位数据为1时,前8位数据送入SBUF,第9位数据位送入SCON中RB8,置RI为1;不然,这次接收无效,也不置位RI。,其帧格式为:,停顿位,D7,D6,D5,D4,D3,D2,D1,D0,起始位,D7,D8,35/79,波特率设计,方式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波特率=2,SMOD,/32(T1溢出速率),其中,T1溢出速率取决于T1计数速率(计数速率=fosc/12)和T1预置初值。若定时器T1采取模式2时,波特率公式以下:,方式1、方式3波特率=2,SMOD,/32(fosc/12)/(256-初值),36/79,定时器T1用作波特率发生器时,通常选取定时器模式2(自动重装初值定时器)比较实用。,要设置定时器T1为定时方式(使C/T=0),让T1计数内部振荡脉冲,即计数速率为fosc/12(,注意应禁止T1中止,以免溢出而产生无须要中止,)。,先设定TH1和TL1计数初值为X,那么每过“256-X”个机器周期,定时器T1就会产生一次溢出。,所以,T1溢出速率为,T1溢出速率=(fosc/12)/(256-X),37/79,波特率计算举例,89C51单片机时钟振荡频率为11.0592MHz,选取定时器T1工作模式2作为波特率发生器,波特率为2400b/s,求初值。,解:设置波特率控制为(SMOD)=0,2400=2,SMOD,/32(fosc/12)/(256-初值),所以,(TH1)=(TL1)=F4H。,38/79,串口工作方式,波特率,f,osc,SMOD,定时器T1,C/T,模式,定时器初值,方式0,1M,12MHz,-,-,-,-,方式2,375K,12MHz,1,-,-,-,187.5K,12MHz,0,-,-,-,方式1或,方式3,62.5K,12MHz,1,0,2,FFH,19.2K,11.059MHz,1,0,2,FDH,9.6K,11.059MHz,0,0,2,FDH,4.8K,11.059MHz,0,0,2,FAH,2.4K,11.059MHz,0,0,2,F4H,1.2K,11.059MHz,0,0,2,E8H,137.5K,11.059MHz,0,0,2,1DH,110,12MHz,0,0,1,FEEBH,方式0,0.5M,6MHz,-,-,-,-,方式2,187.5K,6MHz,1,-,-,-,方式1或,方式3,19.2K,6MHz,1,0,2,FEH,9.6K,6MHz,1,0,2,FDH,4.8K,6MHz,0,0,2,FDH,2.4K,6MHz,0,0,2,FAH,1.2K,6MHz,0,0,2,F3H,0.6K,6MHz,0,0,2,E6H,110,6MHz,0,0,2,73H,55,6MHz,0,0,2,FEEBH,惯用波特率与其它参数选取关系,39/79,串行口方式1发送和接收,例2:89C51串行口按全双工方式收、发,ASCII字符,,最高位用来作奇偶校验位,采取奇校验方式,要求传送波特率为1200b/s。编写相关通信程序。,解:,7位ASCII码加1位奇校验位共8位数据,故可采取串行口方式1。,89C51单片机奇偶校验位P:当累加器A中1个数为奇数时,P=1,不然,P=0。,假如直接把P值放入ASCII码最高位,恰好成了偶校验,与要求不符。所以,要把P值取反后放入ASCII码最高位,才是要求奇校验。,40/79,双工通信要求收、发能同时进行。,实际上,收、发操作主要是在串行接口进行,CPU只是,把数据从接收缓冲器读出,和,把,数据写入发送缓冲器,。数据传送用中止方式进行,,响应中止以后,经过检测是RI置位还是TI置位来决定CPU是进行发送操作还是接收操作。,发送和接收都经过调用子程序来完成,设发送数据区首地址为20H,接收数据区首地址为40H,fosc为6 MHz,经过查波特率初值,(,表7-2,),可知定时器初装值为F3H。,定时器T1采取工作模式2,可防止,计数溢出后,用软件重装定时初值工作。,41/79,串行口初始化编程步骤,在串行口工作之前,应对其进行初始化,主要是设置产生波特率定时器1,串行口控制存放器SCON和中止控制器IE,步骤以下:,确定T1工作方式(编程TMOD存放器),计算T1初值,装载TH1、TL1;,开启T1(编程TCON中TR1位),确定串行口控制(编程SCON存放器),串行口工作在中止方式时,要进行中止设置(编程IE、IP存放器),42/79,主程序清单:,ORG 0000H,AJMP START,ORG 0023H ;串行口中止入口,AJMP SBR1 ;转至中止服务程序,ORG 0030H,START:,MOV TMOD,#20H;定时器1设为模式2,MOV TL1,#0F3H;定时器初值,MOV TH1,#0F3H;8位重装值,SETB TR1 ;开启定时器1,MOV SCON,#50H ;设置为方式1,,;REN=1,MOV R0,#20H ;发送数据区首址,MOV R1,#40H ;接收数据区首址,ACALL SOUT ;先输出一个字符,SETB ES,SETB EA,SJMP$;等候中止,中止服务子程序,ORG 0100H,SBR1:,JNB RI,SEND ;RI=0,为发送中止,ACALL SIN ;不然,RI=1,为接,;收中止,SJMP NEXT ;转至统一出口,SEND:,ACALL SOUT ;调用发送子程序,NEXT:,RETI,;中止返回,43/79,发送子程序,SOUT:,CLR TI,MOV A,R0 ;取发送数据到A,MOV C,P ;奇偶标识赋予C,CPL C ;奇校验,MOV ACC.7,C ;ACC.7补0或1,MOV SBUF,A;发送ASCII码,INC R0 ;修改发送数据指针,RET,;返回,接收子程序,SIN:,CLR RI,MOV A,SBUF ;读出接收缓冲区内容,MOV C,P ;取出校验位,P=1,CPL C ;奇校验,JC ERROR,ANL A,#7FH ;删去校验位,MOV R1,A ;读入接收缓冲区,INC RI ;修改接收数据指针,SJMP SIN_1,ERROR:;犯错处理,略,SIN_1,:,RET,;返回,END,44/79,采取查询方式由串行口发送带奇偶校验位数据块,。,例3:设从内部RAM单元30H-4FH取出ASCII码数据,在最高位上加偶校验位后由串行口发出。采取10位异步通信方式,波特率为1200b/s,fosc=11.059MHz。,由要求可知,应把串行口设置为方式1,采取定时器1模式2作为波特率发生器,预置值(TH1)=0E8H。,45/79,主程序;,MOV TMOD,#20H ;设置定时器1为模式2,MOV TL1,#0E8H ;初值,波特率为1200b/s,MOV TH1,#0E8H,SETB TR1 ;开启T1运行,MOV SCON,#01000000B ;设置串行口为方式1,MOV R0,#30H ;设置数据块起始地址,MOV R7,#32 ;设置数据块长度,LOOP:,MOV A,R0,ACALL S-OUT ;调用发送子程序,INC R0,DJNZ R7,LOOP,46/79,串行口发送子程序(偶校验);,S-OUT:,MOV C,PSW.0 ;设置偶校验位,MOV ACC.7,C ;ACC.7补0或1,MOV SBUF,A ;开启串行口发送过程,JNB TI,$;等候发送完,CLR TI ;清TI标志,,允许再发送,RET,END,47/79,串行口方式2和方式3发送和接收,串行口方式 2与方式 3基本一样(只是波特率设置不一样),接收/发送11位信息:开始为1位起始位(0),中间8位数据位,数据位之后为1位程控位(由用户置SCONTB8决定),最终是1位停顿位(1)。,只比喻式1多了一位程控位。,48/79,例4:设计一个发送程序,将片内RAM 50H5FH中数据串行发送;串行口设定为方式2,TB8作奇偶校验位。在数据写入发送缓冲器之前,先将数据,奇偶位P写入TB8,,这时,第9位数据作奇偶校验用。,49/79,程序清单以下:,TRT:MOV SCON,#80H ;方式2设定,MOV PCON,#80H ;取波特率为fosc/32,MOV R7,#10H ;数据长度10HR7,LOOP:,MOV A,R0 ;取数据A,MOV C,PSW.0 ;PTB8,MOV TB8,C,MOV SBUF,A ;数据SBUF,开启发送,WAIT:JBC TI,CONT ;判断是否发送完,SJMP WAIT,CONT:INC R0,DJNZ R7,LOOP,RET,50/79,例5:编制一个串行口方式2接收程序,并查对奇偶标志位。,解:依据上面介绍特点,在方式2、方式3发送过程中,将数据和附加在TB8中奇偶标志位一块发向对方。所以,作为接收一方应设法取出该奇偶标志位进行查对,对应接收程序段为:,51/79,RRR:MOV SCON,#90H ;选方式2,并允许接收(REN=1),LOOP:JBC RI,RECEIV ;等候接收数据并清RI,SJMP LOOP,RECEIV:MOV A,SBUF ;将接收到字符取出后,送到A。注意,,;传送指令影响PSW,产生接收端奇偶值,JB PSW.0,ONE ;判断接收端奇偶值,JB RB8,ERR ;判断发送端奇偶值,SJMP RIGHT,ONE:JNB RB8,ERR,RIGHT:;接收正确,ERR:;接收有误,当接收到一个字符时,从SBUF转移到A中时会产生接收端奇偶值,而保留在RB8中值为发送端奇偶值,两个奇偶值应相等,不然接收字符有错。发觉错误要及时通知对方重发。,52/79,89C51与89C51点对点异步通信,1通信协议,要想确保通信成功,通信双方必须有一系列约定,比如:,作为发送方,必须知道什么时候发送信息,发什么,对方是否收到,收到内容有没有错,要不要重发,怎样通知对方结束等等。作为接收方,必须知道对方是否发送了信息,发是什么,收到信息是否有错,假如有错怎样通知对方重发,怎样判断结束等。,这种约定就叫做通信规程或协议,它必须在编程之前确定下来。要想使通信双方能够正确交换信息和数据,在协议中对什么时候开始通信,什么时候结束通信,何时交换信息等等都必须作出明确要求。只有双方恪守这些要求才能顺利地进行通信。,53/79,2 波特率设置,在串行通信中,一个主要指标是波恃率,它反应了串行通信速率,也反应了对于传输通道要求。波特率越高,要求传输通道频带越宽。普通异步通信波特率在 50 b/s19200 b/s之间。,因为异步通信双方各用自己时钟源,要确保捕捉到信号正确,最好采取较高频率时钟。普通选择时钟频率比波特率高16倍或64倍。若是时钟频率等于波特率,则频率稍有偏差便会产生接收错误。,54/79,在异步通信中,收、发双方必须事先要求两件事:,1、字符格式,即要求字符各部分所占位数是否采取奇偶校验以及校验方式(偶校验还是奇校验)等通信协议;,2、采取波特率以及时钟频率和波特率百分比关系。,89C51串行通信波特率(由,图7-16,可知)由定时器T1溢出率取得(仅指串行口方式1、方式3时),当串行口工作于方式1或方式3时,波特率为:,其中,k为定时器1位数,定时器模式0,k=13;定时器模式1,k=16;,定时器模式2和摸式3,k=8。,55/79,例6:设甲机发送,乙机接收。串行接口工作于方式3(每帧数据为11位,第9位用于奇偶校验),两机均选取 6.0000MHz振荡频率,波特率为 2400 b/s。通信功效为:,甲机:,将片外数据存放器4000H-407FH单元内容向乙机发送,每发送一帧信息,乙机对接收信息进行偶校验,将P位值放在TB8中。若校验正确,则乙机向甲机回发“数据发送正确”信号(例中以00H作为应答信号)。甲机收到乙机“正确”应答信号后再发送下一个字节。若奇偶校验有错,则乙机发出“数据发送不正确”信号(例中以FFH作为应答信号)。甲机接收到“不正确”应答信号后,重新发送原数据,直至发送正确。甲机将该数据块发送完成后停顿发送。,乙机:,接收甲机发送数据,并写入以4000H为首址片外数据存放器中。每接收一帧数据,乙机对所接收数据进行偶校验,并发出对应应答信号,直至接收完全部数据。,56/79,解:,(1)计算定时器计数初值X,将已知数据 fosc=6 MHz,波特率=2400b/s代入下式:,若取SMOD=0时,X=249.49。因取整数误差过大,故设SMOD=1,则X=242.98,243=F3H,所以,实际波特率=2403.85 bS。,57/79,甲机发送流程图,乙机发送流程图,58/79,(3)源程序,甲机 主程序,ORG 0000H,LJMP MAIN ;上电,转向主程序,ORG 0023H ;串行口中止入口地址,LJMP SERVE1 ;转向甲机中止服务程序,ORG H ;主程序,MAIN:,MOV TMOD,#20H ;设T1工作与模式2,MOV TH1,#0F3H ;赋计数初值,MOV TL1,#0F3H ;赋计数值,SETB TR1 ;开启定时器T1,MOV PCON,#80H ;设SMOD=1,MOV SCON,#0D0H ;置串行口方式3,允许接收,MOV DPTR,#4000H ;置数据块首址,MOV R0,#80H ;置发送字节数初值,SETB ES ;允许串行口中止,SETB EA ;CPU开中止,MOVX A,DPTR ;取第一个数据发送,MOV C,P,MOV TB8,C ;奇偶标志送TB8,MOV SBUF,A ;发送数据,SJMP$;等候中止,59/79,甲机中止服务程序,SERVE1:JBC RI,LOOP;是接收中止,去除RI,转入接收乙机应答信息,CLR TI ;是发送中止,去除此中止标志,SJMP ENDT,LOOP:MOV A,SBUF ;取乙机应答信息,CLR C,SUBB A,#01H ;判应答信号是#00吗?,JC LOOP1 ;是#00H,发送正确,(#00H-#01H),C=1,转LOOP1,LOOP2:,MOVX A,DPTR ;不然甲机重发,MOV C,P,MOV TB8,C,MOV SBUF,A ;甲机重发原数据,SJMP ENDT,LOOP1:INC DPTR ;修改地址指针,准备发送下一个数据,;MOVX A,DPTR,;MOV C,P,;MOV TB8,C,;MOV SBUF,A ;发送,;DJNZ R0,ENDT ;数据块未发送完,返回继续发送,DJNZ R0,LOOP2 ;数据块未发送完,开启发送下一个数据,CLR ES ;全部发送完,禁止串行口中止,ENDT:RETI ;中止返回,END,60/79,乙机主程序;,ORG 0000H,LJMP MAIN ;上电,转向主程序,ORG 0023H ;串行口中止入口地址,LJMP SERVE2 ;转向乙机中止服务程序,ORG H ;主程序,MAIN:,MOV TMOD,#20H ;设T1工作于模式2,MOV TH1,#0F3H ;赋计数初值,MOV TL1,#0F3H ;赋计数初值,SETB TR1 ;开启定时器T1,MOV PCON,#80H ;设SMOD=1,MOV SCON,#0D0H ;置串行口方式3,允许接收,MOV DPTR,#4000H ;置数据区首址,MOV R0,#80H ;置接收字节数初值,SETB ES ;允许串行口中止,SETB EA ;CPU开中止,SJMP$;等候中止,61/79,乙机中止服务程序:,SERVE2:JBC RI,LOOP ;是接收中止,去除此中止标志,转LOOP(接收),CLR TI ;是发送中止,去除此中止 标志,中止返回,SJMP ENDT,LOOP:,MOV A,SBUF ;接收(读入)数据,MOV C,P ;奇偶标志送C,JC LOOP1 ;为奇数,转LOOP1,ORL C,RB8 ;为偶数,检测RB8,JC LOOP2 ;奇偶校验错,转LOOP2,SJMP LOOP3,LOOP1:ANL C,RB8 ;检测RB8,JC LOOP3 ;奇偶校验正确,转LOOP3,LOOP2:,MOV A,#0FFH,MOV SBUF,A ;发送“不正确”应答信号,SJMP ENDT,LOOP3:MOVX DPTR,A ;存放接收数据,MOV A,#00H,MOV SBUF,A ;发送“正确”应答信号,INC DPTR ;修改数据区指针,DJNZ R0,ENDT ;数据块未接收完,返回,CLR ES ;全部数据接收完成,禁止串行口中止,ENDT:RETI ;中止返回,END,62/79,89C51与PC机间通信软件设计,一、PC机通信软件设计,1.通信协议,波特率:1200b/s;,信息格式:8位数据位,1位停顿位,无奇偶检验;,传送方式:PC机采取查询方式收发数据;89C51采取中止方式接收,查询方式发送;,校验方式:累加和校验;,握手信号:采取软件握手。发送方在发送之前先发一联络信号(用“?”号ASCII码,接收方接到“?”号后回送一个“”号作为应答信号),随即依次发送数据块长度(字节数),发送数据,最终发送校验和。收方在收到发送方发过来校验和后与自己所累加校验和相比较,相同则回送一个“0”,表示正确传送并结束此次通信过程;若不相同则回送一个“F”,并使发送方重新发送数据,直到接收正确为止。,63/79,2.PC机发送文件子程序,首先介绍经过串口发送一个文件函数sendf()。要求欲发送这个文件存在当前盘上,而且为了便于说明问题,只传送总字节小于256个字符文件。,3、PC机接收文件子程序,接收函数receivef()采取查询方式从串口接收一个总字节数小于256个字符文件,接收文件也存于当前盘上。,64/79,PC机发送文件子函数sendf()流程图,PC机接收文件子函数receivef()流程图,65/79,PC机发送文件子函数sendf()程序清单,66/79,67/79,68/79,4、PC机主程序(函数),在有了上述发送和接收文件两个子函数之后,主函数编写就非常简单了。主函数工作只是在完成串口初始化后,依据键入命令来决定是发送文件还是接收文件。,PC机主函数以下:,69/79,PC机主函数流程图,70/79,这里采取是带参主函数main(int argc,char*argv)。其中,argc是一个整型变量,argv 是一个字符型指针数组。利用main函数参数能够使主程序从系统得到所需数据(也就是说带参函数可直接从DOS命令行中得到参数值,当然,这些值是字符串)。当程序运行时(在DOS下执行.EXE文件),能够依据输入命令行参数进行对应处理。,比如,执行程序mypro时,若要从当前盘上将名为f1.c文件从串口发送出去,需键入下述命令:,mypro s f1.c,其中,mypro是源文件mypro.c经编译连接后生成可执行文件 mypro.exe。,键入命令:,mypro r f2.c,能够从串口接收若干字符,并写入当前盘上名为f2.c文件中去。,71/79,二、89C51通信软件设计,1、单片机查询发送子程序,本程序将片外RAM从1000H开始小于256B数据从串行口发送出去,发送数据字节数在R7中,用R6作累加和存放器。,单片机查询发
展开阅读全文