|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1.串行口方式0应用编程 8051单片机串行口方式0为移位寄存器方式,外接一个串入并出的移位寄存器,就能扩展一个并行口。
7 c' K* m; M0 E- r ~& g 1 q! P4 M3 L* v- f8 @0 R& B- L8 I
<单片机串行口通信程序设计硬件连接图>
; P# c5 V$ t, Z, O T 例:用8051单片机串行口外接CD4094扩展8位并行输出口,如图所示,8位并行口的各位都接一个发光二极管,要求发光管呈流水灯状态。 串行口方式0的数据传送可采用中断方式,也可采用查询方式,无论哪种方式,都要借助于TI或RI标志。串行发送时,能靠TI置位(发完一帧数据后)引起中断申请,在中断服务程序中发送下一帧数据,或者通过查询TI的状态,只要TI为0就继续查询,TI为1就结束查询,发送下一帧数据。在串行接收时,则由RI引起中断或对RI查询来确定何时接收下一帧数据。无论采用什么方式,在开始通信之前,都要先对控制寄存器SCON进行初始化。在方式0中将,将00H送SCON就能了。
; {& b/ b2 P% \& n$ l' N: ~-----------------单片机串行口通信程序设计列子--------------------------1 t) N6 F6 ? V1 I2 `
ORG 2000H 8 Q6 H b% @$ R3 l9 h
START: MOV SCON,#00H ;置串行口工作方式0 ' w8 l" t5 {: e0 q
MOV A,#80H ;最高位灯先亮
+ d1 H& L2 F8 W. x$ dCLR P1.0 ;关闭并行输出(避象传输过程中,各LED的"暗红"现象)0 b+ T% c/ ?; w! |: m$ C$ a9 W# Z
OUT0: MOV SBUF,A ;开始串行输出
+ H% `7 D* i; Q2 u! M8 FOUT1: JNB TI,OUT1 ;输出完否
* e$ l- R$ M, @CLR TI ;完了,清TI标志,以备下次发送
0 v9 D) `& G, m- `SETB P1.0 ;打开并行口输出 ; d4 x; e( w% ?* C0 w
ACALL DELAY ;延时一段时间 5 c" c% U% X* x) v1 d
RR A ;循环右移
( c* V( f, u% U3 dCLR P1.0 ;关闭并行输出 9 R! y. U9 H C, U0 y3 }: Y9 x
JMP OUT0 ;循环
, J) |, ^! z- }0 V说明:DELAY延时子程序能用前面我们讲P1口流水灯时用的延时子程序,这里就不给出了。 4 Z- c) J% s' e7 W
二、串行口异步通信
D+ w* D& @# Y- B. b" ^org 0000H
4 v1 B. L% p) J+ T4 c: q- s& @AJMP START
7 l7 L" D0 m3 Z6 v" zORG 30H
, ?* A0 w- t7 j. r2 j+ Z" `0 A% aSTART:
$ b; s0 n9 t: Y' U; A* @* V* `* C# Hmov SP,#5fh ;6 d9 g: o7 C& R9 g. g/ u8 s
mov TMOD,#20h ;T1: 工作模式2
( F- ?6 H: W7 S: H. umov PCON,#80h ;SMOD=1
r) K m7 C R2 t N' v7 @; emov TH1,#0FDH ;初始化波特率(参见表)4 J' n- N' f, \9 p: {
mov SCON,#50h ;Standard UART settings3 ^, U* @7 G9 _# |: I
MOV R0,#0AAH ;准备送出的数
9 W7 X9 [9 F) Y& S9 Z% y7 r nSETB REN ;允许接收4 c: \' j( K; Y& r2 \' P
SETB TR1 ;T1开始工作
) a3 N9 Z# J+ E+ z G6 @WAIT:; I) ^1 i9 D6 F) ^
MOV A,R0 : k- J5 _ B1 S: ]# {) F6 B
CPL A8 z3 V* t9 V* L
MOV R0,A
% W, h4 W! Q' W) G: J( eMOV SBUF,A7 o8 G, H/ s, G/ ?8 N7 d0 x7 @! X
LCALL DELAY . d, x. Y" ?: X: D) v
JBC TI,WAIT1 ;如果TI等于1,则清TI并转WAIT1% E$ t! i$ ^) u6 a/ X
AJMP WAIT2 J. H! B4 G1 e, F, W) N- u9 Y. e
WAIT1: JBC RI,READ ;如果RI等于1,则清RI并转READ
1 w' I$ I6 P* m) D4 [( |AJMP WAIT1- H9 y" z% x! n( j$ x8 ~4 j
READ:
6 ?5 q8 l+ d" |MOV A,SBUF ;将取得的数送P1口
+ G4 ?3 g' P# M2 ~MOV P1,A
$ z8 k7 i" y |: K6 q/ `0 i5 D$ H* YLJMP WAIT% _9 O* i# s$ e* |! q. [0 h
DELAY: ;延时子程序* ]! q5 d6 I! ?: Z! |; q9 n/ i
MOV R7,#0ffH
; J. N+ f/ k6 e, j8 x. H8 e6 cDJNZ R7,$
& }6 o% P* Z5 {- YRET6 w, ]! m8 u0 w8 c3 g D7 {" r
END
7 a) J: O: m2 `( z3 x! w+ m 将程序编译通过,写入芯片,插入实验板,用通读电缆将实验板与主机的串行口相连就能实验了。上面的程序功能很简单,就是每隔一段时间向主机轮流送数55H和AAH,并把主机送去的数送到P1口。能在PC端用串行口精灵来做实验。串行口精灵在我主页上有下载。运行串行口精灵后,按主界面上的“设置参数”按钮进入“设置参数”对话框,按下面的参数进行设置。注意,我的机器上用的是串行口2,如果你不是串行口2,请自行更改串行口的设置。+ X/ `6 ]1 F* B4 ]
![]()
7 _; F/ F$ \# ~# s 设置完后,按确定返回主界面,注意右边有一个下拉列表,应当选中“按16进制”。然后按“开始发送”、“开始接收”就能了。按此设置,实验板上应当有两只灯亮,6只灯灭。大家能自行更改设置参数中的发送字符如55,00,FF等等,观察灯的亮灭,并分析原因,也能在主界面上更改下拉列表中的“按16进制”为“按10进制”或“按ASCII字符”来观察现象,并仔细分析。这对于大家理解16进制、10进制、ASCII字符也是很有好处的。程序本身很简单,又有注释,这里就不详加说明了。( ]1 I1 P/ \* W3 G5 R9 Z3 f
三、上述程序的中断版本
: @# B& S& l. N+ i% ~) L! \' norg 0000H
' P9 n7 i3 }2 w5 YAJMP START
" |$ w* h7 I+ _8 lorg 0023h
" c' o) {; F9 k8 uAJMP SERIAL ;
0 S5 ]: g- j4 X9 q8 d, LORG 30H2 Q6 R/ O# q# t/ E# ]
START:
( V4 U1 ]7 S; c' Z' h- mmov SP,#5fh ;5 X9 q0 |: j6 o, @3 h! P. k
mov TMOD,#20h ;T1: 工作模式2# c& D$ s# X! i# r
mov PCON,#80h ;SMOD=1
/ w. I: r/ s. D) A$ `mov TH1,#0FDH ;初始化波特率(参见表)+ V E8 \% T0 X5 [9 F. @# M
mov SCON,#50h ;Standard UART settings& J2 d2 I. y2 H2 `5 H
MOV R0,#0AAH ;准备送出的数
; t4 K5 A+ [3 s6 A6 L, zSETB REN ;允许接收
5 e: L3 l ?1 r9 l5 l% K/ H1 QSETB TR1 ;T1开始工作3 `* I: U" Z9 v# q1 Q6 ~
SETB EA ;开总中断
7 H6 n0 ]: i1 H2 S- a. E- v$ VSETB ES ;开串行口中断' _; ~* W! p5 D+ j
SJMP $ # {8 j7 H$ L9 `9 t1 ?' P l
SERIAL:
$ |* h b- W* H# ?# g _" v$ zMOV A,SBUF
* G" `3 G7 ~; H& K# TMOV P1,A( a0 @- @- M1 ?) N. p
CLR RI - e! Y$ G `5 h8 v
RETI9 G6 g; `/ h5 B, u8 l
END8 D8 H1 _3 y" Z: {# f! L* u
本程序没有写入发送程序,大家能自行添加。) c8 j( J" a) D2 Z* v) y2 ~
) `# }% h* l4 z, [: Q- h+ y
|
|