【江科大STM32合集】day2按键控制LED光敏传感器控制峰鸣器

【STM32合集】day2按键控制LED&光敏传感器控制峰鸣器

    • 电路基础
    • c语言基础
      • main.c
        • key.c
        • 结果
      • 实现一个键开关灯
      • 实验结果+避坑

电路基础

运算放大器-在江科大51单片机b站视频(AD/DA)复习
原理:两个极端
同相输入端电压 》反相输入端 电压输出最大值 接Vcc
同相输入端电压《 反向输入端 电压输出最小值 接GNd

c语言基础

LED.c用来存放驱动程序的主体代码 (ps:逻辑运算代码都在这
LED.h用来存放驱动程序可以对外提供的函数或变量的声明 (ps:相当于java接口的概念

1.3.1 c文件模块化规范演示-主体代码

这里注意是GPIO_Mode_Out_PP别用成了GPIO_Mode_AF_PP模式
在这里插入图片描述

1.3.2 h头文件模块化-外部可以调用声明
在这里插入图片描述

使用模块化的函数

在这里插入图片描述

记得编译下载一下,检查有没有报错

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_ON();}	if(KeyNum==2){LED1_OFF();}	}
}
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;//按键默认返回0,默认低电平if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)	==0){//按下B1端口的键Delay_ms(20);//消抖while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)	==0);Delay_ms(20);//消抖KeyNum=1;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)	==0){//按下B11端口的键Delay_ms(20);//消抖while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)	==0);Delay_ms(20);//消抖KeyNum=2;}return KeyNum;
}	
结果
按一下B1键实现亮灯,B2键关灯

实现一个键开关灯

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_Mode_AF_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);//亮了一个灯,我这里误写成用了GPIO_Mode_AF_PP模式}//开关灯1
void LED1_Turn(void)
{if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0){	GPIO_SetBits(GPIOA, GPIO_Pin_1);//赋值1,高电平熄灭}else{GPIO_ResetBits(GPIOA, GPIO_Pin_1);//赋值0,低电平点亮}}
//开关灯2
void LED2_Turn(void)
{if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0){	GPIO_SetBits(GPIOA, GPIO_Pin_2);//赋值1,高电平熄灭}else{GPIO_ResetBits(GPIOA, GPIO_Pin_2);//赋值0,低电平点亮}}//点亮灯1
void LED1_ON(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_1);//赋值0,低电平点亮}
//熄灭灯1
void LED1_OFF(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_1);//赋值1,高电平熄灭
}
//点亮灯2
void LED2_ON(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_2);//赋值0,低电平点亮}
//熄灭灯2
void LED2_OFF(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_2);//赋值1,高电平熄灭
}

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)//控制开关led2{LED1_Turn();}	if(KeyNum==2)//控制开关led2{LED2_Turn();}	}
}

实验结果+避坑

按B1键 A1引脚的灯 能开关
按B11键 A2引脚的灯 能开关
过程中间没有亮灯的,检查引脚是否插好或者正确
not target 报错可以检查下是否单片机上的电源灯正确亮了,我的vcc引脚两端当时都松动了