You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PIC16F18877读取HC-SR501人体红外传感器始终为低电平的故障排查与优化问询

PIC16F18877读取HC-SR501人体红外传感器始终为低电平的故障排查与优化问询

各位开发者大佬好,我目前正在开发一个基于PIC16F18877的项目,核心需求是读取HC-SR501人体红外传感器的运动检测信号,但遇到了一个百思不得其解的问题——不管我怎么在传感器前挥手触发运动检测,PIC的RD2输入引脚始终读取到LOW(0),完全没有响应。下面是我的详细硬件、代码情况以及已经做过的排查步骤,希望能得到大家的指点!

硬件配置细节

  • PIR传感器型号:HC-SR501
  • 传感器OUT引脚直接连接到PIC16F18877的RD2引脚
  • 传感器采用5V电源供电
  • 万用表实测传感器OUT引脚电压:
    • 空闲状态:稳定0V
    • 检测到运动时:跳升至约3.3V
  • 传感器已完成60秒的预热周期
  • 中断功能正常(RA2引脚能定时翻转,说明TMR0中断在正常工作)
  • 所有接线确认无松动

关键代码片段

引脚初始化函数

void initSysPins(void) {
    ANSELD = 0x00; // 设置PORTD为数字端口
    TRISDbits.TRISD2 = 1; // 配置RD2为输入
    TRISAbits.TRISA1 = 0; // 配置RA1为输出(连接LED)
}

运动检测任务函数

void dspTask_TimerMotion(void) {
    if (PORTDbits.RD2 == 1) {
        PORTAbits.RA1 = ~PORTAbits.RA1;
        det = 1;
    } else {
        PORTAbits.RA1 = 0;
    }
}

LCD显示任务函数

void dspTask_Danger(void) {
    if (det) {
        lcdCtrl_SetPos(1, 1);
        lcdDspAllData(message3);
        lcdCtrl_SetPos(2, 1);
        lcdDspAllData(message4);
        det = 0;
        __delay_ms(3);
    } else {
        lcdCtrl_SetPos(1, 1);
        lcdDspAllData(message1);
        lcdCtrl_SetPos(2, 1);
        lcdDspAllData(message2);
    }
}

void lcdCtrl_SetPos(unsigned char row, unsigned char col) {
    // 行取值1-2,列取值1-16
    unsigned char ramAddr;
    if (row == 1) {
        ramAddr = col - 1;
    } else {
        ramAddr = 0x40 + col - 1;
    }
    lcdWriteCtrlWord(0x80 + ramAddr);
}

void lcdDspAllData(char *msg) {
    while (*msg) {
        lcdWriteDspData(*msg);
        msg++;
    }
}

中断服务函数

void __interrupt() isr() {
    if (PIR0bits.TMR0IF == 1) {
        PIR0bits.TMR0IF = 0;
        PORTAbits.RA2 = ~PORTAbits.RA2;
        dspTask_TimerDanger();
        TMR0H = 0x48; // 3秒定时重载值
        TMR0L = 0xE5; // 3秒定时重载值
    }
}

主循环

while (1) {
    dspTask_TimerMotion();
}

已完成的排查步骤

  • ✅ 用万用表反复验证传感器输出:运动触发时确实会从0V跳至~3.3V
  • ✅ 明确设置ANSELD = 0x00,确保RD2是数字输入模式
  • ✅ 正确配置RD2为输入引脚(TRISDbits.TRISD2 = 1)
  • ✅ 确认MPLAB项目中芯片型号选择的是PIC16F18877
  • ✅ 测试过其他读取RD2的测试项目,能正常读取引脚电平
  • ✅ 尝试过两种逻辑判断(检测高电平和低电平),均无响应
  • ✅ 检查RD2引脚的外设复用情况,确认无冲突
  • ✅ 严格等待传感器完成60秒预热后再测试

我的核心疑问

  • 会不会是代码结构存在问题,导致引脚读取逻辑失效?
  • 为什么中断能正常触发,但RD2始终读不到传感器的高电平信号?
  • HC-SR501输出的3.3V信号,对于5V供电的PIC16F18877来说,是不是低于高电平阈值,导致无法被识别?
  • 有没有更可靠的硬件或代码方案,能让这个传感器和PIC16F18877稳定配合检测运动?

非常感谢大家能抽出时间帮忙分析,任何建议或思路都对我很重要!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 11:55:28