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);
        
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM