单片机串行口_第1页
单片机串行口_第2页
单片机串行口_第3页
单片机串行口_第4页
单片机串行口_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

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

文档简介

第7章AT89S51单片机的串行口王丽2016-2017(1)南航金城学院自动化系序号内容理论备注1第一章单片机概述22第二章单片机的硬件结构43第三章指令系统及汇编语言程序设计44第四章C51语言程序设计基础55第五章单片机中断系统56第六章单片机的定时/计数器57第七章单片机的串行口6※※8第八章单片机系统的并行口扩展29第九章单片机串行口扩展技术410第十章单片机的A/D和D/A转换器接口411第十一章单片机应用系统设计与调试4南航金城学院自动化系教学内容7.1串行通信的概念7.2串行口结构7.3串行口的通信工作方式7.4串行通信接口标准熟悉89S51串行接口的基本结构和工作原理熟练掌握串行接口控制寄存器SCON的含义和功能掌握串行口的4种工作方式及其波特率的计算熟练掌握双机通信的收发设计程序教学目标南航金城学院自动化系通信7.1串行通信的概念在实际工作中,CPU与外设之间常常要进行信息交换,所有信息交换被称为通信。通信方式:并行通信和串行通信;一、并行通信与串行通信

1、并行通信:多位数据同时传送,需要信号通道多控制简单,传输速度快,传输线较多,短距离传送7.1串行通信的概念一、并行通信与串行通信

2、串行通信:低速,需要信号通道少,长距离通信传输线少,可利用电话网,但传送控制复杂。

7.1串行通信的概念

单工:(或单工)配置:

数据只有一个方向传送;

广播、遥控、遥测、无线寻呼等属于单工通信。

7.1.1串行通信的传输方向串行通信的数据传输方式有三种:单工、半双工和全双工半双向(或半双工)配置:允许数据向两个方向中的任一方向传送,但每次只能有一个站点发送;例如,使用同一载波频率的对讲机、收发报机等都是半双工的通信方式。7.1.1串行通信的传输方向串行通信的数据传输方式有三种:单工、半双工和全双工7.1.1串行通信的传输方向串行通信的数据传输方式有三种:单工、半双工和全双工全双向(全双工)配置同一时间可以双向传送数据。等效于一对单向配置,它要求两端的通信设备都具有完整和独立的发送和接受能力。普通电话、手机都是最常用的全双工通信方式,计算机之间的高速数据通信也是这种方式。串行通信的过程及通信协议1、串←→并转换与设备同步要成功通信必须解决两个问题:(1)串←→并转换

将计算机内部的并行数据转换成串行数据,将其通过一根通信线传送;并将接收的串行数据再转换成并行数据送到计算机中。(2)设备同步进行串行通信的两台设备必须同步工作才能有效地检测通信线路上的信号变化,从而采样传送数据脉冲。设备同步对通信双方有两个共同要求:一是统一的编码方法;二是相同的传送速率。采用统一的编码方法确定了一个字符二进制表示值的位发送顺序和位串长度,还有统一的逻辑电平规定。通信双方只有产生相同的传送速率,才能确保设备同步,即双方采用频率相同的时钟。波特率(Baudrate)即数据传送速率,每秒钟传送二进制代码的位数,单位是b/s。波特率对于CPU与外界的通信是很重要的。计算方法:假设数据传送速率是120字符/s,而每个字符格式包含(1个起始位、1个终止位、8个数据位)。传送的波特率为:10b/字符×120字符/s=1200b/s异步通信的传送速率通常在50~19200b/s之间。2、串行通信协议通信协议是对数据传送方式的规定,包括数据格式定义和数据位定义等。通信双方必须遵守统一的通信协议。串行通信协议包括同步协议和异步协议两种。在此只讨论异步串行通信协议。收、发设备使用各自时钟。

异步通信:传送的数据可以是字符或一个字节数据,以帧的形式一帧一帧传送。通信速度低,逻辑结构简单。7.1.2异步通信的概念异步通信方式01停止位起始位低位高位7位数据位奇偶校验停止位第N个字符第N-1个字符以字符构成的帧为单位,字符间是异步的,字符内各位是同步的1、紧邻的2、有空闲位异步通信方式在帧格式中,一个字符由四个部分组成:起始位、数据位、奇偶校验位和停止位。起始为(0),然后是5~8位数据(规定低位在前,高位在后),然后奇偶校验位(可省略),最后停止位(1)。注:奇偶校验也可用这一位(1/0)确定所代表信息的性质(地址/数据等)。停止位收到停止位后,上一字符已传送完毕,同时,为接收下一个字符做好准备。帧起始位(0)信号只占用一位,用来通知接收设备一个待接收的字符开始到达。线路上在不传送字符时应保持为1。接收端不断检测线路的状态,若连续为1以后又测到一个0,就知道发来一个新字符,应马上准备接收。字符的起始位还被用作同步接收端的时钟,以保证以后的接收能正确进行。起始位后面紧接着是数据位,它可以是5位(D0--D4)、6位、7位或8位(D0--D7)。奇偶校验(D8)只占一位,但这一位也可省去。也可用这一位(1/0)来确定这一帧中的字符所代表信息的性质(地址/数据等)。停止位:表征一个字符结束,用高电平(逻辑1)。停止位可以是1位、1.5位或2位。收到停止位后,表示上一字符已传送完毕,同时,为接收下一个字符做好准备(等待再接收到0,就是新的字符的起始位)。若停止位以后不再紧接着传送下一个字符,则将线路电平保持为高电平(逻辑1)。二、异步通信与同步通信2、同步通信:发送方时钟与接收方时钟同步,既保持位同步,也保持字符同步。在数据开始传送前用同步字符来指示(常约定1~2个),并由时钟来实现发送端和接收端同步,即检测到规定的同步字符后,就连续按顺序传送数据,直到通信告一段落。同步传送时,字符与字符之间没有间隙,没有起始位和停止位,仅在数据块开始时用同步字符来指示同步。同步字符:单同步字符或双同步字符方式,然后就是连续的数据块。可以由用户约定,也可采用ASCII码中规定的SYNC代码,即16H。按同步方式通信时,先发送同步字符,接收方检测到同步字符后,即准备接收数据。发送方除了传送数据外,还要同时传送时钟信号:用来实现发送端与接收端之间的同步。以保证接收正确无误。同步传送可以提高传输速率(达56kb/s或更高),但硬件比较复杂。AT89S51串行口全双工的通用异步收发(UART),可同时双向传输。收、发双方使用各自的时钟控制发送和接收过程,这样可省去收、发双方的一条同步时钟信号线,连接简单且易实现。257.2串行口的结构有两个物理上独立的接收、发送缓冲器SBUF(属于特殊功能寄存器),可同时发送、接收数据。发送缓冲器只能写入不能读出接收缓冲器只能读出不能写入两个缓冲器共用一个特殊功能寄存器字节地址(99H)。两个控制寄存器:SCON和PCON。267.2串行口的结构在逻辑上,SBUF只有一个,它既表示发送寄存器,又表示接收寄存器,具有同一个单元地址99H。但在物理结构上,则有两个完全独立的SBUF,一个是发送缓冲寄存器SBUF,另一个是接收缓冲寄存器SBUF。如果CPU写SBUF,数据就会被送入发送寄存器准备发送;

MOVSBUF,A;//将CPU的数据写入发送缓冲器如果CPU读SBUF,则读入的数据一定来自接收缓冲器。即CPU对SBUF的读写,实际上是分别访问上述两个不同的寄存器。

MOVA,SBUF;//将接收缓冲器的数据读入CPU

