呼吸灯(定时器实现)

3 篇文章 0 订阅
1 篇文章 1 订阅

用延时做呼吸灯是无能的表演,真正的大手子是不允许自己的代码中出现可消除的延时。
需要源代码的可加本人QQ2587336621

void Timer3_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5    
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

  TIM_TimeBaseStructure.TIM_Period = 1000-1 ;		//1ms重装一次
  TIM_TimeBaseStructure.TIM_Prescaler = 72;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
	
	TIM_SetCompare2(TIM3,0);	
	
	TIM_ITConfig(TIM3,TIM_IT_CC2,ENABLE);
		//中断分组初始化
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级2级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //从优先级0级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 

	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器

	TIM_Cmd(TIM3, ENABLE);
}

定时器共计数1000次 用时1ms
亮度从0升到1000,然后从1000降到0。
在中断函数中实现。

u16 time3_count;
u8 time3_flag=1;
void TIM3_IRQHandler(void)
{	
	if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET) //输出比较中断
	{
		TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);		
		if(time3_count>999)//最亮
		{
			time3_flag=0;
		}
		else if(time3_count<1)//最暗
		{
			time3_flag=1;
		}
		
		if(time3_flag==1)
		{
			time3_count++;
			TIM_SetCompare2(TIM3,time3_count);
		}
		else
		{
			time3_count--;
			TIM_SetCompare2(TIM3,time3_count);
		}		
	}
}
使用定时器实现51单片机的呼吸灯效果,可以参考以下步骤: 1. 定义一个计数变量,用于控制LED灯的亮度,初始值为0。 2. 初始化定时器,设置定时器的计数器初值和计数器模式,一般使用定时器0或定时器1。 3. 在定时器中断服务函数中,每次计数器溢出时,将计数变量增加或减少一个步长,步长的大小可以自己定义。当计数变量达到一定值时,改变LED灯的亮度。 4. 在主函数中,开启定时器中断,并实现LED灯的闪烁效果。 以下是参考代码: ``` #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit LED = P1^0; // LED灯控制引脚 uchar count = 0; // 计数变量,用于控制LED灯的亮度 void Timer0_Init() { TMOD |= 0x01; // 设置定时器0为模式1 TH0 = 0xFC; // 设置定时器0的计数器初值 TL0 = 0x67; ET0 = 1; // 允许定时器0中断 TR0 = 1; // 启动定时器0 EA = 1; // 允许中断 } void Timer0_Handler() interrupt 1 { TH0 = 0xFC; // 重新设置定时器0的计数器初值 TL0 = 0x67; count++; // 计数变量增加 } void main() { Timer0_Init(); // 初始化定时器0 while (1) { if (count < 64) // 计数变量小于64时,LED灯逐渐变亮 { LED = 0; // LED灯亮 delay(10); // 延时一段时间,使灯光呈现呼吸灯效果 } else if (count >= 64 && count < 128) // 计数变量在64-127之间时,LED灯逐渐变暗 { LED = 1; // LED灯灭 delay(10); // 延时一段时间,使灯光呈现呼吸灯效果 } else { count = 0; // 计数变量清零 } } } void delay(uint n) { uint i, j; for (i = 0; i < n; i++) { for (j = 0; j < 110; j++); } } ``` 在上述代码中,使用定时器0实现呼吸灯效果,每次定时器0溢出时,计数变量count增加1,当count小于64时,LED灯逐渐变亮,当count在64-127之间时,LED灯逐渐变暗,当count大于等于128时,计数变量重置为0。同时,在主函数中使用delay函数实现LED灯亮灭的延时效果,使灯光呈现呼吸灯效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值