 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();
}
}
这是一个呼吸灯的程序,灯从最暗逐渐变亮,之后在逐渐变暗,循环往复。Proteus仿真已经通过。至于题主要求的其他功能,只需在上面修改就行。
#include "reg52.h"
sbit LedHuxi1=P1^0;
#define time (65536-1000) // 单次定时1ms
unsigned char T_High, T, ti, dir;
void InitTimer0(void)
{
TMOD=0x01;
TL0 = time; //initial timer1 low byte
TH0 = time >> 8; //initial timer1 high byte
TR0 = 1; //timer1 start running
ET0 = 1; //enable timer1 interrupt
EA = 1; //open global interrupt switch
}
void Delay(void)
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<255;j++)
;
}
void main(void)
{
T_High=0; //高电平
T=30; //周期
ti=0;
dir=0;
InitTimer0();
while(1){
Delay();
if((T_High<T)&&(dir==0))
T_High++;
else if(T_High==T) {
dir=1;
T_High--;
}
else if((T_High>0)&&(dir==1))
T_High--;
else
dir=0;
}
}
/* Timer0 interrupt routine */
void tm0_isr() interrupt 1
{
TL0 = time;
TH0 = time >> 8;
if(ti<T_High){
LedHuxi1=1;
ti++;
}else if(ti<T){
LedHuxi1=0;
ti++;
}else{
ti=0;
}
}
首尾两个有了,你的代码是最大2000的循环,中间的要亮度依次递减,只需要亮灯阶段(要看你的电路是led正极接p2还是负极接P2)的时间依次递减就可以了
arduino 对多个led实现不同频率的呼吸灯
https://blog.csdn.net/weixin_43833645/article/details/121587608
如果还有其他问题,也可以发出来,我看到会回复得
没看懂题目,到底几个呼吸灯?