6 ]8 _) p' }7 G# G) L8 B$ R
3 [1 W; R# `2 P- N+ c, u. t. L其中fosc为晶体震荡器频率
, ?. x4 k) L* o; f5 Y ?
sm2:多机通信控制位。在方式0时,SM2一定要等于0。在方式1中,当(SM2)=1则只有接收到有效停止位时,RI才置1。在方式2或方式3当(SM2)=1且接收到的第九位数据RB8=0时,RI才置1。
+ P. m( j( F3 |6 h2 R! J0 d
1 U8 E) g% ]+ Z; S- y
REN:接收允许控制位。由软件置位以允许接收,又由软件清0来禁止接收。
. t7 |3 v9 j7 S+ q! G5 j
, U* X* ^! J# b& o! I* B8 r
TB8: 是要发送数据的第9位。在方式2或方式3中,要发送的第9位数据,根据需要由软件置1或清0。例如,可约定作为奇偶校验位,或在多机通信中作为区别地址帧或数据帧的标志位。
4 c& W% M) S) s: ?# q3 U i, g
5 E. Z0 r9 U7 X0 ^) s" g) f
RB8:接收到的数据的第9位。在方式0中不使用RB8。在方式1中,若(SM2)=0,RB8为接收到的停止位。在方式2或方式3中,RB8为接收到的第9位数据。
/ \" R( ]' k4 ]: f/ K0 ^' G. }; ]2 R* @( [0 f* D
ti:发送中断标志。在方式0中,第8位发送结束时,由硬件置位。在其它方式的发送停止位前,由硬件置位。TI置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用软件查询的办法获得数据已发送完毕的信息,或用中断的方式来发送下一个数据。TI必须用软件清0。
6 M" w4 @8 S$ e `* b& l2 P& N3 |* `/ v9 D* B: k$ j
RI:接收中断标志位。在方式0,当接收完第8位数据后,由硬件置位。在其它方式中,在接收到停止位的中间时刻由硬件置位(例外情况见于SM2的说明)。RI置位表示一帧数据接收完毕,可用查询的办法获知或者用中断的办法获知。RI也必须用软件清0。
+ U! h! i% G$ I: O% _
. `# f0 D' o( p1 E R" n( [8 y8 Q" O
特殊功能寄存器PCON
7 b6 Q4 C& _1 k$ f+ l2 M8 `- s; L' C
PCON是为了在CHMOS的80C51单片机上实现电源控制而附加的。其中最高位是SMOD。
7 \. e! ]1 c ]7 D0 d/ f: }1 w) W4 O( ]4 I
串行口的工作方式
: [4 \' ^* q: ^- d# d
+ T0 @9 F0 I% m0 X& s. Q) t8051单片机的全双工串行口可编程为4种工作方式,现分述如下:
1 x3 {: w$ G# N- ^& @
8 Z* ]' K9 R/ P5 X方式0为移位寄存器输入/输出方式。可外接移位寄存器以扩展I/O口,也能外接同步输入/输出设备。8位串行数据者是从RXD输入或输出,TXD用来输出同步脉冲。
' G, V1 f6 S! n h
6 E6 h$ M8 p( @9 g) Y输出 串行数据从RXD管脚输出,TXD管脚输出移位脉冲。CPU将数据写入发送寄存器时,立即启动发送,将8位数据以fos/12的固定波特率从RXD输出,低位在前,高位在后。发送完一帧数据后,发送中断标志TI由硬件置位。
( V0 c. n1 N @8 a0 _" @
1 \. q5 v8 d9 F! |
输入 当串行口以方式0接收时,先置位允许接收控制位REN。此时,RXD为串行数据输入端,TXD仍为同步脉冲移位输出端。当(RI)=0和(REN)=1同时满足时,开始接收。当接收到第8位数据时,将数据移入接收寄存器,并由硬件置位RI。
/ r% ]" M: ]: H
7 J4 G# [' q. g. d/ o$ R下面两图分别是方式0扩展输出和输入的接线图。
1 F+ T$ Q% `5 d6 ^: M6 T
/ B/ E( r$ C, N$ e8 K7 D
% ?4 U' r, ?* e+ ~( y& O. Z<单片机串行口接线图>
4 W8 [( @8 ]* Q& x5 \1 v; z9 D
方式1为波特率可变的10位异步通信接口方式。发送或接收一帧信息,包括1个起始位0,8个数据位和1个停止位1。
* m2 R6 f5 c M5 B- e* c q
A* E. D. Q: p1 B% y k输出 当CPU执行一条指令将数据写入发送缓冲SBUF时,就启动发送。串行数据从TXD管脚输出,发送完一帧数据后,就由硬件置位TI。
! _# T1 k+ `8 j9 ^
5 J# D' R4 A }" i5 X, I
输入 在(REN)=1时,串行口采样RXD管脚,当采样到1至0的跳变时,确认是开始位0,就开始接收一帧数据。只有当(RI)=0且停止位为1或者(SM2)=0时,停止位才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志RI;不然信息丢失。所以在方式1接收时,应先用软件清零RI和SM2标志。
& k# ~2 O. S1 M7 Z
5 u/ J9 k- b6 ]1 F+ W方式2
, V6 D7 ^" B+ N$ O% Q4 b& z
# H& V8 ~- }, f2 Z
方式月为固定波特率的11位UART方式。它比方式1增加了一位可程控为1或0的第9位数据。
& R: ?. m* K! d( z- I3 ?0 U3 G
- T1 H* }4 R5 I/ v
输出: 发送的串行数据由TXD端输出一帧信息为11位,附加的第9位来自SCON寄存器的TB8位,用软件置位或复位。它可作为多机通信中地址/数据信息的标志位,也能作为数据的奇偶校验位。当CPU执行一条数据写入SUBF的指令时,就启动发送器发送。发送一帧信息后,置位中断标志TI。
$ k4 x* S1 R) O: s/ p$ z; S8 Y* v( k* N( }3 |; W; f
输入: 在(REN)=1时,串行口采样RXD管脚,当采样到1至0的跳变时,确认是开始位0,就开始接收一帧数据。在接收到附加的第9位数据后,当(RI)=0或者(SM2)=0时,第9位数据才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志RI;不然信息丢失。且不置位RI。再过一位时间后,不管上述条件时否满足,接收电路即行复位,并重新检测RXD上从1到0的跳变。
5 j& z9 N: y& l w, Y& c. U
% E5 _* z8 n. i' k. f
工作方式3
1 n* {. k: K5 C+ K4 u
# ?/ c3 W' W4 W+ E5 V
方式3为波特率可变的11位UART方式。除波特率外,其余与方式2相同。
5 i1 S# n& x w3 y/ F
2 b$ h5 H0 k4 J7 `) Q$ B, k
波特率选择
! t2 |. p3 |6 s+ w0 Q }9 [$ \
. z. A# o6 N' u: C如前所述,在串行通信中,收发双方的数据传送率(波特率)要有一定的约定。在8051串行口的四种工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可变的,由定时器T1的溢出率控制。
5 r& {$ c2 I% p& |' [6 Q1 ] q6 J7 x& C
方式0
! ~% @8 ]& ^1 W' h' x, x( T# H' c' v( p' f" S2 j
方式0的波特率固定为主振频率的1/12。
, I: m8 a) S; n' u0 L' [) Z! l) g. r" O3 n A% ]5 c2 \3 Q z
方式2
, Z& {% {# e3 X: V( t
3 I3 y- r$ L$ H' [ Z方式2的波特率由PCON中的选择位SMOD来决定,可由下式表示:
k% W/ f* I7 z3 B1 n0 \+ `+ b8 a4 m) V' l$ A3 r
波特率=2的SMOD次方除以64再乘一个fosc,也就是当SMOD=1时,波特率为1/32fosc,当SMOD=0时,波特率为1/64fosc
3 t; x" O% s2 u& t
. M( Q. C) z6 z2 }5 A4 [; j3.方式1和方式3
# E) t# }9 ^/ a4 i _( X7 R
9 s: _/ C( [7 Z
定时器T1作为波特率发生器,其公式如下:
* `0 f/ A& L9 u
# P+ \: r% G5 |( q
波特率=
![]()
定时器T1溢出率
; q$ r( C3 c$ ~$ ]7 g# p2 c" |2 r" ]3 c7 ~. e% s
T1溢出率= T1计数率/产生溢出所需的周期数
" V' }- Q8 M) \0 I4 ?: i6 L
* @9 j( u; o$ T2 w/ p$ l1 M y式中T1计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,T1计数率为fosc/12;当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于fosc/24。产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。
. j9 ^6 z7 a* @$ H6 Y
) ?6 F6 a0 F2 T- F2 c$ t定时器T1工作于方式0:溢出所需周期数=8192-x
2 f) E9 h) F, O8 i/ I' ~
3 D h4 v+ k* X定时器T1工作于方式1:溢出所需周期数=65536-x
$ Z3 \/ z% l* `8 p( ~* ?3 m1 o# c: u+ p7 X6 W
定时器T1工作于方式2:溢出所需周期数=256-x
* _% U, a3 y" Z/ h5 @
" \) v' k! E: m0 a因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当。
7 W! s% ]7 v6 M* @7 L5 e r1 v1 w. J* y! o
当时钟频率选用11.0592MHZ时,取易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶体震荡器就是这个道理。
Y/ q/ b8 q" P. T+ f
" a" }+ Y7 D% H
下表列出了定时器T1工作于方式2常用波特率及初值。
8 n- J1 t B( m, a) S
/ }! A [/ z7 z7 N( A+ C
, x( y! F# a g" X
! A# W( ^9 U0 g/ r" `7 e5 c " A6 Q: f( L! F( L9 V