找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

利用STC12LE5404AD單片機的AD和定時器輸出頻率和占空比可調(diào) 附視頻

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:94955 發(fā)表于 2018-11-11 10:20 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
題目:利用STC12LE5404AD單片機的AD和定時器輸出頻率和占空比可調(diào)。
功能:當調(diào)節(jié)頻率時,占空比不變;調(diào)節(jié)占空比時,頻率不變。
輸出范圍:10~500Hz , 5%~95%
電路描述:
      1、手里現(xiàn)有STC12LE5204AD,所以使用它。要借鑒的朋友,根據(jù)自己的單片機資源調(diào)整;
      2、現(xiàn)成的晶振頻率為18.432MHz。根據(jù)自己手里的晶振使用,不需要通訊的話,可以使用12MHz或者24MHz的晶振,好計算周期。
      3、使用單片機的A/D采樣口為P1.6和P1.7端口(可以自己選擇)。使用精密電位器,兩個固定端,一個接地,一個3.3V電源;可調(diào)端接一個0.1uF的電容對地,然后通過一個2kΩ電阻接入單片機A/D采樣端口。
      4、P3.7口輸出(方波自己布PCB線路,可以自己選擇輸出口)

使用A/D采樣的值(0~FF)去改變定時器的值實現(xiàn)占空比和頻率調(diào)節(jié)。

最終性能有一點偏差,調(diào)節(jié)頻率時,占空比有小范圍波動。代碼總長度為0E78H。望各位大俠勿噴,求指點迷津。

單片機源程序:
  1. #include "reg51.h"

  2. #include "intrins.h"
  3. #define FOSC    18432000L

  4. typedef unsigned char BYTE;
  5. typedef unsigned int WORD;

  6. sfr ADC_CONTR   =   0xBC;           //ADC control register
  7. sfr ADC_RES     =   0xBD;           //ADC high 8-bit result register
  8. sfr ADC_LOW2    =   0xBE;           //ADC low 2-bit result register
  9. sfr P1ASF       =   0x9D;           //P1 secondary function control register
  10. sfr AUXR        =   0x8e;
  11. sbit out=P3^7;
  12. //sbit led1=P1^5;
  13. /*Define ADC operation const for ADC_CONTR*/
  14. #define ADC_POWER   0x80            //ADC power control bit
  15. #define ADC_FLAG    0x10            //ADC complete flag
  16. #define ADC_START   0x08            //ADC start control bit
  17. #define ADC_SPEEDLL 0x00            //420 clocks
  18. float i=100,j=100;
  19. float k=0,d,f,t,t1,t2;
  20. WORD xms;
  21. void InitADC();
  22. void SendData(BYTE dat);
  23. BYTE GetADCResult(BYTE ch);
  24. void Delay(WORD n);
  25. void ShowResult(BYTE ch);
  26. void Timer0Init();
  27. void Delay_xms(WORD xms);
  28. void main()
  29. {
  30.     InitADC();                      //Init ADC sfr
  31.   out=1;
  32.     while (1)
  33.     {
  34.         ShowResult(6);              //Show Channel6
  35.         ShowResult(7);              //Show Channel7
  36.     i = GetADCResult(6);
  37.     f = GetADCResult(7);
  38.      _nop_();                        //Must wait before inquiry
  39.          _nop_();
  40.    if(i<15) i=15;
  41.    else if(i>240) i=240;
  42.    if(f<5) f=5;
  43.    else if(f>240) f=250;
  44.          _nop_();
  45.          _nop_();
  46.    t=256/f;
  47.    d=i/256;
  48.    t1=d*t*100;
  49.    t2=(1-i/256)*t*100;
  50.        _nop_();                        //Must wait before inquiry
  51.          _nop_();
  52.   
  53.          _nop_();
  54.          _nop_();
  55.     out  =1;
  56.     Delay_xms(t1);
  57.     out = 0;
  58.     Delay_xms(t2);
  59.   
  60.    
  61.     }
  62. }
  63. BYTE GetADCResult(BYTE ch)
  64. {
  65.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  66.     _nop_();                        
  67.     _nop_();
  68.     _nop_();
  69.     _nop_();
  70.     while (!(ADC_CONTR & ADC_FLAG));
  71.     ADC_CONTR &= ~ADC_FLAG;      
  72.     return ADC_RES;               
  73. }

  74. void InitADC()
  75. {
  76.     P1ASF = 0xc0;                   //Open 8 channels ADC function
  77.     ADC_RES = 0;                    //Clear previous result
  78.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  79.     Delay(2);                       //ADC power-on and delay
  80. }
  81. void SendData(BYTE dat)
  82. {
  83.     while (!TI);                    //Wait for the previous data is sent
  84.     TI = 0;                         //Clear TI flag
  85.     SBUF = dat;                     //Send current data
  86. }
  87. void Delay(WORD n)
  88. {
  89.     WORD x;
  90.     while (n--)
  91.     {
  92.         x = 5000;
  93.         while (x--);
  94.     }
  95. }
  96. void Timer0Init(void)  //1????@18.432MHz
  97. {
  98. AUXR &= 0x7F;
  99. TMOD &= 0xF0;  
  100. TMOD |= 0x01;
  101. TL0 = 0x00;
  102. TH0 = 0xFA;
  103. TF0 = 0;
  104. TR0 = 1;
  105. }
  106. void Delay_xms(WORD xms)
  107. {
  108.     WORD nms;
  109.   nms=xms*140;
  110.   while (nms--)
  111.     {
  112.        Timer0Init();
  113.     }
  114. }
復制代碼



全部資料51hei下載地址:
視頻.rar (10.77 MB, 下載次數(shù): 14)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規(guī)則

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

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

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