LED-STM32单片机驱动单色LED和RGB全彩LED亮灭与呼吸灯代码

目录

LED

硬件接线

模块代码

GPIO控制LED亮灭

led.h

led.c

PWM呼吸灯

PWM.h

PWM.c

 main.c

RGB三色LED

三基色原理

模块介绍

硬件接线

模块代码

RGB_led.h

RGB_led.c

main.c

视频演示

LED特点与优势


主控芯片STM32F103C8T6

LED

LED(Light Emitting Diode)又叫发光二极管,是采用固体半导体芯片发光材料,与传统灯具相比,LED灯节能、环保、显色性响应速度好。

注意!!!

LED 发光时,请勿直视发光光源,特别是对于一些光强较高的 LED,强光可能伤害你的眼睛

硬件接线

显而易见左侧(较长的一侧)接正极,右侧接负极。

本次代码正极接PA0,负极接GND。

模块代码

GPIO控制LED亮灭

led.h
#ifndef             _LED_H_
#define				_LED_H_

#define LED_ON      0
#define LED_OFF     1   

void LED_Init(void);

void  LED_SetON(void);

void  LED_SetOFF(void);

void LED_Turn(void);
#endif

led.c
#include "stm32f10x.h"                  // Device header
#include "LED.h"

void LED_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

	GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	//GPIO默认输出低电平
	GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)LED_OFF);	//输出高电平 GPIO_SetBits(GPIOA, GPIO_Pin_0)

}
void  LED_SetON(void)
{
	GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)LED_ON);	
}

void  LED_SetOFF(void)
{
	GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)LED_OFF);
}

void LED_Turn(void)
{
	if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)==LED_ON)
	{
		LED_SetOFF();
	}
	else
	{
		LED_SetON();
	}

}

PWM呼吸灯

PWM.h
#ifndef             _PWM_H_
#define				_PWM_H_

void PWM_Init(void);
void PWM_SetCompare1(uint16_t Compare);
#endif
PWM.c
#include "stm32f10x.h"                  // Device header
#include "PWM.h"

void PWM_Init(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;		//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);
	
	TIM_Cmd(TIM2, ENABLE);

}

void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2, Compare);
}

 main.c
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "PWM.h"

int main(void)
{
	
	PWM_Init();
	
	while (1)
	{
		for(int i=0;i<=100;i++)
		{
			PWM_SetCompare1(i);
			Delay_ms(12);
		}
		for(int i=0;i<=100;i++)
		{
			PWM_SetCompare1(100-i);
			Delay_ms(12);
		}
	
	}
}

RGB三色LED

三基色原理

三基色是指RGB三色,即红(red),绿(green),蓝(blue)

大多数的颜色可以通过RGB三色按照不同的比例合成产生。RGB三个值的范围都是0~255

沿着箭头方向改变亮度,即V值。若要实现呼吸灯,成比例改变RGB的值

⑴对于人眼来说,自然界中的绝大部分彩色,都可以由三种基色按一定比例混合得到;反之,任意一种彩色均可被分解为三种基色。但客观来说,光是电磁波,不同频率的电磁波干涉时,频率并不会变化,即不会得到另一种频率的颜色。

⑵作为基色的三种彩色,要相互独立,即其中任何一种基色都不能由另外两种基色混合来产生。

⑶由三基色混合而得到的彩色光的亮度等于参与混合的各基色的亮度之和。

⑷三基色的比例决定了混合色的色调和色饱和度。 

三基色原理_百度百科 (baidu.com)

模块介绍

HW-479是一款插件型 RGB 模块,按照功能图标识将电源正负极接到模块的引脚上可以发出对应的亮光(正极接到 R 引脚发红光;正极 接到 G 引脚发绿光;正极接到 B 引脚发蓝光;)。给 R、G、B 三个 引脚提供 PWM 电压可以调节三种基色(红/绿/蓝)的强度从而实现全彩的混色效果
红色,绿色和蓝色分别使用8位,其整数值介于0到255之间。这使256 * 256 * 256 = 16777216种可能的颜色成为可能。
代码参考颜色:

RGB颜色代码表🎨 (rapidtables.org)icon-default.png?t=N7T8https://www.rapidtables.org/zh-CN/web/color/RGB_Color.html

硬件接线

R,G,B引脚分别接PA0,PA1,PA2,GND接地即可。

