51单片机之用定时器写呼吸灯(全站解释最细节) |
您所在的位置:网站首页 › 《暗灯》 › 51单片机之用定时器写呼吸灯(全站解释最细节) |
基础知识介绍:
PWM:一般指脉冲宽度调制。 个人理解:在一个周期内,高电平和低电平持续时间所占总时间的百分比,即占空比,即PWM。 呼吸:一呼一吸即为呼吸。 要实现呼吸的效果,就要在呼气和吸气的这俩个小周期内实现pwm的动态变化,从视觉上看到LED由亮到灭,由灭到亮的过程。 个人理解:在一个呼气或者吸气的过程中,pwm改变速度足够快的情况下,其实对LED管脚电压的积分原理。实际就是求高电平或者低电平波形面积问题。 插播一条视频: !!!!!一定要看!!!!! 动态变化的pwm 代码分享: /********************************************************************************* * 作者:呆瓜 * 版本:V1.1 * 主控芯片:STC89C52 * 程序功能:LED的呼吸效果 * 程序说明: * 时间:2021.10.13 *********************************************************************************/ #include /****配置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的判定值 ****转载请注明出处**** ****请大佬指点**** ****希望给个三连**** |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |