找回密码
 注册
关于网站域名变更的通知
查看: 159|回复: 4
打印 上一主题 下一主题

51单片机经典范例演练3 对I/O口进行拓展

  [复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-5-24 09:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

3 u% @) b+ o, h& K 51单片机引脚总数只有40,通用I/O引脚只有24个,资源比较紧张。当引脚数目不能满足项目需要时,对I/O口的拓展就是必须掌握的技能了。
, c  p/ Y: R& d* J我们最常使用的是串行数据端口拓展,即单片机使用串行方式发送或接收数据,通过中间芯片,实现串行数据于并行数据之间的转换。
! B* d$ v# @; @
7 Z9 P" E; @6 d' G4 N" T+ ^3 X4 d1、使用74LS165实现对51单片机并行数据转串口的输入
  o  ]4 e, Q" h* f0 K73LS165引脚功能图:- F; g6 g! z( l+ u
2 v7 w; I0 x- r
引脚介绍:
8 x- b% {6 S& l1 CSHIFT/LOAD  :  为低电平时,并行数据从A-H被置入寄存器;为高电平时,在时钟信号下进行移位
. h) T/ x+ h' U% U3 q  Q$ a: UCLK:时钟输入" l( K$ y# O% M
A~H:并行输入口, m5 W; _- Z5 f2 N1 K. X4 u/ K
QH、~QH:串行输出口3 w/ C  ?* C. H9 |0 I. D
接线说明1^7----->SHIFT/LOADTXD ----->CLOCKRXD ----->OUTPUT QH& h/ D4 I/ i, O+ [6 A$ ?+ O
#include <reg52.h>/ o- d9 f& f6 w8 x, p6 y! D1 W* Y
sbit LOAD = P1^7;
+ }: L" }3 E& s- D- }void UART_Init()
6 Z* U. ~# l4 D5 J  a8 T/ j9 O{' W$ M0 r$ V4 A. F  ]# G
SCON = 0x10;7 s& r; ^9 R7 o: C. C; e
ES = 0;8 B$ Z  Q; ]! j' B* D
}
2 F$ e$ a. s; S2 d$ F. N& _unsigned char PA()
% ^, Q' ~; p1 o2 B4 ^{
( L) d5 s' y! x, Eunsigned char PA_data;4 K% Z/ f* e. Y3 M; z( Z: H, _2 K
LOAD = 0;//SH/LOAD为低电平,74LS165将并行数据装入寄存器9 O7 I# }- B; j  I7 L! |
LOAD = 1;//SH/LOAD为高电平,在时钟信号下进行移位
, h$ m" C  L- j4 K$ G  MUART_Init();
" q. l0 b# P& \. K* g% N! l& k1 cwhile(RI==0);3 b: j! ], S! X  Z/ Z, U
RI==0;  Q4 c) w0 p7 J
PA_data == SBUF;
( V) ^3 ]& `& L6 H6 {return PA_data;+ S5 l: F% M, t0 ?% B! w
}
) D6 m$ q; Z/ W- o, Y. u4 D, a( E: N此处,我们同样可以选择使用通用I/O口而不是有串口功能的引脚来接收数据与控制时钟.
: z% b& E  [; H# _* T+ d5 A& ^9 M$ }5 @% w# A' Y
2、使用74LS165实现对51单片机并行数据转串口的输入
& k- M: ^3 l. w' h) C% @ 1 V/ I& U: b2 K. Q- Q
QA~QH:并行输出口
1 P) ?; t" |" A& u  }DSA\DSB :串行输入口% Y1 B& D) f; E- H# Z
CLR  :清零位  Z4 ]9 j: ^6 A8 j) _" v3 t. m
CLK  :时钟输入3 [2 K& q  h( f; c: ~( {$ o
接线说明:
1 i5 i- ^' r) f$ nRXD ------>DSA\DSB
$ m& ~! O5 }" u; aTXD ------>CLK
7 F9 b& q; q- X5 d8 X  TP1^7------>CLR
/ O' C+ M6 ?  E. N% d( m, R+ T4 a2 f. w7 l% f) V
#include <reg52.h>& P3 |3 w! @/ {5 S0 m
sbit CLR = P1^7;8 j) P2 p) H0 x
void UART_Init()5 c. [6 Q9 u+ c5 X
{
( @- I! p0 r" a& tSCON = 0x00;
( ]: N- ^6 _: v: z/ D) BES = 0;
$ L- H. H6 I0 K$ x}7 a: D* a% I8 T2 P! d- j
PA_out(unsigned char PA_data)1 N6 m! U( |# w, I% U! P
{
  v: G' v6 e6 R; W1 a! s& [CLR = 0;% h$ m8 B+ q6 j6 R( a; ]! k
CLR = 1;) \$ |+ ^3 K/ R7 U8 h8 l8 k
UART_Init();
4 F  [8 r( x) u. c/ |1 V- @# Dwhile(TI==0);- @. }" E4 S% U0 [0 ?4 a
TI = 0;
1 H. c2 J2 @' |* q! xSBUF = PA_data;
2 x8 e& ]8 ^! [. t7 V}
* {6 x8 L: ^- o( ~这里同样可以使用通用I/O来代替模拟串口通信。
/ s$ I, R5 |8 A: S$ ~% e其实,在51单片机的使用过程中我们会经常使用这种通用I/O来模拟像I2C等各类通信方式。
; L( x3 f2 t' t, i# S8 h1 I: Y今天介绍的这种串并口转换的方式对单片机引脚进行拓展的方式,会经常用于低速率设备中,向我们第一节课讲的LCD1602,就可以增加74LS1604来减少对单片机引脚的占用。
" ?$ J9 @! Q8 I+ ^: ?5 [# d不过,因为串口是按位读取,接收端接收数据后还需要进行重组,因此不适用于对速率要求较高的场景。面对这种情况,我们还可以选择使用并行数据端口拓展I/O的方式,这一部分请大家自行学习了解。
, u6 S: |" y+ C        

该用户从未签到

2#
发表于 2022-5-24 13:27 | 只看该作者
学习学习。||ヽ(* ̄▽ ̄*)ノミ|Ю
  • TA的每日心情
    开心
    2023-6-2 15:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2022-5-24 13:27 | 只看该作者
    很不错,赶紧收藏起来6 m$ @$ k4 a, A  J, V& a$ X, ^0 L+ O

    该用户从未签到

    4#
    发表于 2022-5-24 14:49 | 只看该作者
    方式太多了

    该用户从未签到

    5#
    发表于 2022-5-24 16:20 | 只看该作者
    嗯嗯,方法有很多
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-29 20:36 , Processed in 0.093750 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表