|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
编者按:移位寄存器的串行扩展技术是单片机串行口扩展的一种常用方法。对于MCS-51系列单片机而言,将串口置为工作方式0,串口便工作在移位寄存器方式下了。此时,单片机的RXD口作串行数据的发送/接收口,TXD口作移位脉冲输出口。利用单片机串口的这一特性,可以十分方便地扩展I/O口线,本文便是一例。通过本例,读者除了可以加深对串口工作方式0的理解外,还可以举一反三,将之用于其他需要进行I/O口扩展的场合,比如用串口扩展键盘等。# o. n0 ^$ O/ a
遥控数码报时闹钟( J; I! t4 U# I
CD4094是带输出锁存和三态控制的串入/并出高速转换器,具有使用简单、功耗低、驱动能力强和控制灵活等优点。: G" ~0 t `, W' {4 A7 U+ W
CD4094的引脚定义如图1。其中{1}脚为锁存端,{2}脚为串行数据输入端,{3}脚为串行时钟端。{1}脚为高电平时,8位并行输出口Q1~Q8在时钟的上升沿随串行输入而变化;{1}脚为低电平时,输出锁定。利用锁存端可方便地进行片选和级联输出控制。{15}脚为并行输出状态控制端,{15}脚为低电平时,并行输出端处在高阻状态,在用CD4094作显示输出时,可使显示数码闪烁。{9}脚QS、{10}脚Q′S是串行数据输出端,用于级联。QS端在第9个串行时钟的上升沿开始输出,Q′S端在第9个串行时钟的下降沿开始输出。
% N/ B% s+ D. m/ n, r2 ]9 g 当CD4094电源为5 V时,输出电流大于3.2mA,灌电流为1 mA。串行时钟频率可达2.5MHz。+ j' S) z4 O& I# p
1. CD4094作静态LED显示驱动器' t% O! B: ~ a5 q) @* l" l
图2为用CD4094作驱动器的三位数码管静态显示电路略图。单片机串口工作在方式0,即移位寄存器方式。输出数据首先送到IC1,第二次输出的数据移至IC1时,先前输出数据则移到IC2,依此类推。输出三次后,在IC1、IC2、IC3的Q1~Q8口分别得到数据3、数据2、数据1。
5 N. q! P3 b+ @0 W 程序如下:(DISP为显示子程序)1 L& l! J) p7 Y* j) ~
..................1 H/ w& e' W9 W9 v
MOV SCON,#00H ;置串口为方式0; y' u4 a9 F- X
..................4 h4 ^3 F6 r O( w
DISP: CLR P3.7 ;输出锁存
8 N! `- |3 |) ]2 I MOV R0,#33H ;显示值送33H、34H、35H5 a# D( P. B' N6 w5 w8 H
MOV R7,#03H ;置数码管个数3
' w- k5 l1 j( W4 F# D& ?; [LP:MOV A,@R0
0 h4 u( Y9 A1 Q/ X* M N' R MOV DPTR,#TAB ;置字段码表首址5 m9 V- N! R$ k; A
MOVC A,@A+DPTR ;查字段码表
! S! X# s' w, w8 m4 @5 b MOV SBUF,A ;送字段码
7 p) M+ z' n6 B: E. m0 j JNB TI,$ ;等待传送结束
! v' u5 H( L% |' j CLR TI ;清串行中断标志
7 U: Y3 t( ]1 B I# \ INC R0 ;显缓区地址加1) S# b' L& n( c4 W
DJNZ R7,LP ;显示数码是否取完?7 q" x; [: z) e$ Z) O" P$ H) {
SETB P3.7 ;允许输出显示
~) u+ z9 \" l4 g! W% ` NOP 7 N% H& b/ O( k* b, ]# g3 u
CLR P3.7 ;输出锁存
& g$ ?/ L A9 r: v2 ^, e: g RET
. v3 X8 x" K- V/ t/ M! ^9 wTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH
* E" `% O3 ^/ A' ~ DB 6FH,00H 9 j' Y9 E v" @; f5 {2 Y! X2 M
说明:在串行口不作为其他使用,且显示的更新速度很低时,STROBE端可以始终接高;也可将P3.7口接到CD4094的{15}脚,从P3.7口输出一定频率的脉冲,使显示闪烁。$ r B8 c5 @. q5 b1 e9 i
2. CD4094作LED动态显示驱动器$ V; S7 _% c; p# b1 R
用一片CD4094作段驱动,一片CD4094作位驱动,驱动8位带小数点的数码管(见图3)。& M" J* O6 Y) ^6 B- M
程序如下:(DISP为显示子程序)1 Z0 c$ I- j3 m% I% S! @! `1 a5 c3 A
MOV SCON?#00H ;置串口为方式0, C# _! _8 _! ?
……
: P) k* c# O: D$ RDISP:CLR P3.7 ;输出锁存( x; _0 B; ]! C
MOV R0, #30H ;显缓区首址送R0, M+ ^/ \3 H" p+ S1 e% A
MOV R4, #08H ;置数码管个数为8
3 C& v2 E4 W4 c MOV R5, #0FEH ;送位码初值
s: l2 h& H; R3 ULP: MOV A, R5 ;取位码" R; t# C- E' ?7 d2 K* B% _& C
MOV SBUF, A ;送位码
' o3 b$ J. q- ?- a JNB T1 ;等待传送结束$ G* G. b+ x, i6 f, ]0 @2 i$ n
CLR T1 ;清串行中断标志
* S( M& C( W K4 O; ? MOV A?, @R0 ;取段码
# c% b, t! k: G* b* V+ E& }& N* K9 f MOV DPTR, #TAB ;置段码表首址
^ q) q; A1 m( S. V- U" n5 a MOVC A, @A+DPTR ;查段码表
$ K% f; F# r; O0 j/ a7 Q' L MOV SBUF?,A ;送段码
p+ Q! S6 i( P- L) T: b n- y. n1 z JNB T1 ;等待传送结束
/ N y' u( f$ }+ ^& G& V CLR T1 ;清串行中断标志
1 w7 G, Y6 \7 {" I+ o2 ^9 z _6 L, q STB P3.7 ;允许输出显示$ @. F( o |& j6 u! r
LCALL DEL ;延时1ms
7 S, Y1 w4 u6 g$ i' r4 Q MOV A, R5 ;取位码
: \* t' c: y6 Z8 W9 h RL A ;位码左移一位
, J: u8 ?) c X$ y6 L1 N2 { MOV R5, A4 `1 I/ R& P, _4 G6 p; w: S
INC R0 ;显缓区地址加11 k: ]- F- u5 G+ ]8 e
CLR P3.7 ;输出锁存! j5 b F k# s4 C! L
DJNZ R4, LP ;8位显示完否?
3 j$ S% d' p2 S* y RET L6 e3 u: o4 r! R- O3 t$ y
DEL: MOV R7, #02H ;延时1ms (fosc=12MHz)
2 \) T6 s4 C7 X* V ?DL: MOV R6?,#0F8H0 V% F! ], f% x$ T; Q
DJNZ R6, $* j/ f. Q" ~' c* y' e) D" X
DJNZ R7, DL
5 C3 {/ }, s+ p. w3 t8 h) M. L4 ^- k RET
- H) M; |" Q( {( `TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H8 J$ A2 c: C+ t- U
DB 7FH,6FH |
|