利用PWM控制灯光

一、PWM定义:

脉宽调制(PWM)基本原理:控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等但宽度不一致的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。按一定的规则对各脉冲的宽度进行调制,既可改变逆变电路输出电压的大小,也可改变输出频率

二、处理过程:

1、设置提供调制方波的片上定时器/计数器的周期

2、 在PWM控制寄存器中设置接通时间

3、设置PWM输出的方向,这个输出是一个通用I/O管脚

4、启动定时器(信号输出)

5、使能PWM控制器

此过程中,我们只需要控制PWM占控比即可,调整工作状态。

三、功能要求:

(1)PWM脉宽信号的频率为100Hz.

(2)系统上电后L1指示灯处在熄灭状态。

(3)L1指示灯有4种亮度模式,分别是完全熄灭、10%的亮度、50%的亮度、90%的亮度

(4)按下S7按键,循环切换L1指示灯的四种亮度模式。

代码如下:

#include "reg52.h"
sbit L1 = P0^0;
sbit S7 = P3^0;

void SelectHC573()
{
	P2 = (P2 & 0x1f) |0x80;
}
//定时器相关函数
unsigned char count =0;
unsigned char pwm_duty =0;
void InitTmier0()
{
	TMOD = 0x01;
	TH0 = (65535 - 100)/256 ;
	TL0 = (65535 - 100)%256;
	
	ET0 = 1;
	EA = 1;
}
void ServiceTimer0 () interrupt 1
{
	TH0 = (65535 - 100)/256 ;
	TL0 = (65535 - 100)%256;
	
	count++;
	if(count == pwm_duty)
	{
		L1 = 1;
	}
	else if(count == 100)
	{
		L1 = 0;
		count = 0;
	}
}
//=====
//按键相关函数
void Delay(unsigned int t)
{
	while(t--);
}
unsigned char stat = 0;
void ScanKeys()
{
	if(S7 == 0)
	{
		Delay(100);
		if(S7 == 0)
		{
			switch(stat)
			{
				case 0:
					L1 = 0;
				  TR0 = 1;
				  pwm_duty = 10;
				stat = 1;
				break;
				
				case 1:
					pwm_duty = 50;
				  stat = 2;
				break;
				
				case 2:
					pwm_duty = 90;
					stat = 3;
				break;
				
				case 3:
					L1 = 1;
				  TR0 = 0;
				  stat = 0;
				break;
			}
			while(S7 == 0);
		}
	}
}
//=======


void main()
{
	SelectHC573();
	L1 = 1;
	InitTmier0();
	while(1)
	{
		ScanKeys();
	}
}

上一篇:线程池


下一篇:线程池基本使用