51单片机输出频率可调脉宽可调的PWM


前言

前段时间有个师弟问我关于51单片机输出PWM的问题,我看了网上的资料,各有千秋,但有一些的思路对新手不是很友好;还有一些输出的脉宽和频率不是可调的。因此写下这篇关于51单片机如何输出频率可调脉宽可调的PWM的文章


一、PWM是什么?

关于PWM网上的介绍已经很多了,我这里就简单的介绍一下。
这里插入图片描述
这个是方波,Tp是脉冲宽度,简称脉宽,PWM就是这个脉宽可以调节大小的方波,所以叫脉宽调制(Pulse Width Modulation)
PWM频率就是在一秒内一个完整的PWM发出的次数,比如PWM的频率为1HZ,即一秒发送1次,那T=1000ms;若PWM的频率为50HZ,即一秒发送50次,那T=20ms。

二、输出PWM

如何输出PWM

其实要输出一个PWM很简单,我们可以假设PWM输出引脚为P2^0。

while(1)
{
P2^0 = 1;
delay(100);//这里相当于Tp
P2^0 = 0;
delay(200);
}

让引脚输出高电平,延迟一段时间后再输出低电平,通过改变延迟的时间就可以调节PWM的脉宽。
但是这样输出的频率是不可调的,也是不准确的;而且一旦有其它程序加入,波形就会发生变化。

使用定时器控制输出频率

PWM输出频率我们可以借助定时器来实现,我们可以让定时器固定一段时间输出高电平,一段时间输出低电平。输出高电平和低电平时间之和即为PWM的周期(周期为频率的倒数),我们只要通过改变输出高电平和低电平时间之和就可以改变PWM的频率了。


sbit led = P0 ^ 0; // 定义P20口是led
sbit Pwm = P2 ^ 0;

//定时器0初始化,每1ms进入一次中断
void Timer0Init()
{
   
    TMOD |= 0X01; // 选择为定时器0模式,工作方式1,仅用TR0打开启动。
    TH0 = 0XFC; // 给定时器赋初值,定时1ms
    TL0 = 0X18;
    ET0 = 1; // 打开定时器0中断允许
    EA = 1;  // 打开总中断
    TR0 = 1; // 打开定时器
}

void main()
{
   
    Timer0Init(); // 定时器0初始化
    Pwm = 1;// 先让PWM引脚输出高电平
    while (1)
    {
   
    }
}

//定时器0的中断服务函数,即每1ms就执行这段程序
void Timer0() interrupt 1
{
   
    static u16 i
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值