标题:
单片机呼吸灯程序源码
[打印本页]
作者:
brew9
时间:
2018-12-25 17:01
标题:
单片机呼吸灯程序源码
代码虽然简单,但效果是杠杠的。
51单片机源码:
#include <reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit led = P1^0;
/* 占空比控制 */
uint16 t = 0;
uint16 PWM = 0;
bit up = 1;
/* 此值越大,单次调整的幅度越小(越精细)*/
uint16 MaxL = 200;
/* 步长,值越大,PWM改变越慢(注意MaxL要能被s整除!!!) */
uint8 s = 100;
void main()
{
//T0工作方式2
TMOD = 0x02;
//单次溢出30us
TH0 = 0xe4;
//全局中断、T0中断允许
IE = 0x82;
//开启T0定时器
TCON = 0x10;
while(1);
}
/* 定时器0中断 */
void timer0() interrupt 1
{
/* 按固定时间间隔调整PWM大小 */
// 最初按网上的代码把PWM动态赋值放到main中,结果出现丢桢现象,
// 就是会出现LED灯亮度渐变过程中突然闪烁一下,在proteus上检查
// 波形也能看到不定时出现跨周期的低电平,相当违和,经分析,确
// 认问题出在PWM数值同步上,于是将2者均放在中断内,从而实现了
// 完美呼吸灯效果。
if((t % s) == 0)
{
PWM = up ? PWM+1 : PWM-1;
if (PWM == MaxL) up = 0;
if (PWM == 0) up = 1;
}
//PWM输出
if(t == PWM)
{
led = 1;
}
if(t == MaxL)
{
t = 0;
led = 0;
}
t++;
}
复制代码
作者:
如是便是
时间:
2019-7-7 20:09
好贴,感谢楼主
作者:
wyl138
时间:
2022-10-31 20:34
一起进步,谢谢分享。
作者:
mcuhui
时间:
2022-11-10 15:35
已验证楼主的呼吸灯程序相当nice
作者:
1235asdf
时间:
2022-11-11 17:45
有连接图片吗
作者:
nhwhg
时间:
2022-11-12 23:19
感谢楼主,已收藏.
作者:
zhang1314hong
时间:
2022-11-18 13:05
赋值运算符学习了一下
PWM = up? PWM+1:PWM-1; 等价于PWM = (up? PWM+1:PWM-1);
相当于
if(up)
PWM = PWM+1;
else
PWM = PWM-1;
作者:
大漠孤烟001
时间:
2022-11-18 13:29
#在这里快速回复#在最新 STC-ISP V6.90U 版本软件 的 范例程序部分,STC8G系列的 范例程序中有 参考源程序
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1