基於STC89C52RC單片機制作的呼吸燈

預計用500HZpwm波驅動呼吸燈,呼吸燈呼吸頻率爲5s

設計思路

1.
使用兩個定時器,T0用於PWM波翻轉,T1用於調整佔空比,均採用16位計時模式,因爲51單片機在此模式下不能自動重裝初值,因此需要在每一次觸發中斷後手動重裝初值,爲了不造成太大誤差,重裝初值程序需要寫在中斷最前面,PWM波佔空比在5s內先由0%增加到100%,再逐漸減少到0%,爲了保證呼吸燈呼吸均勻,決定每次以2.5%的增幅改變佔空比,共改變80次;

2.
T0每25us中斷一次,當累計中斷80次(25×80=2000us,保證週期爲2ms)時PWM波翻轉;T1用於調整佔空比,每12.5ms中斷一次,當累計中斷5次(12.5×5=62.5ms,5s/80=62.5ms)時改變佔空比;
3.
呼吸燈正極接vcc,串聯1k電阻後接到P1^3口;

#include<reg52.h>
unsigned char XUNHUAN=0;
unsigned char PWM_COUNT=0; //PWM翻轉計時
unsigned int HUXI_COUNT=0; //佔空比調節計時
signed char PWM_VALUE=2; //佔空比比對值
unsigned char ljk=0;控制佔空比調整比對值direc_flag
bit direc_flag=0; //佔空比調節比對值,0爲增加,1爲減少
sbit LED=P1^3;//定義呼吸燈接口

void timer0_init() 
{ 
    TMOD=0x11;
	TH0=(65536-46)/256;
	TL0=(65536-46)%256;
	TH1=(65536-11520)/256;
	TL1=(65536-11520)%256;
	EA=1;
	ET0=1;
	ET1=1;
	TR1=1;
	TR0=1;
PWM_COUNT =0; //初始化定時器
} 

void time0()           interrupt 1 
{ 
    TH0=(65536-46)/256;
	TL0=(65536-46)%256;
    PWM_COUNT++;
	if(PWM_COUNT==PWM_VALUE)
{
LED=1;
}
if(PWM_COUNT==40)
{
LED=0;
PWM_COUNT=0;
}
	
}
void time1()            interrupt 3 
{
TH1=(65536-11520)/256;
TL1=(65536-11520)%256;
HUXI_COUNT++;	
}

void main() 
{
    LED=1;
while(1)
{
	XUNHUAN=1;
	if(HUXI_COUNT==5&&direc_flag==0)
  {
     HUXI_COUNT=0;
     PWM_VALUE=PWM_VALUE+2;
    ljk++;
  }
      if(ljk==40)
        direc_flag=1;
            if(HUXI_COUNT==5&&direc_flag==1)
        {
                      HUXI_COUNT=0;
                      PWM_VALUE=PWM_VALUE-2;
                              ljk++;
        }
              if(ljk==80)
           {
                    direc_flag=0;
                      ljk=0;
                  PWM_VALUE=2;
           }
}
	}



測試結果

1.
由於51單片機性能上存在缺陷,設計的500HZ並未達到,實測400HZ,讀者可根據自身需要調整PWM_COUNT或者定時器0來設置PWM波頻率;
2.
實測佔空比調整範圍5%~95%,讀者可根據需要調整HUXI_COUNT、ljk或者定時器2來調整佔空比範圍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章