欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4590|回復: 1
打印 上一主題 下一主題
收起左側

51單片機學習:定時器產生PWM可調方波,控制led燈亮度

[復制鏈接]
跳轉到指定樓層
樓主
ID:161768 發表于 2017-1-14 18:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
使用定時器T0產生PWM方波,
用按鍵調整占空比,20級可調
控制led燈的亮度等級.

源程序:
  1. #include  "my51.h"
  2. #include  "timer0.h"

  3. #define grading    20                       //亮度20級變化
  4. sbit keyS3=P3^5;                            //按鍵調整占空比,PWM_keyChange++
  5. sbit keyS4=P3^6;                            //                                PWM_keyChange--

  6. u8 PWM_keyChange=10;                     //初值,按鍵調整在1~20之間變化
  7.                                                            //占空比   PWM_keyChange/grading

  8. void T0_work()                                   //本函數由T0定時器中斷函數調用
  9. {       
  10.         if(timeMultiple1Flag)
  11.         {               
  12.                 led=off(7);                           //關閉7號燈
  13.                 timeMultiple1Flag=0;   //清定時器復用置位標志
  14.         }
  15.        
  16.         if(timeMultiple2Flag)
  17.         {               
  18.                 led=on(7);                           //打開7號燈
  19.                 timeMultiple2Flag=0;   //清定時器復用置位標志
  20.         }                 
  21. }

  22. void main()                                            //測試
  23. {
  24.         u8 keyFlag=1;                                //程序中沒有消抖處理,只是簡易的按鍵進出自鎖標志
  25.         led0=ledon;                                        //先打開0號燈,用于和7號燈對比亮度               
  26.         initT0(1,10,grading);                //1毫秒的基本定時,亮的時間1*10毫秒,暗1*(grading-10)毫秒
  27.         while(1)
  28.         {
  29.                 if(0==keyS3)
  30.                 {
  31.                         if(keyFlag)                                                     //防止一次按鍵中多次執行
  32.                         {
  33.                                 keyFlag=0;                                             //清標志,類似同步鎖
  34.                                 if(++PWM_keyChange>grading)
  35.                                 {
  36.                                         PWM_keyChange=grading;          //占空比最大100%
  37.                                 }
  38.                                 initT0(1,PWM_keyChange,grading);       
  39.                         }                       
  40.                 }
  41.                 else if(0==keyS4)
  42.                 {
  43.                         if(keyFlag)
  44.                         {
  45.                                 keyFlag=0;
  46.                                 if(0==--PWM_keyChange)                                //占空比減小
  47.                                 {
  48.                                         PWM_keyChange=1;                                  //最小占空比 1/20
  49.                                 }       
  50.                                 initT0(1,PWM_keyChange,grading);        //占空比減小
  51.                         }
  52.                 }
  53.                 else
  54.                 {
  55.                         keyFlag=1;        //按鍵鎖釋放標志,下一次按鍵時允許調整占空比
  56.                 }
  57.         }
  58. }
復制代碼
  1. #ifndef _MY51_H
  2. #define _MY51_H
  3. #include <reg52.h>
  4. //#include <math.h>
  5. #include <intrins.h>
  6. #include <stdio.h>
  7. #include "mytype.h"


  8. #ifndef _51LED_
  9. #define _51LED_
  10. #define led           P1                               //P1總線連8個led燈,燈連573鎖存器,P1置低電平點亮
  11. #define LED                  led
  12. #define ON(x)     P1&(~(1<<(x)))         //打開某個燈,開多個燈用 ON(m) & ON(n)
  13. #define OFF(x)    P1|(1<<(x))                  //關閉某個燈,關多個燈用 OFF(m)| OFF(n)
  14. #define on(x)          ON(x)                                 //包含大小寫
  15. #define off(x)          OFF(x)

  16. #define ledon     0                                         //某個燈,打開
  17. #define ledoff    1                                         //某個燈,關閉

  18. sbit led0=P1^0;     
  19. sbit led1=P1^1;
  20. sbit led2=P1^2;
  21. sbit led3=P1^3;
  22. sbit led4=P1^4;
  23. sbit led5=P1^5;
  24. sbit led6=P1^6;
  25. sbit led7=P1^7;       
  26. sbit ledLock=P2^5;        //鎖定當前8個led的狀態,0鎖定 ,1不鎖定

  27. #endif

  28. /*************二進制輸入宏****************************/
  29. #ifndef _LongToBin_
  30. #define LongToBin(n) \                           
  31. (                                         \
  32. ((n >> 21) & 0x80) | \
  33. ((n >> 18) & 0x40) | \
  34. ((n >> 15) & 0x20) | \
  35. ((n >> 12) & 0x10) | \
  36. ((n >> 9)  & 0x08) | \
  37. ((n >> 6)  & 0x04) | \
  38. ((n >> 3)  & 0x02) | \
  39. ((n ) & 0x01)                  \
  40. )
  41. #define  bin(n)  LongToBin(0x##n##l)
  42. #define  BIN(n)  bin(n)
  43. #define  B(n)    bin(n)
  44. #define  b(n)    bin(n)                          
  45. #endif

  46. /*************單個數據位的置位宏*********************/
  47. #ifndef   _BIT_
  48. #define   BIT(n)   (1<<n)
  49. #define   bit(n)   BIT(n)
  50. #endif

  51. #define high        1   //高電平
  52. #define low                0   //低電平


  53. sbit beep=P2^3;     //蜂鳴器

  54. extern void delayms(u16 ms);
  55. extern void delayXus(u8 us); //函數執行(8+6x)個機器周期, 即t=(8+6x)*1.085
  56. /////////////////////////////////////////////////////////////////////////////


  57. #endif
