找回密码
 立即注册
国芯人工智能技术交流网站国芯人工智能技术交流网站 教学视频 第06集-基础-IO口-按键检测(查询法)

第06集-基础-IO口-按键检测(查询法)

国学芯用 2024-3-8 11:00 | 分类: STC8G-瑞生 | 播放次数:105 |点赞 1

第06集-基础-IO口-按键检测(查询法)

上一条: 第05集-基础-IO口-红绿灯系统 下一条: 第07集-基础-IO口-按键检测(外部中断)
< 按“左方向键”切换 按“右方向键”切换 >

评论区

全部评论共1条评论

xiaoxia9623

2026-5-11 13:01

课程里面讲是电容拉低了K1电平,这个讲法不严谨。 一、先纠正教程的错误说法 “因为电容通交流阻直流,上电瞬间被电容拉低,导致K1=0” —— 这个解释是错误的,问题根本不在电容的“通交流”上,核心是上电时序 + IO模式切换的瞬间状态。   二、你说的“上电高阻、拉高需要时间”,才是真正的原因 1. STC单片机上电默认状态:高阻输入 刚上电、还没执行任何配置代码时,所有IO口都是高阻浮空状态,上下MOS管全关,既不拉高也不拉低。 此时按键引脚的电平,被10nF电容“锁”在GND电位(因为电容另一端接GND,平时电荷泄放完,引脚端就是低电平)。 2. 配置为“准双向口”后,才会被内部弱上拉拉高 你写的  P3M0=0; P3M1=0;  执行后,P3口才切换为准双向模式,内部的弱上拉电阻才接入电路,开始把引脚往VCC拉。 但这个“拉高”不是瞬间完成的:- 引脚和GND之间的10nF电容,需要通过内部弱上拉电阻充电,电平才会慢慢上升到高电平。 - 这个充电过程是需要时间的,时间常数  τ = R * C ,按STC的弱上拉电阻(约40kΩ)计算:  τ = 40kΩ × 10nF = 0.4ms ,虽然不长,但在单片机的纳秒级指令周期里,是完全可以被捕捉到的。 3. 没有delay时,直接进while循环,就会误判为低电平 代码执行顺序是:c P3M0 = 0x00; // 切换为准双向,上拉开始工作 P3M1 = 0x00; // 这里没有delay! while(1) { if(K1 == 0) // 刚切换完,电容还没充到高电平,此时引脚电平还低,条件成立! { LED_R = 0; // 直接点亮LED } }   你说得一点没错: 不是电容“通交流”拉低了电平,而是上电时电容本来就是低电平,切换准双向后,还没等上拉把电容充到高电平,程序就已经进while循环,把低电平读进去了。   三、加了 delay_ms(1000); ,为什么就好了? 延时1秒,足够给电容完成充电,让引脚电平稳定到高电平: - 10nF电容,通过40kΩ上拉电阻充电,5τ(约2ms)就能充到接近高电平。 - 1秒的延时,给足了时间让电平完全稳定,此时再进while循环,读出来的就是稳定的高电平,不会误判按键按下。   四、教程里的“电容通交流”说法,错在哪? 电容的“通交流”是针对变化的电压信号,而上电瞬间的电平上升,本质是一个阶跃信号,电容会有充电过程,但它不是主动“拉低”电平,而是阻碍电平变化,让上升沿变缓。 真正导致误判的是: - 上电时引脚处于高阻状态,电容保持低电平 - 切换准双向后,上拉开始充电,但程序执行太快,没等电平稳定就去读了 - 误判为按键按下,点亮LED

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-24 03:50 , Processed in 0.036898 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

返回顶部