STM32之RGB灯仿真

实验目的

  点灯是练习GPIO输出的最佳实验。由于疫情期间没法返校,手头上没有现成的实验板,于是借助Proteus进行仿真。本实验点的不是普通的灯,而是RGB混色灯,实现多种颜色的显示。后期还可以加上PWM,实现全彩灯控制。

仿真电路

  电路非常简单,采用的LED型号是RGBLED-CA,这是一个共阳的RGB灯。我们需要关注灯的两个参数:正向压降和正向电流。三盏灯的正向电流都是20mA,红灯的压降是1.8V,另外两盏灯是3.2V,由此可以很容易计算出合适的电阻值。

  为了程序的方便,我把三盏灯依次接到了PB8、PB9、PB10三个端口。整个仿真电路如下,在仿真过程中,灯的颜色看起来不是很鲜艳明亮,主要是引脚低电平输出时,电压并非是0V。

  

核心程序

  程序主要的步骤无非是:

    1、配置GPIOB的时钟使能;

    2、配置GPIO引脚工作在推免输出的模式;

    3、依次改变引脚输出电平的组合;

  因为这实验会有很多重复的代码,所以编写时最好多写些宏定义,让程序更美观。

#include "stm32f10x.h"

// 初始化宏定义
#define RED_GPIO_PORT                GPIOB
#define RED_GPIO_CLK                RCC_APB2Periph_GPIOB
#define RED_GPIO_PIN                GPIO_Pin_8

#define GREEN_GPIO_PORT         GPIOB
#define GREEN_GPIO_CLK            RCC_APB2Periph_GPIOB
#define GREEN_GPIO_PIN             GPIO_Pin_9

#define BLUE_GPIO_PORT            GPIOB
#define BLUE_GPIO_CLK                RCC_APB2Periph_GPIOB
#define BLUE_GPIO_PIN             GPIO_Pin_10

// LED开关宏定义
#define RED_ON                            GPIO_ResetBits(RED_GPIO_PORT, RED_GPIO_PIN);
#define RED_OFF                            GPIO_SetBits(RED_GPIO_PORT, RED_GPIO_PIN);

#define GREEN_ON                        GPIO_ResetBits(GREEN_GPIO_PORT, GREEN_GPIO_PIN);
#define GREEN_OFF                        GPIO_SetBits(GREEN_GPIO_PORT, GREEN_GPIO_PIN);

#define BLUE_ON                         GPIO_ResetBits(BLUE_GPIO_PORT, BLUE_GPIO_PIN);
#define BLUE_OFF                        GPIO_SetBits(BLUE_GPIO_PORT, BLUE_GPIO_PIN);

//混色宏定义
//
#define LED_RED                         {RED_ON; GREEN_OFF; BLUE_OFF;}
// 绿
#define LED_GREEN                     {RED_OFF; GREEN_ON; BLUE_OFF;}
//
#define LED_BLUE                        {RED_OFF; GREEN_OFF; BLUE_ON;}
// 黄=红+绿
#define LED_YELLOW                    {RED_ON; GREEN_ON; BLUE_OFF;}
// 紫=红+蓝
#define LED_PURPLE                    {RED_ON; GREEN_OFF; BLUE_ON;}
// 青=绿+蓝    
#define LED_CYAN                        {RED_OFF; GREEN_ON; BLUE_ON;}
// 白=红+绿+蓝
#define LED_WHITE                        {RED_ON; GREEN_ON; BLUE_ON;}
// 黑=全部关闭
#define LED_BLACK                        {RED_OFF; GREEN_OFF; BLUE_OFF;}

// 延时
void Delay(uint16_t time)
{
    uint16_t i,j;
    for (i=0;i<time;i++)
        for (j=0;j<1000;j++);
}

void LED_GPIO_Config()
{
    //GPIO时钟使能
    RCC_APB2PeriphClockCmd(    RED_GPIO_CLK | 
                                                    GREEN_GPIO_CLK |
                                                    BLUE_GPIO_CLK, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStruct;
    
    //初始化红色GPIO
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStruct.GPIO_Pin = RED_GPIO_PIN;
    GPIO_Init(RED_GPIO_PORT, &GPIO_InitStruct);
    
    //初始化绿色GPIO
    GPIO_InitStruct.GPIO_Pin = GREEN_GPIO_PIN;
    GPIO_Init(GREEN_GPIO_PORT, &GPIO_InitStruct);
    
    //初始化蓝色GPIO
    GPIO_InitStruct.GPIO_Pin = BLUE_GPIO_PIN;
    GPIO_Init(BLUE_GPIO_PORT, &GPIO_InitStruct);
    
    // 关闭所有LED
    LED_BLACK;
}

int main()
{
    LED_GPIO_Config();
    while(1){
        
        LED_RED;
        Delay(3000);

        LED_GREEN;
        Delay(3000);
        
        LED_BLUE;
        Delay(3000);
        
        LED_YELLOW;
        Delay(3000);
        
        LED_PURPLE;
        Delay(3000);
        
        LED_CYAN;
        Delay(3000);
        
        LED_WHITE;
        Delay(3000);
        
        LED_BLACK;
        Delay(3000);
        
    }
}

猜你喜欢

转载自www.cnblogs.com/kensporger/p/12372735.html