文章目录[隐藏]
基础知识介绍:
PWM:一般指脉冲宽度调制。
个人理解:在一个周期内,高电平和低电平持续时间所占总时间的百分比,即占空比,即PWM。
呼吸:一呼一吸即为呼吸。
要实现呼吸的效果,就要在呼气和吸气的这俩个小周期内实现pwm的动态变化,从视觉上看到LED由亮到灭,由灭到亮的过程。
个人理解:在一个呼气或者吸气的过程中,pwm改变速度足够快的情况下,其实对LED管脚电压的积分原理。实际就是求高电平或者低电平波形面积问题。
插播一条视频: !!!!!一定要看!!!!!
动态变化的pwm
代码分享:
/*********************************************************************************
* 作者:呆瓜
* 版本:V1.1
* 主控芯片:STC89C52
* 程序功能:LED的呼吸效果
* 程序说明:
* 时间:2021.10.13
*********************************************************************************/
#include<reg52.h>
/****配置LED****/
sbit LED = P0^0;
bit Direct_flag = 0; //LED的呼吸方向的开关
/****函数声明****/
void T0init();
/****全局变量****/
unsigned int PWM_wanttime=0; //想要多长时间改变的占空比一次
unsigned int Breath_wanttime=0; //想要多长时间改变呼气或者吸气的值时间
unsigned int PWM_value = 0; //占空比的大小
void main()
{
T0init();
while(1)
{
}
}
/*********************************************************
* 函数说明 :1ms定时
* 入口参数 :void
* 返回值 :void
*********************************************************/
void T0init()
{
TMOD |= 0x01; //设置定时器为工作方式1
TH0=0XFC; //1ms定时,装入初值
TL0=0X66;
ET0 = 1; //开定时器的中断
TR0 = 1; //开定时器
EA = 1; //开总中断
}
void Time0(void) interrupt 1
{
TH0=0XFC; //1ms定时,装入初值
TL0=0X66;
PWM_wanttime++; //改变的占空比一次的标志
Breath_wanttime++; //呼气或者吸气的时间改变的标志
if(PWM_wanttime == PWM_value) //判断是否到了点亮LED的时候
LED = 0; //点亮LED
if(PWM_wanttime == 10) //当前周期结束
{
LED = 1; //熄灭LED
PWM_wanttime = 0; //重新计时,去改变占空比
}
if((Breath_wanttime == 200) && (Direct_flag == 0)) //200ms 改一次占空比,占空比每次增加10%
{
Breath_wanttime = 0;
PWM_value++; //改变占空比的值
if(PWM_value == 9) //占空比更改方向
Direct_flag = 1;
}
if((Breath_wanttime == 200) && (Direct_flag == 1)) //200ms 改一次占空比,占空比每次减少10%
{
Breath_wanttime = 0;
PWM_value--; //改变占空比的值
if(PWM_value == 1) //占空比更改方向
Direct_flag = 0;
}
}
注: 呼吸流畅度调整 PWM_wanttime 的判定值
呼吸持续时间调整 Breath_wanttime的判定值
****转载请注明出处****
****请大佬指点****
****希望给个三连****
版权声明:本文为CSDN博主「Nop_(void)」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_46136319/article/details/120751728
暂无评论