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=;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灯仿真的更多相关文章
- 串口控制RGB灯程序
实验目的: 通过上位机给串口发送数据(字符); STM32收到数据进入中断程序原封不动返回上位机,并且根据收到的信息产出相应的进行操作.(1- led_on 2 – ledoff...); 源码 ...
- 通过RGB灯输出七色
本文由博主原创,如有不对之处请指明,转载请说明出处. /********************************* 代码功能:输出模拟信号,控制RGB灯的颜色 使用函数: pinMode(引脚 ...
- 进阶之路(基础篇) - 014 通过RGB灯输出七色
本文由博主原创,如有不对之处请指明,转载请说明出处. /********************************* 代码功能:输出模拟信号,控制RGB灯的颜色 使用函数: pinMode(引脚 ...
- 机智云连接ESP8266--远程控制点亮RGB灯
概述 智能灯,是一个简单常见的智能产品,硬件电路简单,程序本身也不复杂:下面我们使用esp8266开发板和机智云云端,实现如何将一个传统的灯泡,改造成可以远程控制开关的智能灯. 1.准备工作 硬件: ...
- RGB灯
robotbit扩展板4个rgb灯,r-红,g-绿,b-蓝,值为0~255,可模拟出256*256*256种颜色. from microbit import * import neopixel r = ...
- STM32之呼吸灯实验
首先,我想引用一下在一片博文里 看到 的一段话,写的很详细, 首先来说,你要使用PWM模式你得先选择用那个定时器来输出PWM吧!除了TIM6.TIM7这两个普通的定时器无法输出PWM外,其余的定时器都 ...
- STM32 KEIL不能输入仿真引脚端口error 65: access violation at 0x40021000 : no 'read' permission
使用MDK自己创建一个STM32F103ZE核的项目 加入源码后编译,正常,在线仿真单步执行出现如下问题 error 65: access violation at 0x40021000 : no ' ...
- 小结-stm32 驱动LED灯
使用位带操作,位带操作就是把每个比特膨胀成一个32位的字,当访问这些字的时候就访问这些比特位. http://www.cnblogs.com/xiaobo-Linux/ 然后,端口使能: //³õʼ ...
- STM32点LED灯
一.建立项目模板 这里的user中重复引用了system_stm32f10x.c Output中选择Create HEXFile,并且可以选择输出路径. Listing中可以选择输出路径. 然后在C/ ...
随机推荐
- CQBZOJ 邮递员(直播剪枝技巧)
题目描述 Mirko在一个山镇找到了一份邮递员的工作.这个镇可以看作一个N*N的矩形.每个区域可能是以下之一:房子K,邮政局P,草地 '.'.每个区域都有一个海拔. 每天早上,Mirko要送信给镇上所 ...
- 基于云开发开发 Web 应用(一):项目介绍 & 初始化
基于云开发开发 Web 应用(一):项目介绍 & 初始化 背景描述 Linux 中国曾在过去的 1 - 2 年内长期运行了一个 TL;DR 的中国版.不过当时做的版本是小程序的版本,一直以来, ...
- Linux中软件安装包的格式
一.Linux常用安装包及安装方法 1.安装包一般有四类: 1)tar包,如software-1.2.3-1.tar.gz.他是使用UNIX系统的打包工具tar打包的. 2)rpm包,如softwar ...
- Web自动化测试项目(二)BasePage实现
一.BasePage介绍 创建一个BasePage类,对Selenium Api进行二次封装 为了快速创建项目并投产,用到的Selenium Api才进行封装,没用到的则不封装 优先封装最重要的几个方 ...
- flask中使用SQLAlchemy操作mysql的一些注意事项和坑
一 ImportError: cannot import name 'db' 由于app最后才加载,所以其他文件,比如models.py不能从app.py导入任何变量, 要使用db可以先定义一个,之后 ...
- 【WPF学习】第二十九章 元素绑定——将元素绑定到一起
数据banding的最简单情形是,源对象时WPF元素而且源属性是依赖性属性.前面章节解释过,依赖项属性具有内置的更改通知支持.因此,当在源对象中改变依赖项属性的值时,会立即更新目标对象中的绑定属性.这 ...
- 使用visual studio 2013读取.mat文件
现在有一个T.mat 文件需要在c++中处理然后以.mat 或是.txt形式返回 T.mat中存储了十个cell,每个cell中会有一个不等长的数组 1.以下是相关配置过程: 参考:http://we ...
- Vue methods,watch,computed的区别
1. computed(计算属性) 计算属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算.注意,如果某个依赖 (比如非响应式属性) 在该实例范畴之外,则计算属性是不会被更新的. eg: < ...
- C# 接口和继承
转:https://www.cnblogs.com/songhe123/p/9558545.html 接口是方法的抽象,如果不同的类有同样的方法,那么就应该考虑使用接口. 例1: using Syst ...
- c++中的 static 关键字
注:若没有特指是 静态成员时,默认都是普通成员: 1 类中的普通成员 类中的成员变量 和 成员函数 是分开存储的.其中, 1)每个对象都有独立的成员变量:成员变量可以存储在 栈空间.堆空间.全局数据区 ...