STM32学习日记1---光敏传感器模块

本文记录了一位开发者使用STM32学习光敏传感器的过程,包括GPIO工作模式、输出速度、光敏传感器引脚功能及实验。通过实验1控制LED,实验2切换OLED显示,实验3利用ADC读取模拟输出并串口打印,最后在实验4中用OLED显示ADC数据。遇到问题如OLED闪屏,通过调整代码得以解决,并学会了浮点数在OLED上的显示方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

这是我学习32的心理路程
我会尽量把内容写的仔细
对于一些简单模块的使用,我不打算深究其原理,我只要会用它就欧克。所以看见我的32博客的同志们请注意这一点。如果同志您觉得内容有改进的地方,那就请多多指教啦~~~本人一定认真听取。


一、光敏传感器引脚

我这里使用的光敏传感器是4针的。

AO 模拟输出:光敏传感器将采集的光线变成一个连续的模拟信号从AO引脚输出
DO 数字输出:大于光线阈值,DO引脚输出1(高电平);反之输出0。关于光线阈值,应该是调节模块上面那个十字架旋钮
GND 接地
VCC 3·3v或者5v

注意:这是我第一次使用这个模块,所以语言描述可能有bug。

3针的光敏传感器就好像没有DO引脚。其他的是一样的。

二、光敏传感器小实验1

1·读取DO引脚的高低电平来控制一个led的亮灭。

这个小实验很简单哈。

lightsensor.c

#include "stm32f10x.h"                  // Device header

#define LED_OFF()   GPIO_SetBits(GPIOB,  GPIO_Pin_1 )
#define LED_NO()   GPIO_ResetBits(GPIOB,  GPIO_Pin_1 )

/**
   * @brief  光敏传感器DO引脚所连接32的PC14引脚的初始化,
			 PC14设置为输入模式,读取DO传过来的电平。		 
   * @param  无
   * @retval 无
   */
void Light_Sensor_GPIOinit(void)
{
   
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	GPIO_InitTypeDef Light_Sensor_GPIO_InitStruct;
	Light_Sensor_GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU ;
	Light_Sensor_GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
	Light_Sensor_GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&Light_Sensor_GPIO_InitStruct);
}

/**
   * @brief   光敏传感器所控制的led的初始化,这里我是自己外接的led
   * @param   无
   * @retval  无
   */
void Test_Sensor_LEDinit(void)
{
   
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitTypeDef Test_Sensor_LEDinit;
	Test_Sensor_LEDinit.GPIO_Mode = GPIO_Mode_Out_PP ;
	Test_Sensor_LEDinit.GPIO_Pin = GPIO_Pin_1;
	Test_Sensor_LEDinit.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOB,&Test_Sensor_LEDinit);
	LED_OFF();   //high--->led off
}

/**
   * @brief  功能函数,读取DO电平,来控制外接LED
   * @param
   * @retval
   */
void Sensor_Contral_LED(void)
{
   
	//uint8_t value = 0;
	
	if( GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_14) == 0 )
	{
   
		LED_OFF();
	}
	else
		LED_NO(); 
	
}


main.c

#include "stm32f10x.h"                  // Device header
#include "lightsensor.h"

int main (void)
{
   
	Light_Sensor_GPIOinit();
	Test_Sensor_LEDinit();

	while(1)
	{
   
		
		//GPIO_ResetBits(GPIOB,  GPIO_Pin_1 );// 测试外接led单独能不能亮

		 Sensor_Contral_LED();	
	}
}

注意:lightsensor.h就是将lightsensor.c中的函数名复制一下就欧克了,这里就不多展示 了哈!

对于这个实验的总结:
开始测试外接led能不能单独亮的时候,led死活不亮,我还以为是引脚复用的毛病,但是我差了一下资料发现并不是这个问题,结果回去仔细看了一下引脚初始化才发现led要推挽输出(),以及引脚初始化结构体的问题。我麻了。后来修正后就成功点亮了,虽然这个问题是小小的不起眼的问题,至少还是需要总结一下,避免以后再犯~~~

2·这里提一下GPIO的工作模式

4种输出模式:
(1)推挽输出:使用推挽输出目的是增大电流,即提高输出引脚的驱动能力,提高电路负载能力。【驱动led】

(2)开漏输出:由于只有下拉MOS管没有上拉MOS管,所以开漏输出模式下,IO引脚只能输出低电平。如果要输出高电平,则需要外接上拉电阻。

(3)复用推挽,复用开漏输出:IO引脚做复用功能时,可以选则复用推挽或者复用开漏输出模式,在选择复用开漏输出模式时,需要外接上拉电阻。

4种输入模式:
(1)上拉输入模式:引脚内部有一个上拉电阻,通过开关连接到电源VDD,当IO引脚无输入信号时,默认输入高电平。【外接按键】

(2)下拉输入模式:与上拉输入模式相反。当IO引脚无输入信号时,默认输入低电平。

(3)浮空输入:引脚内部即不接上拉也不接下拉电阻。浮空输入模式下的引脚电平是不确定的,外部信号是上面电平,MCU引脚就输入什么电平。【USART,IIC等通信协议】

(4)模拟输入模式:引脚内部即不接上拉也不接下拉电阻。【A/D模拟输入实现对外部信号的采集】

3·这里提一下GPIO的输出速度

(1)输出速度并不是输出信号的的速度,而是IO口驱动电路的响应速度。“我简称为:反应能力”。

(2)32 的输出速度有3种: 2MHz, 10MHz, 50MHz,对应的就是低速反应能力,中速反应能力,高速反应能力。

当输出配置为高速时,噪声大,功耗高,电磁干扰强;当输出为低速时,噪声小,功耗低,电磁干扰弱。当输出较高频率的信号时,应该选用较高频率响应速度的驱动模块,否则容易出现信号失真现象。
一般常用的外设(例如led,蜂鸣器等)建议采用2MHz的输出速度,而作为IIC,SPI等复用功能的输出引脚时,尽量选择高响应速度,如10mhz,50hmz。
GPIO引脚做输入模式时,不需要配置引脚的输出速度。

三、光敏传感器小实验2

稍微提升一下小实验1的难度。

1·光敏传感器DO的高低电平变化来切换OLED的显示。

这里我就不贴OLED的代码了哈。

这个实验就是在实验1的lightsensor.c中加一个函数就行。

void  SensorContral_LED_OLED
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值