串行数据缓冲器SBUFSBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器,以便能以全双工方式进行通信。此外,在接收寄存器之前还有移位寄存器,从而构成了串行接收的双缓冲结构,这样可以避免在数据接收过程中出现帧重叠错误。发送数据时,由于CPU是主动的,不会发生帧重叠错误,因此发送电路不需要双重缓冲结构。图7-3串行口结构示意图7.2串行口的结构接收器是双缓冲结构,在前一个字节被从接收缓冲器SBUF读出之前,第二个字节即开始被接收(串行输入至移位寄存器),但是,在第二个字节接收完毕而前一个字节CPU未读取时,会丢失前一个字节。什么情况使TI=1:当向SBUF发“写”命令时(执行“MOVSBUF,A”指令),即是向发送缓冲器SBUF装载并开始由TXD引脚向外发送一帧数据,发送完便使发送中断标志位TI=1。接收数据的条件:接收中断标志位RI(SCON.0)=0;允许接收位REN(SCON.4)=1。什么情况使RI=1:

接收完一帧数据进入移位寄存器,并装载到接收SBUF中。

注:发送缓冲器发送时CPU是主动的,不会产生重叠错误,不需要用双缓冲器结构来保持最大传送速率。

串行口的初始化编程:SCON和PCONSCON(98H):89C51串行通信的方式选择、接收和发送控制以及串行口的状态标志。7.2.1串行口控制寄存器SCON①SM0和SM1——串行口工作方式选择位。对应4种通信方式,其中,fosc是振荡频率。②SM2(SCON.5)——多机通信控制位,主要用于方式2和方式3。

允许多机通信,SM2=1

。当一片89C51(主机)与多片89C51(从机)通信时,所有从机的SM2位都置1。主机首先发送的一帧地址,即从机机号,其中第9位为1,所有的从机接收到数据后,将其中第9位装入RB8中。各个从机根据收到的第9位数据(RB8中)的值来决定从机可否再接收主机的信息。若(RB8)=0,说明是数据帧,则使接收中断标志位RI=0,信息丢失;若(RB8)=1,说明是地址帧,数据装入SBUF并置RI=1,中断所有从机,被寻址的目标从机清除SM2以接收主机发来的一帧数据。其他从机仍然保持SM2=1。

若SM2=0,单机通信,接收一帧数据后,置RI=1,将接收到的数据装入SBUF。根据SM2这个功能,可实现多个89C51应用系统的串行通信。在方式1时,若SM2=1,则只有接收到有效停止位时,RI才置1,以便接收下一帧数据。在方式0时,SM2必须是0。③REN允许接受控制位:由软件置1或清0,只有当REN=1时才允许接收,相当于串行接收的开关;若REN=0,则禁止接收。只有满足RI=0和REN=1(允许接收)的条件,一帧数据就装载入接收SBUF中。④TB8(SCON.3)——发送数据的第9位(D8)装入TB8中。在方式2或方式3中,根据发送数据的需要由软件置位或复位。在许多通信协议中可用作奇偶校验位,也可在多机通信中作为发送地址帧或数据帧的标志位。对于后者,TB8=1,说明该帧数据为地址;TB8=0,说明该帧数据为数据字节。在方式0或方式1中,该位未用。⑤RB8(SCON.2)——接收数据的第9位。在方式2或方式3中,接收到的第9位数据放在RB8位。它可以是奇/偶校验位,或是约定的地址/数据标识位。在方式2和方式3多机通信中,若SM2=1,如果RB8=1,说明收到的数据为地址帧。

