九齐NY8A051F单片机实现呼吸灯效果

一、呼吸灯简介

呼吸灯是指LED灯通过单片机控制实现由亮到暗的逐渐变化,就和人体呼吸一样。这里我们单片机要用到定时器和PWM占位来实现这项功能。

二、NY81051F定时器的定义

	DISI();					//静止所以中断
	TMR0=256-160;			//初始化寄存器,160*6.4=1024us,1MS进一次中断
	T0MD = C_PS0_TMR0 | C_PS0_Div;	//将TMR0分配,20M/10/64-->156.25KHz  (timeBase=6.4us),INT Falling Edge
	INTE=C_INT_TMR0;		//启动定时器
	ENI();					//开启中断

三、PWM(脉冲宽度调制)

通过改变脉冲宽度来改变电压的输出,T=1/f,T是周期,f是频率。如果频率为50Hz,那么一个周期就是20ms,一秒就有50次PWM周期。一个周期如下图,脉冲时间所占周期的时间的比例就是占空比。比如要实现呼吸灯则亮90%灭10%,亮80%灭20%,亮70%灭30%,依次循环。

 

四、程序编写(项目创建和参数设置请查看我上一篇文章)

#include <ny8.h>
#include "ny8_constant.h"
#include "typedefs.h"
#define uchar unsigned char
#define uint unsigned int

 
static unsigned char dir;
static unsigned int count=0,timer=0,value1=0;

#define IO_LED_R PORTBbits.PB4    //红色
#define IO_LED_G PORTBbits.PB2	  //绿色
#define IO_LED_B PORTBbits.PB1    //蓝色    

void initialize(void)
{	
	IOSTB = C_PB4_Output| C_PB2_Output | C_PB1_Output;	
	DISI();					
	TMR0=256-160;			
	T0MD = C_PS0_TMR0 | C_PS0_Div;	
	INTE=C_INT_TMR0;		
	ENI();				

}
void led(void)
{
	    while(1) 
	   {
        if(count > 50) 
        {
            count = 0;			
            if(dir == 1) 
            	value1++;
            else 
            	value1--;
        }
        if(timer > 1000)
            timer = 0;
        if(value1 == 1000)
            dir = 0;
        if(value1 == 0)
            dir = 1;
        if(timer < value1)
		{	
			CLRWDT();
           IO_LED_R=0;
           IO_LED_G=0;
           IO_LED_B=0;
		}
        else
		{
		CLRWDT();
           IO_LED_R=1;
           IO_LED_G=0;
           IO_LED_B=0;
		}
    }
}
void main(void)
{	 
	initialize();//初始化定时器
	led();//PWM控制LED的亮灭
}

void isr(void)  __interrupt(0)
{
		count++;
		timer++;		
}

五、 结果

呼吸灯的演示

作者:吾乃混子生

物联沃分享整理
物联沃-IOTWORD物联网 » 九齐NY8A051F单片机实现呼吸灯效果

发表评论