當前位置:編程學習大全網 - 編程語言 - 那位大哥能提供壹個由數字電路完成的“四位數字顯示電容表”資料 十萬火急 謝謝了

那位大哥能提供壹個由數字電路完成的“四位數字顯示電容表”資料 十萬火急 謝謝了

不好意思兄弟~找了壹些妳用不到的~呵呵~soryy~幫不了妳!!

/2007/10/200710171782221340.html

/u/52/1177380466.doc

希望對妳有幫助~

還有:AT89C2051作為AT89C51的簡化版雖然去掉了P0、P2等埠,使I/O口減少了,但是卻增加了壹個電壓比較器,因此其功能在某些方面反而有所增強,如能用來處理模擬量、進行簡單的模數轉換等。本文利用這壹功能設計了壹個數字電容表,可測量容量小於2微法的電容器的容量,采用3位半數字顯示,最大顯示值為1999,讀數單位統壹采用毫微法(nf),量程分四檔,讀數分別乘以相應的倍率。

電路工作原理

本數字電容表以電容器的充電規律作為測量依據,測試原理見圖1。

圖1

電源電壓E+經電阻R給被測電容CX充電,CX兩端原電壓隨充電時間的增加而上升。當充電時間t等於RC時間常數τ時,CX兩端電壓約為電源電壓的63.2%,即0.632E+。數字電容表就是以該電壓作為測試基準電壓,測量電容器充電達到該電壓的時間,便能知道電容器的容量。例如,設電阻R的阻值為1千歐,CX兩端電壓上升到0.632E+所需的時間為1毫秒,那麽由公式τ=RC可知CX的容量為1微法。

測量電路如圖2所示。

圖2

A為AT89C2051內部構造的電壓比較器,AT89C2051的P1.0和P1.1口除了作I/O口外,還有壹個功能是作為電壓比較器的輸入端,P1.0為同相輸入端,P1.1為反相輸入端,電壓比較器的比較結果存入P3.6口對應的寄存器,P3.6口在AT89C2051外部無引腳。電壓比較器的基準電壓設定為0.632E+,在CX兩端電壓從0升到0.632E+的過程中,P3.6口輸出為0,當電池電壓CX兩端電壓壹旦超過0.632E+時,P3.6口輸出變為1。以P3.6口的輸出電平為依據,用AT89C2051內部的定時器T0對充電時間進行計數,再將計數結果顯示出來即得出測量結果。

整機電路見圖3。電路由單片機電路、電容充電測量電路和數碼顯示電路等部分組成。

圖3

AT89C2051內部的電壓比較器和電阻R2-R7等組成測量電路,其中R2-R5為量程電阻,由波段開關S1選擇使用,電壓比較器的基準電壓由5V電源電壓經R6、RP1、R7分壓後得到,調節RP1可調整基準電壓。當P1.2口在程序的控制下輸出高電平時,電容CX即開始充電。量程電阻R2-R5每檔以10倍遞減,故每文件顯示讀數以10倍遞增。由於單片機內部P1.2口的上拉電阻經實測約為200K,其輸出電平不能作為充電電壓用,故用R5兼作其上拉電阻,由於其他三個充電電阻和R5是串聯關系,因此R2、R3、R4應由標準值減去1K,分別為999K、99K、9K。由於999K和1M相對誤差較小,所以R2還是取1M。

數碼管DS1-DS4、電阻R8-R14等組成數碼顯示電路。本機采用動態掃描顯示的方式,用軟件對字形碼譯碼。P3.0-P3.5、P3.7口作數碼顯示七段筆劃字形碼的輸出,P1.3-P1.6口作四個數碼管的動態掃描位驅動碼輸出。這裏采用了***陰數碼管,由於AT89C2051的P1.3-P1.6口有25mA的下拉電流能力,所以不用三極管就能驅動數碼管。R8-R14為P3.0-P3.5、P3.7口的上拉電阻,用以驅動數碼管的各字段,當P3的某壹埠輸出低電平時其對應的字段筆劃不點亮,而當其輸出高電平時,則對應的上拉電阻即能點亮相應的字段筆劃。

軟件設計

程序使用C語言編寫,詳細源程序見本刊網站。

