GPIO输入模式之按键控制及光敏传感器控制应用案例

news2024/11/18 2:26:56

系列文章目录

STM32之GPIO(General Purpose Input/Output,通用型输入输出)
GPIO输出控制之LED闪烁、LED流水灯以及蜂鸣器应用案例


文章目录

  • 系列文章目录
  • 前言
  • 一、按键简介
  • 二、传感器模块简介
    • 2.1 AO模拟量输出模块
    • 2.2 DO数字量输出模块
    • 2.3 指示灯
  • 三、按键硬件电路
    • 3.1 下接按键方式
    • 3.2 上接按键方式
  • 四、传感器硬件电路
  • 五、GPIO输入模式应用案例
    • 5.1 按键控制LED
      • 5.1.1 电路接线以及原理图
      • 5.1.2 应用案例代码
      • 5.1.3 应用案例分析
    • 5.2 光敏传感器控制蜂鸣器
      • 5.2.1 电路接线图
      • 5.2.2 应用案例代码
      • 5.2.3 应用案例分析


前言

提示:本文主要用作在学习江协科大STM32入门教程后做的归纳总结笔记,旨在学习记录,如有侵权请联系作者

本文主要探讨stm32的GPIO输入模式,最后通过两个简单的应用案例(按键控制LED以及光敏传感器控制蜂鸣器)实现了GPIO输入状态的监测。


一、按键简介

  • 按键:常见的输入设备,按下导通,松手断开。
  • 按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动。

在这里插入图片描述

二、传感器模块简介

如下图所示,从左到右分别是光敏电阻传感器、热敏电阻传感器、对射式红外传感器以及反射式红外传感器。

在这里插入图片描述

这些传感器模块都是利用传感器元件比如光敏电阻、热敏电阻、红外接收管等,这些元件的电阻会随外界的模拟量变化而变化。比如光线越强,光敏电阻的阻值就会越小。温度越高,热敏电阻的阻值就越小。红外光线越强,红外接收管的阻值就越小。

但是电阻的变化不容易直接被观察,所以我们通常将传感器元件与定值电阻进行串联分压,这样就可以得到模拟电压的输出了,对电路来说,检测电压就非常容易了。另外,这个模块还可以通过电压比较器来对这个模拟电压进行二值化,这样就可以得到数字电压输出了。

在这里插入图片描述

