51单片机实现呼吸灯

发布者:创客1992最新更新时间:2020-04-15 来源: eefocus关键字:51单片机  呼吸灯  LED 手机看文章 扫描二维码
随时随地手机看文章

一、概述


使用51单片机控制LED,实现其由暗变亮,再由亮变暗的渐变过程。


二、程序


#include <STC15F2K60S2.H>

#include "MacroAndConst.h"

 

sbit LED = P1^5;

 

#define LED_ON() LED = 0; //LED亮

#define LED_OFF() LED = 1; //LED灭

 

#define LED_PWM_LIMIT_MAX 99

#define LED_PWM_LIMIT_MIN 0

 

 

static u8 s_u8TimeCounter = 0; //中断计数

static u8 s_u8LedDirection = 0; //LED方向控制 0:渐亮  1:渐灭

static u8 s_u8LedPWMCounter = 0; //LED占空比

 

void Timer0Init(void)

{

AUXR |= 0x80; //定时器时钟1T模式

TMOD &= 0xF0; //设置定时器模式

TL0 = 0x5C; //设置定时初值

TH0 = 0xF7; //设置定时初值

TF0 = 0; //清除TF0标志

TR0 = 1; //定时器0开始计时

ET0 = 1; //使能定时器0中断

}

 

void Timer0Isr(void) interrupt 1

{

static int8 s_u8PWMCounter = 0;

TH0 = 0xF7; //定时器初始值(200us中断1次)

TL0 = 0x5C;

if(++s_u8TimeCounter >= 100) //每20ms调整一次LED占空比

{

s_u8TimeCounter = 0;

//如果是渐亮方向变化,则占空比递增

if((s_u8LedPWMCounter <= LED_PWM_LIMIT_MAX)&&(s_u8LedDirection == 0))

{

s_u8LedPWMCounter++;

if(s_u8LedPWMCounter > LED_PWM_LIMIT_MAX)

{

s_u8LedDirection = 1;

s_u8LedPWMCounter = LED_PWM_LIMIT_MAX;

}

}

//如果是渐灭方向变化,则占空比递减

if((s_u8LedPWMCounter > LED_PWM_LIMIT_MIN)&&(s_u8LedDirection == 1))    

             //此处有坑,若写成“>=”,则达不到预期效果

{

s_u8LedPWMCounter--;

if(s_u8LedPWMCounter <= LED_PWM_LIMIT_MIN)

{

s_u8LedDirection = 0;

s_u8LedPWMCounter = LED_PWM_LIMIT_MIN;

}

}

s_u8PWMCounter = s_u8LedPWMCounter; //获取LED的占空比

}

if(s_u8PWMCounter > 0) //占空比大于0,则点亮LED,否则熄灭

{

LED_ON();

s_u8PWMCounter--;

}

else

{

LED_OFF();

}

}

关键字:51单片机  呼吸灯  LED 引用地址:51单片机实现呼吸灯

上一篇:初学51单片机——简单的流水灯程序
下一篇:51单片机--LED闪烁、流水灯的简单试验

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved