对射式红外传感器计次问题:
将遮挡物放在传感器中间led灯熄灭,拿走led灯点亮,次数中断触发,显示屏上的读数应该加一,但是实际情况是显示屏读数未增加,中断似乎没有触发,得出这个结果的原因是我写了一个参数设他初始值为1,若触发中断则赋这个参数为0,后来显示屏上显示的是1.
以下为计次部分代码:


对射式红外传感器计次问题:
将遮挡物放在传感器中间led灯熄灭,拿走led灯点亮,次数中断触发,显示屏上的读数应该加一,但是实际情况是显示屏读数未增加,中断似乎没有触发,得出这个结果的原因是我写了一个参数设他初始值为1,若触发中断则赋这个参数为0,后来显示屏上显示的是1.
以下为计次部分代码:


晚上好🌙🌙🌙
本答案参考通义千问
你描述的问题是关于 STM32 使用 对射式红外传感器 进行 计次 的问题。根据你的描述,显示屏上的读数没有增加,说明 中断未被正确触发 或 中断处理逻辑有误。
你提到以下几点:
flag 初始值为 1,若触发中断则将其设为 0,显示屏显示的是 1。这表明:
flag 没有被正确更新或读取。中断未被正确使能或配置
中断服务函数(ISR)未被调用
标志位 flag 的使用逻辑有误
flag 初始化为 1,并在中断中设为 0,但显示屏上仍显示 1,说明 中断未被触发 或 flag 未被正确读取。中断触发条件不匹配
传感器与 STM32 的连接问题
检查 EXTI 配置
// 配置 EXTI 中断
void EXTI_Config(void) {
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
// 使能 EXTI 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// 配置 PA0 为 EXTI0
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
EXTI_InitStruct.EXTI_Line = EXTI_Line0;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling; // 上升沿+下降沿
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
// 配置 NVIC
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
编写并测试中断服务函数(ISR)
void EXTI0_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
// 执行计数操作
count++;
EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志
}
}
检查标志位 flag 的使用逻辑
你提到 flag = 1,中断中 flag = 0,但显示屏显示的是 1,说明:
flag 未被正确读取(比如在主循环中没有更新显示)。建议直接使用 count 变量来显示数值,而不是依赖 flag。
调试中断是否被触发
void EXTI0_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
// 打印调试信息
printf("Interrupt triggered!\n");
count++;
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
验证传感器与 STM32 的连接
// 全局变量
volatile uint16_t count = 0;
// 中断服务函数
void EXTI0_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
count++; // 计数加一
EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志
}
}
// 主循环中更新显示屏
while (1) {
// 显示 count 的值
Display_Update(count);
}
重点问题:中断未被正确触发或未被正确处理。
count 变量进行计数,而非依赖 flag。如有更多代码片段或硬件连接图,可进一步分析具体原因。