×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-05-29 发布时间:
|
AT89S51本身没有PWM接口,程序采用软件模拟PWM,P1口控制LED亮度,模拟PWM输出控制灯的10个亮度级。

#include  
#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灯灭          
}

关键字:PWM功能  单片机 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项