hc05与单片机连接图_单片机科普:单片机的IO口不够用了怎么办?如何扩展单片机的IO口...

本文介绍了多种单片机IO口扩展方法,包括矩阵按键输入扩展、电阻采样型扩展、逻辑芯片实现的输入输出扩展及模拟口的扩展。每种方法都详细解释了工作原理、优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7bab740f8ccb09d9ca2ab8913e2d2ca8.png

单片机是一种可编程器件,在各种消费类电子、工业电子、汽车电子等行业应用广泛,目前开发产品的构架就是以单片机为核心,根据不同的功能搭建不同的外设电路。同样的功能,每个人、每个团队所做的技术方案都不会相同,但是单片机加外设的构架不会变。足可以看出单片机在电子设计中的重要性。

ec3dac42a4b01b736c1c9c732971d68c.png

1-华为荣耀体脂秤电路板-芯海的单片机

在设计单片机电路的过程中,往往会遇到这种情况:单片机的GPIO口不够用,但是又不是缺很多,如果要更换更多引脚的单片机可能会贵一些,如果是老产品的话,还要涉及到代码的移植,比较方法。有没有扩展方法?答案是肯定的。

有很多的芯片都可以实现单片机GPIO口的扩展功能,下面和大家分析几种常用的扩展方法。

1.输入扩展1-矩阵按键

对于单片机的按键输入,大学课程里有专门的讲解,按键输入可以分为独立式按键和矩阵式按键两类。独立式按键占用单片机IO口比较严重,而矩阵式按键就是利用较少的IO口实现较多的按键检测,也属于GPIO口扩展的范畴。

9bcf1e886e8a3df9c630a2ba31444793.png

2-输入扩展-矩阵式按键

上图中(上拉电阻为画出),就是利用了单片机的八个GPIO口,扩展了4×4的矩阵式按键。四行键盘分别连接单片机的4个IO口,四列键盘分别连接单片机的另外4个IO口,总共占用了8个IO口,扩展出16个按键输入。

矩阵式按键的工作原理

在编程时一般采用扫描的方式,先将列设置为输入状态,将列设置为输出状态,并依次输出低电平,此时依次扫描列的输入状态,如果检测到低电平则说明有按键按下并记录状态,否则无按键事件发生。再将行设置为输入状态,将列设置为输出状态,并依次输出低电平,此时依次扫描行的输入状态,如果检测到低电平则说明有按键按下并记录状态,否则无按键事件发生。经过以上两次判断,就可以得出是否有按键发生,并可确定出按键的编号。

矩阵式按键的优缺点分析

矩阵式按键可以实现单片机IO口的扩展,但是只能用作输入,如果占用7个IO,可以扩展处3×4的矩阵。但是其缺点非常明显,程序需要不停的扫描端口的状态,比较浪费单片机的资源,实时性效率较低。4×4按键的实物图如下图所示。

69cd07cef33c2e3d4b4766c584a6a854.png

3-矩阵式按键-实物图

2.输入扩展2-电阻采样型扩展

采用单片机的AD采样功能也可以实现输入按键的扩展,通过设置不同的电阻,按下键时,单片机采到不同的电压值,由此来识别按键。这种扩展形式有两种方法可以实现:电阻并联型和电阻串联型。

电阻并联型扩展按键的实现原理

通过电阻分压的原理,每个按键和一个不同阻值的电阻串联,再并联后和一个定值电阻串联,公共点接到单片机的AD采样端口。设置后电阻,以区分不同的分压值,使每个按键按下后,所得到的电压值都不同,单片机采集该电压就可以确定按键的编号。电阻并联型按键的原理图如图4所示。

39abe426f589f7a8a8c5fdc53cf51aeb.png

4-电阻并联型扩展输入

另一种方式就是电阻串联型,前一个电阻依次和后边的电阻串联,按下键后所有的电阻都参与分压,该种方式的电路原理图如图5所示。

f2e0361cac5f0e7c85a35f9072840bdb.png

5-电阻串联型扩展输入

电阻采样型扩展方法的优缺点分析

这种方式的最大优点就是通过一个AD采样口就可以实现多个按键的输入,价格便宜。但是缺点太明显:1)接入的按键越多,对AD采样的结果要求越精准;2)不能接入过多的按键,因为必须要计算电阻的阻值,必须保证,每个按键动作都有不同的电压值可以区分;3)多于两个的按键同时按下时较难区分,既要考虑单个按键发生时的电压值,又要考虑多个按键时的电压值,导致电阻值难以设计。

3.输入/输出扩展3-逻辑芯片实现

74系列逻辑芯片非常经典,而且功能强大,也可以实现对单片机IO口的扩展。常用的扩展芯片有74HC138、74HC165、74HC595、74HC164、74HC148等。这类数字芯片可以使用较少的单片机IO,即可实现多路输入或者多路输出,但是需要根据芯片的时序图或者真值表进行编程。

逻辑芯片实现扩展输出

以74HC164为例,介绍如何通过逻辑芯片实现单片机IO口的扩展输出,74HC164是串入并出的移位寄存器,占用单片机3个IO口就可以实现8个IO口的输出。与该芯片类似的芯片是74HC595,该芯片是带锁存的移位寄存器,并且可以级联扩展,即通过3个IO口就能实现多个八路输出的扩展。典型电路原理图 如6所示。

43e7ac6d112444fde22bca973f777874.png

6-数字芯片实现输出扩展

逻辑芯片实现扩展输入

以74HC165为例,介绍如何通过逻辑芯片实现输入扩展,74HC165是并入串出的移位寄存器,单片74HC165可以扩展8路输入,只需要占用单片机3个IO口。并且可以级联,实现多个8路输入的扩展。典型的74HC165的扩展电路图如下图所示。

110910035ba6b73b57c8d56c9ad77af1.png

7-数字芯片实现输入扩展

逻辑芯片实现扩展的优缺点分析

逻辑芯片实现输入输出IO口的扩展时,其硬件电路非常简单,电路原理非常清晰,关键是价格非常便宜,国产逻辑芯片价格只有几毛钱。其稍微复杂的地方是真值表和时序图。以上介绍的逻辑芯片都是需要通过编程来实现扩展的,程序虽然不复杂,但如果是第一次使用,可能需要费一番功夫的。

4.模拟口的扩展-多路选择开关实现

在设计产品的时候,可能要用到多路AD采样端口,如实现多路PT100温度采样。单片机虽然有多路AD采样通道,但是多通道的AD采样在程序的时序上稍微复杂,或者所剩与AD口不足,这时候就要扩展,对于采样类扩展选用多路选择开关是一个不错的选择。以HCF4051为例介绍。

单片机使用三个IO口作为HCF4051的通道选择控制端,一个AD采样口接第3引脚,可以实现8路模拟量的采集。其实现电路原理图如图8所示。

ee9a59f0faf5917861bcfe05b4e37093.png

8-模拟口的扩展

除了用这种多路选择开关实现外,还可以使用专用的模拟量扩展芯片,如ADS1015,这类芯片即可以作为四通道的单端采样使用,又可以当作两通道的差分采样使用,其与单片机的接口为IIC接口。

模拟口扩展的优缺点分析

使用4051之类的多路选择开关,虽然只占用一个AD采样口,但是只能使用多路轮询的方式采集每一个通道,导致采样周期过长,而且采样的时序不好控制;采用ADS1015类的采样芯片,由于是通过IIC与单片机通讯的,所以采样时许容易控制,但是价格比较贵。

电子设计的特点就是实现同一个功能的技术方案有很多,每个人的方案可能都不一样,在扩展IO时,每个人使用的方法也不一样,以上只是一个简单的总结,还有很多的方法没有总结到。如果大家有其他的方法可以留言讨论。

7dde85d4363d79fdbd0ab2305744b7a7.png

