STM32 07 对射式红外传感器计次
2026/7/24 11:00:05 网站建设 项目流程

一、实验目标

掌握GPIO外部中断配置,使用PB14引脚外接对射红外传感器,物体遮挡触发上升沿中断完成计数;通过0.96寸OLED实时刷新计数值,实现物体通行计数功能。
本次重点:EXTI外部中断初始化、NVIC中断优先级配置、中断服务函数计数、OLED动态数字显示,基于标准库STM32F10x开发。

二、硬件接线说明

1.对射式红外传感器

VCC:3.3V(禁止5V,避免烧坏单片机IO)

GND:开发板GND共地

OUT信号脚:接STM32 PB14(EXTI14中断通道)
原理:无遮挡时OUT输出低电平;物体挡住红外光束,OUT输出高电平,电平上升沿触发外部中断,计数+1。

  1. 0.96寸I2C OLED屏幕

GND:电源地

VCC:3.3V

SCL(时钟):PB8

SDA(数据):PB9

  • 三、代码块
    ``main函数
#include"stm32f10x.h"// Device header#include"delay.h"#include"OLED.h"#include"Through-beam infrared sensor.h"intmain(){count_init();OLED_Init();OLED_Clear();OLED_ShowString(1,1,"Count");count_init();while(1){OLED_ShowNum(1,6,Get(),5);Delay_ms(1000);}}

外部中断模块

#include"stm32f10x.h"// Device header#include"delay.h"uint16_tcount;voidcount_init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line=EXTI_Line14;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;EXTI_Init(&EXTI_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructure);}uint16_tGet(void){returncount;}voidEXTI15_10_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line14)==SET){count++;}EXTI_ClearITPendingBit(EXTI_Line14);}

四、代码关键知识点解析

  1. OLED显示函数坐标规则

OLED_ShowNum(1, 6, Get(), 5) 参数含义:

  • 第1个参数 1 :行(Y轴),一行可显示8个英文字符/1个汉字;
  • 第2个参数 6 :列(X轴),从屏幕最左侧开始计数;
  • 第3个参数:需要显示的数字(读取全局count计数值);
  • 第4个参数 5 :数字显示长度,不足5位时高位自动补空格。
  1. 外部中断核心要点

1. AFIO时钟必须开启:EXTI复用IO映射功能依赖AFIO外设,不开启时钟中断无法正常工作;

2. 浮空输入模式:红外传感器OUT为高低电平输出,GPIO配置浮空输入即可正确读取电平;

3. 上升沿触发:无遮挡低电平→遮挡高电平,上升沿精准捕捉物体经过动作;

4. 中断标志清除: EXTI_ClearITPendingBit 必须写在中断函数末尾,否则硬件会持续重复进入中断;

5. 中断通道共用:PB10~PB14全部共用 EXTI15_10_IRQHandler 一个中断服务函数,函数内通过 EXTI_GetITStatus 区分具体触发引脚。

  1. 全局计数变量说明

uint16_t count 定义为全局变量,中断服务函数直接修改数值,主函数调用 Get() 读取数值,实现中断与主循环的数据交互。

五、实验现象与调试注意事项

  1. 正常实验现象

1. 上电后OLED第一行显示固定字符串 Count ;

2. 无物体遮挡红外对射管时,屏幕数字保持初始0;

3. 手/物体穿过红外光路,触发一次上升沿中断,数字自动+1,每秒刷新一次屏幕。

  1. 常见问题排查

1. 计数乱跳、自动累加
原因:红外信号线无下拉/上拉电阻,电平干扰误触发;
解决:传感器OUT引脚并联10k下拉电阻到GND,或修改GPIO为上拉输入模式。

2. 遮挡传感器计数无变化
排查顺序:

  • 确认PB14接线无误,传感器VCC接3.3V;
  • 检查代码是否开启AFIO时钟;
  • 确认中断服务函数中清除中断标志代码存在;
  • 示波器测量PB14遮挡时是否有电平上升跳变。

    3. OLED屏幕不显示数字
    确认I2C引脚PB8/PB9接线正确,OLED驱动初始化无报错,显示列参数未超出屏幕最大宽度。

六、个人学习心得

作为刚入门外部中断的初学者,本次实验让我对GPIO外部中断、NVIC中断优先级、中断服务函数有了直观认知:

1. 中断和主循环是两套独立运行逻辑:主循环负责屏幕刷新,中断函数负责瞬时捕捉传感器信号,二者通过全局变量完成数据传递;

2. 区分查询法与中断法:如果用while循环不断读取PB14电平属于轮询查询,会占用单片机全部算力;外部中断仅在电平变化时触发,CPU空闲时可以执行其他任务,资源利用率更高;

3. 模块化开发优势:红外传感器、OLED屏幕、延时函数全部封装独立 .c/.h 驱动文件,业务逻辑(计数显示)写在主函数,底层硬件驱动完全隔离,后续更换传感器、修改屏幕参数无需改动主循环代码;

4. 中断代码规范很重要:忘记清除中断挂起位、漏开AFIO时钟、中断通道写错,这三类错误不会直接报编译报错,只会出现计数异常,调试耗时很久,写代码时要牢记初始化完整流程。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询