專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

讓沒有PWM功能的單片機(jī)實(shí)現(xiàn)PWM功能

作者:huqin   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2013年11月15日   【字體:

        AT89S51本身沒有PWM接口,程序采用軟件模擬PWM,P1口控制LED亮度,模擬PWM輸出控制燈的10個(gè)亮度級(jí)。

#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;   //定時(shí)器0,工作模式2,8位定時(shí)模式 
      TH0=241;     //寫入預(yù)置初值241到定時(shí)器0,使15微秒溢出一次(11.0592MHz) 
      TL0=241;     //寫入預(yù)置值 
      TR0=1;       //啟動(dòng)定時(shí)器 
      ET0=1;       //允許定時(shí)器0中斷   
      EA=1;        //允許總中斷
      P1=0xff; //初始化P1 
      while(1)     
      {      
             for(n=0;n<300;n++);  //延時(shí),將響應(yīng)定時(shí)器中斷,燈會(huì)自動(dòng)加/減一個(gè)檔次的亮度 
             if(flag==1)       //燈漸亮
             PWM_T++;
             else          //燈漸熄
             PWM_T--;
             if(PWM_T>=10) //設(shè)置燈亮度級(jí)別為10
             flag=0;
             if(PWM_T==0)   //限定最低亮度級(jí)別為0
             flag = 1;
      }         

///////////////////定時(shí)器0中斷模擬PWM////////////////////
timer0() interrupt 1 using 2  

      static  uchar   t ;   //t用來保存當(dāng)前時(shí)間在一秒中的比例位置 
       t++;    //每15微秒增加1 
       if(t==10)   //1.5毫秒的時(shí)鐘周期 
      { 
             t=0;  //使t=0,開始新的PWM周期 
             P1=0x00;  //使LED燈亮              
      }
     if(PWM_T==t)  //按照當(dāng)前占空比切換輸出為高電平 
     P1=0xff;        //使LED燈滅         
}

關(guān)閉窗口

相關(guān)文章