当前位置: 首页 > news >正文

现在用什么cms做网站好个人网站模板王

现在用什么cms做网站好,个人网站模板王,js跳转网站,东营网站建设公司目录 前言 一、硬件介绍 1.按键 2.传感器模块 二、按键控制LED灯亮灭 1.电路连线图 2. 工程文件添加 3.GPIO口读取函数介绍 (1)输入数据的读取 (2)输出数据的读取 4.代码编写 (1)按键模块 …

目录

前言

一、硬件介绍

1.按键

2.传感器模块

二、按键控制LED灯亮灭

1.电路连线图

2. 工程文件添加 

3.GPIO口读取函数介绍

(1)输入数据的读取 

(2)输出数据的读取 

4.代码编写

(1)按键模块

(2)LED模块

(3)主函数main.c 

三、光敏传感器控制蜂鸣器警报

1.电路连接图

2.代码编写

(1)蜂鸣器模块

(2)光敏传感器模块

(3)主函数main.c 


前言

        本期继续学习stm32的GPIO口,上一期是学习了GPIO口进行输出操作,那么本期就学习GPIO口的输入操作,本期分为两个实际项目,分别是通过按键控制LED灯的亮灭、通过光敏传感器去控制蜂鸣器的警报。(视频:[3-4] 按键控制LED&光敏传感器控制蜂鸣器_哔哩哔哩_bilibili)

一、硬件介绍

1.按键

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

对此我们在编写代码的时候要对按键进行消抖处理,学过51的都知道了吧。下面在看看按键的硬件电路,对于按键的硬件电路,我们一般情况都是用第一行的样式,也就是IO口低电平有效,当按键没有按下的时候IO口就保持高电平状态,所以上面会接一个上拉电阻来实现保持电平,当按键按下的时候,IO口就接地,此时为低电平整体,按键导通电路。对于下面的第第二行样式效果是一样的,不过跟上面的方式相反,是属于高电平有效,但是一般情况都是不用到,基本上都是用第一行低电平有效的方式,所以稍微了解一下就行了。

2.传感器模块

传感器模块:传感器元件(光敏电阻 / 热敏电阻 / 红外接收管等)的电阻会随外界模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出,再通过电压比较器进行二值化即可得到数字电压输出

 传感器模块是经常用到的,比如红外线传感器,超声波传感器等等,不过本期我们用到的是光敏电阻传感器,学过光敏电阻的都知道,光敏电阻就是光线越量的时候电阻就越小,光线暗的时候电阻就变大,对于光敏电阻传感器同样的,下面电路图我们可以看出,光线量的时候DO口就会被导入高电平,此时LED指示灯就会量,DO口为低电平,反之光线暗的时候LED指示灯就会灭,此时DO口为高电平。(想了解更多传感器请看这个:IoT物联网嵌入式设备中30种常见传感器模块简介及原理讲解_数据采集各个模块的传感器-CSDN博客) 

知道了这些,下面就开始今天的项目吧。

二、按键控制LED灯亮灭

1.电路连线图

先看电路的接线图:

这里我们要用到的是GPIOA口的1和2引脚,GPIB口的1和11引脚,前者是LED的引脚,后面是按键的引脚。对于编程,我们最好用模块化编程去做。

2. 工程文件添加 

这里打开项目的根目录,然后创建一个hardware的文件夹:

然后打开三个小方块这个图标,把这个文件夹添加进去,后面就是在这里创建圈起来的这四个文件。 

然后就是打开魔术棒图标:

 按照下面123步骤去把根目录下的hardware这个文件夹添加进去就行了。

3.GPIO口读取函数介绍

这里我们要学习下面几个GPIO口的读取函数,其实也很简单,也就是读取IO口输入输出寄存器里面的数据。

(1)输入数据的读取 

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
这个函数是用来读取输入数据寄存器某一个端口的输入值,参数是GPIOx和GPIO_Pin,用来指定某一个端口。

返回值是uint8_t,代表这个端口的高低电平。


uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
这个函数比上一个函数少了一个Bit,它是用来读取整个输入数据寄存器的,参数只有一个GPIOx,用来指定外设。

返回值是uint16_t,是一个16位的数据,每一位代表一个端口值。

(2)输出数据的读取 

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
这个函数是用来读取输出数据寄存器的某一位,所以它并不是用来读取端口的输入数据的,这个函数一般用于输出模式下,用来看一下自己输出的是什么。


uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
这个函数比上一个函数少了一个Bit,是用来读取整个输出寄存器的。

4.代码编写

这里要用到相关的延时函数,我会上传到本期的资源绑定,自行下载。

要用到的模块也就这些:

(1)按键模块

Key.c文件:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"void Key_init(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_initstruct; GPIO_initstruct.GPIO_Mode=GPIO_Mode_IPU; GPIO_initstruct.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_11;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_initstruct);}uint8_t Keynum(){uint8_t num=0;if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0){Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)Delay_ms(20);num=1;}if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0){Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)Delay_ms(20);num=2;}return num;
}

Key.h文件

#ifndef __KEY_H
#define __KEY_Hvoid Key_init();uint8_t Keynum();
#endif
(2)LED模块

LED.c文件

#include "stm32f10x.h"                  // Device headervoid LED_init(void){//定义时钟 GPIOARCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_initstruct; GPIO_initstruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_initstruct.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_2;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_initstruct);GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);}
//低电平亮
void LED1_ON(){GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
void LED1_OFF(){GPIO_SetBits(GPIOA,GPIO_Pin_1);
}//电平翻转
void LED1_turn(){if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0){GPIO_SetBits(GPIOA,GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_1);}	
}void LED2_ON(){GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
void LED2_OFF(){GPIO_SetBits(GPIOA,GPIO_Pin_2);
}//电平翻转
void LED2_turn(){if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0){GPIO_SetBits(GPIOA,GPIO_Pin_2);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_2);}	
}

LED.h文件

#ifndef __LED_H
#define __LED_Hvoid LED_init(void);void LED1_ON();
void LED1_OFF();
void LED2_ON();
void LED2_OFF();
void LED1_ON();
void LED2_ON();
#endif
(3)主函数main.c 

最后就是主函数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=Keynum();if (keynum==1){LED1_turn();}if (keynum==2){LED1_turn();}}
}

三、光敏传感器控制蜂鸣器警报

1.电路连接图

工程文件添加的操作步骤跟上面的一模一样的,这里我就给大家看结果,要添加哪些文件,步骤不熟悉的话请重新看什么的就行了,这里就不多说了。

2.代码编写

(1)蜂鸣器模块

Buzzer.c文件

#include "stm32f10x.h"                  // Device headervoid Buzzer_init(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_initstruct; GPIO_initstruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_initstruct.GPIO_Pin=GPIO_Pin_12;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_initstruct);GPIO_SetBits(GPIOB,GPIO_Pin_12);}
//低电平亮
void Buzzer_ON(){GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}
void Buzzer_OFF(){GPIO_SetBits(GPIOB,GPIO_Pin_12);
}//电平翻转
void Buzzer_turn(){//读取输出的电平,然后去调整if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_12)==0){GPIO_SetBits(GPIOB,GPIO_Pin_12);}else{GPIO_ResetBits(GPIOB,GPIO_Pin_2);}	
}

Buzzer.h文件

#ifndef __BUZZER_H
#define __BUZZER_Hvoid Buzzer_init();
void Buzzer_ON();
void Buzzer_OFF();
void Buzzer_turn();#endif
(2)光敏传感器模块

Lightsensor.c文件

#include "stm32f10x.h"                  // Device headervoid Lightsensor_init(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_initstruct; GPIO_initstruct.GPIO_Mode=GPIO_Mode_IPU; GPIO_initstruct.GPIO_Pin=GPIO_Pin_13;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_initstruct);}uint8_t Lightsensor_get(){//有光的时候,io口输入高电平到stm32,被读取到;光线不好,就输入低电平return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);
}

Lightsensor.h文件

#ifndef __LIGHTSENSOR_H
#define __LIGHTSENSOR_H
void Lightsensor_init();
uint8_t Lightsensor_get();#endif
(3)主函数main.c 
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Lightsensor.h"
#include "Buzzer.h"int main(void)
{	Buzzer_init();Lightsensor_init();while(1){if(Lightsensor_get()==1){Buzzer_ON();}else{Buzzer_OFF();}}
}

现象的话就是,当你用手遮住光敏传感器的时候,蜂鸣器就会响起来。

以上就是本期的全部内容了,我们下次见!

每日壁纸:

http://mrfarshtey.net/news/149/

相关文章: