STM32第三课:按键控制LED灯,光敏传感器控制蜂鸣器

这篇具有很好参考价值的文章主要介绍了STM32第三课:按键控制LED灯,光敏传感器控制蜂鸣器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一:按键控制LED灯

        STM32的第三课,我们来学习如何使用按键来控制LED灯的亮灭。上一节课我们通过代码控制了LED的状态,但是还是处于一种较为低级的方式控制LED灯,缺少交互性,用按键进行控制属于更高的一个层次。然后我们将学习通过光敏传感器控制蜂鸣器的通断,让我们的学习之路更加有趣、精彩。

1.1 初始化函数代码的编写 

        首先编写LED小灯的初始化函数代码,用于初始化将要控制LED小灯的I/O口。

        首先,在工程文件中先创建一个名为Hardware的文件夹,用于存放我们将要配置的系统文件。

         同样,在魔术棒里面,配置Hardware文件夹的头文件路径,用于使用自己编写的头文件驱动程序。此处再演示一下如何进行配置。

        第一步:先在工程文件中创建名为Hardware的文件夹。stm32第三课:按键控制led灯,光敏传感器控制蜂鸣器,stm32,嵌入式硬件,单片机,学习

第二步,在三个小箱子里面添加名为Hardware的文件,用于存放编写的驱动代码。 

stm32第三课:按键控制led灯,光敏传感器控制蜂鸣器,stm32,嵌入式硬件,单片机,学习

stm32第三课:按键控制led灯,光敏传感器控制蜂鸣器,stm32,嵌入式硬件,单片机,学习

        然后右键左侧刚添加的Hardware文件夹,选择添加新文件到Hardwarestm32第三课:按键控制led灯,光敏传感器控制蜂鸣器,stm32,嵌入式硬件,单片机,学习         然后依次选择.c文件,名称填LED,点Add再选择下面的.h文件,名称也填LED,点Add,这样我们就在Hardware文件夹里面创建了两个配置驱动的文件了。

stm32第三课:按键控制led灯,光敏传感器控制蜂鸣器,stm32,嵌入式硬件,单片机,学习

         同时按照同样的思路,再创建一个Key.c和Key.h的两个驱动文件放在Hardware文件夹里,用于配置按键的驱动。

        在魔术棒里添加上Hardware的头文件地址即可。stm32第三课:按键控制led灯,光敏传感器控制蜂鸣器,stm32,嵌入式硬件,单片机,学习

        在驱动文件LED.c文件里,主要编写驱动文件的函数,用于在主函数main.c文件里面直接引用。把所有想实现的功能都编写成函数有利于代码的检查和移植。LED.h文件主要编写对外引用函数的代码,这就是.c文件和.h文件的主要区别。

          在驱动文件LED.c文件里,首先编写初始化函数的代码,然后再编写相关功能的代码,比如说LED_ON\LED_OFF、LED_Turn,分别代表LED灯的亮灭和电位翻转。详细代码见如下所示:

LED.c

#include "stm32f10x.h"

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

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



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

void LED1_Turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1) == 0)
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_1);
	}
	else
	{
		GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	}
}

void LED2_ON(void)
{
	GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}

void LED2_OFF(void)
{
	GPIO_SetBits(GPIOA,GPIO_Pin_2);
}

void LED2_Turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2) == 0)
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_2);
	}
	else
	{
		GPIO_ResetBits(GPIOA,GPIO_Pin_2);
	}
}

        LED.h文件里主要放置LED.c文件中的函数对外引用,直接把函数的名称拿过来即可。但是LED.h文件首先要写上防止重复引用的函数,都是一个套路,所有的.h文件里面都要写。详细代码如下:

LED.h

#ifndef __LED_H
#define __LED_H

void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED1_Turn(void);
void LED2_Turn(void);

#endif

这样一来LED小灯的驱动代码就写好了。