上图所示为传感器模块的基本电路图,我们先来看一下下图这部分电路(AO口为模拟量输出,DO口为数字量输出

2.1 AO模拟量输出模块

在这里插入图片描述

电路中的N1就是传感器元件所代表的可变电阻,它的阻值可以根据环境的光线、温度等模拟量进行变化。上面这个R1是和N1进行分压的定值电阻,R1和N1进行串联,一端接到VCC正极,另一端接到GND负极,这就构成了基本的分压电路。

左边这个C2是一个滤波电容,它是为了给中间的电压输出进行滤波的,用来滤除一些干扰,保证输出电压波形的平滑。一般我们在电路里遇到这种一端接在电路中,另一端接地的电容,都可以考虑一下这个是不是滤波电容的作用。如果是滤波电容的作用,那这个电容就是用来保证电路稳定的,并不是电路的主要框架。那这时我们在分析电路的时候就可以先把这个电容抹掉,这样就可以使我们的电路分析变得更加简单了。那我们把这个电容抹掉,整个电路的主要框架就是定值电阻和传感器电阻的分压电路了。

在这里插入图片描述
在这里可以用分压定理来分析一下传感器电阻的阻值变化对输出电压的影响,当然我们还可以用上下拉电阻的思维来分析。当这个N1阻值变小时,下拉作用就会增强,中间的AO端的电压就会拉低。极端情况下,N1阻值为0,AO输出被完全下拉,输出0V。当N1阻值变大,下拉作用就会减弱,中间的引脚由于R1的上拉作用,电压就会升高。极端情况下,N1阻值无穷大,相当于断路,输出电压被R1拉高至VCC。这就是用上下拉电阻的思维来分析的。

2.2 DO数字量输出模块

在这两个电阻的分压下,AO就是我们想要的模拟电压输出了。这个模块还支持数字输出,这个数字输出就是对AO进行二值化的输出。这里的二值化是通过LM393芯片来完成的,如下图所示就是数字输出模块电路。

在这里插入图片描述

这个LM393是一个电压比较器芯片,里面有两个独立的电压比较器电路,然后剩下的是VCC和GND供电,那我们VCC就接到电路的VCC,GND也接到了电路的GND,这里有个电容,是一个电源供电的滤波电容。这个电压比较器其实就是一个运算放大器,当同相输入端电压大于反相输入端电压时,输出就会瞬间升高为最大值,也就是输出接VCC。反之,当同相输入端电压小于反相输入端电压时,输出就会瞬间降低为最小值,也就是输出接GND。这样就可以对一个模拟电压进行二值化了。

在这里插入图片描述
我们来看一下实际的应用,如上图所示。这里的同相输入端IN+接到了模拟电压端AO这里的IN+,而反相输入端IN-这里接了一个电位器,这个电位器的接法也是分压电阻的原理。拧动电位器,IN-就会生成一个可调的阙值电压,两个电压进行比较,最终输出结果就是DO,也就是数字电压输出。DO最终就接到了引脚的输出端,这就是数字电压的由来。

2.3 指示灯

在这里插入图片描述
这里还有两个指示灯电路,左边这个是电源指示灯,通电就会亮。右边的是DO输出指示灯,它可以指示DO的输出电平,低电平点亮,高电平熄灭。那右边DO这里还多了一个R5上拉电阻,这个是为了保证默认输出为高电平的。然后就是P1的排针,分别是VCC、GND、DO以及AO。

在这里插入图片描述

对于光敏电阻传感器来说,这个N1就是光敏电阻。对于热敏电阻传感器来说,这个N1就是热敏电阻。对于这个红外传感器来说,这个N1就是一个红外接收管,当然对应还会有一个点亮红外发射管的电路。

三、按键硬件电路

在这里插入图片描述
按键有四种接法,上面两个是下接按键的方式,下面两个是上接按键的方式一般来说我们的按键都是采用下接按键的方式, 也就是上面的两种接法。这个原因跟LED的接法类似,是电路设计的习惯和规范。

3.1 下接按键方式

我们先来看一下左上角第一个图,这种接法是按键最常用的接法了。在这里随便选取一个GPIO口,比如PA0,然后通过K1接到地。当按键按下时,PA0被直接下拉到GND,此时读取PA0口的电压就是低电平。当按键松手时,PA0被悬空,悬空会出现什么情况呢?就是引脚的电压不确定对吧。所以在这种接法下,必须要求PA0是上拉输入的模式,否则就会出现引脚电压不确定的错误现象。如果PA0是上拉输入的模式,当引脚悬空时,PA0就是高电平。所以这种方式下,按下按键,引脚为低电平。松手,引脚为高电平。

在这里插入图片描述

接着再来看一下第二个图,相比较第一个图,在这里外部接了一个上拉电阻。这个上拉电阻大家可以想象成一个弹簧把这个端口往屋顶拉。当按键松手时,引脚由于上拉作用,自然保持为高电平。当按键按下时,引脚直接接到GND,也就是一股无穷大的力把这个引脚往下拉,那弹簧肯定对抗不了无穷大的力啊,所以引脚就为低电平。这种状态下引脚不会出现悬空状态,所以此时PA0引脚可以配置为浮空输入或者上拉输入。如果是上拉输入,那就是内外两个上拉电阻共同作用了,这时高电平就会更强一些,对应高电平更加稳定。当然这样的话,当引脚被强行拉到低时,损耗也就会大一些。

在这里插入图片描述

3.2 上接按键方式

那接下来看第三个图,PA0通过按键接到3.3V,这样也是可以的,不过要求PA0必须配置成下拉输入模式。当按键按下时,引脚为高电平,松手时,引脚回到默认值低电平。 注意:这要求单片机的引脚可以配置为下拉输入的模式,一般单片机可能不一定有下拉输入的模式,所以最好还是用上面的两种下接按键的方式,下面两种作为扩展部分,大家了解一下即可。

在这里插入图片描述

那最后一种接法,就是在刚才的这种接法下面再外接一个下拉电阻,这个接法PA0需要配置为下拉输入模式或者浮空输入模式。至于分析大家应该已经清楚了,这里就不再细讲了。

在这里插入图片描述

总结: 上面这两种接法是,按键按下,引脚为低电平,松手,引脚为高电平。下面这两种接法是,按键按下,引脚为高电平,松手,引脚为低电平。左边两种接法必须要求引脚是上拉或者是下拉输入模式,右边两种接法可以允许引脚是浮空输入的模式,因为已经外置了上拉电阻和下拉电阻。一般我们都用上面两种接法,下面两种接法用得较少。

四、传感器硬件电路

在这里插入图片描述
这里VCC接3.3V,GND接地,用于供电。DO数字输出随便接一个端口比如PA0,用于读取数字量。AO模拟输出暂时不接,等到学ADC模数转换器时再说。

五、GPIO输入模式应用案例

5.1 按键控制LED

本案例实现了一个通过按键控制LED灯亮灭的功能,两个按键分别接到GPIOB的PB1和PB11端口,分别控制接到GPIOA的PA1和PA2的LED亮灭。按下按键,LED点亮,再按下按键,LED熄灭。

5.1.1 电路接线以及原理图

在这里插入图片描述

在这里插入图片描述

5.1.2 应用案例代码

延时头文件Delay.h:

#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

延时实现文件Delay.c:

#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

LED头文件LED.h:

#ifndef __LED_H
#define __LED_H

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

#endif

LED实现文件LED.c:

#include "stm32f10x.h"                  // Device header

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);
	}
}

