【GPIO篇--GPIO输入】《STM32初探索:光敏传感器控制LED》

一、引言

    接上文的通过配置GPIO的点亮一个LED灯,这一节我们通过光敏传感器模块来实现对LED灯的控制,学习GPIO的出入模式以及模块化编程相关知识点。

   本人正在学习江科大STM32课程,本博作为本人的学习笔记,有错误还请指正,共同学习进步,谢谢~

二、知识储备

1、光敏传感器工作原理

    光敏传感器是一种将光信号转换为电信号的装置,其工作原理主要基于半导体材料的光电效应,常见的光电效应包括外光电效应、内光电效应(又分为光电导效应和光生伏特效应),以下为你详细介绍:

  1. 外光电效应:在光线作用下,物体内的电子吸收光子的能量而逸出物体表面向外发射的现象称为外光电效应,也称为光电发射效应。基于外光电效应的光敏传感器有光电管、光电倍增管等。以光电管为例,当光线照射到光电管的阴极(涂有光电发射材料)时,阴极表面的电子获得足够的能量克服金属表面的束缚而逸出,形成电子流,在外电路中产生电流。光强越大,逸出的电子数量越多,产生的电流也就越大。
  2. 光电导效应:内光电效应中的光电导效应是指在光线作用下,电子吸收光子能量后,使半导体材料的电导率发生变化的现象。常见的基于光电导效应的光敏传感器有光敏电阻。当有光照射到光敏电阻上时,其内部的电子吸收光子能量,从价带跃迁到导带,产生自由电子 - 空穴对,这些载流子的增加使得半导体的电导率增大,电阻值降低。光照强度越强,产生的载流子越多,电阻值下降得越多,通过测量电阻值的变化就可以得知光照强度的变化。
  3. 光生伏特效应:光生伏特效应是指在光线作用下,能使物体产生一定方向的电动势的现象。基于光生伏特效应的光敏传感器有光电池(如硅光电池)和光敏二极管、光敏三极管等。以硅光电池为例,当光照射到硅光电池的 PN 结上时,在 PN 结附近产生电子 - 空穴对,在 PN 结内电场的作用下,电子被推向 N 区,空穴被推向 P 区,从而使 P 区和 N 区之间产生电动势,若将光电池与外电路相连,就会有电流流过。光敏二极管和光敏三极管工作原理与光电池类似,在光照下产生光生载流子,从而在电路中产生电流或使晶体管的导通状态发生变化,实现对光信号的检测 。

    光敏传感器通过上述不同的光电效应原理,将光信号转化为易于测量和处理的电信号,广泛应用于工业控制、安防监控、环境监测、智能照明等众多领域。

2、光敏传感器硬件电路设计

三、正文
1、硬件准备

    面包板一块、杜邦线若干、STLINK一个、STM32最小系统板一块、LED灯一个、光敏传感模块一块

2、软件准备

  keil

3、工程实现

1、新建工程的步骤见上一篇博客,只需要在上一边博客的基础上再新建System、Hardware文件夹用于存放后续即将新建的各个系统模块以及外设模块。然后再参照上文依次在工程中为这两个文件夹添加路径即可。

2、按照以下步骤分别在System文件夹中添加Delay模块的.c和.h文件,在Hardware文件夹中添加LED和LightSensor模块的.c和.h文件

4、调试与验证

#include "stm32f10x.h"                  // Device header
#include "LED.h"
#include "Delay.h"
#include "LightSensor.h"

int main(void)
{
	LED_Init();
	LightSensor_Init();
	
	while(1)
	{
		
		if(LightSensor_Get() == 1)
		{
			LED_ON();
		}
		else 
		{
			LED_OFF();
		}
	}
}

#include "stm32f10x.h"                  // Device header

void LightSensor_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}

uint8_t LightSensor_Get(void)
{
	return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5);
}
#include "stm32f10x.h"                  // Device header

void LED_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_SetBits(GPIOA,GPIO_Pin_1);
}

void LED_ON(void)
{
	GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}

void LED_OFF(void)
{
	GPIO_SetBits(GPIOA,GPIO_Pin_1);
}

void LED_Turn(void)
{
	
	if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1 == 1))
	{
		GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  }
	else 
	{
		GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	}
}

四、参考资料

《嵌入式系统及应用》电子科技大学_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值