STM32:制作LED流水灯
1.系统设计说明
本系统利用Proteus内的STM32F103C4作为微控制器,使用了7个按键和九个LED灯,根据不同按键的触发将会显示出不同颜色的流水灯。每完成一次流水灯循环都会对按键进行一次检测,进入下一次循环。
按键为普通开关K1-K7,LED1, LED4, LED7为红色LED,LED2, LED5, LED8为绿色LED,LED3, LED6 ,LED9为蓝色LED。原理图如下:
2.系统功能说明
按下不同的按键会显示不同颜色的流水灯,如下表:
模式 按键状态 效果
1 仅按下K1 红色LED流水灯
2 仅按下K2 绿色LED流水灯
3 仅按下K3 蓝色LED流水灯
4 仅按下K4 黄色LED流水灯
5 仅按下K5 紫色LED流水灯
6 仅按下K6 青色LED流水灯
7 仅按下K7 白色LED流水灯
8 开关均为按下 关闭流水灯,无LED亮起
9 任意按下两个及以上开关 红、绿、蓝色LED流水灯
注:红+绿=黄 ; 红+蓝=紫 ; 绿+蓝=青 。
3.软件设计说明
首先确定使用STM32F103C4,根据需要自行设计LED和KEY与引脚的连接(注意要避开PB2,PB3,PB4,PA13,PA14,PA15)。
然后对LED的GPIO进行配置。步骤依次为:定义LED连接的GPIO端口--定义控制LED打开关闭的--定义基本混色显示的宏—初始化LED的端口。
led.h
#ifndef __LED_H
#define __LED_H#include "stm32f10x.h" /* 定义LED连接的GPIO端口*/#define LED1_GPIO_PORT GPIOB /* GPIO端口 */
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED1_GPIO_PIN GPIO_Pin_0 /* 连接到SCL时钟线的GPIO */#define LED2_GPIO_PORT GPIOB /* GPIO端口 */
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED2_GPIO_PIN GPIO_Pin_1 /* 连接到SCL时钟线的GPIO */#define LED3_GPIO_PORT GPIOB /* GPIO端口 */
#define LED3_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED3_GPIO_PIN GPIO_Pin_5 /* 连接到SCL时钟线的GPIO */#define LED4_GPIO_PORT GPIOB /* GPIO端口 */
#define LED4_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED4_GPIO_PIN GPIO_Pin_6 /* 连接到SCL时钟线的GPIO */#define LED5_GPIO_PORT GPIOB /* GPIO端口 */
#define LED5_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED5_GPIO_PIN GPIO_Pin_7 /* 连接到SCL时钟线的GPIO */#define LED6_GPIO_PORT GPIOB /* GPIO端口 */
#define LED6_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED6_GPIO_PIN GPIO_Pin_8 /* 连接到SCL时钟线的GPIO */#define LED7_GPIO_PORT GPIOB /* GPIO端口 */
#define LED7_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED7_GPIO_PIN GPIO_Pin_9 /* 连接到SCL时钟线的GPIO */#define LED8_GPIO_PORT GPIOB /* GPIO端口 */
#define LED8_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED8_GPIO_PIN GPIO_Pin_10 /* 连接到SCL时钟线的GPIO */#define LED9_GPIO_PORT GPIOB /* GPIO端口 */
#define LED9_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED9_GPIO_PIN GPIO_Pin_11 /* 连接到SCL时钟线的GPIO *//* 定义控制IO的宏 */#define LED1_OFF GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
#define LED1_ON GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);#define LED2_OFF GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
#define LED2_ON GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);#define LED3_OFF GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
#define LED3_ON GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);#define LED4_OFF GPIO_SetBits(LED4_GPIO_PORT,LED4_GPIO_PIN);
#define LED4_ON GPIO_ResetBits(LED4_GPIO_PORT,LED4_GPIO_PIN);#define LED5_OFF GPIO_SetBits(LED5_GPIO_PORT,LED5_GPIO_PIN);
#define LED5_ON GPIO_ResetBits(LED5_GPIO_PORT,LED5_GPIO_PIN);#define LED6_OFF GPIO_SetBits(LED6_GPIO_PORT,LED6_GPIO_PIN);
#define LED6_ON GPIO_ResetBits(LED6_GPIO_PORT,LED6_GPIO_PIN);#define LED7_OFF GPIO_SetBits(LED7_GPIO_PORT,LED7_GPIO_PIN);
#define LED7_ON GPIO_ResetBits(LED7_GPIO_PORT,LED7_GPIO_PIN);#define LED8_OFF GPIO_SetBits(LED8_GPIO_PORT,LED8_GPIO_PIN);
#define LED8_ON GPIO_ResetBits(LED8_GPIO_PORT,LED8_GPIO_PIN);#define LED9_OFF GPIO_SetBits(LED9_GPIO_PORT,LED9_GPIO_PIN);
#define LED9_ON GPIO_ResetBits(LED9_GPIO_PORT,LED9_GPIO_PIN);/* 基本混色 *///红
#define LED_RED1 \LED1_ON;\LED2_OFF\LED3_OFF
#define LED_RED2 \LED4_ON;\LED5_OFF\LED6_OFF
#define LED_RED3 \LED7_ON;\LED8_OFF\LED9_OFF
//绿
#define LED_GREEN1 \LED1_OFF;\LED2_ON\LED3_OFF
#define LED_GREEN2 \LED4_OFF;\LED5_ON\LED6_OFF
#define LED_GREEN3 \LED7_OFF;\LED8_ON\LED9_OFF
//蓝
#define LED_BLUE1 \LED1_OFF;\LED2_OFF\LED3_ON
#define LED_BLUE2 \LED4_OFF;\LED5_OFF\LED6_ON
#define LED_BLUE3 \LED7_OFF;\LED8_OFF\LED9_ON//黄(红+绿)
#define LED_YELLOW1 \LED1_ON;\LED2_ON\LED3_OFF
#define LED_YELLOW2 \LED4_ON;\LED5_ON\LED6_OFF
#define LED_YELLOW3 \LED7_ON;\LED8_ON\LED9_OFF //紫(红+蓝)
#define LED_PURPLE1 \LED1_ON;\LED2_OFF\LED3_ON
#define LED_PURPLE2 \LED4_ON;\LED5_OFF\LED6_ON
#define LED_PURPLE3 \LED7_ON;\LED8_OFF\LED9_ON
//青(绿+蓝)
#define LED_CYAN1 \LED1_OFF;\LED2_ON\LED3_ON
#define LED_CYAN2 \LED4_OFF;\LED5_ON\LED6_ON
#define LED_CYAN3 \LED7_OFF;\LED8_ON\LED9_ON
//白(红+绿+蓝)
#define LED_WHITE1 \LED1_ON;\LED2_ON\LED3_ON
#define LED_WHITE2 \LED4_ON;\LED5_ON\LED6_ON
#define LED_WHITE3 \LED7_ON;\LED8_ON\LED9_ON
//黑(全部关闭)
#define LED_RGBOFF \LED1_OFF;\LED2_OFF;\LED3_OFF;\LED4_OFF;\LED5_OFF;\LED6_OFF;\LED7_OFF;\LED8_OFF;\LED9_OFFvoid LED_GPIO_Config(void);#endif /* __LED_H */
led.c
#include "led.h"/*初始化LED的IO*/
void LED_GPIO_Config(void)
{ /*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启LED相关的GPIO外设时钟*/RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK | LED4_GPIO_CLK | LED5_GPIO_CLK | LED6_GPIO_CLK | LED7_GPIO_CLK | LED8_GPIO_CLK | LED9_GPIO_CLK, ENABLE);/*选择要控制的GPIO引脚1*/GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN; /*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化GPIO*/GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure); /*选择要控制的GPIO引脚2*/GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;/*调用库函数,初始化GPIO*/GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);/*选择要控制的GPIO引脚3*/GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;/*调用库函数,初始化GPIOF*/GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);/*选择要控制的GPIO引脚4*/GPIO_InitStructure.GPIO_Pin = LED4_GPIO_PIN;/*调用库函数,初始化GPIOF*/GPIO_Init(LED4_GPIO_PORT, &GPIO_InitStructure);/*选择要控制的GPIO引脚5*/GPIO_InitStructure.GPIO_Pin = LED5_GPIO_PIN;/*调用库函数,初始化GPIO*/GPIO_Init(LED5_GPIO_PORT, &GPIO_InitStructure);/*选择要控制的GPIO引脚6*/GPIO_InitStructure.GPIO_Pin = LED6_GPIO_PIN;/*调用库函数,初始化GPIOF*/GPIO_Init(LED6_GPIO_PORT, &GPIO_InitStructure);/*选择要控制的GPIO引脚7*/GPIO_InitStructure.GPIO_Pin = LED7_GPIO_PIN;/*调用库函数,初始化GPIOF*/GPIO_Init(LED7_GPIO_PORT, &GPIO_InitStructure);/*选择要控制的GPIO引脚8*/GPIO_InitStructure.GPIO_Pin = LED8_GPIO_PIN;/*调用库函数,初始化GPIOF*/GPIO_Init(LED8_GPIO_PORT, &GPIO_InitStructure);/*选择要控制的GPIO引脚9*/GPIO_InitStructure.GPIO_Pin = LED9_GPIO_PIN;/*调用库函数,初始化GPIOF*/GPIO_Init(LED9_GPIO_PORT, &GPIO_InitStructure);/* 关闭所有led灯 */GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);/* 关闭所有led灯 */GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN); /* 关闭所有led灯 */GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);/* 关闭所有led灯 */GPIO_SetBits(LED4_GPIO_PORT, LED4_GPIO_PIN);/* 关闭所有led灯 */GPIO_SetBits(LED5_GPIO_PORT, LED5_GPIO_PIN); /* 关闭所有led灯 */GPIO_SetBits(LED6_GPIO_PORT, LED6_GPIO_PIN);/* 关闭所有led灯 */GPIO_SetBits(LED7_GPIO_PORT, LED7_GPIO_PIN);/* 关闭所有led灯 */GPIO_SetBits(LED8_GPIO_PORT, LED8_GPIO_PIN); /* 关闭所有led灯 */GPIO_SetBits(LED9_GPIO_PORT, LED9_GPIO_PIN);}
接着对K1-K7的GPIO进行配置。步骤依次为:定义K1-K7连接的GPIO端口--初始化KEY的端口—设计按键检测函数。
key.h
#ifndef __KEY_H
#define __KEY_H#include "stm32f10x.h"// 引脚定义
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY1_GPIO_PORT GPIOA
#define KEY1_GPIO_PIN GPIO_Pin_1
#define KEY1 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_1 ) //读取按键#define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC
#define KEY2_GPIO_PORT GPIOA
#define KEY2_GPIO_PIN GPIO_Pin_2
#define KEY2 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_2 ) //读取按键#define KEY3_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY3_GPIO_PORT GPIOA
#define KEY3_GPIO_PIN GPIO_Pin_3
#define KEY3 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_3 ) //读取按键#define KEY4_GPIO_CLK RCC_APB2Periph_GPIOC
#define KEY4_GPIO_PORT GPIOA
#define KEY4_GPIO_PIN GPIO_Pin_4
#define KEY4 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_4 ) //读取按键#define KEY5_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY5_GPIO_PORT GPIOA
#define KEY5_GPIO_PIN GPIO_Pin_5
#define KEY5 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_5 ) //读取按键#define KEY6_GPIO_CLK RCC_APB2Periph_GPIOC
#define KEY6_GPIO_PORT GPIOA
#define KEY6_GPIO_PIN GPIO_Pin_6
#define KEY6 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_6 ) //读取按键#define KEY7_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY7_GPIO_PORT GPIOA
#define KEY7_GPIO_PIN GPIO_Pin_7
#define KEY7 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_7 ) //读取按键void Key_GPIO_Config(void);
uint8_t Key_Scan( u8 );#endif /* __KEY_H */
key.c
#include "stm32f10x.h"
#include "key.h"/* 配置按键用到的I/O口 */
void Key_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;/*开启按键端口的时钟*/RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);//选择按键的引脚GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN; // 设置按键的引脚为浮空输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //使用结构体初始化按键GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);//选择按键的引脚GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN; //设置按键的引脚为浮空输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //使用结构体初始化按键GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure); //选择按键的引脚GPIO_InitStructure.GPIO_Pin = KEY3_GPIO_PIN; //设置按键的引脚为浮空输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //使用结构体初始化按键GPIO_Init(KEY3_GPIO_PORT, &GPIO_InitStructure); //选择按键的引脚GPIO_InitStructure.GPIO_Pin = KEY4_GPIO_PIN; //设置按键的引脚为浮空输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //使用结构体初始化按键GPIO_Init(KEY4_GPIO_PORT, &GPIO_InitStructure); //选择按键的引脚GPIO_InitStructure.GPIO_Pin = KEY5_GPIO_PIN; //设置按键的引脚为浮空输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //使用结构体初始化按键GPIO_Init(KEY5_GPIO_PORT, &GPIO_InitStructure); //选择按键的引脚GPIO_InitStructure.GPIO_Pin = KEY6_GPIO_PIN; //设置按键的引脚为浮空输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //使用结构体初始化按键GPIO_Init(KEY6_GPIO_PORT, &GPIO_InitStructure); //选择按键的引脚GPIO_InitStructure.GPIO_Pin = KEY7_GPIO_PIN; //设置按键的引脚为浮空输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //使用结构体初始化按键GPIO_Init(KEY7_GPIO_PORT, &GPIO_InitStructure); }void delay(u16 time)
{ u16 i=0; while(time--){i=12000;while(i--) ; }
}/* 按键检测 */
uint8_t Key_Scan( u8 mode )
{ u8 key;/*检测按键,不同的按键对应不同的模式*/if( KEY1==0 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==1 ) { delay(10); //去抖动if( KEY1==0) key=1; }else if( KEY1==1 && KEY2==0 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==1 ) { delay(10); //去抖动if( KEY2==0) key=2; }else if( KEY1==1 && KEY2==1 && KEY3==0 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==1 ) { delay(10); //去抖动if( KEY3==0) key=3; }else if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==0 && KEY5==1 && KEY6==1 && KEY7==1 ) { delay(10); //去抖动if( KEY4==0) key=4; }else if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==0 && KEY6==1 && KEY7==1 ) { delay(10); //去抖动if( KEY5==0) key=5; }else if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==0 && KEY7==1 ) { delay(10); //去抖动if( KEY6==0) key=6; }else if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==0 ) { delay(10); //去抖动if( KEY7==0) key=7; }else if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==1 ) { delay(10); //去抖动if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==1 ) key=8; }else key=9;return key;
}
Main函数的循环里,设置几种模式的选择,每完成一次流水灯循环都会对按键进行一次检测,确定下一次循环的模式。
main.c (其实这里的选择用switch看着会更有条理)
#include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h>
#include "led.h"
#include "key.h" void delay_ms(u16 time)
{ u16 i=0; while(time--){i=12000;while(i--) ; }
}int main(void)
{ u8 t;LED_GPIO_Config();/* LED 端口初始化 */Key_GPIO_Config(); /* KEY 端口初始化 */while (1) /*进行流水灯的循环*/{//if( t == 9 ) GPIO_ResetBits(LED9_GPIO_PORT, LED9_GPIO_PIN);//测试电路t=Key_Scan(1);//if( t == 2 ) GPIO_ResetBits(LED9_GPIO_PORT, LED9_GPIO_PIN);//测试电路if(t==1) {LED_RED1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_RED2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_RED3;delay_ms(30);LED_RGBOFF;delay_ms(10);}else if(t==2) {LED_GREEN1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_GREEN2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_GREEN3;delay_ms(30);LED_RGBOFF;delay_ms(10);}else if(t==3) {LED_BLUE1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_BLUE2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_BLUE3;delay_ms(30);LED_RGBOFF;delay_ms(10); }else if(t==4) {LED_YELLOW1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_YELLOW2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_YELLOW3;delay_ms(30);LED_RGBOFF;delay_ms(10);}else if(t==5) {LED_PURPLE1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_PURPLE2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_PURPLE3;delay_ms(30);LED_RGBOFF;delay_ms(10);}else if(t==6) {LED_CYAN1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_CYAN2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_CYAN3;delay_ms(30);LED_RGBOFF;delay_ms(10);}else if(t==7) {LED_WHITE1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_WHITE2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_WHITE3;delay_ms(30);LED_RGBOFF;delay_ms(10);}else if(t==8) {LED_RGBOFF;delay_ms(10);}else if(t==9) {LED1_ON;delay_ms(30);LED1_OFF;LED2_ON;delay_ms(30);LED2_OFF;LED3_ON;delay_ms(30);LED3_OFF;\LED4_ON;delay_ms(30);LED4_OFF;LED5_ON;delay_ms(30);LED5_OFF;LED6_ON;delay_ms(30);LED6_OFF;\LED7_ON;delay_ms(30);LED7_OFF;LED8_ON;delay_ms(30);LED8_OFF;LED9_ON;delay_ms(30);LED9_OFF;}}
}
4.调试及运行结果
程序编译结果
红色流水灯显示
白色流水灯显示
红、绿、蓝色流水灯显示
万事开头难,这是我第一次对STM32F103进行编程及仿真使用,虽然只是做了一系列的流水灯,但是我对库函数的使用有了更熟练的应用和更清晰的理解。在编程和Debug的过程中,我也增长了一些处理错误和警告的能力。
刚开始的时候我对分模块编程以及对GPIO的初始化配置毫无头绪,跟着STM32F103的相关教学视频学习后,开始逐渐尝试着配置,发现使用库函数进行配置其实很简单,重要是的要下手去编写一些程序,分模块依次攻破,就比较好理清头绪了。
在Debug的过程,我犯了一些很低级的错误,例如写了一些中文的“(”怎么改程序都没发现,例如忘记在led.c函数内调用led.h,例如在设计按键检测函数是应为“与”逻辑我写成了“或”逻辑…其次经过排查,结合CSDN的帖子答疑,一些结构上的问题都能解决。
当然一定要注意要避开PB2,PB3,PB4,PA13,PA14,PA15,我最开始连接引脚的时候刚好GPIOB用的是前九个,GPIOA用的是后七个,刚刚好全部撞上了这些引脚导致仿真的时候电平一直不对劲,后来查阅了资料才知道它们都是有特殊作用的。
STM32:制作LED流水灯相关推荐
- STM32实现LED流水灯
文章目录 一.实验原理 1.STM32F103C8T6简介 2.地址映射 3.寄存器映射 4.GPIO端口初始化设置 1.时钟配置 2.输入输出模式和输出速率设置 二.C语言实现LED流水灯 1.流水 ...
- STM32应用开发实践教程:可控 LED 流水灯的设计与实现
任务 2.1 LED 流水灯的应用开发 2.1.1 任务分析 本任务要求设计一个 LED 流水灯系统,具体要求如下. 系统通电时,两个 LED 以 2s 为周期(亮 1s,灭 1s)交替闪烁,并逐渐缩 ...
- 基于Proteus无实物STM32入门自学教程(二)--LED流水灯
本教程面向新手,前期没有用到stm32的内部库,源程序尽量使用单文件.方便从51直接转过来的同学有个适应期.proteus仿真stm32总所周知没有51仿真的那么完美.笔者在51年代进行仿真时基本与实 ...
- 4、Proteus仿真STM32串口通信,发送数据控制LED流水灯的启动和停止
一.实验说明 本次实验建立在第三个实验基础上,稍加修改,通过串口调试助手发送数据到Proteus来实现对流水灯的启动和停止,所以实验采用2个通信串口,实验原理非常简单,只要熟悉第三次实验的过程,就非常 ...
- 基于STM32安装Stm32CubeMX,配合Keil完成LED流水灯和USART串口通讯程序,及其管脚的时序波形观察
目录 一.使用HAL库完成LED流水灯 (一).用STM32CUBEMX生成工程文件 (二).用Keil仿真调试并生成hex文件 (三).用STM32串口烧录程序 (四).实物连接 二.使用HAL库完 ...
- 用寄存器HAL库完成LED流水灯程序
STM32的地址映射.寄存器映射原理以及GPIO端口的初始化设置三步骤 (一)STM32F103系列芯片的地址映射及寄存器映射原理 1.STM32F103C8T6简要介绍 ● STM32F103C8 ...
- STM32Cubemx的安装及用寄存器HAL库完成LED流水灯程序
目录 一.STM32CubeMx安装 (一)简介 (二)下载地址 1.官方下载地址 2.网盘下载地址 二.STM32CubeMX安装过程 三.HAL库安装 四.HAL库实现LED流水灯 (一)新建项目 ...
- STM32F103C8T6以寄存器方式借助面包板搭建电路点亮LED流水灯详解
文章目录 一.寄存器原理 1.什么是寄存器 2.如何访问寄存器 二.GPIO端口的初始化设置 1.时钟配置 (1)找到时钟使能寄存器映射基地址 (2)找到端口偏移地址以及对应端口所在位置 (3)使能对 ...
- FPGA第一天的学习-LED流水灯
FPGA第一天的学习-LED流水灯 每一次玩一块新的开发板我们都会首先做出一个流水灯,所以我也做出一个流水灯并且结合网上教程和自己的理解来试着将代码理解得更透彻. 1.硬件部分 由原理图我们可以知道时 ...
最新文章
- 学习oop知识之OOP的封装
- 使用Python+turtle绘制同心圆
- 将在本地创建的Git仓库push到Git@OSC
- WPF Datagrid合并表头的思路
- pygame显示图片的方法_使用Sprite实现移动动画(Pygame中的精灵类)
- Python轻量级WEB框架web.py,模板使用
- nextJS和vueJS及Material-UI 简易搭建
- python从入门到放弃-Python数据分析从入门到放弃(十五)爬虫(番外)基金选取实例...
- 没有计算机基础可以学python-没有计算机基础可以参加Python培训吗?老男孩教育...
- 漫画微信小程序源码 全开源 商业版
- # 研究杂感 × VOSviewer(第三辑)
- zemax输出ies_基于ZEMAX的光学设计教程(第2版)
- TX-LCN分布式事务
- docker之构建镜像
- html导出带页码的word,使用js把html导出word,并配置样式和分页功能
- 计算机技术前沿知识,计算机前沿技术综述_相关文章专题_写写帮文库
- 计算机管理服务报错mmc,mmc错误,注册表没有mmc
- 高防服务器防御中“清洗”是什么意思
- requir与include的区别
- 用python编写密码安全性_用大数据python保护密码