资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,电子工业出版社所有,*,单片机技术基础教程与实践,第6章 51单片机串行通信,6.1 异步串行通信,6.1.1 异步串行通信介绍,串行通信就是同一时刻只传送一位信息,当一位发送之后,经过一段时间延迟,再发送下一位的通信。图示为两台单片机串行通信示意图,其中UART是通用异步通信收发器,TX表示发射端,RX表示接收端。,1.异步通信数据格式,异步是指通信中的发送方与接收方不使用同一个时钟源,收发双方各使用自己的时钟源来控制发送的速率和接收数据的时刻,为了保证时钟不一致导致的数据接收错误,在通信过程中必须约定两点:,(1)约定通信双方的通信速率和字符总长度。,(2)发送方应该发送接收方需要的起始位,以使接收方进行接收定位与再同步。,在异步通信中,需要有双方认可的通信格式,一般由4部分组成:起始位、n位数据、奇偶校验位和停止位,这样一组信息称为一帧。,起始位:起始位通常是逻辑0,占用一位时间,表示一个新字符通信的开始。在不通信时,线路呈现逻辑1,接收方不断检测逻辑0,若是在多个逻辑1后,出现一位0,则表示一个新字符发过来,就准备接收数据,使接收方的时钟与起始位同步,顺利接收随后的数据。,n位数据:起始位后紧跟的就是数据,数据位数可以是5、6、7、8、9位,通常采用8位、9位为多,通常是低位在前,就是紧跟起始位的是最低位(LSB)。,奇偶校验位:占一位,并不是必须的,常改作他用,传递一些特定信息。,停止位:表示完成了一个字符的传输,用逻辑1表示。可以是1位或是2位,但通常采用1位。,波特率(Band rate):波特率是单位时间内在串行通信中传送的比特数,定义为:,波特率=1/位时间,带宽的概念:带宽=(每帧包含的信息位数/每帧包含的位数)*波特率,下图中上侧为8位数据位格式,下侧为9位数据位格式,数据位中的最后一位与奇偶校验位共用。,2.异步通信传送方式,(1)单工传送,单工通信示意图如图所示。一方只发送,另一方只接收。只需要一条通信通道。,(2)半双工传送,半双工通信允许信息在两个方向上传输,但需要分时发送与接收,就是在某时刻,只能单工通信。只需要一条通信通道。,图中RTS信号是发送控制信号,74125是三态缓冲器,通常情况下,RTS为高电平,通信双方都处于高阻状态;若是某一方需要发送,则使RTS为低电平,使74125输出通信数据。,(3)全双工通信,在某时刻,通信中的每一方既可以发送也可以接收,就是在发送的同时,也可以接收。这需要发送与接收两条通信通道。例如RS232C通信。,4.组网方式,(1)点对点通信,点对点通信方式是一对一的双机通信方式:,1)参加通信的节点只有两个,一个节点为主控器,另一个为被控器。,2)通信线路为两个节点专用。,3)不存在寻址问题。,4)没有争夺线路控制权问题。,(2)一点对多点的通信,一点对多点的通信,是一点主控器(主机),其他点为被控器(从机)。,1)参与通信的节点多于两个。,2)通信线路为多点拥有,但不是同时使用。,3)一个节点为主控器,其他节点为被控器。,4)主控器需要首先通过广播发送被控器地址,才能与被控器通信。,5)被控器需具有地址检测功能。,6)主控器控制通信线路,享有通信线路的使用权。,7)一般只能主控器与一个被控器之间通信,而被控器之间不能通信。,(3)多主机通信,多主机通信中具有多个主控器(主机),其特点如下。,1)参与通信的节点有多个。,2)通信线路为多点拥有,但不是同时使用。,3)有多个节点为主控器(主机)。,4)占据通信线路的节点,就是主控器,不占有通信线路的节点则为被控器。某一时刻只能有一个主控器(主机)占用通信线路与被控器通信,5)主控器需要首先通过广播发送被控器地址,才能与被控器通信,6)被控器需具有地址检测功能。,7)具有争夺线路控制权问题,主控器需要有解决总线仲裁问题的功能。,5.串行通信模块,很多单片机具有串行通信模块(SCI),又称为通用异步收发器(UART)。串行通信模块的示意图如图所示。,(1)波特率发生器,波特率发生器通过对系统时钟进行分数分频,输出串行通信需要的波特率。由于系统时钟与波特率之间不是整数分频关系,因此很难分频出没有误差的波特率,通常低时钟频率误差大,高时钟频率误差小。,如果单片机时钟fosc=4MHz,设分频器分频比为16,则fclk=fosc/16=250000,如果波特率为9600,则波特率预置数X为,实际误差为 (9615.389600)/9600=0.16%,(2)异步模式传送,异步模式传送模块如下所示。,1)模块有发送数据引脚TXD。,2)10位或11位的移位寄存器。,3)发送缓冲寄存器TXBUF。,4)模式控制位M=0时,发送8位数据,M=1时发送9位数据。,5)在9位数据模式(模式位M=1)时,有写发送缓冲器TXBUF的T8位功能。,当8位新数据装载到发送缓冲寄存器TXBUF中,就会被拷贝到移位寄存器中,接着加入开始位、停止位和T8(M=1),然后帧以波特率发生器发生的波特率移出一位。(注意,只有移位寄存器为空时,才能向发送缓冲寄存器中写入数据。,图中向下的箭头表示移位寄存器的移位时间,模式位M=0时发送8位数据,M=1时发送9位数据。,控制发送硬件的实际时钟TXCLK是波特率的16倍,则每隔16个脉冲,使移位寄存器移位一次,如图所示。发送过程(硬件自动完成)如下:,1)使引脚TXD=0,/发送启动位,2)等待16个脉冲,3)使位计数器n=0 /设置位计数器,4)使引脚TXD=Bn /发送数据位(最低位),5)等待16个脉冲。,6)使位计数器n=n+1。,7)如果位计数器n7,转移到第4步,发送下一位。,8)若M=1,则发送9位数据,使引脚TXD=T8。,9)等待16个脉冲。,10)使引脚TXD=1 发送停止位。,11)等待16个脉冲。,(2)异步模式接收,异步模式接收示意图如图所示。,1)模块有接收数据的引脚RXD。,2)10位或11位的移位寄存器。,3)只读的接收缓冲寄存器RXBUF。,4)在9位数据模式时(M=1),一帧接收完毕后,读R8数据位功能。,在线路空闲情况下,接收器等待起始位(由1跳变为0的信号沿),接着每次从RXD引脚移入一位到10位或是11位数据,然后去掉开始位和停止位,将8位数据装入接收寄存器RXBUF,将第9位数据放入R8(若M=1)后设置读数据标志。如果移位寄存器完成移位后,接收缓冲寄存器RXBUF已经有数据,则移位寄存器将等到接收缓冲寄存器内容被取走时,才将数据传送到接收缓冲寄存器。如果移位寄存器中有一帧数据,接收缓冲寄存器中也有一帧,若是RXD引脚再来一帧,则溢出标志将被置位。,接收帧过程中的开始位时序。,图中S指示接收器检测到起始位的时刻,R指示当接收移位寄存器移位的时刻,在R时刻,引脚RXD上的逻辑电平将被移位到移位寄存器。在时刻R之前和R之后RXD引脚上的信号必须保证有效,为此接收器在检测到起始位的1向0跳变后,延迟半个位时间,因此需要比波特率快的时钟RXCLK,在此用快于波特率16倍的时钟实现,就是用延迟8个RXCLK时钟的方法达到延迟半位的目的。,6.1.2 RS232接口,RS-232C是美国电子工业协会(EIA)确定的接口标准,RS的英文是“推荐标准”的意思,232是标识号,C为修改次数,现在RS-232C接口在PC机上是标准配置。,该接口实际上只需要3根线(TX、RX和地线)就可以进行双工通信,通常都是使用封装为DB9的9芯接口。,RS-232C规定的数据传输速率波特率为50、75、100、150、300、600、1200、2400、4800、9600、19200、38400、43000、56000、576000、115200b/s,驱动器允许有2500pF的电容负载。,引脚号,信号名称,方向,信号功能,1,DCD,向RS-232C输入,外部送来的检测到载波信号,2,RXD,向RS-232C输入,接收数据,3,TXD,从RS-232C输出,发送数据,4,DTR,从RS-232C输出,数据准备就绪,外部设备可以传输,5,GND,6,DSR,向RS-232C输入,外部设备准备就绪信号,7,RTS,从RS-232C输出,请求外部设备发送数据信号,8,CTS,向RS-232C输入,外部设备送来的请求发送信号,9,RI,向RS-232C输入,外部设备送来的检测到电话的信号(振铃信号),参数,技术指标,输出阻抗,300,输出短路电流,500mA,转换速率,30V/s,最大负载电容,+3V,逻辑1时输出逻辑电平(带37k负载时),155V,逻辑1时输入逻辑电平,4;/将高4位右移4位,ns /取低4位。ns是接收到数据的高4位,P0=tableng;/将低4位送P0口,用数码管显示低4位,P1=tablens;/将高4位送P1口,用数码管显示高4位,else TI=0;/清除发送标志,右图显示的是串口助手软件与例题6-1程序通信的情况,串口助手发送55H,51单片机收到后,向串口助手转发55H,串口助手收到并显示在接收区中。,例题6-2 51单片机与PC机串口通信2。,单片机P2口接8只LED灯,P3.2P3.3引脚连接有K1和K2共2个按键,使用单片机串行口与PC机通信。,1)由PC机控制单片机的P2口,将PC机送出的数以二进制形式显示在LED灯上;,2)按下按键K1向PC机发送数字0 x55,按下K2向PC机发送数字0 xAA。,源程序如下:,#define uchar unsigned char,#include string.h,#include reg51.h,unsigned char code table=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90,0 x08,0 x03,0 x46,0 x21,0 x06,0 x0e;/十六进制-7段译码表,void mDelay(unsigned int DelayTime)/延时函数,unsigned char j=0;,for(;DelayTime0;DelayTime-)/延时循环,for(j=0;j4;/将高4位右移4位,ns /取接收数据高4位,P0=tableng;/P0口连接的数码管显示低4位,P1=tablens;/P1口连接的数码管显示高4位,6.4 SPI总线通信,6.4.1 SPI总线介绍,下图所示的SPI总线是摩托罗拉公司首先推出的一种同步串行传送规范的总线,是单片机外设芯片的串行扩展接口。该公司的HC08系列单片机和HC11系列单片机都配备了SPI专用模块,现在很多公司的单片机芯片与外设芯片都具有SPI接口。,1.SPI总线中的信号线,SPI接口可用全双工方式同时发送与接收8位数据,共使用4条线:,(1)主器件输入/从器件输出线(MISO,master in slave out),在主器件侧为输入线,在从器件侧为输出线,就是从器件向主器件传送数据,传输中首先送高位,后送低位。,(2)主器件输出/从器件输入(MOSI,master out slave in),在主器件侧为输出,在从器件侧为输入,先传高位,再传低位。,(3)同步时钟线(SCK,serial clock),在主器件侧为输出线,在从器件侧为输入线,用于主从器件传送数据时的同步脉冲,就是主器件与从器件必须有相同的时序,发送数据是在SCK的一个边沿,接收数据在SCK的另外一个边沿,例如,在时钟的下降沿主器件输出有效数据,而在时钟SCK的上升沿,从器件接收数据。,(4)从机方式选择线(SS,slave select),从器件具有输入选择线SS,当SS为低电平时,从器件接收或是发送数据。,一般情况下主器件是单片机,而从器件可以是单片机或是其他具有SPI接口的芯片。,2.SPI工作原理,SPI主要包含3部分:移位寄存器、发送缓冲器和接收缓冲器,发送缓冲器与接收缓冲器与总线相连,可以从总线接收数据和向总线接收数据。有时发送缓冲与接收缓冲是同一个缓冲器。如图6-18所示。,主机向从机发送数据的半双工通信过程:,(1)主机将欲发送的数据写入主机缓冲器SPIDAT,数据被自动写入移位寄存器,并开始发送操作(MOSI),(2)主机启动发送过程,送出时钟信号,有效数据从主机的移位寄存器移到从机的移位寄存器,同时,从机移位寄存器中的无效内容,也被移到主机的移位寄存器中。,(3)8个时钟脉冲后,时钟停止,主机移位寄存器的内容全部移到从机移位寄存器中,随后,从机移位寄存器的内容自动移到从机缓冲器SPIDAT中,并设置从机中断标志位等待取走。当然,主机移位寄存器的内容也被自动送到主机缓冲器SPIDAT中,也设置主机中断标志位等待取走,由于是无效数据,程序不取走就可以了。,(4)从机取走从机缓冲器SPIDAT中的内容,主机读从机数据的半双工通信过程:,(1)在第一个SCK时钟沿之前,从机已经将数据写入从机发送缓冲的情况。,这种情况需要主机向从机发送SS信号,从SS的下降沿开始,从机将数据写入发送缓冲器,并在第一个SCK时钟沿,主机接收从机数据;当8位数据发送完毕后,主机将从机SS置1,发送下个字节时,主机再使从机SS=0,使SS出现下降沿。,6.4.2 51单片机实现SPI总线输出数据,51单片机工作在串口模式0,向串入并出移位寄存器74164发送数据,特点是只用P3_0(RXD)引脚和P3_1(TXD)引脚两根线,就可以输出数据。,图中的76LS164是串入并出移位寄存器,该芯片的引脚9(clr)是清零端,低电平有效,可以将8位输出都清除为0,不需要清零功能时接高电平;引脚1(A)和引脚2(B)是串行信号输入端,两者之间的关系是“与”关系;引脚8(CLK),是同步脉冲输入端;在同步脉冲的上升沿,输入端A&B端的信号被移位到芯片的低位,并随着时钟CLK的上升沿不断到来,数据从芯片的低位向高位移动,经过8个上升沿,将外部的8个数据移动到芯片中。若是再有时钟脉冲,数据将从最高位引脚13移出,因此可以多个74164串连,就是所有的74164采用同一时钟,数据从前一个74LS164的高位引脚(13)输出到下一级74LS164的输入端A&B(引脚1和2)。,单片机工作在串行模式0(同步模式),就是TXD(引脚11)输出CLK,RXD(引脚10)输出数据。CLK时钟频率(波特率)为:石英晶体频率/12,例如石英晶体频率为12MHz,则CLK时钟频率为12MHz/12=1MHz。,例题6-3 串行输出数据(查询方式),该例采用查询方式向74LS164送两位串行数据(09数字),并显示在74LS164上连接的共阳数码管上。,该例中:,n是循环变量,同时也是向74LS164发送的数据。,k是延时循环变量。,P3_0连接到74LS164的时钟端CLK。,P3_1连接到74LS164的数据输入A和B端。,程序中table是共阳数码管的09数字的段码编码。,#include AT89X51.h,unsigned int code table=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90;/共阳数码管数据,void main(),unsigned int n,k;,SCON=0;/设置串行口,工作在方式0,EA=0;/禁止中断,采用查询方式发送,,while(1),for(n=0;n2;n+)/发送两位数据,TI=0;/清发送完毕标志位,SBUF=tablen;/发送n的七段译码,while(!TI);/等待发送完毕,for(k=0;k20000;k+);/延时后再次发送下一个数,for(k=0;k+0.2V,1,0,0,0;DelayTime-),for(j=0;j0;i-)/循环延时,for(j=248;j0;j-);,for(i=220;i0;i-)for(j=248;j0;j-);,P2_7=1;/将485芯片处于发送状态,SBUF=uart_data;/将接收的数据发送回主机,while(1),if(TI)/等待发送完毕,TI=0;break;,P2_7=0;/使485芯片处于接收状态,(3)主机采用中断方式接收,则源程序如下:,#define uchar unsigned char,#include AT89X51.H,unsigned char code table=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90,0 x08,0 x03,0 x46,0 x21,0 x06,0 x0e;,void SendData(uchar Dat)/发送函数,SBUF=Dat;,while(1),if(TI),TI=0;break;,void mDelay(unsigned int DelayTime)/延时函数,unsigned char j=0;,for(;DelayTime0;DelayTime-),for(j=0;j125;j+);,unsigned char uart_data,nn;,unsigned char ns,ng,temp;,void main()/主函数,P2=0 xff;/关闭P2口接的所有LED灯,TMOD=TMOD|0 x20;/定时器1,工作在模式2,TH1=0 xFD;,SCON=0 x50;/串口工作方式1,TR1=1;/启动定时器1,ES=1;/使能串口中断,EA=1;/使能总中断,P2_7=0;/使485芯片处于接收状态,while(1)/无限循环,if(P3_7=0)/如果按键按下,mDelay(10);/调用延时函数消除抖动,while(P3_7=0);/等待按键抬起,P2_7=1;/使485芯片处于发送状态,SendData(0 x55);/发送数据0 x55,P2_7=0;/使485返回接收状态,P2_2=0;/使连接在P2_2引脚的LED灯亮,用于调试程序和观察程序运行,if(P3_6=0)/若是连接在P3_6引脚的按键按下,mDelay(10);/调用延时函数,消除抖动,while(P3_6=0);/等待按键抬起,P2_7=1;/使485芯片处于发送状态,SendData(0 xaa);/调用发送函数,发送数据0 xaa,P2_7=0;/使485芯片返回接收状态,P2_2=1;/使连接在P2_2引脚的LED灯亮,用于调试程序和观察程序运行,P0=tableuart_data%16;/显示接收数据的低4位,P1=tableuart_data/16;/显示接收数据的高4位,void serial_IT(void)interrupt 4 /串口中断服务函数,if(RI=1)/如果接收中断标志为1,RI=0;/清除接收中断标志,uart_data=SBUF;/接收数据,若是将上述的主机程序同时下载到主从机中,则互为主从机,但是没有接收到数据后自动返回数据功能。,本章参考文献:12,17,18,21,第6章 习题,1.设计一个51单片机向PC机串口助手软件发送0 x88的程序。,2.设计一个51单片机接收PC机串口助手发送0 x99的程序。,3.设计2个51单片机采用串口互相发送接收1个字节的程序。,4.试设计一个51单片机的P3.4P3.7引脚输入开关量数据,并将开关量数据发送到PC机串口助手的程序。,5.设计51单片机采用串口向PC机串口助手软件发送4个端口(P0P3)数据的程序,要求程序使P0、P1、P2口分别输出数字7、8、9。,6.安装1个74HC164芯片驱动共阳数码管的实验电路,编制51单片机向74HC164发送09数字的程序。,7.安装RS485接口电路,设计一个51单片机的P3.4P3.7引脚输入开关量数据,并采用RS485接口发送到另外一个单片机的程序。,8.安装RS485接口电路,设计主51单片机与两从51单片机采用RS485接口通信的程序,要求从单片机采集P3.4P3.7引脚输入开关量数据,并发送到主单片机,主机在P2口连接的LED灯显示从机采集的开关量数据。,
展开阅读全文