模块代码

将自动重装载值设为255-1,0~255分别对应0~1,1~2...254~0的脉冲。分别设置RGB对应通道的PWM对比值即可设置RGB的值,三种灯光混合呈现不同颜色

RGB_led.h

#ifndef             _RGB_LED_H_
#define				_RGB_LED_H_

void RGB_led_Init(void);
void LED_SetRed(uint8_t R_Value);
void LED_SetGreen(uint8_t G_Value);
void LED_SetBlue(uint8_t B_Value);
void LED_SetRGB(uint8_t R_Value,uint8_t G_Value,uint8_t B_Value);

#endif

RGB_led.c

#include "stm32f10x.h"                  // Device header
#include "RGB_led.h"

void RGB_led_Init(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;		
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 255 - 1;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 282 - 1;		//PSC  
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	TIM_OC3Init(TIM2, &TIM_OCInitStructure);
	
	TIM_Cmd(TIM2, ENABLE);

}

void LED_SetRed(uint8_t R_Value)
{
	TIM_SetCompare1(TIM2, R_Value);
}

void LED_SetGreen(uint8_t G_Value)
{
	TIM_SetCompare2(TIM2, G_Value);
}

void LED_SetBlue(uint8_t B_Value)
{
	TIM_SetCompare3(TIM2, B_Value);
}
void LED_SetRGB(uint8_t R_Value,uint8_t G_Value,uint8_t B_Value)
{
	LED_SetRed(R_Value);
	LED_SetGreen(G_Value);
	LED_SetBlue(B_Value);
}


main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "RGB_led.h"
uint8_t i;
int main(void)
{
 
	RGB_led_Init();
	while (1)
	{	
			for(i=0;i<255;i++)			//成比例调节
			{
				LED_SetRGB(220*i/250,20*i/250,60*i/250);	//赤红呼吸灯 						//呼吸灯
				Delay_ms(10);
			}
			for(i=255;i>0;i--)
			{
				LED_SetRGB(220*i/250,20*i/250,60*i/250);												
				Delay_ms(10);
			}
			LED_SetRGB(255,0,0);//红色
			Delay_ms(1000);
		
			LED_SetRGB(0,255,0);//绿色
			Delay_ms(1000);
		
			LED_SetRGB(0,0,255);//蓝色
			Delay_ms(1000);
		
			LED_SetRGB(255,255,0);//黄色
			Delay_ms(1000);
		
			LED_SetRGB(0,255,255);//水色
			Delay_ms(1000);
		
			LED_SetRGB(255,0,255);//紫红色
			Delay_ms(1000);
		
			LED_SetRGB(192,192,192);//银
			Delay_ms(1000);
		
			LED_SetRGB(128,128,128);//灰色
			Delay_ms(1000);
		
			LED_SetRGB(128,0,0);//	栗色
			Delay_ms(1000);
		
			LED_SetRGB(128,128,0);//橄榄色
			Delay_ms(1000);
			
			LED_SetRGB(0,128,0);//绿色
			Delay_ms(1000);
			
			LED_SetRGB(128,0,128);//	紫色
			Delay_ms(1000);
			
			LED_SetRGB(0,128,128);//	蓝绿色
			Delay_ms(1000);
			
			LED_SetRGB(0,0,128);//海军色
			Delay_ms(1000);
			
			LED_SetRGB(0,0,0);//黑色
			Delay_ms(1000);
			
			LED_SetRGB(255,255,255);//白色
			Delay_ms(1000);
		
		
	}
}

视频演示

全彩LED实验

LED特点与优势

  1. 节能高效:相较于传统的白炽灯泡或荧光灯,LED的光效更高,能够有效降低能源消耗。
  2. 长寿命:LED的寿命较长,通常能够达到数万小时以上,远超普通白炽灯和大部分节能灯。
  3. 环保:LED灯不含汞等有害物质,废弃物处理相对安全环保。
  4. 快速响应:LED无须预热,启动速度快,响应时间极短,几乎瞬间点亮。
  5. 抗震动:LED结构坚固,抗振性好,不易破损。
  6. 多颜色:LED可以发出多种颜色的光,包括红、绿、蓝等,以及它们的组合形成的白光。
  7. 体积小、重量轻:LED体积小、重量轻,可以被设计成各种形状和尺寸,适用于不同环境与灯具设计。
  • 35
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值