方式1中,若SM2=0,RB8中存放的是已接收到的停止位。在方式0中,该位未用。⑥TI(SCON.1)——发送中断标志。发送完一帧数据被置1。TI置位意味着向CPU提供“发送缓冲器SBUF已空”的信息,CPU可以准备发送下一帧数据。在方式0串行发送第8位结束或其他方式串行发送到停止位时由硬件置1,可用软件查询。串行口发送中断被响应后,TI不会自动清0,必须由软件清0。⑦RI(SCON.0)——接收中断标志。接收完一帧有效数据后由硬件置1。表示一帧数据接收结束,并已装入接收SBUF中,要求CPU取走数据。RI也必须由软件清0,并准备接收下一帧数据。在方式0中,第8位数据发送结束时,由硬件置1;在其他三种方式中,当接收到停止位中间时由硬件置1。串行中断源只有1个,是RI还是TI呢??CPU事先不知道是发送中断TI还是接收中断RI产生的中断请求,所以,在全双工通信时,必须由软件来判别。复位时,SCON所有位均清0。7.2.2电源控制寄存器PCON7.3串行口的通信工作方式7.3.1工作方式01.工作原理串行口控制寄存器SCON中,SM0、SM1=00时,串行口工作于方式0,此时串行口作为同步移位寄存器使用;此工作方式并不是单片机之间的串行通信,而是用于单片机串行口外接移位寄存器,实现I/O口的扩展。串行数据通过引脚RXD输入或输出,而TXD引脚用于输出移位时钟,作为外接器件的同步信号。方式0的波特率是固定值,它与系统的振荡频率有关,以的速率进行数据的发送或接收。2.方式0的应用串行口的方式0,不适合两个单片机之间进行通信,但是可以通过外接移位寄存器的方法,进行单片机I/O端口的扩展。8位并入串出的移位寄存器,Q8为输出端,CLK为时钟脉冲输入端,P/S为操作控制端,当P/S=1时,锁存并行输入数据,P/S=0时,允许串行移位操作。AT89S51RXDTXDP1.0Q8CLKCD4014P/S并行输入图7-5CD4014用于扩展并行输入口[例7.1]单片机外接CD4014或74LS165均可以用于扩展并行输入口,在本例中采用CD4014芯片作为扩展芯片。采用查询方式。

//包含特殊功能寄存器库//定义P1.0//主函数

//定义变量i,将接收到的数据放到变量i中

//锁存并行输入数据

//允许串行移位操作//设定方式0,允许接收//等待接收完毕//清中断标志//保存并行输入数据例7.1C语言参考程序如下:#include<reg51.h>sbitP1.0=P1^0;voidmain(){unsignedchari;

P1.0=1;

P1.0=0;

SCON=0x10;

while(!RI);

RI=0;

i=SBUF;

……}AT89S51RXDTXDP1.0Q8CLKCD4014P/S并行输入CD4014用于扩展并行输入口例7.1汇编参考程序如下:ORG0000HLJMPKINORG0100HKIN:MOVSCON,#00HCLRESSETBP1.0CLRP1.0SETBRENJNBRI,$MOV40H,SBUFSJMP$END;上电后程序从00000H开始;转移到主程序;主程序从0100H开始;设定串行口为方式0;禁止串行中断;锁存并行输入数据;允许串行移位操作;允许并启动接收(TXD发送移位脉冲);等待接收完毕;保存并行输入;循环等待;汇编结束[例7.2]单片机外接CD4094或74LS164均可以用于扩展并行输出口,在本例中采用CD4094作为扩展芯片实现数据的并行输出。

AT89S51RXDTXDP1.0DATACLKCD4094STB并行输出图7-6CD4094用于扩展并行输出口CD40948位串入并出的同步移位寄存器;CLK为时钟脉冲输入端;STB=0时,允许从DATA端输入,8位并行输出端关闭;STB=1时,DATA输入端关闭,允许8位并行数据输出。C语言参考程序如下:#include<reg51.h>

#defineucharunsignedchar

sbitSTB=P1^0;

sbitCLK=P3^1;voidmain()

{uchardata1;

SCON=0x00;STB=1;

SBUF=data1;

while(TI==0);

TI=0;

STB=0;

CLK=0;CLK=1;while(1);

}

//包含头文件

//定义无符号字符类型的缩写

//位定义

//主程序

//声明变量,存放需送出的数据

//置4094于串行移位工作方式//置串行口于工作方式0//送出高八位数据//检查是否传送完毕//传完清除标志位,准备下一次数据传输//置4094于并行输出工作方式

//串行口数据发送完毕,P3.1上已停止同步移位脉冲//为使4094并行输出数据,软件产生一个脉冲上升沿//原地循环

例7.2汇编语言参考程序如下:ORG0000HLJMPOUTORG0100HOUT:SETBP1.0

MOVSCON,#00HMOVR0,#31HMOVSBUF,@R0JNBTI,$CLRTI CLRP1.0

CLRP3.1SETBP3.1;跳转至OUT程序段

;置4094于串行移位工作方式;置串行口于工作方式0;将31H单元的数写入SBUF,启动发送