程序由主程序、定時中斷服務子程序等模塊組成。定時器T0作被測電容器充電時間的計數用。定時器T1用於定時中斷服務,定時時間為5ms,即5ms產生壹次中斷。數組BitTab[4] 用來存儲位驅動碼,DispTab[11] 用來存儲字形碼,數組DispBuf[4]的4個元素分別用來存儲從定時器T0讀出的數據的個、十百千位的4位數字。

程序顯示每壹位數碼的時間為5ms,因此顯示完整的4位數的周期為20ms(4次中斷)。每過240ms(48次中斷)刷新壹下資料,即每過240ms測壹下電容量,測量時間小於2ms,由於這壹時間小於中斷的時間5ms,因此在測量過程中不會出現中斷現象。測量電容時P1.2口輸出高電平,電容開始充電,與此同時定時器T0開始計數,當電容器充電達到基準電壓時,P3.6口輸出高電平,據此程序作出判斷停止T0的計數,並讀出數據送數碼管顯示。如果被測電容器的容量超出測試文件的量程,則計數值大於或等於2000,顯示結果為千位數顯示1,其他三位數不顯示,這和數字萬用表超過量程的顯示模式相同。這時可選擇大壹檔的量程進行測試。

經仿真和電路測試,發現單片機判斷P3.6口是否輸出高電平要化3個機器周期,這會使顯示值增加3,因此在程序中對此誤差進行了修正,對計數值減去了3。

字形碼的輸出用了P3口的P3.0-P3.5、P3.7,P3.6為空,P3口輸出的數據通過數組DispTab[11]獲得。

數據位 P3.7 P3.6 P3.5 P3.4 P3.3 P3.2 P3.1 P3.0 字形碼

筆段位 A 空 B C D E F G

字 0 1 1 1 1 1 1 1 0 0xfe

1 0 1 1 1 0 0 0 0 0x70

2 1 1 1 0 1 1 0 1 0xed

3 1 1 1 1 1 0 0 1 0xf9

4 0 1 1 1 0 0 1 1 0x73

5 1 1 0 1 1 0 1 1 0xdb

6 1 1 0 1 1 1 1 1 0xdf

7 1 1 1 1 0 0 0 0 0xf0

8 1 1 1 1 1 1 1 1 0xff

9 1 1 1 1 1 0 1 1 0xfb

不顯示 0 1 0 0 0 0 0 0 0x40

數據位和字形的對應關系如上表所示,因為數碼管為***陰型,所以相應的輸出位為1時筆段亮。

安裝與調試

印刷電路板圖見圖4,制作雙面板有困難時也可用萬能印刷電路板制作。IC1

圖4

用AT89C2051單片機集成電路,X1用12MHz的石英晶體,S1選用1×4的波段開關,DS1-DS4選用***陰LED數碼管。其余元器件的參數見圖3。

安裝前先將C語言源程序用KEIL 51編譯成目標文件即HEX文件,再用編程器將HEX檔寫入AT89C2051芯片。C語言源程序和HEX文件下點擊下面連接下載。

C文件

#include <reg51.h>

unsigned char j,n,t,DispBuf[4];

unsigned int cap;

unsigned char code

BitTab[4]={0xbf,0xdf,0xef,0xf7};//位驅動碼

unsigned char code

DispTab[11]={0xfe,0x70,0xed,0xf9,0x73,0xdb,0xdf,0xf0,0xff,0xfb,0x40};//字形碼

sbit P1_2=P1^2;

sbit P3_6=P3^6;

main() //主程序

{ TMOD=0x11;//定時器T0、T1均工作於定時方式1

TH1=0xec;

TL1=0x78;//T1定時時間為5ms

IE=0X88; //開中斷

TR1=1; //開定時器T1

for(;;) //無限循環,定時中斷返回點

;

}

Timer1() interrupt 3//定時中斷服務程序

