51单片机呼吸灯的实现

1.PWM介绍

PWM(Pulse Width Modulation)即脉冲宽度调制(如电机:转5ms停1ms还是转5ms停2ms),在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域。LED没有电的时候也不是马上熄灭的,尽管很快(余晖);这里只做简单介绍,具体原理可以自己上网查找;

PWM重要参数:
     频率 = 1 / TS            占空比 = TON / TS           精度 = 占空比变化步距

频率低电机抖动明显,启动 停止 启动...频率越高越平缓

占空比1%—>2%—>3%...精度就为1%

2.源码

通常为了保证周期是恒定的(不随着占空比变化而变化)所以Delay中的两个延时时间加起来要是一个固定值,那么它的PWM的周期就是一个固定值。控制Delay中的两个延时时间(Time与100-Time)不断变化,那么就可以控制亮度不断进行变化了,从而完成呼吸灯的效果。(由暗变亮再由亮变暗不断循环)

其中两个for循环是用来延缓亮度变化的,要不然太快了;

这里设计的缺点:占用主循环,不断翻转I/O口来延时,在整个呼吸灯过程中,主循环是没有办法来干其它事情的。所以通常我们把PWM写到定时器中去;

#include <REGX52.H>

//简易的延时函数
void Delay(unsigned int t)
{
	while(t--);
}

void main()
{
	unsigned char Time,i;
	while(1)
	{
		for(Time=0;Time<100;Time++)		//改变亮灭时间,由暗到亮
		{
			for(i=0;i<15;i++)			//计次延时
			{
			  P2_0=0;					//LED亮
				Delay(Time);			//延时Time
				P2_0=1;					//LED灭
				Delay(100-Time);		//延时100-Time
			}
		}
		for(Time=100;Time>0;Time--)		//改变亮灭时间,由亮到暗
		{
			for(i=0;i<15;i++)			//计次延时
			{
			  P2_0=0;					//LED亮
				Delay(Time);			//延时Time
				 P2_0=1;					//LED灭
				Delay(100-Time);		//延时100-Time
			}
		}
	}
}

51单片机呼吸灯实现是通过PWM(脉宽调制)技术来实现的[^1]。下面是配置51单片机呼吸灯PWM的步骤: 1. 配置P_SW2寄存器:将最高位EAXFR置1,允许访问XFR寄存器。 2. 选择PWM0的时钟为系统时钟:通过设置PWM0T1寄存器的CLKDIV位来选择时钟源。 3. 初始化PWM0模块:设置PWM0T1寄存器的PWM0T1EN位为1,使得可以驱动PWM0模块。 4. 配置PWM0的工作模式:设置PWM0T1寄存器的PWM0T1MD位来选择工作模式,例如选择自动重载模式。 5. 配置PWM0的周期和占空比:设置PWM0T1寄存器的PWM0T1PR和PWM0T1DR位来设置周期和占空比的值。 6. 启动PWM0:设置PWM0T1寄存器的PWM0T1RUN位为1,启动PWM0。 下面是一个示例代码,演示了如何在51单片机实现呼吸灯效果的PWM控制: ```c #include <reg52.h> sbit PWM0 = P1^0; // PWM0输出引脚 void delay(unsigned int t) // 延时函数 { unsigned int i, j; for(i = 0; i < t; i++) for(j = 0; j < 125; j++); } void main() { unsigned int i; P_SW2 = 0x80; // 配置P_SW2寄存器,允许访问XFR寄存器 PWM0T1 = 0x00; // 选择PWM0的时钟为系统时钟 PWM0T1 |= 0x01; // 初始化PWM0模块 PWM0T1 |= 0x10; // 配置PWM0的工作模式为自动重载模式 while(1) { for(i = 0; i < 100; i++) // 呼吸灯效果,占空比从0增加到100 { PWM0T1DR = i; // 设置PWM0的占空比 delay(10); // 延时 } for(i = 100; i > 0; i--) // 呼吸灯效果,占空比从100减小到0 { PWM0T1DR = i; // 设置PWM0的占空比 delay(10); // 延时 } } } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记忆&碎片

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值