摘 要: 本文中數字電流表的控制系統采用AT89S51單片機,A/D轉換器采用ADC0809為主要硬件,實現數字電流表的硬件電路與軟件設計。該系統的數字電流表電路簡單,所用的元件較少,成本低,調節工作可實現自動化。數字電流表可以測量0~200 mA的8路輸入電流值,并在LCD液晶顯示屏上顯示出來。
關鍵詞: 單片機;數字電流表;A/D轉換器;液晶顯示屏
0 引言
在現實中,根據測試系統的要求,往往需要采集被測對象的各種參數,如電壓、電流等,這些參數的采集是至關重要的,它們直接影響到整個測試系統的測試精度。在有些應用中,需要對電流進行檢測,必須先將其電流信號轉換為電壓信號,然后才能實現A/D轉換。常用的轉換方法是在電路中加入精密電阻,由此將電流信號轉換為電壓信號[1]。這種方法的優點是測量簡單方便,但是這種方法當電流很小時,從電阻上取得的電壓值可能很小,影響測量精度,因而很難選擇一個合適的阻值;其次,所得到的電流檢測信號只有通過放大以后才能進入電路中的比較器,從而增加了電路設計調試時的復雜度。因此,需要采用電流/電壓轉換芯片,并結合單片機以實現對電流信號的檢測。本文中采用精密電阻,克服了常規測量電流方法存在的測量范圍小、測量誤差大等缺點,可提高測量精度,同時采用單片機可實現自動檢測。
1 硬件電路設計
本設計旨在設計一款測量范圍在0~200 mA、顯示精度在小數點前一位的基于AT89S51單片機帶液晶顯示功能的電流表,經查閱多種相關資料,確定本設計的總體框圖如圖1所示。
圖1所示電路工作過程:將需要檢測的電流信號經過I/V變換變為電壓信號,將其輸出的電壓信號連接到ADC0809進行A/D轉換,電壓信號經過采樣后,輸出到單片機,單片機控制中斷的過程以及數據的讀取過程,最后通過控制液晶顯示所讀取的數據。
1.1 I/V變換電路部分
對本設計來說,由于精度要求并不高,故用有源I/V即可滿足要求,有源I/V變換是利用有源器件——運算放大器和電阻電容組成的,如圖2所示。
該有源I/V變換電路利用同相放大電路,把電阻R1上的輸入電壓變成標準輸出電壓。該同相放大電路的放大倍數為:
若取R1=20 Ω,R2=100 kΩ,R3=100 kΩ,R4=25 kΩ,R5=10 kΩ,則當輸入電流為0~200 mA時,對應于0~5 V的電壓輸出。
1.2 A/D轉換模塊
基于成本、功耗、分辨率、模擬電壓轉換范圍等因素,此處選擇ADC0809芯片。ADC0809與8051單片機的硬件接口有3種形式,分別是查詢方式、中斷方式和延時等待方式。A/D轉換后得到的數據應及時傳送給單片機進行處理。數據傳送的關鍵問題是如何確認A/D轉換的完成,因為只有確認完成后,才能進行傳送。在本設計中,選擇中斷方式,即把表明轉換完成的狀態信號(EOC)作為中斷請求信號,以中斷方式進行數據傳送。
1.3 單片機模塊
該電流表可測量0~200 mA的直流電壓,通過電位器調節產生,顯示位數3位[2],工作電壓5 V。通過A/D轉換芯片ADC0809把模擬信號轉換為數字量傳送到單片機的P3口,并在P2口把轉換的結果顯示出來。在仿真軟件Protesus[3]里選擇元器件后連接電流表總圖,如圖3所示。
本設計選用的AT89S51是ATMEL公司推出的高性能8位微控制器,由于ADC0809無片內時鐘,時鐘信號可由AT89S51的ALE信號經D觸發器二分頻后獲得。ALE引腳的脈沖頻率是8051時鐘頻率的1/6。本設計中單片機時鐘頻率采用6 MHz,則ALE輸出的頻率是1 MHz,二分頻后為500 kHz,符合ADC0809對頻率的要求。
1.4 顯示部分
本電流表的顯示[4]選擇LCDl602型LCD,它具有電流小、功耗低、體積小、字跡清晰、美觀、方便、使用壽命長、無電磁輻射等優點。從圖3中可看出其與AT89S51的P0口相連,其DO~D7為8位雙向數據線,VSS為地電源,VDD接5 V正向電源,VEE為液晶顯示器對比度調整端,接正向電源時對比度最弱,而接地電源時對比度最高。該引腳通過一只1 kΩ的電位器來調整其對比度。RS為寄存器選擇引腳,RS為高電平時選用數據寄存器;RS為低電平時選用指令寄存器。RW為可讀寫信號引腳,RW高電平時為讀操作;RW低電平時為寫操作。當RS和RW共同為低電平時則寫入指令或者顯示地址;當RS為低電平、RW為高電平時為讀忙信號;當RS為高電平、RW為低電平時為寫人數據。E為使能端,當E由高電平跳變為低電平時,LCD液晶模塊開始執行命令。
2 電流表軟件設計
本電流表的主程序流程包括:系統初始化、中斷處理程序、數值轉換程序、顯示處理程序。較關鍵的是數據采集部分和顯示部分。
2.1 數據采集部分
本部分程序設計的思想如下:首先由ADC0809采集數據,采集完成后單片機通過中斷將數據讀入,然后將所得十六進制數轉換成十進制數,將此十進制數的百、十、個位分別取出,在預先設置好的表中查出其所對應的顯示指令并顯示出來。以下為數值轉換的主代碼[5]。
codes=PORT;//將中斷值賦予codes
codes1=(codes&0xf0)>>4;//取出codes的高4位
codes0=codes&0x0f;//取出codes的低4位
code_d=codes1*16+codes0;//將codes轉化為十進制數
bai=code_d/100;//將code_d的百位取出
shi=code_d/10%10;//將code_d的十位取出
ge=code_d%10;//將code_d的個位取出
2.2 數值顯示程序
這部分程序首先要將單位mA顯示出來,因為這單位是不變的。要把測得的數值在液晶屏上顯示出來時,此處調用一個getchar函數。在這個函數中,用了一個do{}while語句。在此語句的一開頭首先測試液晶模塊是否空閑,若不空閑則等待其空閑,當液晶空閑時,執行嵌套switch/case語句。由于要顯示三個數字,所以設定了一個變量i,當i=0時顯示百位,當i=1時顯示十位,當i=2時顯示個位。顯示數字時可選擇查表法。先建立三個表,每一位對應一個表。以下為顯示十位的例子。
case 1:
{
PA=TABLE2[shi*2+t];
t++;
}break;
顯示完成后,進行適當的延時以保證顯示的穩定性。
3 結論
在本次設計中,通過使用Proteus繪制電路圖,用C語言編寫程序,程序運行完畢后,電壓表的顯示屏上就可以顯示出電流數值來。調節電位器,顯示數值就會發生變化。電壓表的最小顯示值是0 mA,最大顯示值是200 mA,這與設計目的一致,1 s內大約可以測量2次電壓值。
參考文獻
[1] 柳金龍.淺談數字電壓表的特點[J].中國計量,2004(8):43-44.
[2] 王韜.3位半積分式A/D轉換DC電壓表[J].電子設計工程:電子世界,2002(2):44-45.
[3] 周潤景,張麗娜.劉映群.PROTEUS入門使用教程[M].北京:機械工業出版社,2007.
[4] 馬俊,劉曉林.智能鍵盤字符輸入及LCD顯示系統設計[J].電子設計工程,2009,17(1):66-68.
[5] 馬忠梅,籍順心,張凱,等.單片機的C語言應用程序設計(第3版)[M].北京:北京航空航天大學出版社,2003.