专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

让没有PWM功能的单片机实现PWM功能

作者:huqin   来源:本站原创   点击数:  更新时间:2013年11月15日   【字体:

        AT89S51本身没有PWM接口,程序采用软件模拟PWM,P1口控制LED亮度,模拟PWM输出控制灯的10个亮度级。

#include <reg51.h>
#define uInt unsigned int
#define uchar unsigned char
uchar PWM_T = 0;   //占空比控制变量 
//////////////////主程序入口//////////////////////
void main(void)      

      bit flag = 1; //控制灯渐亮渐熄方式
      uInt n;
      TMOD=0x02;   //定时器0,工作模式2,8位定时模式 
      TH0=241;     //写入预置初值241到定时器0,使15微秒溢出一次(11.0592MHz) 
      TL0=241;     //写入预置值 
      TR0=1;       //启动定时器 
      ET0=1;       //允许定时器0中断   
      EA=1;        //允许总中断
      P1=0xff; //初始化P1 
      while(1)     
      {      
             for(n=0;n<300;n++);  //延时,将响应定时器中断,灯会自动加/减一个档次的亮度 
             if(flag==1)       //灯渐亮
             PWM_T++;
             else          //灯渐熄
             PWM_T--;
             if(PWM_T>=10) //设置灯亮度级别为10
             flag=0;
             if(PWM_T==0)   //限定最低亮度级别为0
             flag = 1;
      }         

///////////////////定时器0中断模拟PWM////////////////////
timer0() interrupt 1 using 2  

      static  uchar   t ;   //t用来保存当前时间在一秒中的比例位置 
       t++;    //每15微秒增加1 
       if(t==10)   //1.5毫秒的时钟周期 
      { 
             t=0;  //使t=0,开始新的PWM周期 
             P1=0x00;  //使LED灯亮              
      }
     if(PWM_T==t)  //按照当前占空比切换输出为高电平 
     P1=0xff;        //使LED灯灭         
}

关闭窗口

相关文章