01:STM32点灯大师和蜂鸣器

目录

一:点亮1个LED

1:连接图

2:函数介绍

3:点灯代码

二:LED闪烁

1:函数介绍

2:闪烁代码

三:LED流水灯

1:连接图

2:函数介绍

3:流水灯代码

四:按键控制LED

1:电路图

2:连接图

3:函数介绍

4:按键控制LED代码

五:蜂鸣器

1:连接图

2:蜂鸣器代码

六:光敏电阻控制蜂鸣器

1:连接图

2:函数介绍

3:光敏电阻控制蜂鸣器代码


一:点亮1个LED

1:连接图

因为IO口与LED负极相连所以IO口输出低电频,点亮LED (采用的是低电频点亮)

STM32的GPIO(通用输入输出口)总共需要3个步骤

A:第一步,使用RCC开启GPIO的时钟

B:第二步,使用GPIO_Init函数初始化GPIO

C:第三步,使用输出或者输入的函数控制GPIO口

2:函数介绍

stm32f10x_rcc.h文件中经常使用的函数只有3个 (RCC开启GPIO的时钟):

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

RCC_AHBPeriphClockCmd: 第一个参数就是选择哪个外设 ,第二个参数ENABLE(启动) or DISABLE(无效))

RCC_APB2PeriphClockCmd和RCC_APB1PeriphClockCmd参数意思一致: 第一个参数选择外设,第二个参数使能ENABLE或失能DISABLE

stm32f10x_gpio.h文件中经常使用的函数很多(PIO_Init函数初始化GPIO) :

void GPIO_DeInit(GPIO_TypeDef* GPIOx);

void GPIO_AFIODeInit(void);

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

GPIO_Init: 这个函数的作用是,用结构体的参数来初始化GPIO口, 我们首先需要先定义一个结构体变量,然后再给结构体赋值,最后调用这个函数. 这个函数内部就会自动读取结构体内部的值,然后自动把外设的各个参数配置好.

第一个参数就是选择哪个外设, 第二个参数就是结构体,我们先把结构体类型复制下来

使用输出或者输入的函数控制GPIO口

GPIO_ResetBits: 第一个参数就是选择哪个外设(GPIOx x=A~G), 第二个参数就是 GPIO_Pin_x (x=0~15)把指定的端口设置为低电频,

3:点灯代码

cpp 复制代码
#include "stm32f10x.h"                  // Device header
int main(void){
	//第一步,使用RCC开启GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//第二步,使用GPIO Init函数初始化GPIO
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//第三步,使用输出或者输入的函数控制GPIO口
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);
	while(1){
	}
}

推挽输出 GPIO_Mode_Out_PP高低电频都有驱动能力

二:LED闪烁

连接图同(一:点亮1个LED)

1:函数介绍

stm32f10x_gpio.h文件中经常使用的函数很多(PIO_Init函数初始化GPIO) :

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

GPIO_SetBits和GPIO_ResetBits函数的参数相同: 第一个参数就是选择哪个外设(GPIOx x=A~G) , 第二个参数就是 GPIO_Pin_x (x=0~15),

GPIO_SetBits第二给参数可以把指定的参数设置为高电频

GPIO_ResetBits第二给参数可以把指定的参数设置为低电频

GPIO_WriteBit: 第一个参数就是选择哪个外设(GPIOx x=A~G) , 第二个参数就是 GPIO_Pin_x (x=0~15),第三个参数Bit_RESET(把第二个参数设置为低电频) or Bit_SET(把第二个参数设置为高电频 一次写1位; Bit_RESET=(BitAction)0 把0强制转化为BitAction枚举类型同理 Bit_SET一样

2:闪烁代码

cpp 复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main(void){
	//第一步,使用RCC开启GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//第二步,使用GPIO Init函数初始化GPIO
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//第三步,使用输出或者输入的函数控制GPIO口
	//GPIO_ResetBits(GPIOA,GPIO_Pin_0);低
	//GPIO_SetBits(GPIOA,GPIO_Pin_0); 
	//GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);   //Bit_SET高   Bit_RESET低
	while(1){
		//Bit_RESET=(BitAction)0  把0强制转化为BitAction枚举类型
		GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);
		Delay_ms(500);
		GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
		Delay_ms(500);
	}
}

三:LED流水灯

1:连接图

2:函数介绍

stm32f10x_gpio.h文件中经常使用的函数很多(PIO_Init函数初始化GPIO) :

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

GPIO_Write: 第一个参数就是选择哪个外设(GPIOx x=A~G) , 第二个参数就是直接写到GPIO的ODR寄存器里的; 这里写的是。指定写到输出数据寄存器的值; 一次写16位

3:流水灯代码

cpp 复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main(void){
	//第一步,使用RCC开启GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//第二步,使用GPIO Init函数初始化GPIO
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All; //打开GPIOA的16个IO口
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//第三步,使用输出或者输入的函数控制GPIO口
	//GPIO_ResetBits(GPIOA,GPIO_Pin_0);低
	//GPIO_SetBits(GPIOA,GPIO_Pin_0); 
	//GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);   //Bit_SET高   Bit_RESET低
	while(1){
		int data=0x0001;    //0x0001=0000 0000 0000 0001
		for(int i=0;i<8;i++){  
			GPIO_Write(GPIOA,~data);   
			Delay_ms(500);
			data=data<<1;
		}
	}
}

四:按键控制LED

1:电路图

经常使用的有两种模式

电阻值越小下拉能力越强; stm32必须为上拉输入(GPIO_Mode_IPU)的模式;

