STM学习笔记-点亮LED灯
文章目录
- STM学习笔记-点亮LED灯
- 一、呼吸灯原理
- 二、呼吸灯代码
-
- 1、main.c
- 2、led.c
- 3、led.h
- 三、代码分析
一、呼吸灯原理
占空比:占空比是指高低电平所占时间的比LED照明和熄灭的时间比) 使用以下照明LED说明灯的原理
GPIO_SetBits(LEDPORT,LED1); //LED高电平灯(1)delay_us(500); GPIO_ResetBits(LEDPORT,LED1); //LED灯为低电平(0)delay_us(500);
上述代码的高低电平输出时间为500,占空比为1,输出结果为小灯常亮(见下图) 当我们将高电平输出时间降低到5时,代码如下:
GPIO_SetBits(LEDPORT,LED1); //LED高电平灯(1)delay_us(5); GPIO_ResetBits(LEDPORT,LED1); //LED灯为低电平(0)delay_us(500);
此时占空比为1/100,小灯常亮,但输出亮度明显降低(见下图) 利用这个原理,我们可以在呼吸灯处制作一个呼吸灯
二、呼吸灯代码
1、main.c
#include "stm32f10x.h" //STM32头文件#include "sys.h"#include "delay.h"#include "led.h"int main (void){ //主程序 //定义所需的变量 u8 MENU; u16 t,i; ///初始化程序 RCC_Configuration(); ///时钟设置 LED_Init(); //设置span> MENU = 0; t = 1; //主循环 while(1){
//菜单0 if(MENU == 0){
//变亮循环 for(i = 0; i < 40; i++){
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1 delay_us(t); //延时 GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0 delay_us(501-t); //延时 } t++; if(t==500){
MENU = 1; } } //菜单1 if(MENU == 1){
//变暗循环 for(i = 0; i < 40; i++){
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1 delay_us(t); //延时 GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0 delay_us(501-t); //延时 } t--; if(t==1){
MENU = 0; } } }}
2、led.c
#include "led.h"void LED_Init(void){
//LED灯的接口初始化 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStructure.GPIO_Pin = LED1 | LED2; //选择端口号(0~15或all) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz) GPIO_Init(LEDPORT, &GPIO_InitStructure); }
3、led.h
#ifndef __LED_H#define __LED_H #include "sys.h"//#define LED1 PBout(0)// PB0//#define LED2 PBout(1)// PB1 #define LEDPORT GPIOB //定义IO接口#define LED1 GPIO_Pin_0 //定义IO接口#define LED2 GPIO_Pin_1 //定义IO接口void LED_Init(void);//初始化 #endif
三、代码分析
u8 MENU; u16 t,i;
定义一个名为MUNE的8位无符号变量和分别名为t,i的16位无符号变量。变量含义详情如下:
数据类型 | 变量定义 |
---|---|
u32 a | 定义32位无符号变量a |
u16 a | 定义16位无符号变量a |
u8 a | 定义8位无符号变量a |
vu32 a | /定义易变的32位无符号变量a |
vu16 a | 定义易变的 16位无符号变量a |
vu8 a | 定义易变的 8位无符号变量a |
uc32 a | 定义只读的32位无符号变量a |
uc16 a | 定义只读 的16位无符号变量a |
uc8 a | 定义只读 的8位无符号变量a |
if(MENU == 0){ //变亮循环 for(i = 0; i < 40; i++){ GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1 delay_us(t); //延时 GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0 delay_us(501-t); //延时 } t++; if(t==500){ MENU = 1; }}
利用占空比让小灯变量(变暗则将变量t–)通过改变i小于的值控制呼吸灯的速度。