然后我们再来配置按键的驱动代码LED.c和LED.h的代码内容。

LED.c代码也是需要我们编写相关功能的驱动代码函数,首先编写初始化函数,结构和上文LED.c的初始化函数大同小异,只有引脚端口号不一样而已。然后编写按键的数据读取函数,在这里我们使用GPIO_ReadInputDataBit函数,可以直接读取某一个引脚的电位值。按键需要延时20微秒用于防抖,详细代码如下:

Key.c

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

void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}

uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;
	
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)
	{
		Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0);
		Delay_ms(20);
		
		KeyNum = 1;
	}
	
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0)
	{
		Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0);
		Delay_ms(20);
		
		KeyNum = 2;
	}
	
	
	return KeyNum;
}

Key.h 

#ifndef __KEY_H
#define __KEY_H
#include "stm32f10x.h"                  // Device header


void Key_Init(void);
uint8_t Key_GetNum(void);

#endif

这样一来,初始化驱动文件就配置好了。

1.2 电路接线方法

stm32第三课:按键控制led灯,光敏传感器控制蜂鸣器,stm32,嵌入式硬件,单片机,学习

1.3 主体代码演示 

 首先我们要配置好头文件,延时函数Delay.h也要配置上,这一点在我上一篇文章中有讲到。然后初始化LED和Key,再循环函数里面编写相关代码即可。代码如下:

main.c

#include "stm32f10x.h"
#include "LED.h"
#include "Delay.h"
#include "KEY.h"


uint8_t KeyNum;

int main(void)
{
	LED_Init();
	Key_Init();
	
	
	while(1)
	{
		//************按键控制LED
		KeyNum = Key_GetNum();
		
		if(KeyNum == 1)
		{
			LED1_Turn();
		}
		if(KeyNum == 2)
		{
			LED2_Turn();
		}
		
	}
	
}

1.4 实操效果展示

 stm32第三课:按键控制led灯,光敏传感器控制蜂鸣器,stm32,嵌入式硬件,单片机,学习

二:光敏电阻控制蜂鸣器 

         光敏电阻是采用半导体材料制作,利用内光电效应工作的光电元件。它在光线的作用下其阻值往往变小,这种现 象称为光导效应,因此,光敏电阻又称光导管。

2.1 光敏电阻传感器

 2.1.1 产品特性

         光敏电阻模块一般用来检测周围环境的光线的亮度,触发单片机或继电器模块等。使用宽电压LM393比较器,信号干净,波形好,驱动能力强,超过15mA。配可调电位器可调节检测光线亮度。设有固定螺栓孔M3,方便安装。

2.1.2 工作原理 

        光敏电阻是用硫化隔或硒化隔等半导体材料制成的特殊电阻器,其工作原理是基于内光电效应。随着光照强度的升高,电阻值迅速降低,由于光照产生的载流子都参与导电,在外加电场的作用下作漂移运动,电子奔向电源的正极,空穴奔向电源的负极,从而使光敏电阻器的阻值迅速下降。其在无光照时,几乎呈高阻状态,暗电阻很大。

2.1.3 产品参数 

         工作电压:DC3.3-5V
        光敏电阻型号:5516

 2.1.4 使用说明

         数字量DO输出端可以直接驱动本店继电器模块,由此可以组成一个光控开关。模拟量A0可以和AD模块相连,通过AD转换,可以获得环境光强的数值。当环境光线亮度达不到设定闽值时,DO端输出高电平,当外界环境光线亮度超过设定闽值时,DO端输出低电平。检测亮度可以通过电位器进行调节,顺时针调电位器,检测亮度增加;逆时针调电位器,检测亮度减少。stm32第三课:按键控制led灯,光敏传感器控制蜂鸣器,stm32,嵌入式硬件,单片机,学习

