文档库 最新最全的文档下载
当前位置:文档库 › 定时器呼吸灯

定时器呼吸灯


/****************************************
基于定时器的51单片机呼吸灯程序
功能:实现led由暗变亮再由亮变暗
日期:2015-8-26
*****************************************/
#include "reg52.h"

#define TimeCnt_50us 1
#define TimeCnt_MS 150 //电平宽度改变时间最大值,led亮度变化快慢由此值决定
#define TimeCnt_cycle 250 //pwm最大周期值,此值决定led变化平滑度,数值越大越平滑

#define led P3 //定义LED
#define ON 0xff
#define OFF 0x00

unsigned int PWM_ChangeCnt; //电平宽度改变时间计数变量
unsigned int PWM_WideCnt; //电平宽度计数变量
unsigned int SYS_TimeCnt; //系统定时器计数基准
unsigned char flag;
unsigned char d_flag;
unsigned char pwm_h; //电平宽度临时变量

void T0_Timer();
void Initial();
void pwm(unsigned char high,unsigned char cycle);
void pwm_delay();

void main()
{
Initial();
while(1)
{
pwm_delay();
pwm(pwm_h,TimeCnt_cycle);
}
}

void pwm(unsigned char high,unsigned char cycle) //pwm产生程序
{
if(SYS_TimeCnt>=TimeCnt_50us) //程序运行时间间隔
{
PWM_WideCnt++; //电平实际宽度加1
PWM_ChangeCnt++; //电平宽度改变延时加1
SYS_TimeCnt=0;
switch(flag)
{
case 0:
led=ON;
if(PWM_WideCnt>=high) //判断电平宽度是否达到预设宽度值
{
PWM_WideCnt=0;
flag=1; //切换到下一步骤
}
break;
case 1:
led=OFF;
if(PWM_WideCnt>=cycle-high) //低电平产生
{
PWM_WideCnt=0;
flag=0; //切换到上一步骤
}
break;
}
}
}

void pwm_delay() //呼吸灯延时渐变
{
if(PWM_ChangeCnt>=TimeCnt_MS) //亮度变化延时时间到
{
PWM_ChangeCnt=0;
switch(d_flag)
{
case 0:
pwm_h++; //高电平宽度逐渐增加
if(pwm_h>=TimeCnt_cycle) //高电平宽度=最大周期值
{
pwm_h=TimeCnt_cycle;
d_flag=1; //切换到下一步骤
}
break;
case 1:
pwm_h--; //高电平宽度逐渐减小
if(pwm_h<=0) //高电平宽度为0
{
pwm_h=0;
d_flag=0; //切换到上一步骤
}
break;
}
}

}

void

Initial()
{
pwm_h=0;
d_flag=0;
PWM_WideCnt=0;
flag=0;
TMOD=0x01; //定时器0工作方式1
TH0=0xff; //装初值50us;11.0592MHz
TL0=0xd1;
EA=1; //开总中断
ET0=1; //允许T0定时器中断
TR0=1; //开定时器T0
}

void T0_Timer() interrupt 1
{
TF0=0; //清零中断标志
TR0=0; //关T0中断
SYS_TimeCnt++;
TH0=0xff; //重装初值
TL0=0xd1;
TR0=1;
}

相关文档