- 打卡等级:初来乍到
- 打卡总天数:7
- 最近打卡:2025-05-26 09:57:44
已绑定手机
注册会员
- 积分
- 53
|
发表于 2025-5-26 09:57:44
|
显示全部楼层
第六集学习心得:I/O输入输出深度实践
本集围绕8051U的I/O端口展开,结合硬件实操与代码逻辑,让我对单片机的“手脚”——输入输出控制有了系统性认知。
一、端口模式的灵活配置
课程通过LED控制案例,详解了4种I/O模式的差异:
- 准双向口:默认上拉电阻使能,适合直接驱动LED等低功耗负载,如P1口控制8位LED时,输出0即可点亮,无需额外驱动电路。
- 推挽输出:高电平驱动能力更强,可用于驱动蜂鸣器等需要大电流的器件,配置时需将端口寄存器的PnM1/PnM0设为11。
- 高阻输入:关闭上拉电阻,适用于读取外部传感器信号(如按键),避免输入电平被内部电阻干扰。
- 开漏模式:需外接上拉电阻才能输出高电平,常用于I2C总线等需要“线与”逻辑的场景,如P3.4/P3.5作为I2C引脚时的配置。
二、按键输入的抗干扰设计
实操中发现,机械按键按下时会产生毫秒级抖动,若直接读取会导致误触发。课程演示了两种消抖方案:
1. 软件延时消抖:检测到按键按下后,延时20ms再确认状态,代码中用 delay_ms(20) 实现,实测可过滤99%的抖动。
2. 硬件电容消抖:在按键两端并联0.1μF电容,利用电容充放电特性平滑电平跳变,适合对实时性要求高的场景。
三、矩阵按键的扫描技巧
当需要扩展按键数量时,矩阵键盘(如4×4键盘)比独立按键更省I/O口。课程演示的扫描逻辑如下:
1. 逐行扫描:先将行线P2.0-P2.3设为输出,列线P2.4-P2.7设为输入,逐行拉低行线(如P2=0xFE),读取列线状态;
2. 坐标解码:若检测到列线某一位为0(如P2.5=0),则按键坐标为“行号×4+列号”,对应ASCII码可直接用于字符输入。
这种方式用8个I/O口实现16个按键,资源利用率提升一倍,适合计算器、简易菜单等场景。
四、实战应用:LED流水灯进阶
结合I/O模式与按键控制,我完成了“按键控制LED流水方向”的实验:
- 当S1按下时,LED从P1.0到P1.7依次点亮(右移);
- 当S2按下时,LED从P1.7到P1.0依次点亮(左移);
- 代码中通过 P1 = _crol_(P1, 1) 和 _cror_(P1, 1) 函数实现循环移位,比逐位赋值更高效。
五、避坑总结
1. 推挽模式下若驱动大电流负载(如继电器),需串联100Ω限流电阻,避免芯片过流损坏;
2. 高阻输入模式下,未使用的I/O口建议配置为输出0或上拉,防止悬浮电平引入干扰;
3. 矩阵键盘扫描时,行线输出低电平后需等待1ms再读取列线,确保电平稳定。 |
|