实验目的

  点灯是练习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=;i<time;i++)
for (j=;j<;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(){ LED_RED;
Delay(); LED_GREEN;
Delay(); LED_BLUE;
Delay(); LED_YELLOW;
Delay(); LED_PURPLE;
Delay(); LED_CYAN;
Delay(); LED_WHITE;
Delay(); LED_BLACK;
Delay(); }
}

STM32之RGB灯仿真的更多相关文章

  1. 串口控制RGB灯程序

    实验目的: 通过上位机给串口发送数据(字符); STM32收到数据进入中断程序原封不动返回上位机,并且根据收到的信息产出相应的进行操作.(1- led_on  2 – ledoff...); 源码   ...

  2. 通过RGB灯输出七色

    本文由博主原创,如有不对之处请指明,转载请说明出处. /********************************* 代码功能:输出模拟信号,控制RGB灯的颜色 使用函数: pinMode(引脚 ...

  3. 进阶之路(基础篇) - 014 通过RGB灯输出七色

    本文由博主原创,如有不对之处请指明,转载请说明出处. /********************************* 代码功能:输出模拟信号,控制RGB灯的颜色 使用函数: pinMode(引脚 ...

  4. 机智云连接ESP8266--远程控制点亮RGB灯

    概述 智能灯,是一个简单常见的智能产品,硬件电路简单,程序本身也不复杂:下面我们使用esp8266开发板和机智云云端,实现如何将一个传统的灯泡,改造成可以远程控制开关的智能灯. 1.准备工作 硬件: ...

  5. RGB灯

    robotbit扩展板4个rgb灯,r-红,g-绿,b-蓝,值为0~255,可模拟出256*256*256种颜色. from microbit import * import neopixel r = ...

  6. STM32之呼吸灯实验

    首先,我想引用一下在一片博文里 看到 的一段话,写的很详细, 首先来说,你要使用PWM模式你得先选择用那个定时器来输出PWM吧!除了TIM6.TIM7这两个普通的定时器无法输出PWM外,其余的定时器都 ...

  7. STM32 KEIL不能输入仿真引脚端口error 65: access violation at 0x40021000 : no 'read' permission

    使用MDK自己创建一个STM32F103ZE核的项目 加入源码后编译,正常,在线仿真单步执行出现如下问题 error 65: access violation at 0x40021000 : no ' ...

  8. 小结-stm32 驱动LED灯

    使用位带操作,位带操作就是把每个比特膨胀成一个32位的字,当访问这些字的时候就访问这些比特位. http://www.cnblogs.com/xiaobo-Linux/ 然后,端口使能: //³õʼ ...

  9. STM32点LED灯

    一.建立项目模板 这里的user中重复引用了system_stm32f10x.c Output中选择Create HEXFile,并且可以选择输出路径. Listing中可以选择输出路径. 然后在C/ ...

随机推荐

  1. MEF sample

    博客里介绍ntier 基于这个框架有一个叫WAF的示例项目. 看 waf(WPF Application Framework)里面这样有句 不是很懂, This page might help you ...

  2. mongo 的 中文社区的 文档还是 挺不错的

    英文文档也奉上: http://api.mongodb.com/csharp/2.2/html/T_MongoDB_Bson_Serialization_Attributes_BsonIdAttrib ...

  3. (初学JS)JS基础——ATM机终端程序编写<1.0>

    初步学习了JS基础,为了更好地将所学知识熟练运用,我进行了银行ATM存取款机的模拟程序编写,主要通过VScode终端实现系列操作. 我的ATM程序包括6个主要功能:1.查询余额 2.存钱 3. 取钱 ...

  4. Django自定义认证系统

    官网教程:https://docs.djangoproject.com/en/2.2/topics/auth/customizing/ app下的model.py from django.db imp ...

  5. 内网IP的解释

    https://baike.baidu.com/item/%E5%86%85%E7%BD%91ip/8881186?fr=aladdin

  6. C语言秋季作业4

    本周作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 作业连接 我在这个课程的目标是 熟练掌握for循环语句的运用 这个作业在那个具体方面帮助我实现目标 通过作业练习 参考文献 文 ...

  7. Visual Studio Code | 报错 command 'markdown.extension.onBackspaceKey' not found

    背景 今天使用Visual Strudio Code想用键盘Back去删除一些字符,发现报如下错误: command 'markdown.extension.onBackspaceKey' not f ...

  8. SVN: 在Ecplise管理SVN资源库

    Window->Show View->SVN

  9. HanLP《自然语言处理入门》笔记--5.感知机模型与序列标注

    笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 5. 感知机分类与序列标注 第4章我们利用隐马尔可夫模型实现了第一个基于序列标注的 ...

  10. 快速理解DevOps概念和意义-兼谈SRE

    最近几年,由于负责的范围的变化.工作逐渐从某个IT领域或者部门,开始关注到整个IT体系的运转和管理.中间也遇到不少困难,同时也有机会去从更高的层面去学习和实践IT治理.文章主要是总结一下我对DevOp ...