LED灯闪烁&LED流水灯设计&蜂鸣器
面包板
面包板正面背面图片如图:

可以看出正负两极共四行的走线是横着来的,其余中心区域是一列一列排布的,这就给了我后续硬件插法的思路.
注意事项
- 1正负两极的四行的每一行行内可能不是完全连通的,要想将这一行完全连通,可以用跳线连接.
LED灯闪烁
- 1配置项目工程,新建一个名为"3-1 LED灯闪烁"的文件夹,然后在此文件夹内添上必要的配置文件,配置过程可以参考该博客:Keil新建工程详细过程.
- 2参考下图将相应硬件配置好

应当注意的是:
①LED灯的较长的引脚是它的正极,较短的引脚是它的负极.
②至于为什么STM32板子插在面包板的这个位置,可能是因为在这个位置是为了利用面包板中间凹槽的电气隔离特性,确保其所有引脚都能独立使用.
- 3开始在main.c文件中书写程序,全部代码如下:
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void){
//配置时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//配置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_SetBits(GPIOA,GPIO_Pin_0);
//点灯
//GPIO_ResetBits(GPIOA,GPIO_Pin_0);
//其他方式 第三个参数Bit_RESET是将A0引脚置为低电平,Bit_SET是将A0引脚置为高电平
//GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
//GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
while(1){
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
Delay_ms(100);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
Delay_ms(500);
}
}
需要说明的是:
①在配置时钟时,根据硬件LED灯的负极是接在A0那一列,所以LED灯归GPIOA的0端口管控,所以要在配置时钟的代码如下:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
该时钟配置代码第一个参数标明配置的设备名称是GPIOA,第二个参数标明启动该时钟.
②依然采用结构体方式来初始化GPIO(没办法,这是该函数规定的),现在GPIO的设备变了,所以初始化函数也应做相应改变.
③有很多支持控制LED灯亮灭的函数:
设置高电平的函数:
GPIO_SetBits(GPIOA,GPIO_Pin_0);
设置低电平的函数:
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
其他方式:第三个参数Bit_RESET是将A0引脚置为低电平,Bit_SET是将A0引脚置为高电平
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
④在while死循环内写入可以控制LED灯周期闪烁的函数:
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
Delay_ms(100);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
Delay_ms(500);入代码片
Delay_ms(unit32_t)函数是引用的外部延迟函数,要在工程中新设置文件夹Systerm,然后引入两个文件:
引入该文件后,也要进行一系列操作让Keil能找到该文件的目录,同时在编程时引用该文件时要加上头文件:
#include "Delay.h"
注意事项
- 1注意LED灯负极引脚接入的是A0位置,若在A0位置启用高电平(使用高电平函数),则LED不会亮,因为LED灯正极是高电平,负极如果也是高电平的话,则没有电流产生.
LED流水灯设计
-
1将硬件作如图连接:

-
2将LED闪烁文件夹复制一份并改名为LED流水灯,用Keil打开,改写main.c函数,改写后的函数如下:
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void){
//配置时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//配置GPIO初始化(涉及结构体)
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
while(1){
//GPIO_Writ以十六位值指定哪个端口亮灯,因为低电平点亮(LED灯的负极插在A0口),所以要加上取反符号~
GPIO_Write(GPIOA,~0x0001);//0000 0000 0000 0001
Delay_ms(500);
GPIO_Write(GPIOA,~0x0002);//0000 0000 0000 0010
Delay_ms(500);
GPIO_Write(GPIOA,~0x0004);//0000 0000 0000 0100
Delay_ms(500);
GPIO_Write(GPIOA,~0x0008);//0000 0000 0000 1000
Delay_ms(500);
GPIO_Write(GPIOA,~0x0010);//0000 0000 0001 0000
Delay_ms(500);
GPIO_Write(GPIOA,~0x0020);//0000 0000 0010 0000
Delay_ms(500);
GPIO_Write(GPIOA,~0x0040);//0000 0000 0100 0000
Delay_ms(500);
GPIO_Write(GPIOA,~0x0080);//0000 0000 1000 0001
Delay_ms(500);
}
}
注意事项
- 1在while死循环内用GPIO_Write();控制流水灯时,第二个函数是想点亮那颗流水灯的16进制地址取反,取反原因是因为低电平点亮.
蜂鸣器
- 1将硬件作如图连接:

- 2将LED闪烁文件夹复制一份并改名为蜂鸣器,用Keil打开,改写main.c函数,改写后的函数如下:
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void){
//配置时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//配置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);
while(1){
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
Delay_ms(100);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
Delay_ms(700);
}
}
注意事项
- 1VCC是蜂鸣器电源接口名称,GND是蜂鸣器接地线名称,VCC接入面包板正极,GND接入面包板负极从而形成回路,有电流流入蜂鸣器.
- 2本接线图I/O口接入的是STM32板子的GPIOB12号引脚,在现实开发中I/O口可以介入STN32板子的除去A15、B3、B4三个端口任何端口,因为A15、B3、B4是调试端口,非要用这三个端口的话可以进行一些配置.


1176

被折叠的 条评论
为什么被折叠?



