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/ ...
随机推荐
- T117897 七步洗手法 / PJT1(洛谷)
题目:现在有n个人需要依次使用1个洗手池洗手,进行一步洗手需要1单位时间.他们每个人至少会进行一步洗手,但是却不一定进行了完整的七部洗手. 现在你知道了他们总共的洗手时间为t,请你推测他们有多少人进行 ...
- mybatis generator cmd 终端命令 生成dao model mapper
mybatis generator cmd 终端命令 生成dao model mapper 文件包下载 mybatis-generator-core-1.3.2.jar 下载地址:https://gi ...
- 痞子衡嵌入式:知名半导体MCU大厂软件开发C代码规范
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是飞思卡尔软件开发C语言编码规范. 2020鼠年春节是个漫长的假期,痞子衡在家百无聊赖,翻出了2016年10月1日(这个时间是痞子衡正式开始 ...
- Java框架-MyBatis三剑客之MyBatis Generator(mybatis-generator MBG插件)详解
生成器设计思路: 连接数据库 -> 获取表结构 -> 生成文件 1 下载与安装 官网文档入口 最方便的 maven 插件使用方式 贴至pom 文件 2 新建配置文件 填充配置信息(官网示例 ...
- Spring JSTL 获取后端数据失败。
显示的jsp页面仍是${XXX}的形式. 解决方法一: 这是因为我们在web.xml中使用的是jsp1.2版本的DTD,在此版本JSTL默认不打开,我们需要手动打开,打开方法: 在相应的JSP头部加入 ...
- 《快乐编程大本营》java语言训练班 3课:java的运算符
第1节. 算术运算符 第2节. 递增和递减运算符 第3节. 比较运算符 第4节. 逻辑运算符 第5节. 运算符优先级 第6节. 字符串运算 http://code6g.com/pxphp/px/ban ...
- 实验8:路由器IOS升级2
IOS 升级 在介绍CISCO路由器IOS升级方法前,有必要对Cisco路由器的存储器的相关知识作以简单介绍.路由器与计算机相似,它也有内存和操作系统.在Cisco路由器中,其操作系统叫做互连网操作系 ...
- JavaScript 替换所有匹配内容
由于JavaScript 的 replace 只能替换一次,因此另外编写一个能现替换全部匹配内容方法,代码如下: /*把 content 中所有的 searchValue 替换为 replaceVal ...
- SPH液面重构过程中的问题
使用粒子方法进行流体特效模拟需要进行液面重构,构造出流体的自由表面,液面重构方法也是一个独立的研究方向,针对其的研究已经有了很多成果,包括液面的平滑度.精度和并行效率等. 在这里,主要是记录一下我在液 ...
- linux入门系列12--磁盘管理之分区、格式化与挂载
前面系列文章讲解了VI编辑器.常用命令.防火墙及网络服务管理,本篇将讲解磁盘管理相关知识. 本文将会介绍大量的Linux命令,其中有一部分在"linux入门系列5--新手必会的linux命令 ...