《MCS_51单片机串行口及其应用(基于Proteus仿真).docx》由会员分享,可在线阅读,更多相关《MCS_51单片机串行口及其应用(基于Proteus仿真).docx(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、MCS-51单片机串行口及其应用基于Proteus仿真前言:本文详细介绍了MCS-51单片机串行口的工作原理、工作方式,并在后面通过两个例子(结合74LS164和74LS165芯片)来说明串行口的应用,所举例子包含proteus仿真电路图,源程序,程序注释详细清楚。这有助于更好地理解与掌握串行口。 1、计算机通信概念:计算机通信是指将计算机技术与通信技术相结合,完成计算机与外部设备或计算机与计算机之间的信息交换。可以分为两大类:并行通信与串行通信。在多微机系统以及现代测控系统中信息的交换多采用串行通信方式。2、并行通信:并行通信通常是将数据字节的各位用多条数据线同时进行传送。并行通信控制简单、
2、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。如下图所示:3、串行通信: 串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,每一位数据占据一个固定的时间长度。串行通信的特点是传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。串行通信又可以分同步通信和异步通信。如下图所示: 4、异步通信:异步通信是指通信的发送设备与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个
3、字符中的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍的关系,但同一字符内的各位之间的距离均为“位间隔”的整数倍。 异步通信的数据格式 :异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加23位用于起止位,各帧之间还有间隔,因此传输效率不高。5、同步通信:同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。发送方对接收方的同步可以通过如下两种方法实现。6、串行通信的三种数据传送方向:(1)单工:单工是指数据传输
4、仅能沿一个方向,不能实现反向传输。(2)半双工:半双工是指数据传输可以沿两个方向,但需要分时进行。(3)全双工:全双工是指数据可以同时进行双向传输。 7、信号的调制与解调:利用调制器把数字信号转换成模拟信号,然后送到通信线路上去,再由解调器把从通信线路上收到的模拟信号转换成数字信号。由于通信是双向的,调制器和解调器合并在一个装置中,这就是调制解调器(Modem)。8、比特率和波特率:比特率是每秒钟传输二进制代码的位数,单位是:位秒(bps,bits per second)。如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的比特率为:10位240个/
5、秒 = 2400 bps波特率是指每秒传输的符号数,若每个符号所含信息量为1比特(即一位二进制数码),则波特率等于比特率。在计算机通信中,常将比特率称为波特率,即1波特=1比特=1位/秒(1bit/s),例如2400bps=2400波特(baud)。9、MCS-51串行口结构:如下图所示,它主要由数据缓冲寄存器SBUF(serial buffer)、移位寄存器、控制寄存器TCON和波特率发生器等组成。其中,接收与发送缓冲寄存器SBUF占用同一个地址99H,虽然二者地址相同,但由于发送数据采用的是写指令,接收数据采用的是读指令,因此不会产生混淆。10、串行口控制寄存器SCONMCS-51单片机串
6、行通信方式的选择、接收和发送控制以及串行口的标志都由SCON特殊功能寄存器控制和指示。SCON可位寻址,其格式如下:SCON各位的含义:(1) SM0、SM1:串行口工作方式选择位,可选择四种工作方式,如下图所示.(2)SM2:多机通信控制位,主要用于方式2和方式3。当串行口工作于方式2和方式3时,作为发送端的主机设置SM2=1,并设置发送第9位数据TB8=1,以表明本帧数据为地址信息,用以寻找从机,以TB8=0作为数据帧标志。SM2=1时,如果接收到的一帧信息中的第9位数据为1,且原有的接收中断标志位RI=0,则硬件将RI置1;如果第9位数据为0,则RI不置1,且所接收的数据无效。SM2=0
7、时,只要接收到一帧信息,不管第9位数据是0还是1,硬件都置RI=1。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB80时不激活RI,收到的信息丢弃;RB81时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。在方式0时,SM2必须为0。在方式1时,若SM2=1,则只有接收到有效停止位时,RI才置1。RI由软件清零,SM2也由软件置位或清零。通过控制SM2,可以实现多机通信。(3)REN:允许接收标志位。由软件置位或清零,若R
8、EN=1,则允许串行口接收数据;REN=0,则禁止串行口接收数据。(4)TB8:是在方式2或方式3中,要发送的数据中的第9位,需要由软件写入1或者0。方式0和方式1中,该位不使用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位,TB8=0表明主机发送的是数据,TB8=1表明主机发送的是地址。(5)RB8:是在方式2或方式3中,接收到数据的第九位,由硬件将接收到的第9位数据存入RB8,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8接收到的是停止位,方式0不使用该位。(6)TI(Transmit Interrupt 发送中断):发送中断标志位。发送
9、数据前必须用软件清零,发送过程中TI保持低电平0,发送完一帧数据后,由硬件自动置1。如果再发送,必须由软件再次清零。(在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。)(7)RI(Receive Interrupt 接收中断):接收中断标志位。接收数据前必须用软件清零,接收过程中RI保持低电平0,接收完一帧数据后,由硬件自动置1. 如果再接收,必须由软件再次清零。(在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CP
10、U发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。)11、特殊功能寄存器PCON:PCON本是用于电源控制的特殊功能寄存器,可位寻址。PCON中只有最高位SMOD与串行口工作有关 : SMOD(PCON.7)为波特率倍增选择位。在串行口工作于方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。12、MCS-51串行口数据收发原理:发送数据时,要发送的数据通过内部累加器A送入发送缓冲器SBUF,在发送控制器控制下组成数据帧结构,并自动以串行方式从TXD(P3.1)输出,每发送完一帧数据,TI置位。通过中断或查询TI来了解数据
11、的发送情况。需要注意的是,TI只能用软件置位。采用C51通过串行口发送一个字符或一字节数据的函数如下:void send(unsigned char c)/发送字符cSBUF=c; /将字符c送入发送缓冲器SBUFwhile(TI=0); /等待发送结束TI=0; /发送结束,TI清零,为下次发送做准备CPU通过RXD(P3.0)接收数据,每接收完一帧数据,自动置位RI,通过中断或查询RI来了解数据的接收情况,然后将接收缓冲器SBUF中的数据读回。RI与TI一样,只能用软件置位。采用C51通过中断方式接收一个字符或一字节数据的函数如下:void receive()interrupt 4 /串行
12、口中断函数if(RI=1) /判断是否接收完一帧数据RI=0; /接收完,RI清零 c=SBUF; /从接收缓冲器SBUF读回数据给celse ; /未接收完则返回13、串行口波特率的设置在串行通信中,收发双方对发送或接收数据的速率(即波特率)要有约定。波特率的设置以及波特率的误差大小直接影响通信的质量。MCS-51单片机串行口波特率设置与串行口工作方式及定时/计数器工作方式密切相关,如下图所示:方式0和方式2的波特率是固定的。而方式1和方式3的波特率是可变的,使用定时/计数器T1作为波特率发生器,由于T1工作在方式2具有自动重装载功能,所以TI往往工作于方式2. T1工作在方式2时的溢出周期
13、(溢出周期其实就是T1的定时时间)为:T1溢出周期=(256 T1初值)(1/ fosc) 12则T1溢出率= 1T1溢出周期 = 1(256 - T1初值)(1/ fosc) 12方式0的波特率 = fosc/12方式2的波特率 =(2SMOD/64) fosc 方式1的波特率 =(2SMOD/32)(T1溢出率)方式3的波特率 =(2SMOD/32)(T1溢出率)其中fosc为系统晶振频率由上面的公式可知,波特率和T1的初值与晶振频率有关,如果晶振频率选择不当,可能会造成求取的TI初值为非整数,这样势必造成波特率误差,影响通信的可靠性和效果。在实际应用中,可以采用与PC机通信控制时钟(1.
14、8432MHZ)成整数倍的晶振作为单片机系统晶振。这样在计算装入T1的初值时,得到的恰好是整数值,不存在非整数误差问题,波特率也就比较精确和稳定了。例如,对于9600bit/s,可以选用11.0592MHZ(11.0592=61.8432)作为晶振频率,则可计算得到定时计数器T1的初值为FAH14、串行口的四种工作方式(1)方式0方式0时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。以8位数据为一帧,从低位开始发送和接收。每个机器周期发送或接收1位,波特率固定为fosc/12。方式0发送和
15、接收无起始位和停止位。发送过程从写SBUF寄存器开始,当8位数据传送完,TI被置位。如下图所示: 接收过程中,当8位数据接收完,RI被置位,此时可通过读取SBUF,将串行数据读入。如下图所示:方式0接收和发送电路 (2)方式1 方式1是10位数据为一帧的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如图所示。其中1位起始位(为0),8位数据位,1位停止位(为1)。 在方式1发送数据时,数据写入SBUF后,开始发送,此时由硬件加入起始位和停止位,构成一帧数据,由TXD串行输出。输出一帧数据后,TXD保持在高电平状态下,并将TI置位,通知CPU可以进行下一个字符或数据的
16、发送。如下图所示: 在方式1接收数据时,当控制寄存器SCON的接收允许位REN=1,且接收到起始位后,在移位脉冲的控制下,把接收到的数据移入接收缓冲器SBUF中,停止位到来后,把停止位送入控制寄存器SCON的RB8位中,并置位RI,通知CPU已接收完一个字符或数据。如下图所示:(3)方式2、方式3方式2和方式3都是11位数据的异步通信口,只不过二者的波特率设置方法不同。帧格式如下:方式2和方式3时起始位1位(为0),数据9位(含1位附加的第9位,发送时为SCON中的TB8,接收时为RB8),停止位1位(为1),一帧数据为11位。方式2的波特率固定为晶振频率的1/64或1/32,方式3的波特率由
17、定时器T1的溢出率决定。 发送数据前,先设置SCON中的TB8位,然后将要发送的数据写入SBUF即可启动发送。TB8被当作数据的第9位,自动叠加到数据帧的D8位上,这一位数据可以作为奇偶校验位使用。在多机通信系统中,该位也可以作为传送的是地址还是数据的特征标志位。 如下图所示:接收数据时,先设置接收允许标志位REN为1,使串行口处于允许接收状态。再 根据SM2和所接收到的RB8的状态,决定接收完数据后是否置位RI位。 当SM2=0时,不论RB8为0还是1,RI都置1,串行口接收数据。 当SM2=1,RB8=1时,表明是多机通信,所接收的数据是地址帧,RI置1,串行口接收发送来的地址信息。 当S
18、M2=1,RB8=0时,表明接收到的为数据帧,RI不置1,丢弃SBUF中所接收的数据帧。在多机通信系统中,只有与主机发送的地址相匹配的从机才进行数据的接收。如下图所示:15、MCS-51单片机串行口应用举例(一)本例在单片机串行口外接一片8位串入并出移位寄存器74LS164芯片,构成单片机输出接口电路,控制8只LED滚动显示。(1)74LS164芯片如右图所示,它是8位串入并出移位寄存器,串行输入数据,然后并行输出。各引脚功能如下:A、B(1、2引脚):数据输入端,数据通过这两个输入端之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。当其中任意一个为低电平,则禁止新数据输
19、入;当其中有一个为高电平,则另一个就允许输入数据。因此两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。Q0Q7(36,1013引脚):数据输出端CP(8号引脚):时钟输入端。CP每次由低变高时,数据右移一位,输入到 Q0, Q0 是两个数据输入端的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。MR:复位清除端,当MR为低电平时,其它所有输入端都无效,同时所有输出端均为低电平。GND(7号引脚,在proteus中已隐藏):接地端 VCC(14号引脚,在proteus中已隐藏):电源端,接+5V电源 74LS164 内部逻辑图(2)如下图所示,本例单片机串行口工作于方式0,
20、即移位寄存器输入/输出模式。串行数据通过RXD输出,TXD则用于输出移位时钟脉冲。数据输入端1接高电平,数据输入端2接单片机RXD引脚。时钟输入端接TXD引脚,复位端悬空。数据输出端通过限流电阻接8只LED灯。C程序如下:#include #include #define uint unsigned int#define uchar unsigned char void delay(uint x)uchar i;while(x-)for(i=0;i120;i+);void main()uchar c=0x80;SCON=0x00; /串行口工作在方式0while(1)c=_crol_(c,1)
21、;SBUF=c;while(TI=0); /等待发送结束TI=0; /发送结束,TI置0delay(400);Proteus仿真运行结果如下:16、MCS-51单片机串行口应用举例(二)本例在单片机串行口外接一片8位并入串出移位寄存器74LS165,连接移位寄存器并行输入端的是8位拨码开关,其开关动作对应的8位二进制序列将通过移位寄存器串行输入到单片机串口,并通过单片机P0端口的8只LED显示出来。(1)74LS165芯片如右图所示,74LS165是8位并入串出移位寄存器(使用移位寄存器芯片可以扩展一个或多个8位并行I/O口)。各引脚功能如下:SH/LD(shift/load 移位/置位):移
22、位与置位控制端。高电平时表示移位,低电平时表示置位。在开始移位之前,需要先从并行输入端口读入数据,这时应将SH/LD置0,并行口的8位数据将被置入74LS165内部的8个触发器,在SH/LD为1时,并行输入被封锁,移位操作开始。INH(clock inhibit 时钟抑制):时钟禁止端。当INH为低电平时,充许时钟输入。CLK(clock):时钟输入端D0D7:并行输入端SI(serial input 串行输入):串行输入端,用于扩展多个74LS165的首尾连接端。SO(serial output):串行输出端.QH:也是串行输出端,它与SO是反相的关系,即QH=SO.VCC(16引脚,在pr
23、oteus中被隐藏):已经默认接+5V电源端.GND(8引脚,在proteus中被隐藏):已经默认接地(2)如下图所示,本例单片机仍工作于串口模式0,即移位寄存器输入/输出模式。74LS165串行输出端SO连接单片机RXD引脚,CLK连接单片机TXD引脚,TXD仍负责发送移位时钟脉冲。C程序如下:#include #include #define uint unsigned int#define uchar unsigned char void delay(uint x)uchar i;while(x-)for(i=0;i120;i+);sbit SPL=P32;void main()SCON=0X10; /串行口工作在方式0,REN=1,允许串口接收while(1)SPL=0;/置数,读入并行输入口的8位数据SPL=1;/移位,并口输入被封锁,串行转换开始while(RI=0); /等待接收完一字节数据RI=0; /接收完成,RI置0P0=SBUF; /接收到的字节显示在P0端口,显示的值与拨码开关对应delay(20); Proteus仿真运行结果如下:17、上述Proteus仿真文件下载地址: 18、参考文献1彭伟.单片机C语言程序设计实训100例.北京:电子工业出版社.2009 2贾振国,许琳.智能化仪器仪表原理及应用.北京:中国水利水电出版社.2011