当k1按下时k1电阻忽略不计,下拉能力强,又因为接低,使用为低电频; 反之不按下K1相当于断路电阻极大,下拉能力弱, 上拉能力相对变强;

这两种连接方式: 按下位低电频(0);松手为高电频(1);

2:连接图

3:函数介绍

stm32f10x gpio.h 文件里面的GPIO读取(输入,输出)函数

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

参数和上面的差不多; 后面有Bit的就是一位一位的输入或者输出,没有bit的是对16位一次性的进行输入或者输出

读取IO口使用xInputx函数; 在输出模式下,想要看一下现在输出了什么使用xOutputx函数

4:按键控制LED代码

cpp 复制代码
#include "stm32f10x.h"                  // Device header

void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
uint8_t KEY_init(){
	//第一步,使用RCC开启GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	//第二步,使用GPIO_Init函数初始化GPIO
	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 LED_init(){
	//第一步,使用RCC开启GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//第二步,使用GPIO_Init函数初始化GPIO
	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);
	//默认为低电频,低电频点亮LED
	GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);
}

//按键函数
uint8_t KEY_pad(){
	uint8_t KeyName;
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);
		Delay_ms(20);
		KeyName=1;
	}
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0){
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);
		Delay_ms(20);
		KeyName=2;
	}
	return KeyName;
}



//取反函数
uint8_t LED1_Turn()
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)//输出寄存器为低电频
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_1);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);
	}
}
uint8_t LED2_Turn()
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_2);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_2);
	}
}

uint8_t KeyNum;
int main(void){
	LED_init();
	KEY_init();
	while(1){
		KeyNum=KEY_pad();
		if(KeyNum==1){
			LED1_Turn();
		}
		if(KeyNum==2){
			LED2_Turn();
		}

		}
	}

五:蜂鸣器

我们使用的是有源蜂鸣器:低电频触发

有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定

1:连接图

2:蜂鸣器代码

cpp 复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main(void){
	//第一步,使用RCC开启GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	//第二步,使用GPIO Init函数初始化GPIO
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12; //打开GPIOA的16个IO口
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	//第三步,使用输出或者输入的函数控制GPIO口
	//GPIO_ResetBits(GPIOA,GPIO_Pin_0);低
	//GPIO_SetBits(GPIOA,GPIO_Pin_0); 高
	//GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);   //Bit_SET高   Bit_RESET低
	while(1){

		GPIO_WriteBit(GPIOB,GPIO_Pin_12,(BitAction)0);
		Delay_ms(100);
		GPIO_SetBits(GPIOB,GPIO_Pin_0);
		Delay_ms(100);
		GPIO_ResetBits(GPIOB,GPIO_Pin_0);
		Delay_ms(100);
		GPIO_WriteBit(GPIOB,GPIO_Pin_12,(BitAction)1);
		Delay_ms(700);

		}
	}

六:光敏电阻控制蜂鸣器

1:连接图

光敏电阻:,DO数字输出端

2:函数介绍

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

对IO引脚(输入数据寄存器)一位的读取,

3:光敏电阻控制蜂鸣器代码

cpp 复制代码
#include "stm32f10x.h"                  // Device header

uint8_t Buzzer_init(){
	//第一步,使用RCC开启GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	//第二步,使用GPIO_Init函数初始化GPIO
	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);
}
uint8_t LightSensor_init(){
	//第一步,使用RCC开启GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	//第二步,使用GPIO_Init函数初始化GPIO     //GPIO_Mode_Out_PP;推挽输出
	GPIO_InitTypeDef GPIO_InitStructure;  //GPIO_Mode_IPU   上拉输出
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;推挽输出
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);

}

uint8_t Buzzer_ON(){
	GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}

uint8_t Buzzer_OFF(){
	GPIO_SetBits(GPIOB,GPIO_Pin_12); //高电频
}


uint8_t LightSensor(){
//读取Io引脚PB13状态的读取,返回值为1或者o
	return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13); 
}

int num;
int main(void){
	Buzzer_init();
	LightSensor_init();
	while (1){
		num=LightSensor();
		if (num==1){
			Buzzer_ON();
		}
		else {
			Buzzer_OFF();		
		}

	}
}
相关推荐
Jason_zhao_MR1 小时前
米尔电子参展预告_中国工博会2026-外发版
嵌入式硬件·机器人·工业控制
Zw-awa2 小时前
电机家族:有的电机听“目标”,有的电机听“力气”
stm32
FPGA小徐5 小时前
STM32五路气敏传感器阵列电路详解:从HHC1000分压到AD8606跟随器和ADC采样
stm32·单片机·嵌入式硬件
Horn Still Sounds7 小时前
IMX6ULL裸机|I2C通信协议 + ADC模数转换学习笔记
arm开发·笔记·单片机·嵌入式硬件
智感子8 小时前
无人值守称重:地磅系统架构与流程
嵌入式硬件
新晨单片机设计9 小时前
S011C-基于STM32智能灯光控制系统(光强、声音、人体)【Proteus仿真+Keil程序+原理图】
stm32·嵌入式硬件·proteus·智能灯光控制系统
无敌贵点大王10 小时前
RTThread学习记录13——关于要使用一个外设,RTThread与cubemx到底要怎么配合?
c语言·stm32·学习·rtthread
女神下凡11 小时前
芯参谋(26):DDR4_软件设计规范
arm开发·单片机·嵌入式硬件
zd84510150012 小时前
DSLogic逻辑分析仪连接失败
嵌入式硬件
国科安芯13 小时前
星载通信载荷信号处理中抗辐射微控制器的选型与适应性分析
人工智能·嵌入式硬件·mcu·信号处理·risc-v·抗辐射·空间信息