|
/**********PWM呼吸燈**********************/
/**********100us中斷一次*****************/
/**********100ms更新一次PWM*************/
/*************T=2000us*****************/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit led=P1^0;
void timer0_init(); //定時(shí)器初始化
uchar zhongduan_count; //中斷次數(shù) 10次變化一次
uchar pwm_value; //當(dāng)前高電平對(duì)應(yīng)的定時(shí)次數(shù)
uint update_count; //占空比更新 中斷的次數(shù) 1000次增加5%
bit flag; // flag 0 增加 1減少
void timer0_init()
{
EA=1;
TMOD=0x02; //定時(shí)器0 方式2
TH0=0xA3; //100us
TL0=0xA3;
ET0=1; //中斷打開(kāi)
TR0=1; //打開(kāi)定時(shí)器
}
void main()
{
zhongduan_count=0;
update_count=0;
pwm_value=10;
flag=0;
timer0_init();
led=1;
while(1);
}
void time0() interrupt 1
{
zhongduan_count++;
update_count++;
if(zhongduan_count==20) //控制周期 20*100us=2ms 一個(gè)周期 不變
{
led=1;
zhongduan_count=0;
}
if(zhongduan_count==pwm_value)
{
led=0;
}
if(update_count==1000) //100ms更新一次占空比
{
if((flag==0)) //標(biāo)志為清0 說(shuō)明我們現(xiàn)在為占空比增加模式
{
update_count=0; //占空比更新中斷的次數(shù)清0,記錄下一次到達(dá)100ms
pwm_value++; //占空比增加5% 因?yàn)?/20=0.05=5%
if(pwm_value==20) //如果占空比為100% 我們進(jìn)入到占空比減少模式
{
flag=1;
}
}
}
if(update_count==1000) //100ms更新一次占空比
{
if(flag==1) //標(biāo)志位置1 說(shuō)明我們現(xiàn)在為真空比減少模式
{
update_count=0; //占空比更新中斷的次數(shù)清0,記錄下一次到達(dá)100ms
pwm_value--; //占空比減少5%
if(pwm_value==0) //如果占空比為0% 進(jìn)入到占空比增加模式
{
flag=0;
}
}
}
}
|
|