实验五 串口通信

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验五串口通信
一、实验目的
1.掌握MCS-51单片机的串行口工作原理。

2.学习编程实现MCS-51的UART通讯。

3.掌握CPU利用串口通讯的方法。

二、实验设备(仪器)
PC 微机一台
三、实验原理
1、串行通讯基本概念
计算机与外界的信息交换称为通信。

常用通信方式有两种:并行通信与串行通信,简称并行传送和串行传送。

并行传送具有传送速度快,效率高等优点,但传送多少数据位就需要多少根数据线,传送成本高;串行传送是按位顺序进行数据传送,最少仅需要一根传输线即可完成,传送距离远,但传送速度慢。

串行通信又分同步和异步两种方式。

这两种通信方式的区别在于发送设备时钟与接收设备时钟是否严格一致。

同步通信中,在数据传送开始时先用同步字符来指示(常约定1-2个),并由同时传送的时钟信号来实现发送端和接收端同步,即检测到规定的同步字符后,接着就连续按顺序传送数据。

这种传送方式对硬件结构要求较高。

异步通信中,接收器和发送器有各自的时钟,它们的工作是非同步的,异步通信用一帧来表示一个字符,其内容如下:一个起始位,仅接着是若干个数据位,下图中传输45H的数据格式。

2、MCS-51单片机的串行接口
MCS-51单片机串行口寄存器结构如下图所示。

SBUF为串行口的收发缓冲器,它是一个可寻址的专用寄存器,其中包含了接收器和发送器寄存器,可以实现全双工通信。

但这两个寄存器具有同一地址(99H)。

MCS-51的串行数据传输很简单,只要向发送缓冲器写入数据即可发送数据。

而从接收缓冲器读出数据即可接收数据。

2.1、串行通信控制寄存器
控制MCS-51单片机串行口控制寄存器共有三个:特殊功能寄存器SCON和PCON和中断允许寄存器IE。

SCON和PCON地址分别为98H和87H,SCON用于控制和监视串行口的工作状态,8可以位寻址,PCON没有位寻址功能。

与串行通信有关的控制寄存器主要是串行通信控制寄存器SCON。

SCON是8051的一个可以位寻址的专用寄存器,用于串行数据通信的控制。

SCON的单元地址98H,位地址9FH—98H。

寄存器内容及位地址表示如下:
PCON
电源控制寄存器PCON中SMOD位可影响串行口的波特率。

SMOD是串行口波特率倍增位,当SMOD=1时,串行口波特率加倍。

系统复位默认为SMOD=0。

实验中我们一般了不设置电源控制寄存器。

中断允许寄存器IE中的ES位可选择串行口中断允许或禁止。

ES=0,禁止串行口中断; ES=1,允许串行口中断。

2.2、串行通信的四种工作方式
8051单片机的串行通信共有四种工作方式:
1.串行工作方式0
串行口为同步移位寄存器方式,波特率固定为f晶振/12。

该方式主要用于I/O口扩展等,方式0传送数据时,串行数据由RXD(P3.0)端输入或输出,而TXD(P3.1)此时仅作为同步移位脉冲发生器发出移位脉冲。

串行数据的发送和接收以8位为一帧,不设起始位和停止位,其格式如下:
2.串行工作方式1
(1)方式1传送的数据格式
方式1传送一帧为10位的串行数据,包括1位起始位,8位数据位和1位停
(2)方式1的波特率的确定
方式1的波特率是可变的,计算公式为:
波特率=(2SMOD / 32)×( T1溢出率)
其中SMOD为PCON寄存器最高位的值。

(3)方式1数据的发送和接收
方式1的数据发送由一条写入单片机发送寄存器SBUF指令启动。

8位数据在串行口由硬件自动加入起始位和停止位组成完整的帧格式。

在内部移位脉冲作用下,由TXD端串行输出。

发送完一帧数据后,使TXD输出端维持”1”状态并置使TI标志位置1以通知CPU发送下一个字符。

接收数据由接收单片机SCON中的REN置1开始,随后串行口不断采样RXD 端电平,当采样到RXD端电平从1向0跳变时,就认定是接收信号并开始接收从RXD端输入的数据,并送入内部接收寄存器SBUF中,直到停止位到来之后,并使RI位置1,通知CPU从SBUF中取走接收到的一帧字符。

方式1传送数据时发送前应先清TI,接收前应先清RI。

3.串行工作方式2
方式2是11位为一帧的串行通信方式,即1位始位,9位数据位和1位停止位。

其中第9位数据既可作奇偶校验位,也可作控制位使用。

其帧格式为:
附加第9位(D8)由软件置1或清零。

方式2发送时单片机自动将SBUF中8位数据加上SCON中TB8作为第9位数据进行发送。

接收时,单片机将接收到的前8位数据送入SBUF,而在SCON中RB8位中存放第9位数据。

方式2波特率只有两种,用公式表示:
波特率=(2SMOD/64)×f晶振
当SMOD=0,波特率为f晶振/64
当SMOD=1,波特率为f晶振/32
4.串行工作方式3
方式3通信过程与方式2完全相同。

区别仅在于方式3的波特率可通过设置定时的工作方式和初值来设定(与串行工作方式1波特率设定方法相同)。

顺便指出,由于方式1和方式3的波特率设置较为灵活,在单片机串行通信中得到广泛应用。

2.3、串行口的通信波特率
MCS-51单片机串行通讯的波特率随串行口工作方式选择不同而不同,它除了与系统的震荡频率f osc,电源控制寄存器PCON的SMOD位有关外,还与定时器T1的设置有关。

串行口的通信波特率反映了串行传输数据的速率。

通信波特率的选用,不仅和所选通信设备、传输距离和MODEM型号有关,还受传输线状况所制约。

用户应根据实际需要加以正确选用。

1、方式0的波特率
在方式0下,串行口的通信波特率是固定不变的,仅与系统震荡频率f osc 有关,其值为f osc /12(f osc 为主机频率)。

2、方式2的波特率
在方式2下,波特率也只有两种:f osc /32或f osc /64。

用户可以根据PCON
中SMOD 位状态来驱使串行口在那个波特率下工作。

选定公式为:
波特率 = osc SMOD
f .64
2 这就是说:若SMOD=0,则所选波特率为f osc /64;若SMOD=1,则波特率为f osc /32。

3、方式1或方式3的波特率
在这两种方式下,串行口波特率是由定时器T 1 或T 2(仅8052有)的溢出率和SMOD 决定的,因此要确定波特率,关键是要计算定时器T 1或T 2的溢出率,T 1或T 2是可编程的,可选的波特率的范围很大,因此,这是很常用的工作方式。

8051系列单片机没有定时器T 2,因此波特率只能由T 1产生。

8052系列单片机,当专用寄存器T 2CON 的RCLK 位为0时,接收波特率由T 1产生,当RCLK=1时,由T 2产生;当T 2CON 的TCLK=0时发送波特率由T 1产生,当TCLK=1时,由T 2产生。

以下只讨论由定时器T 1产生波特率的情况。

定时器T 1用作波特率发生器时,应禁止T 1中断。

通常T 1工作于定时方式(专用寄存器TMOD 的D 6=0),T 1的计数脉冲为震荡频率的12分频信号。

这两种方式下,波特率的相应公式为:
波特率 = 溢出率定时器132
2T SMOD
公式1 定时器T 1溢出率可定义为:
定时器T 1溢出率 = 定时器T 1溢出次数/秒
定时器T 1溢出率与定时器的操作模式有关,可通过改变片内特殊功能寄存器TMOD 中定时器T 1字段的M 1、M 0两位,即TMOD.5和TMOD.4位,可以使定时器T 1工作在四种工作方式(定时器处于方式3时,相当于TR1=0,停止计数,故T 1实际上只有0、1、2这三种方式)。