;检测串行口发送数据是否完毕,未完等待;发送完毕后清TI标志;置4094于并行输出工作方式;数据发送完,停止同步移位脉冲;为使4094并行输出数据,软件产生一个脉冲上升沿

方式1:真正用于串行发送或接收,为10位通用异步接口。TXD与RXD分别用于发送与接收数据;帧格式:1位起始位、8位数据位(低位在前)、1位停止位,共10位;在接收时,停止位进入SCON的RB8,7.3.2工作方式11、工作原理方式1,波特率是可变的,以定时/计数器T1的溢出率作为波特率发生器,其关系式如下:方式1发送时,数据从引脚TXD(P3.1)端输出。当执行写入发送SBUF的命令时,启动了发送器。发送移位时钟由定时器T1送来的溢出信号经过16分频或32分频而得到的,方式1的波特率TX是可变的。方式1和接收时序

方式1接收时,数据从引脚RXD(P3.0)端输入。接收的先决条件:REN位置1并检测到起始位(RXD上检测到1→0的跳变)而开始的。当一帧数据接收完毕后,还需判断是否满足以下条件,这次接受才真正有效:①RI=0。表示上一帧数据已被取走。②SM2=0或收到的停止位为1(方式1时,停止位进入RB8)。满足以上条件则将接收到的数据装入串行口的SBUF并置位RI;如果不满足,则该帧信息将会丢失。

值得注意的是,在整个接收过程中,REN=1是一个先决条件。只有当REN=1时,才能对RXD进行检测。串行通信的编程有两种方式:查询方式和中断方式。都要注意清除标志位TI和RI。2.应用实例例7.3]设甲乙两个单片机系统以串行工作方式1进行数据传送,11.0592MHz,波特率为1200b/s。甲机发送的16个字节数据存在片内RAM40H~4FH单元中,乙机接收后存在片内RAM50H为首的地址区域中。解:串行工作方式1的波特率取决于定时器T1的溢出率(设SMOD=0),T1工作在方式2,则T1的计数初值X:X=采用查询方式进行通信时,发送和接收子程序流程图:甲机发送程序:#include<reg51.h>#defineucharunsignedcharucharidatabuf[16];uchari;voidmain(){TMOD=0x20;TL1=0xE8;TH1=0xE8;

PCON=0x00;SCON=0x40;TR1=1;for(i=0;i<16;i++){SBUF=buf[i];while(TI==0);TI=0;}}//包含特殊功能寄存器库//定义uchar为无符号字符数据类型//定义数组,将发送的16个数据存放在buf数组//定义变量i,作为16个数据循环发送的次数记录//置T1定时器工作方式2

//置T1计数初值//置SMOD=0//工作在方式1,不允许接收//T1启动计数//循环发送16个数据//发送数据//等待发送完毕//发送完后清中断标志甲机发送程序:ORG0000HLJMPTXDAORG0100HTXDA:

MOVTMOD,#20H MOVTL1,#0E8H MOVTH1,#0E8H CLRET1 SETBTR1 MOVSCON,#40H MOVPCON,#00H CLRES

MOVR0,#40H MOVR2,#16 TRSA:MOV A,@R0 MOV SBUF,A

JNB TI,$ CLR TIINC R0 DJNZ R2,TRSA SJMP$;上电后程序从00000H开始;转移到主程序;主程序从0100H开始

;置T1定时器工作方式2

;置T1计数初值.

;置T1计数重装值 ;禁止T1中断 ;T1启动

;置串行方式1,禁止接收

;置SMOD=0(SMOD不能位操作)

;禁止串行中断

;置发送数据区首地址

;置发送数据长度

;读一个数据

;发送 ;等待一帧数据发送完毕 ;清发送中断标志;指向下一字节单元 ;判16个数据发完否?未完继续;循环等待乙机接收程序如下:

#include<reg51.h>#defineucharunsignedcharuchari;voidmain(){unsignedchar*P;P=0x50;

TMOD=0x20;

TL1=0xE8;TH1=0xE8;

PCON=0x00;SCON=0x50;TR1=1;for(i=0;i<16;i++)

