STM32之RGB燈仿真

實驗目的

  點燈是練習GPIO輸出的最佳實驗。因爲疫情期間無法返校,手頭上沒有現成的實驗板,因而藉助Proteus進行仿真。本實驗點的不是普通的燈,而是RGB混色燈,實現多種顏色的顯示。後期還能夠加上PWM,實現全綵燈控制。ui

 

仿真電路

  電路很是簡單,採用的LED型號是RGBLED-CA,這是一個共陽的RGB燈。咱們須要關注燈的兩個參數:正向壓降和正向電流。三盞燈的正向電流都是20mA,紅燈的壓降是1.8V,另外兩盞燈是3.2V,由此能夠很容易計算出合適的電阻值。spa

  爲了程序的方便,我把三盞燈依次接到了PB八、PB九、PB10三個端口。整個仿真電路以下,在仿真過程當中,燈的顏色看起來不是很鮮豔明亮,主要是引腳低電平輸出時,電壓並不是是0V。code

  

 

 

核心程序

  程序主要的步驟無非是:blog

    一、配置GPIOB的時鐘使能;ip

    二、配置GPIO引腳工做在推免輸出的模式;it

    三、依次改變引腳輸出電平的組合;class

  由於這實驗會有不少重複的代碼,因此編寫時最好多寫些宏定義,讓程序更美觀。配置

#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);
        
    }
}
相關文章
相關標籤/搜索