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