|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
: B: L; f5 }& F' i1 \& e
51单片机引脚总数只有40,通用I/O引脚只有24个,资源比较紧张。当引脚数目不能满足项目需要时,对I/O口的拓展就是必须掌握的技能了。/ @ z9 Y- ~5 D; }: u& R
我们最常使用的是串行数据端口拓展,即单片机使用串行方式发送或接收数据,通过中间芯片,实现串行数据于并行数据之间的转换。
) l/ n7 G' i' r6 q; r2 X$ a8 @ I- x( K. v
1、使用74LS165实现对51单片机并行数据转串口的输入! v+ [. Y& y" ?5 A _* x' J2 {7 }
73LS165引脚功能图:$ [9 Y' E4 `( L
7 d; C: k( ~: W/ G( W. K
引脚介绍:
; }0 A0 M" w8 p1 rSHIFT/LOAD : 为低电平时,并行数据从A-H被置入寄存器;为高电平时,在时钟信号下进行移位$ ?6 j2 y/ D' d! j* m2 t
CLK:时钟输入6 h9 _% P- _ M, i* X: D! g
A~H:并行输入口
B$ C2 |! Z4 \4 @QH、~QH:串行输出口
l4 \1 `* R! `* ~4 {" {+ O+ d1 s接线说明 1^7----->SHIFT/LOADTXD ----->CLOCKRXD ----->OUTPUT QH( h/ h0 q6 s3 C: W$ h: _8 M9 {& `
#include <reg52.h>
6 Z1 y/ W( C: f6 P8 S0 w, Lsbit LOAD = P1^7;
. j+ s- m: Y3 t( G L P( }void UART_Init()
+ {2 B, T5 T) N: e: o- l' M/ R+ f5 p" {{1 h9 h) P' e( y6 O) O. i
SCON = 0x10;
: b3 { a9 w; I- D" fES = 0;
" M9 u5 G" [( @3 t$ o( p4 p, M}1 P2 p7 @% V# }4 w4 e
unsigned char PA()% p8 X1 s& ], Y8 w8 H
{& @; N6 V% P p9 I6 K) M7 Y
unsigned char PA_data;0 C* T3 l! C) f
LOAD = 0;//SH/LOAD为低电平,74LS165将并行数据装入寄存器
& m0 Q( `' U( {+ h. YLOAD = 1;//SH/LOAD为高电平,在时钟信号下进行移位* N( Y' A9 j9 A/ n0 h, q. X
UART_Init();% P/ U4 j/ B4 h8 N# U
while(RI==0);0 J( W: M. }$ F. F& i
RI==0;& q+ }8 |. @, h6 M, X$ H
PA_data == SBUF;
0 c0 E9 m- O6 J6 g" h7 oreturn PA_data;5 o* G$ L" m" l) ^
}
% _( q% [2 l8 I0 A4 k) {此处,我们同样可以选择使用通用I/O口而不是有串口功能的引脚来接收数据与控制时钟.
8 p0 J) ^7 q" t9 z* E- `; k, A
7 t p" w) R* k8 Z" M2、使用74LS165实现对51单片机并行数据转串口的输入) I7 Y+ g( m1 q4 l# Q0 Y
5 c( Q% X( r8 U" a: _5 S5 gQA~QH:并行输出口
7 O! F1 Z: j jDSA\DSB :串行输入口! W8 E/ u- Q0 R8 \' J6 A1 ?1 g
CLR :清零位: @3 c7 r, Q9 I# Y$ ^$ F
CLK :时钟输入 g4 I& l; `1 ~0 k5 b1 m
接线说明:- S) j1 u# f5 [+ n/ _+ H
RXD ------>DSA\DSB
7 I. ^4 h( u) P' p& mTXD ------>CLK
3 |; w4 X% o3 Z. i6 {P1^7------>CLR
# E. m; p- W. Y* }
7 }2 u. W8 I8 \" Z4 H$ `6 t#include <reg52.h>
( e4 J; x* D3 @sbit CLR = P1^7;- T3 z' u, R/ C) K, I4 T0 r: U$ e4 [+ C u
void UART_Init()0 L4 u; @7 v# }3 |
{
! b2 H. E. ^6 G1 N& M" @6 K! j, a& w2 {SCON = 0x00;
% c: c: c. X& G$ ZES = 0;
# m9 k5 e- f% y1 L}
" G* x# a& e. {% d3 CPA_out(unsigned char PA_data)6 U; l. ?5 _4 f; e
{7 ^3 u# t3 x# r7 ~! D
CLR = 0;
! U2 ^6 E0 y" KCLR = 1;; V J+ J! V/ y0 C" p& U6 l
UART_Init();
j6 F) B6 Q- i1 L) I6 B! `while(TI==0);
! b/ J7 P! p! U( C6 a9 ?6 Q1 t/ g6 [TI = 0;
( T7 ^3 X3 f3 |# r B7 [0 wSBUF = PA_data;
( c# [4 M) y' q8 h u, A}; D$ P3 B# T; Y
这里同样可以使用通用I/O来代替模拟串口通信。
5 {0 g8 D( ]: X0 J& |" V其实,在51单片机的使用过程中我们会经常使用这种通用I/O来模拟像I2C等各类通信方式。/ t% ]& u# v7 j- R" R% \( g; A
今天介绍的这种串并口转换的方式对单片机引脚进行拓展的方式,会经常用于低速率设备中,向我们第一节课讲的LCD1602,就可以增加74LS1604来减少对单片机引脚的占用。
) e0 [; d, A- j, \不过,因为串口是按位读取,接收端接收数据后还需要进行重组,因此不适用于对速率要求较高的场景。面对这种情况,我们还可以选择使用并行数据端口拓展I/O的方式,这一部分请大家自行学习了解。4 a4 u) i ~6 p% u+ W
|
|