模块化思想
在单片机中,我们使用的模块是很多的,每一个模块都需要初始化,如果把初始化的部分放在主函数中,那么主函数无疑会显得十分的臃肿,所以要进行模块化处理,所谓模块化处理,无非是把各个模块的初始化和操作分别以函数的形式封装在另一个.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();
}
}
}