<think>嗯,用户想查找关于四病房呼叫系统的电子电工资料,包括设计方案、电路图纸和实现方式。从用户提问的精准度来看,ta应该是个电子相关专业的学生或工程师,需要具体的实操指导而非概念科普。注意到用户提到"四"这个关键词,说明是小型病房系统,核心需求集中在:1)如何扩展输入2)低成本通信方案3)状态显示逻辑。之前的引用中提到的STM32和Zigbee对四系统可能过于复杂,需要降级方案。用户可能实际需要的是类似毕业设计的参考资料,考虑推荐更经济的方案:用51单片机+74HC165扩展按键输入,显示部分用数码管替代LCD12864,通信改用315MHz无线模块。这样BOM成本能控制30元以内,特别适合课程设计。电路设计重点在于按键防抖动和通信冲突处理。四系统不需要复杂协议,考虑在回复中提供具体的防冲突逻辑:当两同时呼叫时,系统按"病床1>2>3>4"的优先级轮询,这样软件上只需简单状态机。图纸部分准备提供Proteus仿真文件,用户可能没有实物调试条件。代码示例要突出矩阵键盘扫描和无线收发中断服务程序,这是最容易出bug的部分。参考文献特意选了带电路图的论文,用户应该需要看图说话式的资料。最后补充了施工注意事项,因为实验室电路和实际布线差异很大。比如提醒电源隔离,这是学生做医疗相关设计时最容易忽略的安全点。</think>以下是针对四病房呼叫系统的设计方案、电子电路及实现方式的详细解析: --- ### **一、四病房呼叫系统设计方案** #### **1. 系统架构** ```mermaid graph LR A[病房终端] -->|无线/有线| B[护士站主机] B --> C[LCD/数码管显示] B --> D[声光报警] ``` - **病房终端**:4个独立病床呼叫按钮(带LED状态指示) - **控制核心**:STM32/51单片机(低成本方案可用AT89C51) - **通信方式**: - 有线方案:RS485总线(抗干扰强) - 无线方案:NRF24L01(2.4GHz)或315MHz模块(成本更低) - **护士站主机**: - 显示:LCD1602/数码管(显示病床号) - 响应键:取消当前呼叫 - 报警:蜂鸣器+闪烁LED #### **2. 电路设计要点** 1. **输入电路**(单病床单元): ```mermaid circuit LR S[按钮] --> R1[10K上拉电阻] R1 -->|接单片机IO| MCU LED -->|限流电阻| MCU_IO ``` - 按钮防抖:硬件RC滤波(100nF电容并联按钮)或软件消抖 - LED状态:双色LED(红:呼叫中,绿:已响应) 2. **通信接电路**(有线方案): - **RS485电路**:MAX485芯片 + 120Ω终端电阻 - **接线拓扑**:总线式结构(病房1~4并联到总线) 3. **电源电路**: - 病房终端:3.3V/5V LDO稳压(AMS1117) - 护士站:12V适配器降压 #### **3. 核心电路图** **护士站主机显示模块**(以数码管为例): ```mermaid circuit LR MCU[单片机] --> 74HC595[移位寄存器] 74HC595 --> DIG1[数码管位选] 74HC595 --> SEG[数码管段选] PNP[PNP三极管] -->|驱动位选| DIG1 ``` > 注:完整电路图可参考[立创EDA设计案例](https://oshwhub.com/search?q=病房呼叫系统) --- ### **二、实现方式** #### **1. 硬件选型建议** | 模块 | 推荐型号 | 说明 | |------------|-------------------|-----------------------| | 主控 | STC89C52RC | 成本<5元,易开发 | | 无线模块 | NRF24L01+PA+LNA | 传输距离>100m | | 显示 | 4位共阳数码管 | 低成本方案 | | 按钮 | 轻触开关6×6 | 带自锁式更可靠 | #### **2. 软件逻辑流程** ```c void main() { 初始化外设(); while(1) { if(收到呼叫信号) { 存储病床号到队列; 启动声光报警; LCD显示当前病床号; } if(按下响应键) { 清除该病床状态; 从队列读取下一呼叫; } } } ``` **关键代码片段**(无线数据接收): ```c // NRF24L01接收中断服务函数 void EXTI_IRQHandler() { if(nRF24L01_RxPacket(rx_buf)) { // 成功接收数据 bed_num = rx_buf[0]; // 首字节为病床号 add_to_queue(bed_num); // 加入呼叫队列 } } ``` --- ### **三、设计优化方向** 1. **抗干扰设计**: - 通信数据增加CRC校验 - 按钮输入光耦隔离(TLP521-4) 2. **低功耗模式**: - 病房终端休眠电流<1μA(通过外部中断唤醒) 3. **扩展功能**: - 增加呼叫优先级(危重病床优先响应) - 历史记录存储(AT24C02 EEPROM) --- ### **四、参考设计资源** 1. [**Proteus仿真工程**](https://www.theengineeringprojects.com/2018/05/hospital-bed-call-system-project-in-proteus.html) - 含完整电路图+单片机代码 2. **开源项目**: - [GitHub - 基于Arduino的病房呼叫系统](https://github.com/search?q=hospital+bed+call+system)(可移植到STM323. **设计文献**: - [《四无线呼叫系统设计》](http://www.cqvip.com/QK/71135X/201303/1002073202.html)(电子设计工程,2013) --- ### **相关问题** 1. 如何解决多病房同时呼叫时的冲突问题? 2. RS485总线布线有哪些注意事项? 3. 如何实现呼叫系统的低功耗设计? 4. 无线方案中如何避免信号干扰? > 提示:实际施工时需注意医疗电气安全标准(如IEC 60601),建议采用隔离电源模块[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值