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);
        
    }
}
相关文章
相关标签/搜索