以下只讨论定时器T 1处于方式2(M 1M 0=10,计数初值自动重装8位计数))时溢出率的计算。

定时器T 1由两个8位计数器TH 1和TL 1构成,当T 1处于方式2时,T 1为8位自动装载定时器,它使用TL 1计数,溢出后自动将TL 1加1,当TL 1增至FFH 时,再增加1的话TL 1就产生溢出。

可见,定时器T 1的溢出率不仅与系统时钟频率f OSC 有关,还与每次溢出后TL 1的重装初值N 有关,N 越大,定时器T 1的溢出率也就越大。

一种极限情况是:若N=FFH ,那么每隔12时钟周期,定时器T 1就溢出一次。

对于一般情况,定时器T 1溢出一次所需的时间为:
)(112)2(12)2(88秒时钟周期OSC
f N N ⨯
⨯-=⨯- 公式2
于是,定时器每秒所溢出的次数为公式2所示,式中K=8。

在实际计算时定时器T 1的溢出率的计算公式为:
定时器T 1溢出率 =
)初值
-k OSC f 21
.(12 公式3 因此,把式公式2代人公式1,便可得到方式1或方式3的波特率计算公式:
波特率 = )初值
-k OSC SMOD f 21
.(12.322 式中:K 为定时器T 1的位数,它和定时器T 1的设定方式有关。

即: 若定时器T 1设为方式0,则K=13 若定时器T 1设为方式1,则K=16 若定时器T 1设为方式2或3,则K=8
常用波特率和定时器T 1的初值关系表
其实,定时器T1通常采用方式2,因为定时器T1在方式2下工作时,当TL1从全“1”变为全“0”时,TH1自动重装TL1。

这种方式,不仅可使操作方便,也可避免因重装初值(时间常数初值)而带来的定时误差。

应当注意两点:一是表中定时器T1的时间常数初值和相应波特率之间有一定误差(例如:FDH的对应波特率的理论值是10416波特,与这个表中给出的9699波特相差816波特),消除误差可以通过调整单片机的主频f OSC实现,二是在定时器T1的方式1时的初值应考虑到它的重装时间(例如表中55波特下的情况)。

另外,我们通常在开发时使用11.0592M晶体是为了得到标准的无误差的波特率,那么为何呢?计算一下就知道了。

如我们要得到9600的波特率,晶振为11.0592M和12M,定时器1为模式2,SMOD设为1,分别看看那所要求的TH1为何值。

代入公式:
11.0592M晶振时:
由 9600=(2÷32)×((11.0592M/12)/(256-TH1)) 得
TH1=250
12M晶振时:
由 9600=(2÷32)×((12M/12)/(256-TH1)) 得
TH1≈249.49
上面的计算可以看出使用12M晶体的时候计算出来的TH1不为整数,而TH1的值只能取整数,这样它就会有一定的误差存在不能产生精确的9600波特率。

当然一定的误差是可以在使用中被接受的,就算使用11.0592M的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。

四、实验内容及步骤
编写两块单片机的串口通讯程序,每块单片机都有2位LED数码管显示其数值,其中一块单片机为发送端,另一块为接收端。

通信成功时两数码管显示相同。

1、用Protues设计两块单片机的串口通讯电路原理图,单片机选用AT89C51,
P1口接LED字段a~h,P2.0与P2.1口接位选,发送单片机的TXD(P3.0)与接收单片机的RXD(P3.1)端口相连。

2、打开Keil uVision2仿真软件,首先建立本实验的项目文件,编写发送端与接收端两个源程序,进行编译,直到编译无误,生成HEX文件。

3、将HEX文件上载到Protues电路原理图中的两块的AT89C51中,并仿真成功。

4、实现双机通信,并且两块单片机数值显示相同。

四、流程图
要求发送端单片机每隔1秒转换一次数据,接收端单片机随其一起变化,去掉通信线,接收端单片机数据不变化。

发送程序流程图
接收程序
接收程序流程图。

相关文档
最新文档