復制代碼
  1. #ifndef _TIMER0_H
  2. #define _TIMER0_H
  3. #include "my51.h"


  4. extern u8   timeMultiple1Flag; //中斷時間復用置位標志,須手動清零
  5. extern u8   timeMultiple2Flag; //中斷時間復用置位標志,須手動清零
  6. extern void T0_work();                    //該函數未實現,需外部實現
  7. extern void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) ; //定時器初始化


  8. #endif
復制代碼
  1. #include "timer0.h"

  2. u8   TH0Cout=0 ;             //初值       
  3. u8   TL0Cout=0 ;          
  4. u16  T0IntCouts1=0;              //中斷計數
  5. u16  T0IntCouts2=0;              //中斷計數
  6. u16  timeMultiple1=0;     //中斷復用時間的倍數
  7. u16  timeMultiple2=0;     //中斷復用時間的倍數
  8. u8   timeMultiple1Flag=0; //中斷時間復用置位標志,須手動清零
  9. u8   timeMultiple2Flag=0; //中斷時間復用置位標志,須手動清零

  10. //開啟定時器,定時完成后需要手動關閉TR0,否則將循環定時
  11. //參數一是定時的毫秒數,參數二和三是定時基時的倍率數(定時復用)
  12. void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2)           //定時器初始化設定,ms取值不超過65
  13. {       
  14.         u16   N=11059.2*ms/12;                                  //定時器總計數值
  15.         TR0=STOP;                                                         //停掉定時器
  16.         ET0=CLOSE;                                                         //關定時器中斷

  17.         //對于110592晶振,ms為5的整數倍時沒有計算誤差,但ms最大不超過71毫秒
  18.         TH0Cout =(65536-N)/256;                        //裝入計時值零頭計數初值
  19.         TL0Cout =(65536-N)%256;
  20.         if(0==t_multiple1)          //0倍的基準時間是不合理的,至少1倍
  21.         {
  22.                 t_multiple1=1;       
  23.         }
  24.         if(0==t_multiple2)          //0倍的基準時間是不合理的,至少1倍
  25.         {
  26.                 t_multiple2=1;       
  27.         }
  28.         timeMultiple1=t_multiple1;                 //倍時
  29.         timeMultiple2=t_multiple2;                 //倍時
  30.         TMOD &= 0xf0;                                         //清定時器0配置
  31.         TMOD |= 0x01;                                          //配置定時器0的工作方式為1
  32.        
  33.         EA =OPEN;                   //打開總中斷
  34.         ET0=OPEN;                   //打開定時器中斷

  35.         TH0=TH0Cout;                  //定時器裝入初值
  36.         TL0=TL0Cout;
  37.         TR0=START;                         //啟動定時器
  38. }
  39. void T0_times() interrupt 1                     //T0定時器中斷函數
  40. {
  41.         TH0=TH0Cout;                                                 //重裝初值
  42.         TL0=TL0Cout;
  43.         if(++T0IntCouts1==timeMultiple1)  //判斷是否復用定時器
  44.         {       
  45.                 T0IntCouts1=0;                                      //中斷次數清零,重新計時
  46.                 timeMultiple1Flag=1;                  //復用定時器標志,須在T0_work()中手動清零
  47.         }
  48.         if(++T0IntCouts2==timeMultiple2)  //判斷是否復用定時器
  49.         {       
  50.                 T0IntCouts1=0;                                    //這個也要清,防止到達最小公倍數時亂掉
  51.                 T0IntCouts2=0;                                      //中斷次數清零,重新計時
  52.                 timeMultiple2Flag=1;                    //復用定時器標志,須在T0_work()中手動清零
  53.         }
  54.         T0_work();                                                 //調用工作函數
  55. }
復制代碼




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

相關帖子

回復

使用道具 舉報

沙發
ID:356186 發表于 2018-6-22 11:17 | 只看該作者
有仿真圖嗎樓主
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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