• 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);
            
        }
    }
  • 相关阅读:
    fork和Vfork的区别
    exer4.13.c(undone)
    Exer4.6.c(undone)
    好习惯
    c语言中的register修饰符
    请教如何在页面之间传递dataSet?不用session
    ultraEdite编辑shell或perl程序时注意
    PowerBuilder程序中取数据库中值,值异常(正数变成负数或异常)
    pb程序的编译发布
    关于sql server2000 的1068 与 1069 问题
  • 原文地址:https://www.cnblogs.com/kensporger/p/12372735.html
Copyright © 2020-2023  润新知