|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
! n4 j) N5 y& P3 j1 ` 51单片机引脚总数只有40,通用I/O引脚只有24个,资源比较紧张。当引脚数目不能满足项目需要时,对I/O口的拓展就是必须掌握的技能了。8 R6 c3 k8 Z" Z u
我们最常使用的是串行数据端口拓展,即单片机使用串行方式发送或接收数据,通过中间芯片,实现串行数据于并行数据之间的转换。
* k4 ]# Y: Z6 x- C1 R
- M6 K1 s1 A8 Q6 U# l8 P1、使用74LS165实现对51单片机并行数据转串口的输入& K" `$ g' K6 t5 N+ [6 |
73LS165引脚功能图:; ~9 [1 ~& o4 |. Q! x
7 O3 t" e6 s# a0 V0 o引脚介绍:
3 z3 `) }) N. v, k1 }% |+ N( oSHIFT/LOAD : 为低电平时,并行数据从A-H被置入寄存器;为高电平时,在时钟信号下进行移位8 E% w; @' M8 O; T3 k! U x9 _
CLK:时钟输入
4 i+ Y1 Y x: }! t) S# _* sA~H:并行输入口
, ~/ r7 f: H( i3 HQH、~QH:串行输出口 G# W2 j( A% \: d+ x, w
接线说明 1^7----->SHIFT/LOADTXD ----->CLOCKRXD ----->OUTPUT QH4 ^% B5 n8 @6 }. }
#include <reg52.h>
6 g* E! T5 ~9 b8 m' Lsbit LOAD = P1^7;
. r9 Y- v3 I+ g" W/ Xvoid UART_Init(), h% D" F, l z' Q; T
{6 b+ |1 W) T5 C3 r& \
SCON = 0x10;# V j' F; U {* I) X a
ES = 0;
- a5 ~# T }# M+ b$ @}7 D }1 O ?, |. A, ]1 e
unsigned char PA()" u0 Q8 ?% ^6 C8 G
{
, M2 N( l" e. Qunsigned char PA_data;7 y+ h1 t9 K; J3 t; k6 k) o( S) F% n
LOAD = 0;//SH/LOAD为低电平,74LS165将并行数据装入寄存器* g1 I! ]) m5 w. p' J/ |
LOAD = 1;//SH/LOAD为高电平,在时钟信号下进行移位
' b9 E0 u- b& a9 {UART_Init();
P C6 J$ n+ rwhile(RI==0);2 r o* X4 A6 R0 a
RI==0;
6 \1 e/ s4 k: G# j# t9 N) p) ~$ [0 TPA_data == SBUF;. m$ c0 E, i, d; F5 e
return PA_data;4 h7 p+ ?4 X& ]8 k( l* w
}
/ X: b' d7 Z9 P+ b# p# z# |此处,我们同样可以选择使用通用I/O口而不是有串口功能的引脚来接收数据与控制时钟.# Q: v8 q/ F8 o3 k
6 V( Z* Q" F4 s+ j; O* g" V2、使用74LS165实现对51单片机并行数据转串口的输入3 Y4 Z' E5 f- C4 C0 N: j; ?* y
/ E8 L' T, J1 a
QA~QH:并行输出口& s& J3 J7 F7 Q* A! N, y
DSA\DSB :串行输入口* n( a; I6 k( l8 p' ? [
CLR :清零位
& i( P$ Z6 I9 a5 rCLK :时钟输入
8 Y) w. J; t6 v* C8 q接线说明:, f, l8 `( K! M* A% q+ O+ w
RXD ------>DSA\DSB$ M/ S, N0 o: C
TXD ------>CLK
1 B; g L0 _( O9 A; N+ J5 J$ Q; OP1^7------>CLR$ E- @+ k7 k( X! ?
5 |( Q+ }+ E2 v4 \: r' U c W
#include <reg52.h>
1 f4 j8 O: s1 e: S* e% ?% N( E* g( Hsbit CLR = P1^7;
1 ^' q; W; Y* Qvoid UART_Init()
/ n# T$ {8 A, m8 k8 @7 F7 }, f0 z{8 c2 a. D. \* ?
SCON = 0x00;, P; J7 W( b* p+ `4 A7 |* Y7 L( K. L
ES = 0;
# z8 P7 B& C7 t* G}
9 _! L g8 s% V+ kPA_out(unsigned char PA_data)! E! C0 X! D0 H# ?
{8 {* h+ d5 }6 {# u6 o* {5 d
CLR = 0;
f( U0 ^! v8 s6 |1 S! ]9 C! {6 [) dCLR = 1;1 D3 I, |, w# w1 T
UART_Init();
7 q. D5 v: w# m! L0 h) \8 Rwhile(TI==0);
3 V$ A. c# M6 gTI = 0;9 Q4 t3 v. d1 q2 J# C( z
SBUF = PA_data;: n6 B* t4 ^% U: X1 g% B W
}
! L6 ?- d# `0 F$ G( ~% ]这里同样可以使用通用I/O来代替模拟串口通信。
7 X9 o+ C7 {2 p+ {' N其实,在51单片机的使用过程中我们会经常使用这种通用I/O来模拟像I2C等各类通信方式。
9 e, h3 d7 p. J% g$ S, Q5 S. N* x1 r今天介绍的这种串并口转换的方式对单片机引脚进行拓展的方式,会经常用于低速率设备中,向我们第一节课讲的LCD1602,就可以增加74LS1604来减少对单片机引脚的占用。, ~9 g$ h/ H$ I; ]
不过,因为串口是按位读取,接收端接收数据后还需要进行重组,因此不适用于对速率要求较高的场景。面对这种情况,我们还可以选择使用并行数据端口拓展I/O的方式,这一部分请大家自行学习了解。$ x7 b1 H/ A* |
|
|