在我们的生活中,夜晚降临时,环境光强不够,路边的路灯就会亮起;而到了白天,环境光强足够时,路灯就会熄灭。
本次是基于IO的输入输出做一个例子,结合了光敏模块和LED灯来实现功能。在开始前先声明一下我的引脚,PA0是光敏模块DO口的输入引脚,PA1是LED灯负极的引脚,LES的正极是连接电源。当环境光强不够时光敏模块的DO口会输入低电平,此时就需要把LED灯负极的PA1端口设置为低电平。反之,光强足够就输出高电平,LED的负极设置为高电平。

以下是AI编写的代码,不太严谨,仅供参考。有学过STM32 Hal库的话,大家应该是知道set函数应该是把引脚置为高电平,而这里我却当时在演示实物没有实现LED亮起,于是我把set和reset两个函数互调了一下,成功实现了这个功能。我也不清楚这里面到底是为什么会这样子,如果有人能够指出的话,非常感谢。
#include "gd32vw55x.h"
#include "systick.h"
#include "gd32vw553h_eval.h"
#include <stdio.h>
void hardware_init(void)
{
/* 使能GPIOA时钟 */
rcu_periph_clock_enable(RCU_GPIOA);
/* 配置A0引脚:输入模式,无上下拉(适配光敏电阻DO) */
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
/* 配置A1引脚:输出模式,推挽,25MHz速度,无上下拉(控制LED) */
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, GPIO_PIN_1);
/* 初始状态:A1高电平 → LED熄灭(因为LED低电平导通) */
gpio_bit_set(GPIOA, GPIO_PIN_1);
}
int main(void)
{
/* 配置系统滴答定时器(用于延时) */
systick_config();
/* 初始化硬件 */
hardware_init();
while(1) {
/* 读取A0引脚电平(光敏电阻DO),消抖延时10ms */
delay_1ms(10);
/* 判定逻辑:
- 遮光 → 光敏电阻DO输出低电平(RESET)→ A1输出低电平 → LED亮
- 环境亮 → 光敏电阻DO输出高电平(SET)→ A1输出高电平 → LED灭
*/
if(RESET == gpio_input_bit_get(GPIOA, GPIO_PIN_0)) {
// 遮光:A1输出低电平,LED点亮
gpio_bit_set(GPIOA, GPIO_PIN_1);
} else {
// 环境亮:A1输出高电平,LED熄灭
gpio_bit_reset(GPIOA, GPIO_PIN_1);
}
}
}
最后就是展示一下不同光强下,LED灯的效果。左边是有光(我当时是拿着一个小台灯)打过来,LED熄灭;右边是环境光强不足,LED亮起。


开源社区
