pwm-practise

pwm-practise,第1张

pwm-practise PWM脉宽调制

内容来自b站小蜜蜂老师

一、什么是脉宽调制

PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%高低电平在一个周期内各占一半

二、pwm实际运用 led调光

#include "reg52.h"



unsigned int count = 0; //计数
unsigned char pwm_duty = 0;  //记录占空比
unsigned char status = 0; //状态记录

sbit S7 = P3^0; //按键
sbit L1 = P0^1; //led

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


//--------------------------74HC138初始化---------------------------
void Init_74HC138(unsigned char n)
{
 	switch(n)
	{
		case 4: P2 = P2 | 0x1f; P2 = 0x80; break;
		case 5: P2 = P2 | 0x1f; P2 = 0xa0; break;
		case 6: P2 = P2 | 0x1f; P2 = 0xc0; break;
		case 7: P2 = P2 | 0x1f; P2 = 0xe0; break; 
	}
}
//--------------------------------------------------------------------

//-----------------------------系统初始化-----------------------------
void InitSystem(void)
{
 	 Init_74HC138(5);			//Y5选通
	 P0 = 0x00; //关闭继电器和蜂鸣器
	 Init_74HC138(4);		 //Y4
	 P0 = 0xff; //关闭LED

}
//----------------------------------------------------------------------


//-------------------------------定时器0初始化-------------------------
void Init_Timer0(void)
{
 	TMOD = 0x01;  //定时0 方式二16位
	//100us
	TH0 = (65535-100)/256; //高八位			  
	TL0 = (65535-100)%256; //低八位
	ET0 = 1; //定时器0中断使能
	EA = 1; //总中断
}
//----------------------------------------------------------------------


//--------------------------------按键处理函数----------------------------
void Key_Tackle(void)
{
 	if(S7 == 0)
	{
		 Delay(50);
		 if(S7 == 0)
		 {
		 		switch(status)
				{
				 	case 0:	L1 = 0; TR0 = 1; pwm_duty = 10;status = 1;break;
					case 1: pwm_duty = 50;status = 2;break;
					case 2: pwm_duty = 90;status = 3;break;
					case 3: L1 = 1; TR0= 0;status = 0;break;
				}
				while(S7 == 0);
		}
		
	}

}


void main(void)
{
	InitSystem();
	Init_Timer0();
	Init_74HC138(4);
 	while(1)
	{
		 Key_Tackle();
	}

}



//--------------------------定时器0中断服务函数-------------------------
void Server_Timer0() 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;
	}
}
//---------------------------------------------------------------------

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5702821.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存