{ TH1=0xec;

TL1=0x78;

t=BitTab[j];//取位值

P1=P1|0x78;//P1.3-P1.6送1

P1=P1&t; //P1.3-P1.6輸出取出的位值

t=DispBuf[j];//取出待顯示的數

t=DispTab[t];//取字形碼

P3=t; //字型碼由P3輸出顯示

j++; //j作為數碼管的計數器,取值0-3,顯示程序通過它確認顯示哪個數碼管

if(j==4)

j=0;

n++;

if(n==48)//每過48個中斷測壹次電容量

{

n=0;

TH0=0;

TL0=0;

P1_2=1;//電容開始充電

TR0=1; //開定時器T0

for(;P3_6==0;)//判斷充電電壓達到參考電壓否

;

TR0=0;//充電電壓達到參考電壓,關定時器T0

P1_2=0;

cap=TL0|(TH0<<8);//取定時器T0中的數值

cap=cap-3;//修正誤差

if(cap>=2000)

{

DispBuf[3]=10;

DispBuf[2]=10;

DispBuf[1]=10;

DispBuf[0]=1; //超量程,最高位顯示1,其余各位不顯示(滅)

}

if(cap<2000) //不超量程,取各位數值

{

DispBuf[3]=cap%10;//取個位數

cap=cap/10;

DispBuf[2]=cap%10;//取十位數

cap=cap/10;

DispBuf[1]=cap%10;//取百位數

DispBuf[0]=cap/10;//取千位數

}

}

}

1164636437.c

HEX文件

:0F016A00BFDFEFF7FE70EDF973DBDFF0FFFB4057

:10000300758911758DEC758B7875A888D28E80FEF5

:03001B0002001EC2

:10001E00C0E0C0F0C083C082C0D075D000C000C0A8

:10002E0004C005C006C007758DEC758B78E50E9083

:10003E00016A93F510439078E51052907408250EDE

:10004E00F8E6F51090016E93F510F5B0050EE50E7D

:10005E00B40403750E00050FE50F64306003020152

:10006E0000F50FF58CF58AD292D28C30B6FDC28C8B

:10007E00C292AF8CEFAD8AF50CEDF50D24FDF50DAA

:10008E0074FF350CF50CC3E50D94D0E50C940740C8

:10009E000C750B0A750A0A75090A750801C3E50D78

:1000AE0094D0E50C9407504AAE0CAF0D7C007D0A3F

:1000BE001201158D0BAE0CAF0D7C007D0A120115D1

:1000CE008E0C8F0D7C007D0A1201158D0AAE0CAFC1

:1000DE000D7C007D0A1201158E0C8F0D7C007D0AA1

:1000EE001201158D09AE0CAF0D7C007D0A120115A3

:1000FE008F08D007D006D005D004D000D0D0D08243

:07010E00D083D0F0D0E032F5

:0300000002017981

:0C017900787FE4F6D8FD758110020003C9

:10011500BC000BBE0029EF8DF084FFADF022E4CCCE

:10012500F875F008EF2FFFEE33FEEC33FCEE9DEC97

:10013500984005FCEE9DFE0FD5F0E9E4CEFD22EDDD

:10014500F8F5F0EE8420D21CFEADF075F008EF2F27

:10015500FFED33FD4007985006D5F0F222C398FD18

:050165000FD5F0EA22B5

:00000001FF

1164636633.hex

安裝後的調試工作主要是通過對RP1的調節來調整基準電壓,最好是通過對壹個精度比較高的電容器的測量進行調節,而不是直接測量基準電壓。具體方法是選壹個經確認容量比較準確的電容器,如壹只15nf的電容器,將S1置於20nf檔,調節RP1使測量顯示值為1500。選擇的電容器容量至少要大於相應量程的壹半,最好是接近滿量程,這樣才能使調節比較準確。該檔調試好後其他各檔也就相應的調好了,如果發現某檔精度有問題可改變其相應的充電電阻阻值進行調整。

在使用過程中,當S1置於2nf檔時,在沒有放入測試電容器時有10pf左右的顯示值為正常現象,因為這是電壓比較器的輸入電容和電路的分布電容,只要在測量讀數時減去這壹數值即可。因此在調試時也不要選擇該檔,以免分布電容影響調試的準確性。

文章怎麽樣,發表壹下妳的高論,願與妳交流。我正在做全自動量程的電容表,硬件和思路已經有了,就等軟件調試了,到時多提意見呦!

  • 上一篇:請問AE裏可編程動畫用的是什麽編程語言啊
  • 下一篇:課程設計---最少費用旅遊路線選擇 急急急 告急!!!希望哪位大大幫助壹下。
  • copyright 2024編程學習大全網