pwm波怎么输出,基于51单片机输出pwm波

模拟技术

2346人已加入

描述

  PWM就是脉冲宽度调制,也就是占空比可变的脉冲波形。PWM控制技术就是对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等而宽度不相等的脉冲,用这些脉冲来代替正弦波或其他所需要的波形。按一定的规则对各脉冲的宽度进行调制,既可改变逆变电路输出电压的大小,也可改变输出频率。

  51系列单片机无PWM输出功能,可以采用定时器配合软件的方法输出。对精度要求不高的场合,非常实用。

  一般可以使用两个定时器来实现,如果单片机是S51的话使用T0和T1,如果是S52的话建议使用T0和T2,因为定时器在工作方式2的八位重装模式下定时比较准确,这里我们使用T0和T1

  51单片机

  用T0定时器完成PWM输出,脉宽固定,T1来决定高平的宽带来进行PWM调制具体程序如下:其中晶振12M,载波频率20KHZ,直接用P0.1来驱动直流电机,直流电机正极接电源正,单片机低平驱动,这样灌电流大。

  基于51单片机输出pwm波程序

  #include 《 reg51.h 》

  #include 《 intrins.h 》

  sbit K1 =P1^4 ; //增加键

  sbit K2 =P1^5 ; //减少键

  sbit P00 =P0^1;

  sbit BEEP =P3^7 ; //蜂鸣器

  unsigned char PWM=0xe7; //赋初值

  void Beep();

  void delayms(unsigned char ms);

  void delay(unsigned char t);

  /*********************************************************/

  void main()

  {

  P1=0xff;

  TMOD=0x21 ;

  TH0=0xff ; //50us延时常数

  TL0=0xce ; //频率调节

  TH1=PWM ; //脉宽调节

  TL1=0 ;

  EA=1;

  ET0=1;

  ET1=1;

  TR0=1 ;

  while(1)

  {

  do{

  if(PWM!=0xff)

  {PWM++ ;delayms(10);}

  else Beep() ;

  }

  while(K1==0);

  do{

  if(PWM!=0xce)

  {PWM-- ;delayms(10);}

  else Beep() ;

  }

  while(K2==0);

  }

  }

  void timer0() interrupt 1

  {

  TR1=0 ;

  TH0=0xff ;

  TL0=0xce ;

  TH1=PWM ;

  TR1=1 ;

  P00=0 ; //启动输出

  }

  void timer1() interrupt 3

  {

  TR1=0 ;

  P00=1 ; //结束输出

  }

  /*********************************************************/

  //蜂鸣器子程序

  /*********************************************************/

  void Beep()

  {

  unsigned char i ;

  for (i=0 ;i《100 ;i++)

  {

  delay(100) ;

  BEEP=!BEEP ; //Beep取反

  }

  BEEP=1 ; //关闭蜂鸣器

  delayms(100);

  }

  /*********************************************************/

  // 延时子程序

  /*********************************************************/

  void delay(unsigned char t)

  {

  while(t--) ;

  }

  /*********************************************************/

  // 延时子程序

  /*********************************************************/

  void delayms(unsigned char ms)

  {

  unsigned char i ;

  while(ms--)

  {

  for(i = 0 ; i 《 120 ; i++) ;

  }

  }

  /*********************************************************/

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分