如何基于51单片机利用定时器的实现PWM的方法详细概述

出处:电子说 发布于:2018-06-13 14:53:13

  51单片机是可以输出PWM的,比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。
  用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。
  下面重点介绍用一个定时器的实现PWM的方法。以周期为1ms(1kHZ)为例,要产生其它频率的PWM波,程序中只需作简单修改即可。用一个定时器时(如定时器T0),首先要确定PWM的周期T和占空比D,确定了这些以后,就可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n。
  因为这里我们是产生周期为1ms(1kHZ)的PWM,所以可设置中断的时间基准为0.01ms,,然后中断100次即为1ms。在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:
  1、当time>=100时,time清零(此语句保证频率为1kHZ);
  2、当time>n时(n应该在0-100之间变化开),让单片相应的I/O口输出低电平;
  3、当time<=n时,让单片相应的I/O口输出高电平,此时占空比就为%n。
  下面程序产生30%占空比的pwm:
  #include<reg51.h>
  #define uint unsigned int
  #define uchar unsigned char
  sbit PWM=P2^0;//  P2.0输出pwm
  uchar time;  // 定义占空比的变量
  void main()
  {
  TMOD=0x01;//定时器0工作方式1
  TH0=0xff;//(65536-10)/256;//赋初值定时
  TL0=0xf7;//(65536-10)%256;//0.01ms
  EA=1;//开总中断
  ET0=1;//开定时器0中断
  TR0=1;//启动定时器0
  while(1)
  {
  }
  }
  void tim0() interrupt 1
  {
  TR0=0;//赋初值时,关闭定时器
  TH0=0xff;//(65536-10)/256;//赋初值定时
  TL0=0xf7;//(65536-10)%256;//0.01ms
  TR0=1;//打开定时器
  time++;
  if(time>=100)  <span style="font-family:'KaiTi_GB2312';">//1khz</span>
  time=0;
  if(time<=30)   <span style="font-family:'KaiTi_GB2312';">//占空比%30,可改</span>
  PWM=1;
  else PWM=0;
  }
  的到波形,在示波器上显示如下图所示

  如何基于51单片机利用定时器的实现PWM的方法详细概述
  如果想修改占空比,直接在程序里面修改下面这句即可。
  if(time<=30)//占空比%30,可改占空比

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

相关技术资料
上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!