一、呼吸灯简介
呼吸灯是指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%,依次循环。
文章来源:https://www.toymoban.com/news/detail-842623.html
四、程序编写(项目创建和参数设置请查看我上一篇文章)
#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++;
}
五、 结果
呼吸灯的演示文章来源地址https://www.toymoban.com/news/detail-842623.html
到了这里,关于九齐NY8A051F单片机呼吸灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!