找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2260|回复: 0
收起左侧

利用STC12LE5404AD单片机的AD和定时器输出频率和占空比可调 附视频

[复制链接]
ID:94955 发表于 2018-11-11 10:20 | 显示全部楼层 |阅读模式
题目:利用STC12LE5404AD单片机的AD和定时器输出频率和占空比可调。
功能:当调节频率时,占空比不变;调节占空比时,频率不变。
输出范围:10~500Hz , 5%~95%
电路描述:
      1、手里现有STC12LE5204AD,所以使用它。要借鉴的朋友,根据自己的单片机资源调整;
      2、现成的晶振频率为18.432MHz。根据自己手里的晶振使用,不需要通讯的话,可以使用12MHz或者24MHz的晶振,好计算周期。
      3、使用单片机的A/D采样口为P1.6和P1.7端口(可以自己选择)。使用精密电位器,两个固定端,一个接地,一个3.3V电源;可调端接一个0.1uF的电容对地,然后通过一个2kΩ电阻接入单片机A/D采样端口。
      4、P3.7口输出(方波自己布PCB线路,可以自己选择输出口)

使用A/D采样的值(0~FF)去改变定时器的值实现占空比和频率调节。

最终性能有一点偏差,调节频率时,占空比有小范围波动。代码总长度为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. }
复制代码

0.png

全部资料51hei下载地址:
视频.rar (10.77 MB, 下载次数: 14)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表