2.2 初始化驱动代码的编写 

         首先创建有关于蜂鸣器的Buzzer.c和Buzzer.h的两个驱动文件,再创建有关于光敏传感器的LightSensor.c和LightSensor.h的两个驱动文件,按照上文的方法分别添加到Hardware文件中。

        Buzzer.c文件主要编写实现蜂鸣器响起来的代码函数,类型和上文类似,这里不再赘述。直接给出Buzzer.c和Buzzer.h的代码。

Buzzer.c

#include "stm32f10x.h"                  // Device header

void Buzzer_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	GPIO_SetBits(GPIOA,GPIO_Pin_12);
}

void Buzzer_ON(void)
{
	GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}



void Buzzer_OFF(void)
{
	GPIO_SetBits(GPIOB,GPIO_Pin_12);
}

void Buzzer_Turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_12) == 0)
	{
		GPIO_SetBits(GPIOB,GPIO_Pin_12);
	}
	else
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_12);
	}
}

Buzzer.h

#ifndef __Buzzer_H
#define __Buzzer_H

void Buzzer_Init(void);
void Buzzer_ON(void);
void Buzzer_OFF(void);
void Buzzer_Turn(void);



#endif

        关于LightSensor.c和LightSensor.h的两个驱动文件的话,在LightSensor.c文件中内容与上文类似,不过有关代码部分我们只需要传回光敏传感器引脚的值就行。代码如下:

LightSensor.c

#include "stm32f10x.h"                  // Device header

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

uint8_t LightSensor_Get(void)
{
	return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);
}

LightSensor.h

#ifndef __LIGHT_SENSOR_
#define __LIGHT_SENSOR_

void LightSensor_Init(void);
uint8_t LightSensor_Get(void);

#endif

如此一来,我们驱动文件基本上配置好了,下面只要完善主函数main.c中的代码即可。

2.3 电路接线方法

stm32第三课:按键控制led灯,光敏传感器控制蜂鸣器,stm32,嵌入式硬件,单片机,学习

2.4 主体代码演示 

         相关的头文件是必须要包含的,比如#include "stm32f10x.h"、#include "Delay.h",还有刚刚配置好的#include "Buzzer.h"、#include "LightSensor.h"等头文件。

        紧接着初始化Buzzer和LightSensor函数。

        在while循环函数中,接收光敏传感器返回的引脚电位数值,进行 if 判断。代码如下所示:

#include "stm32f10x.h"
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"


int main(void)
{
	Buzzer_Init();
	LightSensor_Init();
	
	
	while(1)
	{
		
		if (LightSensor_Get() == 1)
		{
			Buzzer_ON();
		}
		else
		{
			Buzzer_OFF();
		}
		
	}
	
}

2.5 实操效果演示 

stm32第三课:按键控制led灯,光敏传感器控制蜂鸣器,stm32,嵌入式硬件,单片机,学习

与君共勉 დ,关注我,持续更新中~ 文章来源地址https://www.toymoban.com/news/detail-861481.html

