標(biāo)題: 讓沒(méi)有PWM功能的單片機(jī)實(shí)現(xiàn)PWM功能 [打印本頁(yè)]

作者: wangming    時(shí)間: 2015-2-11 01:51
標(biāo)題: 讓沒(méi)有PWM功能的單片機(jī)實(shí)現(xiàn)PWM功能
  1.         AT89S51本身沒(méi)有PWM接口,程序采用軟件模擬PWM,P1口控制LED亮度,模擬PWM輸出控制燈的10個(gè)亮度級(jí)。
  2. #include <reg51.h>
  3. #define uInt unsigned int
  4. #define uchar unsigned char
  5. uchar PWM_T = 0;   //占空比控制變量  
  6. //////////////////主程序入口//////////////////////
  7. void main(void)        
  8. {  
  9.       bit flag = 1; //控制燈漸亮漸熄方式
  10.       uInt n;
  11.       TMOD=0x02;   //定時(shí)器0,工作模式2,8位定時(shí)模式  
  12.       TH0=241;     //寫入預(yù)置初值241到定時(shí)器0,使15微秒溢出一次(11.0592MHz)  
  13.       TL0=241;     //寫入預(yù)置值  
  14.       TR0=1;       //啟動(dòng)定時(shí)器  
  15.       ET0=1;       //允許定時(shí)器0中斷   
  16.       EA=1;        //允許總中斷
  17.       P1=0xff; //初始化P1  
  18.       while(1)      
  19.       {      
  20.              for(n=0;n<300;n++);  //延時(shí),將響應(yīng)定時(shí)器中斷,燈會(huì)自動(dòng)加/減一個(gè)檔次的亮度  
  21.              if(flag==1)       //燈漸亮
  22.              PWM_T++;
  23.              else          //燈漸熄
  24.              PWM_T--;
  25.              if(PWM_T>=10) //設(shè)置燈亮度級(jí)別為10
  26.              flag=0;
  27.              if(PWM_T==0)   //限定最低亮度級(jí)別為0
  28.              flag = 1;
  29.       }         
  30. }  
  31. ///////////////////定時(shí)器0中斷模擬PWM////////////////////
  32. timer0() interrupt 1 using 2   
  33. {  
  34.       static  uchar   t ;   //t用來(lái)保存當(dāng)前時(shí)間在一秒中的比例位置  
  35.        t++;    //每15微秒增加1  
  36.        if(t==10)   //1.5毫秒的時(shí)鐘周期  
  37.       {  
  38.              t=0;  //使t=0,開(kāi)始新的PWM周期  
  39.              P1=0x00;  //使LED燈亮               
  40.       }
  41.      if(PWM_T==t)  //按照當(dāng)前占空比切換輸出為高電平  
  42.      P1=0xff;        //使LED燈滅           
  43. }
復(fù)制代碼







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1