struggle 发表于 2017-6-11 15:20:42

51单片机实现PWM控制

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

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

用T0定时器完成PWM输出,脉宽固定,T1来决定高平的宽带来进行PWM调制
具体程序如下:

其中晶振12M,载波频率20KHZ,直接用P0.1来驱动直流电机,直流电机正极接电源正,单片机低平驱动,这样灌电流大。



#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 ;   //结束输出
}

地沟油 发表于 2017-6-11 15:57:28

riverhill 发表于 2017-6-11 16:17:00

shuobing 发表于 2017-6-11 17:04:12

厉害,双定时器输出PWM,想法很好啊

yangxf0120 发表于 2017-6-11 19:13:34

谢谢分享51单片机实现PWM控制

kenxjy 发表于 2017-6-11 21:26:00

jbb2013 发表于 2017-6-12 08:35:54

想法很好

龙凤呈祥 发表于 2017-6-12 08:47:27

想法很好,好贴

marco117 发表于 2017-6-12 08:54:44

scapaflow 发表于 2017-6-12 08:56:59

页: [1] 2
查看完整版本: 51单片机实现PWM控制