单片机串口理解

发布者:自由思考最新更新时间:2016-11-08 来源: eefocus关键字:单片机  串口理解 手机看文章 扫描二维码
随时随地手机看文章
串行接口

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

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

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

 

 

串行通讯的方式:

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

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

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

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

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

 

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

 

8051单片机的串行接口结构

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

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

串行口控制寄存器SCON

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

D7

D6

D5

D4

D3

D2

D1

D0

SM0

SM1

SM2

REN

TB8

RB8

TI

RI

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

SM0、SM1

工作方式

功能描述

波特率

0 0

方式0

8位移位寄存器

Fosc/12

0 1

方式1

10位UART

可变

1 0

方式2

11位UART

Fosc/64或fosc/32

1 1

方式3

11位UART

可变

其中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)=0,RB8为接收到的停止位。在方式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个起始位0,8个数据位和1个停止位1。

  1. 输出 当CPU执行一条指令将数据写入发送缓冲SBUF时,就启动发送。串行数据从TXD引脚输出,发送完一帧数据后,就由硬件置位TI。
  2. 输入 在(REN)=1时,串行口采样RXD引脚,当采样到1至0的跳变时,确认是开始位0,就开始接收一帧数据。只有当(RI)=0且停止位为1或者(SM2)=0时,停止位才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志RI;否则信息丢失。所以在方式1接收时,应先用软件清零RI和SM2标志。

三.方式2

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

  1. 输出: 发送的串行数据由TXD端输出一帧信息为11位,附加的第9位来自SCON寄存器的TB8位,用软件置位或复位。它可作为多机通讯中地址/数据信息的标志位,也可以作为数据的奇偶校验位。当CPU执行一条数据写入SUBF的指令时,就启动发送器发送。发送一帧信息后,置位中断标志TI。
  2. 输入: 在(REN)=1时,串行口采样RXD引脚,当采样到1至0的跳变时,确认是开始位0,就开始接收一帧数据。在接收到附加的第9位数据后,当(RI)=0或者(SM2)=0时,第9位数据才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志RI;否则信息丢失。且不置位RI。再过一位时间后,不管上述条件时否满足,接收电路即行复位,并重新检测RXD上从1到0的跳变。

四.方式3

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

 

波特率选择

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

  1. 方式0

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

  1. 方式2

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

波特率=2的SMOD次方除以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的数据传送可采用中断方式,也可采用查询方式,无论哪种方式,都要借助于TI或RI标志。串行发送时,可以靠TI置位(发完一帧数据后)引起中断申请,在中断服务程序中发送下一帧数据,或者通过查询TI的状态,只要TI为0就继续查询,TI为1就结束查询,发送下一帧数据。在串行接收时,则由RI引起中断或对RI查询来确定何时接收下一帧数据。无论采用什么方式,在开始通讯之前,都要先对控制寄存器SCON进行初始化。在方式0中将,将00H送SCON就可以了。

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

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

 

设置完后,按确定返回主界面,注意右边有一个下拉列表,应当选中“按16进制”。然后按“开始发送”、“开始接收”就可以了。按此设置,实验板上应当有两只灯亮,6只灯灭。大家可以自行更改设置参数中的发送字符如55,00,FF等等,观察灯的亮灭,并分析原因,也可以在主界面上更改下拉列表中的“按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

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

关键字:单片机  串口理解 引用地址:单片机串口理解

上一篇:AT89C51单片机详解
下一篇:51单片机串行口中断实例讲解

推荐阅读最新更新时间:2024-03-16 15:19

