蓝桥杯单片机PWM控制

WM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%.
蓝桥杯单片机PWM控制_第1张图片
对于蓝桥杯来说PWM 信号其实就是一高一低的一系列电平组合在一起。具体方法是给I/O加一个定时器,对于你要求输出的PWM信号频率与你的定时器一致,用定时器中断来计数,但是这种方法一般不采用,除非对于精度、频率等要求不是很高可以这样实现。

下面为例子
pwm频率100hz 周期=0.01s =10ms =10000us=100us*100
通过定时器控制这100个定时过程中高电平个数实现占空比调节

蓝桥杯单片机PWM控制_第2张图片

#include 
#define uchar unsigned char;
#define uint unsigned int;
uchar count=0;
uchar flag=0;
uchar tt=0;//定时器计数
uchar pwm_num=0;//pwm占空比
void allinit();//打开控制L1锁存器
void Delay5ms();
void keyscan();
void Timer0Init(void);

void main()
{
	allinit();
	Timer0Init();
  P00=1;
	while(1)
	{
		keyscan();
		if(flag==1)
		{
			   flag=0;
					switch(count)
					{
						case 0:
							P00=0;//L1亮 共阴极 10%亮度则为低电平时间
						  EA=1;
							ET0=1;
							pwm_num=10;
							count=1;			
						break;
						case 1:
							pwm_num=50;
							count=2;
						break;
						case 2:
							pwm_num=90;
							count=3;
						break;
					 case 3:
					 		P00=1;
					    EA=0;
							ET0=0;
							count=0;
						break;
					
					}
		
		}
	
		
	
	}
}

void allinit()
{
	  P2=0X80;
//	P0=0XFF;//led
//	
//	P2=0XC0;
//	P0=0XFF;//段选
//	P2=0XE0;
//	P0=0XFF;//位选数码管
//	
//	P2=0XA0;
//	P0=0X00;//蜂鸣器 继电器
	
}

void Delay5ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 54;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}

void keyscan()
{
 if(P30==0)
 {
	 Delay5ms();	
	 if(P30==0)
	 {
		 flag=1;
	 }
	 while(!P30);
 }


}

void Timer0Init(void)		//100微秒@11.0592MHz pwm频率100hz 周期0.01s 10ms 10000us=100us*100
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xAE;		//设置定时初值
	TH0 = 0xFB;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}

void Timer0()	interrupt 1
{
	tt++;
	if(tt==pwm_num)
	{
	  P00=1;
	}
	else if(tt==100)
	{
		P00=0;
	  tt=0;
	}
}

	

你可能感兴趣的:(蓝桥杯,蓝桥杯,PWM,占空比)