久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 20665|回復: 9
收起左側

AT89C2051內部比較器做AD轉換器ADC

  [復制鏈接]
ID:71407 發表于 2014-12-31 00:11 | 顯示全部樓層 |閱讀模式
    放假研究恒溫烙鐵,繼昨晚研究完1602液晶驅動后,今天繼續研究利用AT89C2051內部的電壓比較器做廉價的ADC轉換器,查閱了一些資料,基本上有這么一些方法:
  1、常規RC電路,對電容充電時間進行計算,通過查表得到AD值。這種AD簡單,但分辨率低,僅8位左右。
  2、常規RC電路,對電容充電時間進行計算,通過直接的自然對數反對數運算得到AD值,這種AD電路簡單,分辨率高,但程序的運算量很大。2051這種低端單片機不適合此法。
  3、中國歐軟采用的辦法:外置恒流源,以得到線性的充電曲線,這樣單片機的運算工作就會簡單很多了。
電路圖:

焊接好的電路板:



    程序:

  1. #include <reg51.h>
  2. sbit CMP_R=P3^6;
  3. sbit ADC = P1^1;
  4. unsigned char sled1,sled2,sled3,sled4,sztj;//串行LED掃描數據,狀態機
  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) //初始化函數,就是開機首先要做的事情,init是自己起的名字
  12.      {
  13.   TMOD=0x11; //兩個定時器工作于方式1
  14.   PX0=1;  //計時定時器中斷優先
  15.   TR0=1;  //定時器0啟動
  16.   ET0=1;
  17.   ET1=1;
  18.   EA=1;
  19.   }   //這段程序啟動了芯片中的兩個定時器
  20. void sledscan(void)      //時速LED模塊掃描子程序,定時器調用
  21.      {
  22.   unsigned char datemp;
  23.   switch(sztj)      //切換狀態機
  24.     {
  25.     case 0:       //第一狀態
  26.     P3=0XFF;       //關閉顯示
  27.     datemp=sledsg[sled3];
  28.     P1=0X01;
  29.     P1=P1|(datemp&0xfc);
  30.     P3=P3&(datemp|0xfc);
  31.     P3=P3&0x7f;
  32.     sztj=1;       //轉移狀態
  33.     break;       //狀態結束
  34.     case 1:       //第二狀態
  35.     P3=0XFF;       //關閉顯示
  36.     datemp=sledsg[sled4];
  37.     P1=0X01;
  38.     P1=P1|(datemp&0xfc);
  39.     P3=P3&(datemp|0xfc);
  40.     P3=P3&0xdf;
  41.     sztj=2;       //轉移狀態
  42.     break;       //狀態結束
  43.     case 2:       //第三狀態
  44.     P3=0XFF;       //關閉顯示
  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;       //關閉顯示
  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;       //異常時捕獲狀態機
  63.     break;
  64.     }
  65.   }
  66. void timer0 (void) interrupt 1 using 2  //定時器中斷程序,定時時間到,自動運行此程序
  67.      {
  68.   TH0=(65536-10000)/256;    //這兩行的數值代表每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;//關閉顯示
  91. advalue=0;//變量復位
  92. ET0=0;//關閉中斷,防止中斷干擾
  93. TL1=0X00;
  94. TH1=0X00;
  95. TR1=1;
  96. ADC=1;//開始給電容充電
  97. while(CMP_R&&(!timer1overflow));//等待比較器結果
  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;//轉成十進制
  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.   }
復制代碼




回復

使用道具 舉報

ID:70769 發表于 2015-1-1 23:51 | 顯示全部樓層
GOOD!!!
回復

使用道具 舉報

ID:111188 發表于 2016-3-29 21:23 | 顯示全部樓層
先下載看一下,不知道可不可用
回復

使用道具 舉報

ID:72088 發表于 2016-9-10 19:58 | 顯示全部樓層
試過了嗎,你們誰試過,精度如何
回復

使用道具 舉報

ID:72088 發表于 2017-2-15 13:01 | 顯示全部樓層
利用定時器計時加橫流充電,精度很高的,我制作過。
很容易達到4位精度
2051電壓表.png
回復

使用道具 舉報

ID:230350 發表于 2017-9-1 02:48 | 顯示全部樓層
新鄉家電維修 發表于 2017-2-15 13:01
利用定時器計時加橫流充電,精度很高的,我制作過。
很容易達到4位精度

用ISIS 7 Professional 仿真后怎么只顯示四個 7777
回復

使用道具 舉報

ID:517951 發表于 2020-11-15 09:56 | 顯示全部樓層
謝謝樓主分析代碼,值得學習
回復

使用道具 舉報

ID:137736 發表于 2022-9-26 16:06 | 顯示全部樓層
1305115329 發表于 2017-9-1 02:48
**** 作者被禁止或刪除 內容自動屏蔽 ****

好象有人說模型中的89c2051無比較器,而后,有人做了個模型
回復

使用道具 舉報

ID:163139 發表于 2022-9-28 20:38 | 顯示全部樓層

太棒了,我一直想制作一個
回復

使用道具 舉報

ID:977861 發表于 2022-10-3 13:03 | 顯示全部樓層
學習了,謝謝你的付出
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲免费在线 | 日韩综合一区 | 欧美男人天堂 | 国产综合久久久久久鬼色 | 欧美中文字幕在线 | www成人免费视频 | 亚洲综合大片69999 | 精品99久久 | 亚洲精品久久久久久一区二区 | a免费视频| 亚洲色视频| 色综合桃花网 | 欧美亚洲另类在线 | 久操亚洲 | 极品的亚洲 | 日韩精品在线看 | 日韩精品一区二区三区中文字幕 | 99国产精品久久久 | 中文字幕一区二区三区乱码在线 | 国产探花在线精品一区二区 | 99热在线免费 | 97av在线| 欧美一区二区久久 | 福利视频三区 | 日韩欧美中文字幕在线观看 | 新91 | 精品福利在线 | 成人在线亚洲 | 一级毛片大全免费播放 | 日本成人在线网址 | 亚洲精品福利视频 | 四虎最新视频 | 成人免费看黄网站在线观看 | 国产高清毛片 | 最近中文字幕第一页 | 91看片网址| 中文字幕在线观看一区 | 精品国产免费人成在线观看 | 激情伊人网 | 中文字幕第一页在线 | 国产成人精品免费视频大全最热 |