用AT89C51實現模數轉換
本期教程通過一個簡單的電壓測量電路,講解AT89C2051片內比較器的使用及模數轉換主程序的設計,說明利用RC充電規(guī)律實現模數轉換,取得被測電壓近似值的原理。
一、電路構成與功能
由圖1可知,本電路主要由AT89C2051(IC1)、R10、C4等組成,被測電壓從P1.1輸入,電路通過對C4充電電壓與被測電壓的比較得到電壓值,然后將被測電壓值轉換為相應的顯示代碼,送LED1、LED2中顯示出來。
二、AT89C2051簡介
AT89C2051與AT89C51相比,除去掉了P0口和P2口,并在P1口的P1.0、P1.1與P3口的P3.6之間嵌入了一個精確的模擬比較器外,其他硬件資源完全相同。AT89C2051具有以下一些標準特性:2K字節(jié)的閃速存儲器,128字節(jié)RAM,15條I/O線,2個16位定時/計數器,5個兩級中斷源結構,一個全雙工串行口,一個精確的模擬比較器,片內振蕩器和時鐘電路。此外,AT89C2051設有靜態(tài)邏輯,可以在低到零頻率的條件下工作,支持兩種軟件可選的省電模式:在閑置模式下,CPU停止工作,但RAM、定時器/計數器、串口和中斷系統仍在工作;在掉電模式下,保存RAM中的內容并且凍結振蕩器,禁止所有其他片內控制單元功能,直到下一個硬件復位為止。
AT89C2051只有20個引腳。引腳排列及片內比較器連接示意圖見圖2。由圖可知,P1.0與比較器的同相輸入端相接,
P1.1與比較器的反相輸入端相接,比較器的輸出端在片內與P3.6相接,而P3.6并無片外引腳。因此,AT89C2051的P1口有完整的8條I/O口線的片外引腳,而P3口只有7條I/O線的片外引腳,使其可供片外使用的I/O線為15條。AT89C2051性能同AT89C51一樣卓越而結構又十分簡單,從而為很多嵌入式控制系統提供了靈活而又廉價的方案,因此,在各種智能化、自動化儀器、儀表及家電中得到廣泛應用。
三、數模轉換原理
圖3為數模轉換電路的簡化圖。由圖可知,比較器IC1的同相輸入端P1.0與P1.4之間接有電阻R10,而被測電壓是通過P1.1輸入至比較器IC1的反相端,這樣,當被測電壓Ui從P1.1輸入并開始測量時,先使P1.4置低電位,C4就會對地放電,使P1.0的電位為零,由于此時P1.1的電位高于P1.0的電位(Ui>0),因此,IC1的輸出端P3.6為低電位。進入測量程序,先使P1.4跳高電位,VCC就會通過R9、R10向C4充電,P1.0的電位就會隨時間按指數規(guī)律上升。當P1.0的電位上升至與P1.1的電位相同或略高一點時,IC1的輸出端P3.6就會由低電位跳變?yōu)楦唠娢?,由此,我們可用程序控制CPU在C4充電的同時,不間斷檢測P3.6的電位,當P3.6電位發(fā)生高跳時,我們就認為P1.0的電壓與P1.1的電壓相等。由于C4的充電電壓是可以通過充電時間的長短來準確計算的,所以,計算出C4的充電壓,也就間接地測出了被測電壓Ui的值。VCC通過R10(R9和P1.4上拉電阻的影響忽略)向C4充電,C4兩端的電壓是隨時間按指數規(guī)律上升的,可根據UC=VCC(1-e-t/RC)求出任一時刻的充電電壓值。為了便于理解,我們只在圖4所示的充電曲線中選取一小段,將其取直,然后按直線變化規(guī)律對模數轉換原理加以闡述。由圖4可以看出,C4充電曲線的起始部分0~500mV這一段是較陡的,且接近直線,為了使程序設計簡單,我們就把OA段看做是直線。這樣,當C4自零電位開始充電到充電電壓達500mV的這段時間里,充電時間與其兩端的電壓是成正比的,我們適當地對R10和C4取值,使C4的充電電壓每20μs上升10mV,再編制與之相匹配的程序,自C4開始充電起,每隔20μs就檢測一次P3.6的電位,并將檢測的次數在寄存器中累計下來,直到P3.6的電位發(fā)生跳變才停止累計。這樣,寄存器中的累計數便與C4兩端的充電電壓有了對應關系。如果第5次檢測時,P3.6的電位由低跳高,說明被測電壓是50mV。這樣,我們測到P3.6電位跳高后,就停止檢測,將寄存器中的數值乘以10mV,就得到了被測電壓Ui的電壓值,這就實現了模量與數量的轉換。
四、顯示原理
在圖1中,LED1與LED2的a、b、c、d、e、f、g端分別與IC1P3口的P3.0至P3.7相接(P3.6除外),GND端分別與IC1的P1.2和P1.3相接。顯示時,將段選碼送P3口,將位選碼送P1口,測量值就會在LED1和LED2中顯示出來。有關原理及變換過程,前幾講中已有詳述。
五、程序設計思想
系統上電后進行初始化,熄滅數碼管LED1和LED2,然后進入測量子程序:執(zhí)行CLR P1.4,使P1.4呈低電位,C4便通過R10對地放電,調用40ms顯示子程序后,C4電荷放盡,P1.0的電位為零,執(zhí)行MOV R0,#00H,將檢測次數累計寄存器R0清零,然后執(zhí)行SETB P1.4, 使P1.4呈高電位,VCC通過R10對C4充電,經數次空操作,執(zhí)行INC R0指令,將R0中的內容加1,再執(zhí)行JNB P3.6,000FH,判斷充電電壓與被測電壓是否相等。如果P3.6電位為低,說明C4的充電電壓較被測電壓低,程序跳轉至000F處,經空操作充電延時后再對P3.6的電位進行檢測;如果P3.6的電位為高,說明P1.0的電壓與P1.1的電壓相等,執(zhí)行SJMP 0006H,程序立刻返回0006處,使C4放電,并進入顯示子程序,對測量數據進行處理,將處理后的數據送數碼管顯示,然后進行下一次測量。從程序清單中的000FH至0018H空間可以看出,6次空操作及INC R0為單機器周期指令,執(zhí)行時間皆為2μs,而JNB P3.6,000FH為雙機器周期指令,執(zhí)行時間為4μs,這樣,便使每次對P3.6的檢測時間間隔為18μs。按圖1電路中R10及C4的取值運行上述程序,能使每檢測一次P3.6的電位,C4充電電壓的上升約10mV。然后進入顯示子程序,將R0中的數據經變換后送LED中顯示出來,我們就可讀出被測電壓Ui的值了。模數轉換主程序安放在0000H至001AH空間內,數據顯示子程序要在001BH處開始安放。顯示子程序的主要功能是將數據經譯碼后得到顯示代碼,其原理不再贅述。如果對模數轉換有較高的精度要求,就要事先根據UC=VCC(1-e-t/RC)計算出多個時刻的對應值,這樣,組成充電時間與充電電壓值的對應數據表,然后編一段程序,將充電時間,也就是寄存器R0中的數據取出來,經查表比較,取得較精確的充電電壓數值,本文旨在說明一下模數轉換的基本原理,對此不作詳述。
六、主程序清單
地址 機器碼 指令 解釋
0000 75B000 MOV P3,#00H ; 初始化
0003 7590EF MOV P1, #EFH ; 關顯示
0006 C294 CLR P1.4 ; 放電
0008 12001B LCALL 001B ; 調40ms顯示子程序
000B 7800 MOV R0,#00H ; 清累計寄存器
000D D294 SETB P1.4 ; 開始充電
000F 00 NOP ; 空操作延時
0010 00 NOP ;
0011 00 NOP ;
0012 00 NOP ;
0013 00 NOP ;
0014 00 NOP ;
0015 08 INC R0 ; 累計檢測次數
0016 30B6F6 JNB P3.6,000FH; 低于Ui,再充電比較
0019 80EB SJMP 0006H ; 返回進行下次測量
比較器相關文章:比較器工作原理
評論