欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于STC89C52RC单片机制作的呼吸灯

程序员文章站 2024-03-17 16:04:46
...

预计用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=1; //占空比比对值
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=(65535-11520)/256;
TL1=(65535-11520)%256;
HUXI_COUNT++;	
}

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



测试结果

1.
由于51单片机性能上存在缺陷,设计的500HZ并未达到,实测400HZ,读者可根据自身需要调整PWM_COUNT或者定时器0来设置PWM波频率;
2.
实测占空比调整范围5%~95%,读者可根据需要调整HUXI_COUNT、ljk或者定时器2来调整占空比范围。

相关标签: 程序