到了这里,关于STM32第三课:按键控制LED灯,光敏传感器控制蜂鸣器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机设计:stm32远程水位检测灌溉系统(水泵+电机驱动+OLED显示屏+水位传感器+防水式ds18b20+光敏传感器+按键+WiFi+手机app)

    单片机设计:stm32远程水位检测灌溉系统(水泵+电机驱动+OLED显示屏+水位传感器+防水式ds18b20+光敏传感器+按键+WiFi+手机app) 一、主要功能:    1.水位传感器检测水的高度、光敏传感器检测周围光照强度、ds18b20检测水温 2.0LED、手机app显示当前数据以及阈值 3.手机app远程调节阈值,

    2024年02月05日
    浏览(35)
  • DIY_实现光敏电阻传感器简单控制LED

    模块接线图: 1、VCC 接电源正极 3.3-5V 2、GND 接电源负极 3、DO TTL 开关信号输出 4、AO 模拟信号输出 模块特色: 1、工作电压3.3V-5V 2、使用宽电压LM393比较器 3、设有固定螺栓孔,方便安装 4、采用灵敏型光敏电阻传感器 5、小板PCB尺寸:3.2cm x 1.4cm 6、配可调电位器可调节检测光

    2024年02月02日
    浏览(24)
  • STM32-光敏传感器实验

    光敏传感器的主要是光敏二极管,核心是PN结,利用了光电效应,对光强很敏感,有单向导电性,工作时需要加反向电压。光照越强,等效电阻越小。 实验要求通过ADC3通道6(PF8)采集光敏二极管的电压,然后转换为0~100的光纤强度值并显示在液晶屏上。 由下图可知对于的通

    2024年02月05日
    浏览(27)
  • STM32F4_光敏传感器

    目录 1. 什么是光敏传感器、光敏电阻 2. 硬件分析 3. 实验程序 3.1 main.c 3.2 ADC3.c 3.3 ADC3.h 3.4 Lightsensor.c 3.5 Lightsensor.h 光敏传感器 也称为光电传感器。是利用光电器件把光信号转换成电信号的一种传感器。它的敏感波长在可见光波长附近,包括红外线波长和紫外线波长。光传感

    2024年02月05日
    浏览(25)
  • STM32学习记录——光敏传感器的使用

    文章目录 前言 一、学习目的 二、模块介绍 三、代码记录 总结        只做 学习记录 ,记录自己如何从零学会使用一个模块,仅仅只是会用,缺乏专业知识。如果需要了解更多原理,可以从我推荐的技术大佬的文章中获取。        我的学习目的就是通过STM32的ADC功能,学

    2024年02月07日
    浏览(46)
  • STM32_ADC————ADC+DMA多路数据传输,看门狗中断,传感器控制LED

    一:介绍ADC与DMA的基本情况与初始化 二:利用ADC+DMA+看门狗中断+传感器控制LED灯代码 三:总结实验过程中碰到的错误与问题 通过DMA转运ADC的数据,设置ADC的中断看门狗阈值,当光敏传感器的ADC采样值在看门狗高低阈值中间,不触发中断,如果超过看门狗的高低阈值就会触发

    2024年02月04日
    浏览(32)
  • Stm32_标准库_11_ADC_光敏&热敏传感器_测数值

    在测量光敏传感器数值得基础上手动将通道改成热敏传感器通道即可 由于温度传感器的测量范围是-20 ~ 105摄氏度,所以输出温度得考虑带上符号这就需要在原有输出光照强度代码的基础上新添加几个函数 函数1: 在获取模拟电压函数最开始写入通道函数方便接入GPIO_1或GPIO_

    2024年02月19日
    浏览(28)
  • Stm32_标准库_8_ADC_光敏传感器_测量具体光照强度

    ADC简介 测量方式 采用二分法比较数据 IO通道 ADC基本结构及配置路线 获取数字变量需要用到用到光敏电阻的AO口,AO端口接在PA0引脚即可 测得的模拟数据与实际光照强度之间的关系为 代码: 完整朴素代码: 效果: 此代码的不足之处在于每次写入数字都会提前占据固定位置,

    2024年02月04日
    浏览(29)
  • STM32——震动传感器点亮LED灯

    若产品不震动,模块上的 DO 口输出高电平; 若产品震动,模块上的 DO 口输出低电平,D0-LED绿色指示灯亮。 需求:当震动传感器接收到震动信号时,使用中断的方式点亮led1。 1、打开cubeMX a.在SYS中选择调试方式为串行线调试。 b.在RCC(复位和时钟控制)中选择 HSE(高速时钟)

    2024年02月04日
    浏览(30)
  • STM32按键控制LED

    1.利用模块化编程对LED 2.设置LED的几种状态(亮,灭,和利用按键反转电平) 3.按键 (1)按键初始化 (2)如果按键按下做什么(这里是控制LED) 4,主函数

    2024年02月12日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包