5 E: _5 a, y" L# F) t
8 i0 b5 D- k! H! Z' p/ a其中fosc为晶体震荡器频率
1 }: o: h, v& B) T3 z7 ^: Fsm2:多机通信控制位。在方式0时,SM2一定要等于0。在方式1中,当(SM2)=1则只有接收到有效停止位时,RI才置1。在方式2或方式3当(SM2)=1且接收到的第九位数据RB8=0时,RI才置1。
$ [/ x' S6 d+ b$ k
2 y) I* w/ J3 ~! ]7 J( x" U! WREN:接收允许控制位。由软件置位以允许接收,又由软件清0来禁止接收。
; t5 n3 v" L" N! E" O1 U
" j3 s3 T$ B( o8 NTB8: 是要发送数据的第9位。在方式2或方式3中,要发送的第9位数据,根据需要由软件置1或清0。例如,可约定作为奇偶校验位,或在多机通信中作为区别地址帧或数据帧的标志位。
3 P$ C1 s0 C: C8 ~. D, ^- t& ~
( d) D" v4 N6 I& V/ N/ {& [) v; X
RB8:接收到的数据的第9位。在方式0中不使用RB8。在方式1中,若(SM2)=0,RB8为接收到的停止位。在方式2或方式3中,RB8为接收到的第9位数据。
& `6 i4 }1 Y' M' N& O) V
- |! h" T7 n( H! J' cti:发送中断标志。在方式0中,第8位发送结束时,由硬件置位。在其它方式的发送停止位前,由硬件置位。TI置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用软件查询的办法获得数据已发送完毕的信息,或用中断的方式来发送下一个数据。TI必须用软件清0。
! d4 E* A/ f0 t
7 c' d1 `/ _- S! O, ?7 J
RI:接收中断标志位。在方式0,当接收完第8位数据后,由硬件置位。在其它方式中,在接收到停止位的中间时刻由硬件置位(例外情况见于SM2的说明)。RI置位表示一帧数据接收完毕,可用查询的办法获知或者用中断的办法获知。RI也必须用软件清0。
8 [5 X3 V, S3 J- r# a% X
0 G! D! e- f0 ^: ]" Z T& i
特殊功能寄存器PCON
* W1 G3 A% V& w
0 F& C: L; c$ pPCON是为了在CHMOS的80C51单片机上实现电源控制而附加的。其中最高位是SMOD。
- `4 O% A* B2 F
" S9 F( B7 n8 _2 X" r/ S) F! u! X8 `
串行口的工作方式
. ~: s1 T! @8 l2 S* G7 ?: n4 ~
7 t6 ?4 N" n% [9 l8 j5 ^0 K/ u
8051单片机的全双工串行口可编程为4种工作方式,现分述如下:
3 \; j# p4 o+ Q& m x Q4 J% J& c7 j8 w/ U" c
方式0为移位寄存器输入/输出方式。可外接移位寄存器以扩展I/O口,也能外接同步输入/输出设备。8位串行数据者是从RXD输入或输出,TXD用来输出同步脉冲。
: q; J- o' r2 E- h3 r8 m
4 Z' r+ C. m- B4 P6 G! ~输出 串行数据从RXD管脚输出,TXD管脚输出移位脉冲。CPU将数据写入发送寄存器时,立即启动发送,将8位数据以fos/12的固定波特率从RXD输出,低位在前,高位在后。发送完一帧数据后,发送中断标志TI由硬件置位。
! J* m# m! P& _, n+ ^7 V4 s. G/ M C$ p' Q1 {( L
输入 当串行口以方式0接收时,先置位允许接收控制位REN。此时,RXD为串行数据输入端,TXD仍为同步脉冲移位输出端。当(RI)=0和(REN)=1同时满足时,开始接收。当接收到第8位数据时,将数据移入接收寄存器,并由硬件置位RI。
9 f7 |9 P3 x4 g$ @9 _6 O; W; d1 y/ r3 E, r6 Z
下面两图分别是方式0扩展输出和输入的接线图。
- J |/ a" t" p
( V0 y d* V" V7 N& i9 Q# X
5 `8 r$ d4 t4 z% s( N7 D; p
<单片机串行口接线图>
& S6 n- n; n. a+ r' }- N方式1为波特率可变的10位异步通信接口方式。发送或接收一帧信息,包括1个起始位0,8个数据位和1个停止位1。
2 D- b: k9 c; j8 K; Z9 M6 i4 u( V. s$ F' N; p* U7 O! p/ _# {
输出 当CPU执行一条指令将数据写入发送缓冲SBUF时,就启动发送。串行数据从TXD管脚输出,发送完一帧数据后,就由硬件置位TI。
% B+ Y, p0 }- p
7 T+ x! i1 \0 l4 y9 I: A输入 在(REN)=1时,串行口采样RXD管脚,当采样到1至0的跳变时,确认是开始位0,就开始接收一帧数据。只有当(RI)=0且停止位为1或者(SM2)=0时,停止位才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志RI;不然信息丢失。所以在方式1接收时,应先用软件清零RI和SM2标志。
& V$ @$ y+ e) P( D6 H9 e. c: w; J
方式2
( {& f/ _. k' I) p5 T' o2 k9 z) R) D: ^' h' A
方式月为固定波特率的11位UART方式。它比方式1增加了一位可程控为1或0的第9位数据。
( C. W& z% U& Y
; v6 }1 d! G# R) d, S% P' I4 i输出: 发送的串行数据由TXD端输出一帧信息为11位,附加的第9位来自SCON寄存器的TB8位,用软件置位或复位。它可作为多机通信中地址/数据信息的标志位,也能作为数据的奇偶校验位。当CPU执行一条数据写入SUBF的指令时,就启动发送器发送。发送一帧信息后,置位中断标志TI。
{, q& G" Q/ C) a, a
" h6 c5 z6 G. `7 m, o; S0 B+ v5 W& j输入: 在(REN)=1时,串行口采样RXD管脚,当采样到1至0的跳变时,确认是开始位0,就开始接收一帧数据。在接收到附加的第9位数据后,当(RI)=0或者(SM2)=0时,第9位数据才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志RI;不然信息丢失。且不置位RI。再过一位时间后,不管上述条件时否满足,接收电路即行复位,并重新检测RXD上从1到0的跳变。
- J" w) ^# G9 d" R _! k5 z9 z; }; H2 i! w7 z& J; E9 a$ K8 A! d
工作方式3
: m/ [- E9 o( ^3 w, s X0 h3 l( b U3 ]9 n* }
方式3为波特率可变的11位UART方式。除波特率外,其余与方式2相同。
( |( |& A$ B3 A$ _# d* F, P* s4 S) F: g- t9 ]0 J# k
波特率选择
9 Q8 b" g+ M5 W4 K* C, K5 I
3 H N9 F; y [4 ?4 O
如前所述,在串行通信中,收发双方的数据传送率(波特率)要有一定的约定。在8051串行口的四种工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可变的,由定时器T1的溢出率控制。
$ M) `( y' N U K- S" l
' T- n( A: I& T, \( y6 X+ ~ P方式0
" U" n3 U6 z/ A+ [$ a. Q, m
, p8 u J7 ?5 Y5 m: H方式0的波特率固定为主振频率的1/12。
2 x2 O/ e8 v+ {5 m0 Y' i [) K
) b' B8 |6 g# P0 _方式2
+ P9 f4 l2 j9 h5 B7 r
8 j" ` m- K; M) e1 C3 j( V
方式2的波特率由PCON中的选择位SMOD来决定,可由下式表示:
* J/ Y& S5 C: |1 ?1 b' _
/ I/ N& d/ ^- G# N4 ~( M& C- c4 G9 ~波特率=2的SMOD次方除以64再乘一个fosc,也就是当SMOD=1时,波特率为1/32fosc,当SMOD=0时,波特率为1/64fosc
6 y& p3 Q9 y- y) ~& Z1 @; x% E5 ~6 V& R. l) J
3.方式1和方式3
* v1 s t4 A4 V. p" C% e
9 A7 |7 E7 X1 I7 ?' r' q定时器T1作为波特率发生器,其公式如下:
% z8 }1 _) |9 v1 a: ^& C
3 k& q3 W: j7 H4 T波特率=
![]()
定时器T1溢出率
" R) o3 Y$ v* p$ i: d% k3 L+ v$ P" Z
+ P( L/ S) |$ W3 _( k) yT1溢出率= T1计数率/产生溢出所需的周期数
1 e0 b% U) u5 I/ v* ^# v3 ?( |6 m" V* S. u
式中T1计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,T1计数率为fosc/12;当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于fosc/24。产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。
. [6 ?0 p o1 R; ~8 E8 b
& h* m9 C. K" [1 V/ y, Q, t. Y7 ^' l定时器T1工作于方式0:溢出所需周期数=8192-x
8 I" }" o, c6 L6 i' L* r L/ z& X. ? t6 q3 y9 ~- V
定时器T1工作于方式1:溢出所需周期数=65536-x
0 h; b6 ^$ x/ o, @
8 ` n7 d+ C9 G3 m/ a
定时器T1工作于方式2:溢出所需周期数=256-x
w0 _" i# A: y% _8 Y' J# I& w5 q8 b/ [( {# q; N
因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当。
c) }8 z/ C/ V7 O( C- D, j1 Z- [$ S" e
当时钟频率选用11.0592MHZ时,取易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶体震荡器就是这个道理。
! ^; k& K7 Z7 G. H- G
5 w% f; H& w6 b+ O% u) L下表列出了定时器T1工作于方式2常用波特率及初值。
/ @5 B# ~' @" ]# x# z
# N9 `6 f" [: B; y5 @3 d: N$ F* Q& J% \# E/ R {6 J
4 @# k+ W- ~; X
1 @, ?1 n! K1 [: }# [- w9 e6 A