標(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ī)的運算工作就會簡單很多了。
電路圖:

焊接好的電路板:


程序:
- #include <reg51.h>
- sbit CMP_R=P3^6;
- sbit ADC = P1^1;
- unsigned char sled1,sled2,sled3,sled4,sztj;//串行LED掃描數(shù)據(jù),狀態(tài)機(jī)
- unsigned char temp,temp1,temp2;
- unsigned int advalue;
- bit timer1overflow;
- unsigned char code sledsg[]={0x28,0xEB,0x32,0xA2,0xE1,0xA4,0x24,0xEA,0x20,0xA0,
- 0x60,0x25,0x3C,0x37,0x23,0x34,0x74,0x61,0x65,0x3D,
- 0x67,0x68,0x27,0x70,0x77,0x35,0x29,0xF7,0x7F,0xff};//LED段碼
- void init(void) //初始化函數(shù),就是開機(jī)首先要做的事情,init是自己起的名字
- {
- TMOD=0x11; //兩個定時器工作于方式1
- PX0=1; //計時定時器中斷優(yōu)先
- TR0=1; //定時器0啟動
- ET0=1;
- ET1=1;
- EA=1;
- } //這段程序啟動了芯片中的兩個定時器
- void sledscan(void) //時速LED模塊掃描子程序,定時器調(diào)用
- {
- unsigned char datemp;
- switch(sztj) //切換狀態(tài)機(jī)
- {
- case 0: //第一狀態(tài)
- P3=0XFF; //關(guān)閉顯示
- datemp=sledsg[sled3];
- P1=0X01;
- P1=P1|(datemp&0xfc);
- P3=P3&(datemp|0xfc);
- P3=P3&0x7f;
- sztj=1; //轉(zhuǎn)移狀態(tài)
- break; //狀態(tài)結(jié)束
- case 1: //第二狀態(tài)
- P3=0XFF; //關(guān)閉顯示
- datemp=sledsg[sled4];
- P1=0X01;
- P1=P1|(datemp&0xfc);
- P3=P3&(datemp|0xfc);
- P3=P3&0xdf;
- sztj=2; //轉(zhuǎn)移狀態(tài)
- break; //狀態(tài)結(jié)束
- case 2: //第三狀態(tài)
- P3=0XFF; //關(guān)閉顯示
- datemp=sledsg[sled1];
- P1=0X01;
- P1=P1|(datemp&0xdc);
- P3=P3&(datemp|0xfc);
- P3=P3&0xef;
- sztj=3;
- break;
- case 3:
- P3=0XFF; //關(guān)閉顯示
- datemp=sledsg[sled2];
- P1=0X01;
- P1=P1|(datemp&0xfc);
- P3=P3&(datemp|0xfc);
- P3=P3&0xf7;
- sztj=0;
- break;
- default:
- sztj=0; //異常時捕獲狀態(tài)機(jī)
- break;
- }
- }
- void timer0 (void) interrupt 1 using 2 //定時器中斷程序,定時時間到,自動運行此程序
- {
- TH0=(65536-10000)/256; //這兩行的數(shù)值代表每10000us運行一次此程序
- TL0=(65536-10000)%256; //置定時值,每次時間到都要重新置定時值
- sledscan(); //掃描時速LED模塊,122個周期
- }
- void timer1 (void) interrupt 3 using 1 //定時器中斷程序,定時時間到,自動運行此程序
- {
- TR1=0;
- timer1overflow=1;
- TH1=0XFF;
- TL1=0XFF;
- }
- void delay()
- {
- while(--temp)
- while(--temp1)
- while(--temp2);//等待電容放電完畢
- }
- void main()
- {
- init();
- while(1)
- {
- P3=0XFF;//關(guān)閉顯示
- advalue=0;//變量復(fù)位
- ET0=0;//關(guān)閉中斷,防止中斷干擾
- TL1=0X00;
- TH1=0X00;
- TR1=1;
- ADC=1;//開始給電容充電
- while(CMP_R&&(!timer1overflow));//等待比較器結(jié)果
- timer1overflow=0;
- TR1=0;
- ADC=0;
- ((unsigned char *)&advalue)[0]=TH1;
- ((unsigned char *)&advalue)[1]=TL1;
- advalue=advalue+1000;
- sled1=advalue/10000;//轉(zhuǎn)成十進(jìn)制
- sled2=advalue%10000/1000;
- sled3=advalue%1000/100;
- sled4=advalue%100/10;
- ET0=1;
- temp=4;
- delay();
- }
- }
復(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位精度
2051電壓表.png (67.75 KB, 下載次數(shù): 163)
下載附件
2017-2-15 13:00 上傳
作者: 1305115329 時間: 2017-9-1 02:48
用ISIS 7 Professional 仿真后怎么只顯示四個 7777
作者: rayin 時間: 2020-11-15 09:56
謝謝樓主分析代碼,值得學(xué)習(xí)
作者: zmc419 時間: 2022-9-26 16:06
好象有人說模型中的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 |