按键头文件Key.h:

#ifndef __KEY_H
#define __KEY_H

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

#endif

按键实现文件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;
}

主程序文件main.c:

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

uint8_t KeyNum;

int main(void)
{
	LED_Init();
	Key_Init();
	
	while (1)
	{
		KeyNum = Key_GetNum();
		if (KeyNum == 1)
		{
			LED1_Turn();
		}
		if (KeyNum == 2)
		{
			LED2_Turn();
		}
	}
}

5.1.3 应用案例分析

先来看一下LED初始化函数:

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);
}
  1. 开启GPIOA的时钟。
  2. 配置PA1和PA2为推挽输出模式,速度为50MHz。
  3. 初始化PA1和PA2引脚,并设置为高电平(即关闭LED灯)。

LED状态切换函数:

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_Turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_2);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_2);
	}
}
  • 读取PA1或PA2引脚的状态,如果为低电平(LED灯亮),则设置为高电平(LED灯灭),反之亦然。

再来看一下按键初始化函数:

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);
}
  1. 开启GPIOB的时钟。
  2. 配置PB1和PB11为上拉输入模式,速度为50MHz。

注意:由于是按键下接方式,为了保证按键按下时为低电平,松开是高电平,因此必须要将按键的引脚配置为上拉输入模式以保证引脚在悬空时为高电平,在上面按键的接法原理分析时已经讲过这一点了。

获取按键编号的函数:

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;
}
  1. 检测PB1和PB11按键是否按下。
  2. 如果检测到按键按下,进行20ms的去抖动延迟,之后再次检测按键状态。
  3. 根据按键的状态,返回按键编号1或2。

最后看下主程序整体结构:

int main(void)
{
	LED_Init();
	Key_Init();
	
	while (1)
	{
		KeyNum = Key_GetNum();
		if (KeyNum == 1)
		{
			LED1_Turn();
		}
		if (KeyNum == 2)
		{
			LED2_Turn();
		}
	}
}
  1. 初始化LED和按键。
  2. 在主循环中,持续检测按键状态。
  3. 根据检测到的按键编号,调用相应的LED状态切换函数。

5.2 光敏传感器控制蜂鸣器

本案例实现了一个通过光敏电阻传感器控制蜂鸣器的功能。蜂鸣器I/O控制引脚接到GPIOB的PB12口,光敏电阻传感器DO输出引脚接到GPIOB的PB13口。当我们遮住光线时,输出指示灯灭,代表输出高电平。当我们松手时,输出指示灯亮,代表输出低电平。

5.2.1 电路接线图

在这里插入图片描述

5.2.2 应用案例代码

蜂鸣器头文件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

蜂鸣器实现文件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(GPIOB, 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);
	}
}

光敏传感器模块头文件LightSensor.h:

#ifndef __LIGHT_SENSOR_H
#define __LIGHT_SENSOR_H

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

#endif

光敏传感器模块实现文件LightSensor.c:

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

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);
}

uint8_t LightSensor_Get(void)
{
    uint8_t state = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
    Delay_ms(10);  // 短暂延迟
    if (state == GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13)) {
        return state;
    } else {
        return !state;
    }
}

主程序文件main.c:

#include "stm32f10x.h"                  // Device header
#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();
		}
	}
}

5.2.3 应用案例分析

先来看一下蜂鸣器初始化函数:

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(GPIOB, GPIO_Pin_12);
}
  1. 启用GPIOB的时钟。
  2. 将PB12配置为推挽输出模式,速度为50MHz。
  3. 初始化PB12,并设置为高电平,确保蜂鸣器初始状态为关闭(PNP型三极管驱动,低电平触发)。

蜂鸣器控制函数:

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

void Buzzer_OFF(void)
{
    GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
  • Buzzer_ON: 将PB12设置为低电平,打开蜂鸣器。
  • Buzzer_OFF: 将PB12设置为高电平,关闭蜂鸣器。

再来看一下光敏传感器初始化函数:

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);
}
  1. 启用GPIOB的时钟。
  2. 将PB13配置为上拉输入模式(IPU),速度为50MHz。

