【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引脚两端当时都松动了