{while(RI==0);RI=0;*P=SBUF;P++;}}//包含特殊功能寄存器库//定义uchar为无符号字符数据类型//定义变量i,作为接收16个数据的次数记录。//主函数//定义指针变量并赋初值//置T1定时器工作方式2//置T1计数初值//置SMOD=0//工作在方式1,允许接收//T1启动计数

//循环体(连续接收16个数据)//等待接收数据//接收完一个字节的数据后清中断标志//接收数据,送指定单元//单元地址加1,准备存放下一个数据乙机接收程序:ORG0000HLJMPRXDBORG0100HRXDB:MOVTMOD,#20H MOVTL1,#0E8H MOVTH1,#0E8H CLRET1 SETBTR1 MOVSCON,#40H MOVPCON,#00H CLRES MOVR0,#50H MOVR2,#16 SETBREN RDSB:JNB RI,$ CLR RI MOV A,SBUF MOV @R0,A INC R0 DJNZ R2,RDSB SJMP$;在0000H单元存放转移指令

;转移到主程序;主程序从0100H开始

;置T1定时器工作方式2;置T1计数初值;置T1计数重装值

;禁止T1中断

;T1启动;置串行方式1,禁止接收;置SMOD=0(SMOD不能位操作);禁止串行中断

;置接收数据区首地址

;置接收数据长度;启动接收;等待一帧数据接收完毕;清接收中断标志;读接收数据;存接收数据;指向下一数据存储单元;判16个数据接收完否?未完继续

;循环等待全双工应用实例利用AT89S51单片机的串行口,设计一个工作方式1的全双工收发程序,并将接收到的数据借助P1口进行LED显示。假设晶振频率为11.0592MHz,SMOD=0,波特率为2400b/s。双方均采用中断方式进行通信。解:串行工作方式1的波特率取决于T1的溢出率,T1工作于方式2,当SMOD=0时,则T1的计数初值X:X=F4H,(TH1)=(TL1)=F4H要求:发送器来说,发送1帧数据后,接收回执信息0,并用P1显示;接收器,接收1帧数据并存储后,向甲方发送一个回执信号0;C语言参考程序如下:发送方源程序://初始化串行口voidcsh(){SM0=0;SM1=1;REN=1;TI=0;RI=0;PCON=0;TH1=0xF4;TL1=0XF4;

TMOD=0X20;

EA=1;ES=1;TR1=1;}voidmain() { charc=data; csh();

while(1)

{ TI=0;

SBUF=c;

while(!TI);

TI=0;

}

}voidintrr()interrupt4

{ chartemp; temp=SBUF; P1=temp;

RI=0;EA=0;

}

//置串行方式1//允许接收

//设置SMOD=0

//设置TH1、TL1初值

//设置T1工作方式

//开中断

//开定时器T1,产生波特率

//定义待发送的数据data

//调用初始化函数

//发送一组数据

//等待发送结束

//显示接收到的回执信号

//关中断

接收方源程序://初始化串行口voidcsh(){SM0=0;SM1=1;REN=1;TI=0;RI=0;PCON=0;TH1=0xF4;TL1=0XF4;TMOD=0X20;EA=1;ES=1;TR1=1;}//设置工作方式1//允许接收

//设置SMOD=0

//T1设置初值

//T1设置工作方式//开中断//开启定时器T1//串行口和T1初始化//等待串行口接收中断

//串行口接收中断函数

//保存接收到数据

//显示串行口接收到的数据

//发送和接收标志清0

//向甲方发送一个回执信号0//关中断voidmain() { csh();

while(1);

}voidintrr()interrupt4

{ chartemp; temp=SBUF;

P1=temp;

RI=0; TI=0;

SBUF=0;

while(!TI); TI=0; EA=0;

}全双工源程序://初始化串行口voidcsh(){SM0=0;SM1=1;REN=1;TI=0;RI=0;PCON=0;TH1=0xF4;TL1=0XF4;TMOD=0X20;TR1=1;EA=1;ES=1;}

//设置工作方式1//允许接收

//设置SMOD=0

//T1设置初值

//T1设置工作方式//开中断//开启定时器T1//串行口和T1初始化

//等待串行口接收中断

//串行口接收中断函数

//接收中断,并清0

//保存接收到的数据

//进行LED显示

//发送标志清0

//发送下一帧数据voidmain() {

csh();

chardata*c

;chardata*temp;

while(1);

}voidintrr()interrupt4

{while(!TI){RI=0;

char*temp;temp++;

*temp=SBUF;

P1=temp;

}{

TI=0;c++;SBUF=*C;}

}中断方式,另外甲机发送片内RAM一组数据,并将接收数据存入片内ram内7.3.3方式2方式2和方式3,9位异步通信接口。每帧数据为11位,1位起始位0,8位数据位(先低位),1位可程控为1或0的第9位数据和1位停止位.

62方式2波特率

=

fosc1)方式2发送发送前,先根据通信协议由软件设置TB8(如奇偶校验位或多机通信的地址/数据标志位),然后将要发送的数据写入SBUF,即启动发送。TB8自动装入第9位数据位,逐一发送。发送完毕,使TI位置“1”。632)方式2接收SM0、SM1=10,且REN

=

1时,以方式2接收数据。数据由RXD端输入,接收11位信息。当位检测逻辑采样到RXD的负跳变,便开始接收一帧信息。接收第9位数据后,需满足以下两个条件,才将接收到的数据送入SBUF,且RI置“1”。

。(1)RI

=

0,意味着接收缓冲器为空。(2)SM2

=

0或接收到的第9位数据位RB8

=

1。若不满足这两个条件,接收的信息将被丢弃。2.应用实例:方式2实现双机通信,带有奇偶校验和应答功能[例7.5]设计一个串行方式2收发程序,设SMOD=1,波特率固定为。甲机:发送片内RAM50H~5FH中的数据,第9位数据作为奇偶校验位,采用偶校验方式,接到接收方核对正确的回复信号(用00H表示)后,再发送下一字节数据,否则重发该字节。乙机:接收到的数据存在首址为40H的片内RAM中,并核对奇偶校验位。核对正确,发出回复信号00H;发现错误,发出回复信号FFH,并等待重新接收。C语言参考程序:甲机发送:#include<reg51.h>#defineucharunsignedcharucharidatabuf[16];uchardat;uchari; 。sbitp=PSW^0;

//包含特殊功能寄存器库

//定义uchar为无符号字符数据类型

//设发送的16个数据放在buf数组中

//定义变量dat作为要发送数据的缓存

//定义变量i作为循环此时的计数。//定义PSW^0位变量C语言参考程序:甲机发送:voidmain(void){ PCON=0x80; SCON=0x90;

i=0; while(1)

{if(i==16)

{break;

} dat=buf[i];

ACC=dat;

TB8=p;

SBUF=dat;

while(TI==0);

TI=0;

while(RI==0);

RI=0;

if(SBUF==0x00)

{

i++;

} }}//主函数

//置SMOD=1//串行口工作在方式2,允许接收

//循环体

//发送完毕

//取要发送的数据

//将所发数据送累加器A,为得到奇偶位

//奇偶位作为第9位输出//发送数据

//等待发送完毕

//发送完后清中断标志

//等待乙机应答

//收到后清中断标志

//对方接收正确继续发送下一字节,否则重新发送该字节乙机接收:#include<reg51.h>#defineucharunsignedcharucharidatabuf[16];uchar*pbuf=(uchar*)0x40;uchari;sbitp=PSW^0;voidmain(void){

PCON=0x80; SCON=0x90;

i=0; while(1)

{

if(i==16){break;} while(RI==0);

RI=0; *pbuf=SBUF;

ACC=*pbuf; if(p==RB8){

SBUF=0x00; pbuf++;

i++; }else{

SBUF=0xff;}

while(TI==0);

TI=0; }}

//包含特殊功能寄存器库

//定义uchar为无符号字符数据类型

//定义数组,存放接收的16个数据

//定义指针变量并赋初值//定义变量//定义PSW^0位变量//主函数//置SMOD=1//串行口工作在方式2,允许接收

//无限循环体