光敏传感器获取状态函数:

uint8_t LightSensor_Get(void)
{
    uint8_t state = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
    Delay_ms(10);  // 短暂延迟
    if (state == GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13)) {
        return state;
    } else {
        return !state;
    }
}

通过读取GPIOB的PB13引脚的电平状态,结合延迟和重复读取,返回光敏电阻传感器的稳定状态。

最后看一下主函数:

int main(void)
{
    Buzzer_Init();
    LightSensor_Init();
    
    while (1)
    {
        if (LightSensor_Get() == 1)
        {
            Buzzer_ON();
        }
        else
        {
            Buzzer_OFF();
        }
    }
}
  1. 初始化蜂鸣器和光敏电阻传感器。
  2. 进入无限循环,不断检查光敏电阻传感器的输出。
  3. 如果传感器输出为高电平(光线被遮挡),打开蜂鸣器。
  4. 如果传感器输出为低电平(光线正常),关闭蜂鸣器。

整体代码实现了根据光敏电阻传感器状态对蜂鸣器进行控制的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1991385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言加油站】数据在内存中的存储

数据在内存中的存储 导读一、计算机中的数据类型二、整数在计算机中的存储2.1 整数的存储形式——原码、反码与补码2.2 三种形式之间的相互转换2.3 采用补码存储整数的原因 三、大小端字节序与字节序判断3.1 大端存储与小端存储3.2 为什么会出现大小端存储?3.3 大端…

家用设备轻松搭建 AI 集群,畅跑 Llama 3.1 405B

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 本文主要介绍如何在家用设备上运行大型开源语言模型Llama 3.1 405B,首先我会解释构建人工智能集群来提高运行效率的原理,随后会演示如何通过Distributed Llama项目支持在多个设备上运行LLM模型,并…

【STL】05.vector的模拟实现

一、vector的实现 1.1 基本框架 template<class T> class vector {typedef T* iterator;typedef const T* const_iterator; public:private:iterator _startnullptr;iterator _finishnullptr;iterator _end_of_storagenullptr; };1.2 vector的默认成员函数 1.2.1 构造…

如何通过大模型生成业务需要的数据集

现在大模型训练数据的主力都是LLM自己贡献的了。但是也不是说你让它输出什么&#xff0c;然后它就一劳永逸地不停地输出你想要的东西。受限于LLM本身的能力、上下文规定的长度、训练方式导致的有限变化&#xff0c;你需要不断变更你的prompt&#xff0c;以让输出更多样。 接下…

录屏为什么没有声音?一款软件为您解决无声难题

录屏已经成为我们日常工作和生活中不可或缺的一部分。然而&#xff0c;有时在录屏过程中&#xff0c;我们可能会遇到一个令人困惑的问题&#xff1a;录屏为什么没有声音&#xff1f;本文将详细解析电脑录屏没有声音的可能原因&#xff0c;并提供相应的解决方案。同时&#xff0…

YOLOv10问世,登顶GiTHub!性能飞升,【多尺度目标检测】值得大看特看!

【多尺度目标检测】是近年来在深度学习领域中备受关注的一项技术&#xff0c;它通过处理图像中不同尺度的目标&#xff0c;显著提升了模型在复杂场景中的检测精度和鲁棒性。多尺度目标检测技术已经在自动驾驶、安防监控和遥感图像分析等多个领域取得了显著成果&#xff0c;其独…

SQL Server Management Studio的使用

之前在 https://blog.csdn.net/fengbingchun/article/details/140961550 介绍了在Windows10上安装SQL Server 2022 Express和SSMS&#xff0c;这里整理下SSMS的简单使用&#xff1a; SQL Server Management Studio(SSMS)是一种集成环境&#xff0c;提供用于配置、监视和管理SQL…

前端工程师学习springboot2.x之配置idea热更新实现高效率开发节奏

目前已经学习springboot实现了增删改查分页查询&#xff0c;每次修改业财或者是代码重启项目都让我觉得很闹心&#xff0c;现在给出idea2021版本自带热更新操作设置&#xff0c;设置过程分享给大家 总结&#xff1a;以上就是配置的全部过程&#xff0c;祝大家写代码快乐…

鸿蒙(Harmony) NEXT - AlphabetIndexer实现联系人字母索引

鸿蒙(Harmony) NEXT 9月份就要正式上架了&#xff0c;并且不会再兼容安卓平台&#xff0c;于是我也赶紧给App开发鸿蒙版本&#xff0c;接下来会写一系列的Harmony开发教程。 今天使用AlphabetIndexer实现联系人字母索引&#xff0c;AlphabetIndexer是官方封装好的组件 咱们实…

【驱动程序】3.5寸SPI液晶屏_ILI9488_stm32f103c8t6_CubeMX_HAL库

【驱动程序】3.5寸SPI液晶屏_ILI9488_stm32f103c8t6_CubeMX_HAL库 主控芯片&#xff1a; stm32f103c8t6 接线&#xff1a; LED-3.3v其他管脚按main.h文件接: #define LCD_CS_Pin GPIO_PIN_1 #define LCD_CS_GPIO_Port GPIOA #define LCD_RS_Pin GPIO_PIN_2…

武汉流星汇聚:全球化与多元化并进,亚马逊展望电商领域无限可能

在全球电商的浩瀚星空中&#xff0c;亚马逊无疑是最为耀眼的一颗星辰。凭借其多年在跨境市场的深耕细作&#xff0c;亚马逊不仅积累了庞大的高活跃用户群&#xff0c;还构建了显著的平台流量优势。根据Similar Web的权威数据&#xff0c;亚马逊的独立访问用户数量已超过26.59亿…

EGO-Swarm 仿真环境搭建

EGO-Swarm仿真环境搭建 参考教程&#xff1a; https://github.com/ZJU-FAST-Lab/ego-planner-swarm EGO-Swarm是一种分散的异步系统解决方案&#xff0c;用于仅使用机载资源在未知的障碍物丰富的场景中进行多机器人自主导航。 1. 查看系统环境 要运行本仿真程序&#xff0c…

评估测量仪器/传感器时的各种精度解析一览

在工业测量中&#xff0c;精度是一个复合概念&#xff0c;涉及到多个方面&#xff0c;通常用来描述测量结果的准确性和可靠性。 在选择测量仪器/传感器时&#xff0c;面对众多的精度名称&#xff0c;你是否苦恼他们具体描述的是什么精度&#xff0c;是否和评估要求有直接关联&…

开放式耳机有什么好处?开放式耳机该怎么选?

​开放式耳机的好处多多呀&#xff01;如今&#xff0c;开放式耳机已经迅速成为耳机市场上的新宠&#xff0c;它们以其独特的佩戴方式和卓越的音质表现&#xff0c;赢得了广大音乐爱好者和运动达人的喜爱。尤其是对于那些热爱听歌和追求运动自由的人们来说&#xff0c;开放式耳…

电脑录屏软件推荐,6款高效录屏神器(2024最全最新)

电脑录屏软件成为了我们工作、学习和娱乐中不可或缺的工具。无论是录制PPT演示、QQ聊天过程&#xff0c;还是进行专业的直播或教学&#xff0c;都需要一款功能强大、操作简便的录屏软件。 那么&#xff0c;本文将为大家进行电脑录屏软件推荐&#xff0c;让您无论在哪种录屏场景…

共享之道——享元模式(Python实现)

共享之道——享元模式&#xff08;Python实现&#xff09; 大家好&#xff0c;今天我们继续来讲结构型设计模式&#xff0c;上一期我们介绍了外观模式&#xff0c;这一期我们来讲享元模式&#xff08;Flyweight Pattern&#xff09;。 享元模式&#xff08;Flyweight Pattern…

超实用 不再担心猫咪掉毛 一文教你养宠家庭空气净化器怎么选

一到夏天&#xff0c;家中的猫咪给你带来的不仅仅是温暖的陪伴&#xff0c;还有那挥之不去的宠物异味。普通空气净化器虽然能够应对一般的空气净化需求&#xff0c;但对于养猫家庭特有的挑战&#xff0c;如宠物毛发、皮屑和异味等&#xff0c;它们往往难以胜任。专业的宠物空气…

【LLM大模型】大模型Prompt Engineering提示词工程

目录&#xff1a; 1、提示工程简介 2、如何写好提示词 2.1 描述清晰2.2 角色扮演2.3 提供示例2.4 复杂任务分解2.5 使用格式符区分语义2.6 情感和物质激励2.7 使用英语2.8 结构化提示词 1、提示工程简介 1.1 什么是Prompt 提示词&#xff1f; 不论是文生图应用&#xff0c;…

STM32-门电路-储存器-寄存器-STM32f1-MCU-GPIO-总线-keil5-点led

1、门电路 门电路组成简单加法器&#xff1a; 二进制对电路的影响&#xff1a; 0和1代表无和有&#xff1b; 以下图例&#xff0c;演示与门&#xff1a;左1右1输出1&#xff1b; 电平标准&#xff1a;使用不同的电压表示数字0和1&#xff1b; 高电平&#xff1a;1&#xff1…