PWM脉宽调制
内容来自b站小蜜蜂老师
一、什么是脉宽调制
PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%高低电平在一个周期内各占一半
二、pwm实际运用 led调光
#include "reg52.h"
/********************************************
Date:2022-1-11
Author:小殷同学
Learn From:B 站小蜜蜂老师
*********************************************/
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;
}
}
//---------------------------------------------------------------------