原创 单片机串口理解

2006-11-23 22:07 11372 15 19 分类: MCU/ 嵌入式

串行接口<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


8051单片机的通讯方式有两种:


并行通讯:数据的各位同时发送或接收。


串行通讯:数据一位一位顺序发送或接收。参看下图:


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /> 



串行通讯的方式



  1. 异步通讯:它用一个起始位表示字符的开始,用停止位表示字符的结束。其每帧的格式如下:


在一帧格式中,先是一个起始位0,然后是8个数据位,规定低位在前,高位在后,接下来是奇偶校验位(可以省略),最后是停止位1。用这种格式表示字符,则字符可以一个接一个地传送。


在异步通讯中,CPU与外设之间必须有两项规定,即字符格式和波特率。字符格式的规定是双方能够在对同一种01的串理解成同一种意义。原则上字符格式可以由通讯的双方自由制定,但从通用、方便的角度出发,一般还是使用一些标准为好,如采用ASCII标准。


波特率即数据传送的速率,其定义是每秒钟传送的二进制数的位数。例如,数据传送的速率是120字符/s,而每个字符如上述规定包含10数位,则传送波特率为1200波特。



  1. 同步通讯:在异步通讯中,每个字符要用起始位和停止位作为字符开始和结束的标志,占用了时间;所以在数据块传递时,为了提高速度,常去掉这些标志,采用同步传送。由于数据块传递开始要用同步字符来指示,同时要求由时钟来实现发送端与接收端之间的同步,故硬件较复杂。

 



  1. 通讯方向:在串行通讯中,把通讯接口只能发送或接收的单向传送方法叫单工传送;而把数据在甲乙两机之间的双向传递,称之为双工传送。在双工传送方式中又分为半双工传送和全双工传送。半双工传送是两机之间不能同时进行发送和接收,任一时该,只能发或者只能收信息。

 


8051单片机的串行接口结构


8051串行接口是一个可编程的全双工串行通讯接口。它可用作异步通讯方式(UART),与串行传送信息的外部设备相连接,或用于通过标准异步通讯协议进行全双工的8051多机系统也可以通过同步方式,使用TTLCMOS移位寄存器来扩充I/O口。


8051单片机通过引脚RXDP3.0,串行数据接收端)和引脚TXDP3.1,串行数据发送端)与外界通讯。SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器。它们有相同名字和地址空间,但不会出现冲突,因为它们两个一个只能被CPU读出数据,一个只能被CPU写入数据。


串行口控制寄存器SCON


它用于定义串行口的工作方式及实施接收和发送控制。字节地址为98H,其各位定义如下表:



D7


D6


D5


D4


D3


D2


D1


D0


SM0


SM1


SM2


REN


TB8


RB8


TI


RI


SM0SM1:串行口工作方式选择位,其定义如下:



SM0SM1


工作方式


功能描述


波特率


0 0


方式0


8位移位寄存器


Fosc/12


0 1


方式1


10UART


可变


1 0


方式2


11UART


Fosc/64fosc/32


1 1


方式3


11UART


可变


其中fosc为晶振频率


