本章源代码链接:
链接: link
1、点亮LED
实验要求:点亮LED
①LED.c文件的代码如下:
#include "LED.h"
/**
* LED引脚初始化
*/
/* 定义数组,想要添加引脚向里面添加即可 */
uint16_t GPIO_A[] = {PA0,PA1,PA2,PA3};
static uint8_t GPIONum = sizeof(GPIO_A)/sizeof(GPIO_A[0]);
void LED_Init(void)
{
/* 1、开启GPIOA的时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* 2、对引脚工作模式进行配置:通用推挽输出 */
GPIO_InitTypeDef GPIO_InitStruct;
for(uint8_t i = 0; i < GPIONum; i++)
{
GPIO_InitStruct.GPIO_Pin = GPIO_A[i];
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
}
/**
* 点亮LED
* PAx:PA0~PA3
*/
void LED_ON(uint16_t PAx)
{
/* 点亮LED,引脚输出高电平 */
GPIO_SetBits(GPIOA, PAx);
}
/**
* 熄灭LED
* PAx:PA0~PA3
*/
void LED_OFF(uint16_t PAx)
{
/* 熄灭LED,引脚输出低电平 */
GPIO_ResetBits(GPIOA, PAx);
}
/**
* 翻转LED
* PAx:PA0~PA3
*/
void LED_Turn(uint16_t PAx)
{
/* 如果LED是点亮 */
if(GPIO_ReadOutputDataBit(GPIOA, PAx))//输出引脚为高电平
{
/* 熄灭LED */
LED_OFF(PAx);
}
else
{
/* 否则点亮LED */
LED_ON(PAx);
}
}
②LED.h文件的代码如下:
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
#define PA0 GPIO_Pin_0
#define PA1 GPIO_Pin_1
#define PA2 GPIO_Pin_2
#define PA3 GPIO_Pin_3
void LED_Init(void);
void LED_ON(uint16_t PAx);
void LED_OFF(uint16_t PAx);
void LED_Turn(uint16_t PAx);
#endif
③Delay.c文件的代码如下:(定时器章节进行讲解)
#include "Delay.h"
/*
* 延迟函数us
*/
void Delay_us(uint16_t us)
{
// 设置 SysTick 的计数周期
SysTick_Config(SystemCoreClock/1000000); // 每周期 1us
// 关闭 SysTick 的中断,不可省略
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
// 开始计数
for(uint32_t i=0; i<us; i++)
{ // 循环一次就是 1us
while( !((SysTick->CTRL)&(1<<16)) );
}
// 关闭 SysTick 定时器
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
/*
* 延迟函数ms
*/
void Delay_ms(uint16_t ms)
{
while (ms--)
{
Delay_us(1000);
}
}
/*
* 延迟函数s
*/
void Delay_s(uint16_t s)
{
while (s--)
{
Delay_ms(1000);
}
}
④Delay.h文件的代码如下:
#ifndef __Delay_h
#define __Delay_h
#include "stm32f10x.h"// Device header
void Delay_us(uint16_t us);
void Delay_ms(uint16_t ms);
void Delay_s(uint16_t s);
#endif
⑤main.c文件的代码如下:
#include "LED.h"
int main(void)
{
LED_Init();
LED_ON(PA0);
while(1)
{
}
}
2、LED闪烁
实验要求:LED每隔1s亮灭
⑤main.c文件的代码如下:
#include "LED.h"
#include "Delay.h"
int main(void)
{
LED_Init();
while(1)
{
LED_ON(PA0);
Delay_ms(500);
LED_OFF(PA0);
Delay_ms(500);
}
}
3、LED流水灯
⑤main.c文件的代码如下:
#include "LED.h"
#include "Delay.h"
extern uint16_t GPIO_A[];
int main(void)
{
LED_Init();
while(1)
{
for(uint8_t i = 0; i < 4; i++)
{
LED_ON(GPIO_A[i]); //点亮
LED_OFF(GPIO_A[(i+3)%4]); //熄灭
Delay_ms(500);
}
}
}
4、按键控制LED
①Key.c文件的代码如下:
#include "Key.h"
/**
* Key1引脚PB0的初始化
*/
void Key_Init(void)
{
/* 1、开启GPIOB的时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/* 2、对引脚工作模式进行配置:上拉输入模式 */
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/**
* 检测按键是否按下
*/
uint8_t Key_Num(void)
{
uint8_t num = 0;
if(!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)) //如果按键按下
{
Delay_ms(10); //延时消抖
if(!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)) //按键真的按下
{
while(!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)); //等待按键松开
Delay_ms(10); //延时消抖
num = 1;
}
}
return num;
}
②Key.h文件的代码如下:
#ifndef __Key_H
#define __Key_H
#include "stm32f10x.h"
#include "Delay.h"
void Key_Init(void);
uint8_t Key_Num(void);
#endif
③main.c文件的代码如下:
#include "LED.h"
#include "Key.h"
int main(void)
{
LED_Init(PA0);
Key_Init();
while(1)
{
if(Key_Num() == 1)
{
LED_Turn(PA0);
}
}
}
5、蜂鸣器
😀蜂鸣器模块的IO引脚输入低电平时,蜂鸣器响;IO引脚输入高电平时,蜂鸣器不响。
图蜂鸣器IO连接着单片机的PC1引脚,PC1输出低电平,蜂鸣器响,输出高电平,蜂鸣器不响
①Buzzer.c文件的代码如下:
#include "Buzzer.h"
/**
* 蜂鸣器引脚的初始化
*/
void Buzzer_Init(void)
{
/* 1、开启GPIOC的时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
/* 2、对引脚工作模式进行配置:通用推挽输出 */
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC,&GPIO_InitStruct);
}
/**
* 蜂鸣器响
*/
void Buzzer_ON(void)
{
/* PC1输出低电平 */
GPIO_ResetBits(GPIOC, GPIO_Pin_1);
}
/**
* 蜂鸣器不响
*/
void Buzzer_OFF(void)
{
/* PC1输出高电平 */
GPIO_SetBits(GPIOC, GPIO_Pin_1);
}
②Buzzer.h文件的代码如下:
#ifndef __Buzzer_H
#define __Buzzer_H
#include "stm32f10x.h"
void Buzzer_Init(void);
void Buzzer_ON(void);
void Buzzer_OFF(void);
#endif
③main.c文件的代码如下:
#include "Buzzer.h"
#include "Delay.h"
int main(void)
{
Buzzer_Init();
while(1)
{
Buzzer_ON(); //响
Delay_ms(200);
Buzzer_OFF(); //不响
Delay_ms(200);
}
}