找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4018|回復: 0
打印 上一主題 下一主題
收起左側(cè)

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

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:73526 發(fā)表于 2015-2-11 01:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1.         AT89S51本身沒有PWM接口,程序采用軟件模擬PWM,P1口控制LED亮度,模擬PWM輸出控制燈的10個亮度級。
  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;   //定時器0,工作模式2,8位定時模式  
  12.       TH0=241;     //寫入預置初值241到定時器0,使15微秒溢出一次(11.0592MHz)  
  13.       TL0=241;     //寫入預置值  
  14.       TR0=1;       //啟動定時器  
  15.       ET0=1;       //允許定時器0中斷   
  16.       EA=1;        //允許總中斷
  17.       P1=0xff; //初始化P1  
  18.       while(1)      
  19.       {      
  20.              for(n=0;n<300;n++);  //延時,將響應定時器中斷,燈會自動加/減一個檔次的亮度  
  21.              if(flag==1)       //燈漸亮
  22.              PWM_T++;
  23.              else          //燈漸熄
  24.              PWM_T--;
  25.              if(PWM_T>=10) //設(shè)置燈亮度級別為10
  26.              flag=0;
  27.              if(PWM_T==0)   //限定最低亮度級別為0
  28.              flag = 1;
  29.       }         
  30. }  
  31. ///////////////////定時器0中斷模擬PWM////////////////////
  32. timer0() interrupt 1 using 2   
  33. {  
  34.       static  uchar   t ;   //t用來保存當前時間在一秒中的比例位置  
  35.        t++;    //每15微秒增加1  
  36.        if(t==10)   //1.5毫秒的時鐘周期  
  37.       {  
  38.              t=0;  //使t=0,開始新的PWM周期  
  39.              P1=0x00;  //使LED燈亮               
  40.       }
  41.      if(PWM_T==t)  //按照當前占空比切換輸出為高電平  
  42.      P1=0xff;        //使LED燈滅           
  43. }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表