目录
主控芯片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的值
⑴对于人眼来说,自然界中的绝大部分彩色,都可以由三种基色按一定比例混合得到;反之,任意一种彩色均可被分解为三种基色。但客观来说,光是电磁波,不同频率的电磁波干涉时,频率并不会变化,即不会得到另一种频率的颜色。
⑵作为基色的三种彩色,要相互独立,即其中任何一种基色都不能由另外两种基色混合来产生。
⑶由三基色混合而得到的彩色光的亮度等于参与混合的各基色的亮度之和。
⑷三基色的比例决定了混合色的色调和色饱和度。
模块介绍
RGB颜色代码表🎨 (rapidtables.org)https://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特点与优势
- 节能高效:相较于传统的白炽灯泡或荧光灯,LED的光效更高,能够有效降低能源消耗。
- 长寿命:LED的寿命较长,通常能够达到数万小时以上,远超普通白炽灯和大部分节能灯。
- 环保:LED灯不含汞等有害物质,废弃物处理相对安全环保。
- 快速响应:LED无须预热,启动速度快,响应时间极短,几乎瞬间点亮。
- 抗震动:LED结构坚固,抗振性好,不易破损。
- 多颜色:LED可以发出多种颜色的光,包括红、绿、蓝等,以及它们的组合形成的白光。
- 体积小、重量轻:LED体积小、重量轻,可以被设计成各种形状和尺寸,适用于不同环境与灯具设计。