STM32光敏电阻控制LED亮灭实验详解
1.分析光敏电阻传感器的电路
电路分析:
指示灯连接VCC,当OD端输出低电平时,指示灯亮,输出高电平时,指示灯灭。
电压比较器的输出取决于正极电压-负极电压,而正极电压为光敏电阻电压,负极电压为滑动变阻器电压。所以滑动变阻器电压一定时,光敏电阻电压越大,电压比较器更容易输出1,而光敏电阻阻值与光照强度成反比,即光照强度越暗->OD端输出1->指示灯灭,而滑动变阻器的作用可以调节光敏电阻传感器的灵敏度。
我们的目的是,光线暗->LED亮。而光线暗,OD端输出1,所以当我们检测到OD端引脚的输入为1时,点亮LED灯。
这里,我的LED灯由PB11端控制,使用推挽输出模式,OD端接入PB9,使用上拉输入模式,为什么使用上拉输入模式呢,这就需要考虑DO引脚输出高低电平的工作原理了:
当光照不足较暗时,DO引脚会主动输出低电平。
当光照充足较亮时,DO引脚实际会断路进入高阻态,输出电平不稳定,此时会由内部的上拉电阻将电平拉高,引脚对外输出高电平。
接好电路后就是写代码环节了。
void led_init(void){
//先开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//定义结构体
GPIO_InitTypeDef GPIO_Init_Struct;
//赋值
GPIO_Init_Struct.GPIO_Mode = GPIO_Mode_Out_PP ;//使用推挽输出
GPIO_Init_Struct.GPIO_Pin = GPIO_Pin_11;//将pB11开通
GPIO_Init_Struct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB ,&GPIO_Init_Struct);
}
void LDR_init(void){
//先开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//定义结构体
GPIO_InitTypeDef GPIO_Init_Struct;
//赋值
GPIO_Init_Struct.GPIO_Mode = GPIO_Mode_IPU ;//使用上拉输入
GPIO_Init_Struct.GPIO_Pin = GPIO_Pin_9;//将pB9开通
GPIO_Init_Struct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB ,&GPIO_Init_Struct);
}
int main(void){
led_init();
LDR_init();
while(1){
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)){
//如果PB9引脚输出1,代表光线暗,点亮LED
GPIO_SetBits(GPIOB,GPIO_Pin_11);
}else{
//反之,熄灭
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
}
}
}
作者:Boshevilk