51单片机内部特殊功能寄存器分析
1. Warning 280:’i’:unreferenced LOC al variable 说明局部变量i 在函数中未作任何的存取操作,解决方法消除函数中i 变量的宣告 2 Warning 206:’Mus IC 3’:missing function-prototype 说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用 解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告 3 Compling :C:\8051\MANN.C Error:318: CAN ’t open file ‘beep.h’
[单片机]
51单片机三极管的作用讲解
对于单片机程序员,在数字电路中,三极管的作用,99.9%都只是用来做“开关”而已。我用一个NPN型三极管驱动直流电机,来说明一下,看图一 图一 大家对着上图,简单说明一下;对于NPN型三极管: B极接上高电平,CE极之间导通,你可以把它理解成一条导线也行,然后整个电路就变成,一个直流电机和一个电源串联,电机能不转吗? B极接着低电平,CE极之间截至,你可以把它理解成短路也行,实际上,CE极之间变成了一个无穷大的电阻,然后整个电路就变成,一个直流电机,一个无穷大的电阻,一个电源串联,根据串联电阻分压的原理(直流电机自身电阻很小),电源12V都在CE之间的无穷大电阻上面,电机二端的电压是接近0V,所以电机能转吗?
[单片机]
51<font color='red'>单片机</font>三极管的作用讲解
单片机从零基础到独立开发,我经历了哪些阶段?
总结出来的结果就是:99%的初学者都走了弯路,而且都很迷茫,焦虑,不知接下来该做什么。 其中有很大一部分在初学者,在职业定位上,就存在严重问题,就是硬件和软件都想学到独立设计的水平。 抱歉,今天我要泼你们一身冷水:几乎不太可能! 这是全栈工程师的水平,新手想达到这个水平,没几十个项目以上的积累是很难做到的。 就拿硬件设计来说,哪怕做了10年,也不敢说什么产品硬件都能设计,换个没做过的产品,照样够你折腾的。 前期学习一定要有侧重点,不要有软硬通吃的想法。 在刚学单片机的时候,我也不知道还分硬件工程师和单片机工程师,我以为都是一个人完成的。 实际除了非常小的公司,大多数公司一个项目标配就是软硬两个职位,毕竟术业有专攻。 新手期
[单片机]
51单片机C编程(十一、电话拨号模拟液晶显示)
*程序名称:电话拨号模拟(液晶显示) *创建人 :jumpmysoul *完成日期:2009.06.06 *版 本:V1.0 *功能说明:按下电话键盘上的一个按键,在液晶显示屏上相应的显示出按下的 按键对应的字符,按下DEL键,则删除一个字符 (不足之处:在删除所有的字符后 光标不见了,如果继续删除几次,再输入的时候就要多按几次按键) #include reg51.h #define uchar unsigned char #define uint unsigned int #define LCDPORT P0 #define KEY P1 //#define WEI P2 sbit DEL=P3^0; sb
[单片机]
盛群半导体推出HT46R0664微控制器
盛群半导体Enhanced A/D Type MCU新增HT46R0664 MCU。HT46R0664内建有12-bit A/D与8-bit PWM,可减少外围零件、缩小PCB Size及降低成本,并内建高精准度的系统频率振荡器、内建直接驱动R-type LCD的驱动电路,非常适合各式小家电、及带LCD面板显示的应用。 HT46R0664的特点在于工规(-40~85℃)、工作电压2.2~5.5V、内建R-Type LCD驱动电路、I/O功能复用及极大化、快速12-bit A/D及多组PWM、内建高精准度RC振荡电路、休眠快速唤醒、高低双频系统操作切换及提供RTC等功能,实为功能、性能、价格最具竞争力的MCU。 HT4
[单片机]
盛群半导体推出HT46R0664<font color='red'>微控制器</font>
51单片机之C语言-4.3结构体
既然既然相同长度单元格能放在一起,比如char1,char2,char3; int1,int2,int3; long1,long2,long3.在实际使用中,有些变量长度是不一样的,但由于它们之间相互关联也需要放在一起,那么要是不同长度的变量,想放在一起有没有办法呢?当然可以,这个就叫做结构体。现在按照数组的学习方法来研究结构体,两个问题,如何定义;如何访问结构体成员。 (1) 如何定义一个结构体 定义一个结构的一般形式为: struct 结构名 {成员表列}; 成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为: 类型说明符成员名; 成员名的命名应符合标志符的书写规定。例如
[单片机]
MCU市场规模可望于2020年再创新高
IC Insights预期,在经历了近几年的价格下滑之后,微控制器(MCU)的平均销售价格(ASP)预期将会回温,并再创销售额新高纪录。 市场研究机构IC Insights预期,IC产业的原始系统级晶片(SoC)产品──微控制器(microcontrollers,MCU)市场的年营收规模,将在未来五年稳定成长并达到新高纪录,尽管该市场整体出货量成长将趋缓。 IC Insights指出,MCU市场销售额在2015年几乎没有成长,幅度不到0.5%,但金额规模却达到了略高于159亿美元的新高纪录,主要是因为MCU出货量成长了15%,在去年达到了221亿颗的高峰(如下图)。强劲的出货量成长──由智慧卡应用与32位元产品带
[单片机]
<font color='red'>MCU</font>市场规模可望于2020年再创新高
51单片机控制步进电机-让电机转起来
摘要: 本节介绍用简单的方式,让步进电机转起来。其目的之一是对电机转动有直观的感受,二是熟悉整个开发流程 本系列教程必要的51单片机基础包括IO口操作、中断、定时器三个部分,相关基础教程网上很多,可以自行学习 一、软件清单 需要用到的软件有keil5编译软件、STC程序烧录软件 二、控制原理 根据TB6600驱动器原理,向PUL口发送脉冲,每发送一个脉冲,电机就转一步。通过单片机延时的方式,切换PUL口电平产生脉冲,从而控制电机转动。 三、程序代码 //毫秒延时函数 void delay(unsigned int z) { unsigned int x,y; for(x=z;x 0;x--) for(y
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved