2.7 按键控制LED&光敏传感器控制蜂鸣器

模块化思想

在单片机中,我们使用的模块是很多的,每一个模块都需要初始化,如果把初始化的部分放在主函数中,那么主函数无疑会显得十分的臃肿,所以要进行模块化处理,所谓模块化处理,无非是把各个模块的初始化和操作分别以函数的形式封装在另一个.c\.h文件中,我们使用的时候只需要使用对应写好的函数即可。

按键控制LED接线图

1.我们创建一个关于控制LED模块的封装文件(led.h\led.c),并把它放入项目中。

2.在LED文件中,我们需要写7个函数,分别是LED初始化函数,LED开关函数以及LED反转函数。

LED函数代码

#include "stm32f10x.h"

void LED_Init(void){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开始GPIOA时钟
	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); //初始化PA1\PA2引脚
	
	GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2); //默认关闭灯光
}

void LED1_ON(){
	GPIO_ResetBits(GPIOA,GPIO_Pin_1); //开启led1灯光
}

void LED2_ON(){
	GPIO_ResetBits(GPIOA,GPIO_Pin_2); //开启led2灯光
}

void LED1_OFF(){
	GPIO_SetBits(GPIOA,GPIO_Pin_1); //关闭led1灯光
}

void LED2_OFF(){
	GPIO_SetBits(GPIOA,GPIO_Pin_2); //关闭led2灯光
}

void LED_Turn1(){
	if(GPIOA->IDR&GPIO_Pin_1){
		LED1_ON();
	}else{
		LED1_OFF();
	}
	
}

void LED_Turn2(){
	if(GPIOA->IDR&GPIO_Pin_2){
		LED2_ON();
	}else{
		LED2_OFF();
	}
	
}

 

3.我们创建一个关于按键的封装文件(anjian.h\anjian.c),并把它放入项目中。

4.在按键文件中,我们需要写3个函数,分别是按键初始化函数和按键检测函数。

按键函数代码

#include "stm32f10x.h"
#include "Delay.h"

void Anjian_Init(){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOB时钟
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11;
	GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PB10\PB11引脚
}

uint8_t Anjian(void){
	uint8_t ajnumber = 0;
	
	if( (GPIOB->IDR&GPIO_Pin_10) == 0 ){
		Delay_ms(20);
		while( (GPIOB->IDR&GPIO_Pin_10) == 0);
		Delay_ms(20);
		ajnumber = 1;
	}
	
	if( (GPIOB->IDR&GPIO_Pin_11) == 0 ){
		Delay_ms(20);
		while( (GPIOB->IDR&GPIO_Pin_11) == 0);
		Delay_ms(20);
		ajnumber = 2;
	}
	

	return ajnumber;
	
}

 

5.写逻辑函数(main),让按键正常控制LED。

#include "stm32f10x.h"
#include "led.h"
#include "anjian.h"
uint8_t KeyNum;
int main(){
LED_Init(); // LED初始化函数。
Anjian_Init(); //按键初始化函数。
while(1){
	KeyNum = Anjian(); //记录按键的返回值。
	if(KeyNum==1){  //若返回1,则代表按键1被按下,LED1状态被反转。
		LED_Turn1();
	}
	if(KeyNum==2){ //若返回2,则代表按键2被按下,LED2状态被反转。
		LED_Turn2();
         }
  }
return 0;
}

 

光敏传感器控制蜂鸣器接线图

光敏传感器,当我们遮住光线时,输出指示灯灭,代表输出高电平;松手时,输出指示灯亮,代表输出低电平,上面的蓝色螺丝是电位器,可以调节高低电平的判断阈值。

1.我们创建一个关于控制蜂鸣器模块的封装文件(fengmingqi.h\fengmingqi.c),并把它放入项目中。

2.在蜂鸣器文件中,我们需要写3个函数,分别是蜂鸣器初始化函数和蜂鸣器开关函数。

蜂鸣器函数代码

#include "stm32f10x.h"

void FMQ_Init(){
	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 FMQ_ON(){
	GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}

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

 

3.我们创建一个关于光敏电阻模块的封装文件(gmdz.h\gmdz.c),并把它放入项目中。

4.在光敏电阻模块文件中,我们需要写2个函数,分别是光敏电阻模块初始化函数和模块输出返回值函数。

光敏电阻模块函数代码

#include "stm32f10x.h"

void GMDZ_Init(){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitTypeDef GPIO_InitStrcture;
	GPIO_InitStrcture.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStrcture.GPIO_Pin=GPIO_Pin_13;
	GPIO_Init(GPIOB,&GPIO_InitStrcture);
}

uint8_t GMDZ_Output(){
	uint8_t output = 0;
	if(GPIOB->IDR&GPIO_Pin_13){
		return output; //当PB13引脚为高电平时,光线正常,返回0;
	}else{
		output = 1;
		return output; //当PB13引脚为低电平时,光线被遮挡,返回1;
	}
}

 

5.写逻辑函数(main),使得光敏电阻被遮挡,则蜂鸣器鸣叫。

#include "stm32f10x.h"
#include "gmdz.h"
#include “fengmingqi.h”
uint8_t GMNum;
int main(void){
	FMQ_Init();
	GMDZ_Init();
	while(1){
		GMNum = GMDZ_Output();
		if(GMNum == 1){ //如果返回1,代表光线被遮挡,蜂鸣器需要鸣叫。
		FMQ_ON();
		}
		
		if(GMNum == 0){ //如果返回0,代表光线正常,蜂鸣器停止鸣叫。
		FMQ_OFF();
		}
	  
	}
}