//接收完成退出循环

//等待接收数据//接收完一个字节的数据后清中断标志//接收数据存到指定的单元//将接收的数据赋给累加器A

//比较奇偶位

//校验奇偶相同则发"00"

//存放单元的地址加1,准备存放下一个数据

//出错发"ff"

//等待发送完毕//收到后清中断标志,跳出循环,重新接收

7.3.4工作方式3串行口控制寄存器SCON中,SM0、SM1=11时,串行口工作于方式3,为波特率可变的9位异步通信方式,除了波特率外,方式3和方式2相同。工作方式3的波特率是可变的,可根据需要定时器的设置得到不同的波特率,设置方法与方式1相同。鉴于方式3的使用和方式2基本一样(波特率不同),所以方式3的应用编程,可参照方式2编程;波特率设计部分参照方式1;(2)串行口方式3编程时与方式2的不同点:

在使用串行口方式3时需在主程序中对定时器T1的模式、初值进行设置,并要启动定时器1。如:MOVTMOD,#20HMOVTH1,#0F4HMOVTL1,#0F4HSETBTR1注意:在串行口通信中,采用定时器T2产生波特率时,定时器T2不需开中断。方式3实现双机通信,带有奇偶校验和应答功能[例7.6]设计一个串行方式3收发程序,采用偶校验公式,波特率设置为2400b/s,晶振频率为11.0592MHZ,要求:设SMOD=0。甲机:发送片内RAM40H~4FH中的数据,第9位数据作为奇偶校验位,采用偶校验方式,接收核对正确的回复信号(用00H表示)后,继续发送下一帧数据;错误应答为FFH,则重新发送原数据。乙机:接收甲机,接收数据存在首址为40H的片内RAM中,并核对奇偶校验位。核对正确,发出回复信号00H;发现错误,发出回复信号FFH,并等待重新接收。解:串行口工作方式3的波特率取决于定时器T1的溢出率,设T1工作于方式3,当SMOD=0时,则T1的计数初值X:X=244=F4H。甲机发送:#include<reg51.h>//包含特殊功能寄存器库#defineucharunsignedchar/*定义uchar为无符号字符数据类型*/uchardat;//定义变量dat作为要发送数据的缓存/器sbitp=PSW^0;//定义PSW^0位变量#defineBUFFER_BASE0x40uchar*buf=(uchar*)0x40;ucharack=0;//定义应答信号//初始化串行口voidcsh(){ SM0=1; SM1=1;//设置串行口工作方式3 REN=1;//允许接收

TI=0; RI=0; PCON=0;//设置SMOD=0 TH1=0xF4; TL1=0XF4;//设置TH1、TL1初值

TMOD=0X20;//设置T1工作方式

EA=1; ES=1;//开中断

TR1=1;//开定时器T1,产生波特率}voidmain(void)//主函数{ csh();//调用初始化函数,对T1和串行口进行初始化 dat=buf[0];//取要发送的数据ACC=dat;//将所发数据送累加器A,得到奇偶校验位 TB8=p;//奇偶位作为第9位 SBUF=dat;//发送数据 while(1);//等待中断}/*甲机的发送中断程序*/voidintrr()interrupt4//串行口中断函数{

if(TI==1)

{

TI=0;

return;}else//接收应答信号并判断{RI=0;

ack=SBUF; if(ack==0x00)//应答信号正确则继续发送新数据

{buf++; ACC=*buf; TB8=p;//取校验位 SBUF=*buf;//收到"00"则发送下一个数据 if(buf-BUFFER_BASE==16)

{ ES=0;//禁止串行口中断 return;}

}

else{SBUF=*buf;//收到"FF"则再次发送原有数据

}

}}乙机接收:#include<reg51.h>//包含特殊功能寄存器库#defineucharunsignedchar//定义uchar为无符号字符数据类型uchar*pbuf=(uchar*)0x40;uchardat;//定义变量dat作为要接收数据的缓存器sbitp=PSW^0;//定义PSW^0位变量ucharack=0;//定义应答信号//初始化串行口voidcsh(){

温馨提示

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

评论

0/150

提交评论