標(biāo)題: AT89C2051內(nèi)部比較器做AD轉(zhuǎn)換器ADC [打印本頁]

作者: wudawei    時間: 2014-12-31 00:11
標(biāo)題: AT89C2051內(nèi)部比較器做AD轉(zhuǎn)換器ADC
    放假研究恒溫烙鐵,繼昨晚研究完1602液晶驅(qū)動后,今天繼續(xù)研究利用AT89C2051內(nèi)部的電壓比較器做廉價的ADC轉(zhuǎn)換器,查閱了一些資料,基本上有這么一些方法:
  1、常規(guī)RC電路,對電容充電時間進(jìn)行計算,通過查表得到AD值。這種AD簡單,但分辨率低,僅8位左右。
  2、常規(guī)RC電路,對電容充電時間進(jìn)行計算,通過直接的自然對數(shù)反對數(shù)運算得到AD值,這種AD電路簡單,分辨率高,但程序的運算量很大。2051這種低端單片機(jī)不適合此法。
  3、中國歐軟采用的辦法:外置恒流源,以得到線性的充電曲線,這樣單片機(jī)的運算工作就會簡單很多了。
電路圖:

焊接好的電路板:



    程序:

  1. #include <reg51.h>
  2. sbit CMP_R=P3^6;
  3. sbit ADC = P1^1;
  4. unsigned char sled1,sled2,sled3,sled4,sztj;//串行LED掃描數(shù)據(jù),狀態(tài)機(jī)
  5. unsigned char temp,temp1,temp2;
  6. unsigned int advalue;
  7. bit timer1overflow;
  8. unsigned char code sledsg[]={0x28,0xEB,0x32,0xA2,0xE1,0xA4,0x24,0xEA,0x20,0xA0,
  9.                              0x60,0x25,0x3C,0x37,0x23,0x34,0x74,0x61,0x65,0x3D,
  10.         0x67,0x68,0x27,0x70,0x77,0x35,0x29,0xF7,0x7F,0xff};//LED段碼
  11. void init(void) //初始化函數(shù),就是開機(jī)首先要做的事情,init是自己起的名字
  12.      {
  13.   TMOD=0x11; //兩個定時器工作于方式1
  14.   PX0=1;  //計時定時器中斷優(yōu)先
  15.   TR0=1;  //定時器0啟動
  16.   ET0=1;
  17.   ET1=1;
  18.   EA=1;
  19.   }   //這段程序啟動了芯片中的兩個定時器
  20. void sledscan(void)      //時速LED模塊掃描子程序,定時器調(diào)用
  21.      {
  22.   unsigned char datemp;
  23.   switch(sztj)      //切換狀態(tài)機(jī)
  24.     {
  25.     case 0:       //第一狀態(tài)
  26.     P3=0XFF;       //關(guān)閉顯示
  27.     datemp=sledsg[sled3];
  28.     P1=0X01;
  29.     P1=P1|(datemp&0xfc);
  30.     P3=P3&(datemp|0xfc);
  31.     P3=P3&0x7f;
  32.     sztj=1;       //轉(zhuǎn)移狀態(tài)
  33.     break;       //狀態(tài)結(jié)束
  34.     case 1:       //第二狀態(tài)
  35.     P3=0XFF;       //關(guān)閉顯示
  36.     datemp=sledsg[sled4];
  37.     P1=0X01;
  38.     P1=P1|(datemp&0xfc);
  39.     P3=P3&(datemp|0xfc);
  40.     P3=P3&0xdf;
  41.     sztj=2;       //轉(zhuǎn)移狀態(tài)
  42.     break;       //狀態(tài)結(jié)束
  43.     case 2:       //第三狀態(tài)
  44.     P3=0XFF;       //關(guān)閉顯示
  45.     datemp=sledsg[sled1];
  46.     P1=0X01;
  47.     P1=P1|(datemp&0xdc);
  48.     P3=P3&(datemp|0xfc);
  49.     P3=P3&0xef;
  50.     sztj=3;
  51.     break;
  52.     case 3:
  53.     P3=0XFF;       //關(guān)閉顯示
  54.     datemp=sledsg[sled2];
  55.     P1=0X01;
  56.     P1=P1|(datemp&0xfc);
  57.     P3=P3&(datemp|0xfc);
  58.     P3=P3&0xf7;
  59.     sztj=0;
  60.     break;
  61.     default:
  62.     sztj=0;       //異常時捕獲狀態(tài)機(jī)
  63.     break;
  64.     }
  65.   }
  66. void timer0 (void) interrupt 1 using 2  //定時器中斷程序,定時時間到,自動運行此程序
  67.      {
  68.   TH0=(65536-10000)/256;    //這兩行的數(shù)值代表每10000us運行一次此程序
  69.   TL0=(65536-10000)%256;    //置定時值,每次時間到都要重新置定時值
  70.   sledscan();      //掃描時速LED模塊,122個周期
  71.   }
  72. void timer1 (void) interrupt 3 using 1  //定時器中斷程序,定時時間到,自動運行此程序
  73.   {
  74.   TR1=0;
  75.   timer1overflow=1;
  76.   TH1=0XFF;
  77.   TL1=0XFF;
  78.   }
  79. void delay()
  80.   {
  81. while(--temp)
  82.    while(--temp1)
  83.      while(--temp2);//等待電容放電完畢
  84.   }
  85. void main()
  86.   {
  87.   init();
  88.   while(1)
  89.     {
  90. P3=0XFF;//關(guān)閉顯示
  91. advalue=0;//變量復(fù)位
  92. ET0=0;//關(guān)閉中斷,防止中斷干擾
  93. TL1=0X00;
  94. TH1=0X00;
  95. TR1=1;
  96. ADC=1;//開始給電容充電
  97. while(CMP_R&&(!timer1overflow));//等待比較器結(jié)果
  98.     timer1overflow=0;
  99. TR1=0;
  100. ADC=0;
  101. ((unsigned char *)&advalue)[0]=TH1;
  102. ((unsigned char *)&advalue)[1]=TL1;
  103. advalue=advalue+1000;
  104. sled1=advalue/10000;//轉(zhuǎn)成十進(jìn)制
  105. sled2=advalue%10000/1000;
  106. sled3=advalue%1000/100;
  107. sled4=advalue%100/10;
  108. ET0=1;
  109. temp=4;
  110. delay();
  111. }
  112.   }
復(fù)制代碼





作者: 51hei電控2112312    時間: 2015-1-1 23:51
GOOD!!!
作者: szyybyf    時間: 2016-3-29 21:23
先下載看一下,不知道可不可用
作者: 新鄉(xiāng)家電維修    時間: 2016-9-10 19:58
試過了嗎,你們誰試過,精度如何
作者: 新鄉(xiāng)家電維修    時間: 2017-2-15 13:01
利用定時器計時加橫流充電,精度很高的,我制作過。
很容易達(dá)到4位精度

作者: 1305115329    時間: 2017-9-1 02:48
新鄉(xiāng)家電維修 發(fā)表于 2017-2-15 13:01
利用定時器計時加橫流充電,精度很高的,我制作過。
很容易達(dá)到4位精度

用ISIS 7 Professional 仿真后怎么只顯示四個 7777
作者: rayin    時間: 2020-11-15 09:56
謝謝樓主分析代碼,值得學(xué)習(xí)
作者: zmc419    時間: 2022-9-26 16:06
1305115329 發(fā)表于 2017-9-1 02:48
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

好象有人說模型中的89c2051無比較器,而后,有人做了個模型
作者: shuiquan3    時間: 2022-9-28 20:38

太棒了,我一直想制作一個
作者: zydl123    時間: 2022-10-3 13:03
學(xué)習(xí)了,謝謝你的付出




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