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

物联沃分享整理
物联沃-IOTWORD物联网 » STM32光敏电阻控制LED亮灭实验详解

发表回复