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_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\
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_OFF
void LED_GPIO_Config(void); #endif /* __LED_H */
led.c
#include "led.h"
/*初始化LED的IO*/
void LED_GPIO_Config(void)
{
/*定义⼀个GPIO_InitTypeDef类型的结构体*/
2011江苏高考语文
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
/*选择要控制的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*/