占空比:占空比指的是高低电平所占的时间的比率(即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,小灯常亮,但是输出的亮度明显降低(见下图)
利用该原理,我们就可以制作处一个呼吸灯了
#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();
//设置变量的初始值
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;
}
}
}
}
#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);
}
#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小于的值控制呼吸灯的速度。