SM2:多机通讯控制位。在方式0时,SM2一定要等于0。在方式1中,当(SM2=1则只有接收到有效停止位时,RI才置1。在方式2或方式3当(SM2=1且接收到的第九位数据RB8=0时,RI才置1


REN:接收允许控制位。由软件置位以允许接收,又由软件清0来禁止接收。


TB8: 是要发送数据的第9位。在方式2或方式3中,要发送的第9位数据,根据需要由软件置1或清0。例如,可约定作为奇偶校验位,或在多机通讯中作为区别地址帧或数据帧的标志位。


RB8:接收到的数据的第9位。在方式0中不使用RB8。在方式1中,若(SM2=0RB8为接收到的停止位。在方式2或方式3中,RB8为接收到的第9位数据。


TI: 发送中断标志。在方式0中,第8位发送结束时,由硬件置位。在其它方式的发送停止位前,由硬件置位。TI置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用软件查询的方法获得数据已发送完毕的信息,或用中断的方式来发送下一个数据。TI必须用软件清0


RI: 接收中断标志位。在方式0,当接收完第8位数据后,由硬件置位。在其它方式中,在接收到停止位的中间时刻由硬件置位(例外情况见于SM2的说明)。RI置位表示一帧数据接收完毕,可用查询的方法获知或者用中断的方法获知。RI也必须用软件清0


串行口的工作方式


8051单片机的全双工串行口可编程为4种工作方式,现分述如下:


一.方式0


方式0为移位寄存器输入/输出方式。可外接移位寄存器以扩展I/O口,也可以外接同步输入/输出设备。8位串行数据者是从RXD输入或输出,TXD用来输出同步脉冲。



  1. 输出 串行数据从RXD引脚输出,TXD引脚输出移位脉冲。CPU将数据写入发送寄存器时,立即启动发送,将8位数据以fos/12的固定波特率从RXD输出,低位在前,高位在后。发送完一帧数据后,发送中断标志TI由硬件置位。


  2. 输入 当串行口以方式0接收时,先置位允许接收控制位REN。此时,RXD为串行数据输入端,TXD仍为同步脉冲移位输出端。当(RI=0和(REN=1同时满足时,开始接收。当接收到第8位数据时,将数据移入接收寄存器,并由硬件置位RI


下面两图分别是方式0扩展输出和输入的接线图。



 


二.方式1


方式1为波特率可变的10位异步通讯接口方式。发送或接收一帧信息,包括1个起始位08个数据位和1个停止位1



  1. 输出 当CPU执行一条指令将数据写入发送缓冲SBUF时,就启动发送。串行数据从TXD引脚输出,发送完一帧数据后,就由硬件置位TI


  2. 输入 在(REN=1时,串行口采样RXD引脚,当采样到10的跳变时,确认是开始位0,就开始接收一帧数据。只有当(RI=0且停止位为1或者(SM2=0时,停止位才进入RB88位数据才能进入接收寄存器,并由硬件置位中断标志RI;否则信息丢失。所以在方式1接收时,应先用软件清零RISM2标志。


三.方式2


方式二为固定波特率的11UART方式。它比方式1增加了一位可程控位10的第9位数据。



  1. 输出: 发送的串行数据由TXD端输出一帧信息为11位,附加的第9位来自SCON寄存器的TB8位,用软件置位或复位。它可作为多机通讯中地址/数据信息的标志位,也可以作为数据的奇偶校验位。当CPU执行一条数据写入SUBF的指令时,就启动发送器发送。发送一帧信息后,置位中断标志TI


  2. 输入: 在(REN=1时,串行口采样RXD引脚,当采样到10的跳变时,确认是开始位0,就开始接收一帧数据。在接收到附加的第9位数据后,当(RI=0或者(SM2=0时,第9位数据才进入RB88位数据才能进入接收寄存器,并由硬件置位中断标志RI;否则信息丢失。且不置位RI。再过一位时间后,不管上述条件时否满足,接收电路即行复位,并重新检测RXD上从10的跳变。


四.方式3


方式3为波特率可变的11UART方式。除波特率外,其余与方式2相同。


 


波特率选择


如前所述,在串行通讯中,收发双方的数据传送率(波特率)要有一定的约定。在8051串行口的四种工作方式中,方式02的波特率是固定的,而方式13的波特率是可变的,由定时器T1的溢出率控制



  1. 方式0


方式0的波特率固定为主振频率的1/12



  1. 方式2


方式2的波特率由PCON中的选择位SMOD来决定,可由下式表示:


波特率=2SMOD次方除以64再乘一个fosc,也就是当SMOD=1时,波特率为1/32fosc,当SMOD=0时,波特率为1/64fosc


3.方式1和方式3


定时器T1作为波特率发生器,其公式如下:


波特率=定时器T1溢出率


T1溢出率= T1计数率/产生溢出所需的周期数


式中T1计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,T1计数率为fosc/12;当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于fosc/24。产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。


定时器T1工作于方式0:溢出所需周期数=8192-x


定时器T1工作于方式1:溢出所需周期数=65536-x


定时器T1工作于方式2:溢出所需周期数=256-x


因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当


当时钟频率选用11.0592MHZ时,取易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶振就是这个道理。


下表列出了定时器T1工作于方式2常用波特率及初值。



常用波特率


Fosc(MHZ)


SMOD


TH1初值


19200


11.0592


1


FDH


9600


11.0592


0


FDH


4800


11.0592


0


FAH


2400


11.0592


0


F4h


1200


11.0592


0


E8h


 


串行口应用编程实例


1. 串口方式0应用编程 8051单片机串行口方式0为移位寄存器方式,外接一个串入并出的移位寄存器,就可以扩展一个并行口。



例:用8051串行口外接CD4094扩展8位并行输出口,如图所示,8位并行口的各位都接一个发光二极管,要求发光管呈流水灯状态。串行口方式0的数据传送可采用中断方式,也可采用查询方式,无论哪种方式,都要借助于TIRI标志。串行发送时,可以靠TI置位(发完一帧数据后)引起中断申请,在中断服务程序中发送下一帧数据,或者通过查询TI的状态,只要TI0就继续查询,TI1就结束查询,发送下一帧数据。在串行接收时,则由RI引起中断或对RI查询来确定何时接收下一帧数据。无论采用什么方式,在开始通讯之前,都要先对控制寄存器SCON进行初始化。在方式0中将,将00HSCON就可以了。


ORG 2000H


START: MOV SCON,#00H ;置串行口工作方式0


MOV A,#80H ;最高位灯先亮


CLR P1.0 ;关闭并行输出(避象传输过程中,各LED"暗红"现象)


OUT0: MOV SBUF,A ;开始串行输出


OUT1: JNB TI,OUT1 ;输出完否


CLR TI ;完了,清TI标志,以备下次发送


SETB P1.0 ;打开并行口输出


ACALL DELAY ;延时一段时间


RR A ;循环右移


CLR P1.0 ;关闭并行输出


JMP OUT0 ;循环


说明:DELAY延时子程序可以用前面我们讲P1口流水灯时用的延时子程序,这里就不给出了。


二、异步通讯


org 0000H


AJMP START


ORG 30H


START:


mov SP,#5fh ;


mov TMOD,#20h ;T1: 工作模式2


mov PCON,#80h ;SMOD=1


mov TH1,#0FDH ;初始化波特率(参见表)


mov SCON,#50h ;Standard UART settings


MOV R0,#0AAH ;准备送出的数


SETB REN ;允许接收


SETB TR1 ;T1开始工作


WAIT:


MOV A,R0


CPL A


MOV R0,A


MOV SBUF,A


LCALL DELAY


JBC TI,WAIT1 ;如果TI等于1,则清TI并转WAIT1


AJMP WAIT


WAIT1: JBC RI,READ ;如果RI等于1,则清RI并转READ


AJMP WAIT1


READ:


MOV A,SBUF ;将取得的数送P1


MOV P1,A


LJMP WAIT


DELAY: ;延时子程序


MOV R7,#0ffH


DJNZ R7,$


RET


END


将程序编译通过,写入芯片,插入实验板,用通读电缆将实验板与主机的串口相连就可以实验了。上面的程序功能很简单,就是每隔一段时间向主机轮流送数55HAAH,并把主机送去的数送到P1口。可以在PC端用串口精灵来做实验。串口精灵在我主页上有下载。运行串口精灵后,按主界面上的设置参数按钮进入设置参数对话框,按下面的参数进行设置。注意,我的机器上用的是串口2,如果你不是串口2,请自行更改串口的设置。



设置完后,按确定返回主界面,注意右边有一个下拉列表,应当选中16进制。然后按开始发送开始接收就可以了。按此设置,实验板上应当有两只灯亮,6只灯灭。大家可以自行更改设置参数中的发送字符如5500FF等等,观察灯的亮灭,并分析原因,也可以在主界面上更改下拉列表中的16进制10进制ASCII字符来观察现象,并仔细分析。这对于大家理解16进制、10进制、ASCII字符也是很有好处的。程序本身很简单,又有注释,这里就不详加说明了。


三、上述程序的中断版本


org 0000H


AJMP START


org 0023h


AJMP SERIAL ;


ORG 30H


START:


mov SP,#5fh ;


mov TMOD,#20h ;T1: 工作模式2


mov PCON,#80h ;SMOD=1


mov TH1,#0FDH ;初始化波特率(参见表)


mov SCON,#50h ;Standard UART settings


MOV R0,#0AAH ;准备送出的数


SETB REN ;允许接收


SETB TR1 ;T1开始工作


SETB EA ;开总中断


SETB ES ;开串口中断


SJMP $


SERIAL:


MOV A,SBUF


MOV P1,A


CLR RI


RETI


END


本程序没有写入发送程序,大家可以自行添加。


 

PARTNER CONTENT

文章评论9条评论)

登录后参与讨论

用户1504241 2009-9-29 09:44

看过之后,模糊地概念有点清楚了。

用户1364675 2008-3-28 16:18

写的不错,这个行业就是这样的,书多看,并搞懂,不要似懂非懂,要思路清晰,再试着多编程,就逐渐掌握了

用户86860 2007-12-19 14:09

3.方式1和方式3

定时器T1作为波特率发生器,其公式如下:

波特率= 定时器T1溢出率 ?

 

 

 

正确的是bps=(2^smod/32)*T1的溢出率

用户86860 2007-12-19 14:07

e

用户42936 2006-11-28 23:24

我觉得刚开始可以不比较非得记住.书多看,硬件结构一定要清楚!!SFR一定搞的很明白!然后就可以多看多编程序!漫漫的就记住了,想忘都难,呵呵~~

用户57362 2006-11-28 08:37

我是一位单片机初学者.想请问一下学单片机是不是一定要熟记那一百个助记符?

用户1053025 2006-11-27 14:16

呵呵,这样俺就明确了。其实,能像您一样,踏踏实实地读完每篇文章,标出重点,对大家而言也是一种财富。

用户42936 2006-11-24 19:01

单片机技术已经非常完善,我做的只不过是总结罢了.很多是参考别的网友的文章,兰色部分是我的标记

谢谢关注,呵呵

 

用户1053025 2006-11-24 17:33

shanliang,这篇文章看上去是原创的?另外,蓝色部分是不是您的标记啊?
相关推荐阅读
用户42936 2007-04-19 22:00
嵌入式学习笔记之-驱动程序(不断更新)
关于驱动程序的理解:1.是处理和操作硬件控制器的软件2.内核中具有最高特权的,驻留内存的,可共享的底层硬件处理程序3.是内核的一部分,是内核和硬件设备的直接接口,它屏蔽了硬件细节驱动程序的作用:1.对...
用户42936 2007-04-19 20:32
同济大学软件学院万金友院长谈嵌入式(学习与规划)
嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限 ,并且对成本很敏感,有时对实时响应要求很高等。特别是随...
用户42936 2006-12-28 22:17
欢迎大家加入MCU/FPGA群!18356280!
18356280...
用户42936 2006-11-28 23:38
今天仿真了一个跑马灯实例,希望对大家有帮助
电路图程序:ORG           0000HLJMP          STARTORG           4000HSTART:      MOV A,#0FEH    ;左边第一个开始显示...
用户42936 2006-11-23 22:04
单片机相关概念理解
数据:这是由微处理机处理的对象,在各种不同的应用电路中各不相同,一般而言,被处理的数据可能有这么几种情况:1·地址(如MOV DPTR,#1000H),即地址1000H送入DPTR。2·方式字或控制字...
EE直播间
更多
我要评论
9
15
关闭 站长推荐上一条 /3 下一条