|
在工業控制和智能化儀表中,常由單片機進行實時控制及實時數據處理。單片機所加工的信息都是數字量,而被控制或測量對象的有關參量往往是連續變化的模擬量,如溫度、速度、壓力等等,與此對應的電信號是模擬電信號。單片機要處理這種信號,首先必須將模擬量轉換成數字量,這一轉換過程就是模—數轉換,實現模/數轉換的設備稱為A/D轉換器或ADC。 AD轉換器是單片機應用中常見的接口,從事單片機開發的人員通常都會遇到使用AD的要求,本文通過一個典型的例子來學習一種常用AD轉換器的用法。
一、模數轉換簡介 A/D轉換電路種類很多,在選擇模/數轉換器時,主要考慮以下的一些技術指標:轉換時間和轉換頻率、量化誤差與分辨率、轉換精度、接口形式等。目前,較為流行的 AD轉換器件有很多都采用了串行接口,這使得這類芯片與單片機的硬件連接非常簡單,而軟件編程相對要復雜一些,下面,我們以TI公司的TLC1543為例,制作一個多路輸入的電壓表,了解一下這類芯片的使用特點。
二、TLC1543特性簡介 TLC1543是由TI公司開發的開關電容式AD轉換器,該芯片具有如下的一些特點: 10位精度、11通道、三種內建的自測模式、提供EOC(轉換完成)信號等。該芯片與單片機的接口采用串行接口方式,引線很少,與單片機連接簡單。 圖1是TLC1543的引腳示意圖,其中A0~A10是11路輸入,Vcc和GND分別是電源引腳,REF+和REF-分別是參考電源的正負引腳,使用時一般將REF-接到系統的地,達到一點接地的要求,以減少干擾。其余的引腳是TLC1543與CPU的接口,其中CS為片選端,如不需選片,可直接接地。I/O Clock是芯片的時鐘端,Adress是地址選擇端,Data Out是數據輸出端,這三根引腳分別接到CPU的三個I/O端即可。EOC用于指示一次AD轉換已完成,CPU可以讀取數據,該引腳是低電平有效,根據需要,該引腳可接入CPU的中斷引腳,一旦數據轉換完成,向CPU提出中斷請求;此外,也可將該引腳接入一個普通的I/O引腳,CPU通過查詢該引腳的狀態來了解當前的狀態,甚至該引腳也可以不接,在CPU向TLC1543發出轉換命令后,過一段固定的時間去讀取數據即可。
三、單片機與TLC1543芯片的接口 圖2使用TLC1543制作的多路輸入電壓表的電路圖,從圖中可以看出,這里使用了TLC1543作為基準電壓源,將REF-直接接地,P1.0、P1.1、P1.2、P1.3和P1.4分別與EOC、時鐘、地址、數據、片選端分別相連。制作時,請參考表1進制連線。注意電容E1和C1一定要用,E1可用10u/16V電解,C1可用0.1u CBB電容,安裝時盡量接近20腳和第10腳。輸入端可根所需要,接入相應的信號。 編程的要求是在六位數碼管的后四位數碼管上輪流顯示TLC1543各通道的測量值,同時用十六進制表示的通道號顯示在第1位數碼管上。
圖2 用單片機制作多路輸入電壓表
四、TLC1543驅動程序編寫 由于采用串行接口,在硬件電路簡單的同時,帶來了軟件編制的復雜性,初學單片機的入門者很難掌握這類芯片的編程方法,這給此類芯片的應用帶來一定的限制。為解決這一問題,我們在實際應用該芯片的基礎上寫出了該芯片的驅動程序,有了驅動程序,使用者不必再關心TLC1543數據手冊中的時序圖之類不易懂的部份,只要了解清楚驅動程序的用法,即可使用該芯片。 TLC1543共有11條輸入通道,這11條通道的編號從0~10,讀取時,根據編號來獲得想應通道的數據,此外,內部還有三條用于測試的通道,分別是接: 、 和 其通道編號分別是11、12和13. 1.驅動程序 ;以下定義各引腳 ADCLK EQU P1.1 ;時鐘 ADaddr EQU P1.2 ;地址引腳 ADDout EQU P1.3 ;數據端 ADCS EQU P1.4 ;片選端 命令:ADConver 參數:r2 通道號,轉換前存入 轉換結后數據在r0r1中,高位在前 資源占用:r0,r1,r7,A ADConver: CLR ADClk CLR ADCS MOV A,R2 RLC A ;送出地址信號 MOV R7,#4 C_L1: RLC A MOV ADAddr,C SETB ADClk NOP NOP NOP NOP CLR ADClk DJNZ R7,C_L1 ;補6個脈沖 MOV R7,#6 C_L2: SETB ADClk NOP NOP NOP NOP CLR ADClk DJNZ R7,C_L2 ;等待轉換結束 SETB ADCS NOP NOP NOP NOP CLR ADCS ;取高2位 NOP NOP NOP NOP SETB ADDout SETB ADClk MOV C,ADDout MOV ACC.1,C CLR ADClk NOP NOP NOP NOP SETB ADDout SETB ADClk MOV C,ADDout MOV ACC.0,C CLR ADClk ANL A,#00000011B ;清A的高6位 MOV R0,A ;保存數據
MOV R7,#8 C_L3: NOP NOP NOP NOP SETB ADDout SETB ADClk MOV C,ADDout MOV ACC.0,C RLC A CLR ADClk DJNZ R7,C_L3 SETB ADCS MOV R1,A RET
2.驅動程序的使用 該驅動程序中用到了四個標記符號: ADClk 與TLC1543的Clk引腳相連的單片機引腳 ADaddr 與TLC1543的Address引腳相連的單片機引腳 ADDout 與TLC1543的AdDout引腳相連的單片機引腳 ADCS 與TLC1543的 引腳相連的單片機引腳 實際使用時,根據接線的情況定義好ADclk、ADaddr、ADDout、ADCS,將通道號送入R2,調用ADConver,即可從R0、R1中得到轉換后的數據,使用非常簡單。 ;************************************************** ; 平凡單片機工作室 ; http://www.mcustudio.com ; Copyright 2003 pingfan's McuStudio ; All rights Reserved ;作者:周堅 ;文件名:ad.asm ;功能簡介:每隔1s輪流將一個通道的值顯示在數碼管后4位,首位顯示通道號 ;************************************************** gCoun DATA 22H ;通道計數器 CLK bit P1.1 ;時鐘端 ADDR bit P1.0 ;地址端 Dout bit P1.4 ;數據輸出端 CS bit P1.3 ;片選端 Hidden DATA 10H ;消隱碼 Counter DATA 57H ;顯示程序用計數器 DISPBUF DATA 58H ;顯示緩沖區首地址
ORG 0000H JMP START ORG 000BH ;定時中斷使用T0 JMP DISP ;定時中斷程序 ORG 30H START: MOV SP,#5FH ;初始化 MOV P1,#0FFH MOV P0,#0FFH MOV P2,#0FFH ;關所有LED及數碼管 MOV TMOD,#00000001B MOV TH0,#HIGH(65536-3000) MOV TL0,#LOW(65536-3000) SETB TR0 SETB EA SETB ET0 MOV Counter,#0 ;計數器清零 MOV DISPBUF+1,#Hidden ;第2位顯示器消隱 MOV gCoun,#0 ;通道計數器清零,指向通道0 LOOP: CALL Delay ;延時1s MOV R2,gCoun ;送通道號 CALL ADConver MOV A,R0 MOV R6,A MOV A,R1 MOV R7,A CALL HB2 ;調用二-十進制轉換程序 ;入口:待轉換的雙字節十六進制數在R6和R7中 ;出口:轉換結束的結果在R3、R4和R5中,壓縮BCD碼方式存儲 MOV A,R4 ANL A,#0F0H SWAP A ;高低4位互換 MOV DispBuf+2,A ;最高位 MOV A,R4 ANL A,#0FH MOV DispBuf+3,A MOV A,R5 ANL A,#0F0H SWAP A MOV DispBuf+4,A MOV A,R5 ANL A,#0FH MOV DispBuf+5,A ;以上程序段將壓縮BCD碼轉換成非壓縮BCD碼并送顯示緩沖區 MOV DispBuf,gCoun ;將通道號送第1個顯示器的顯示緩沖區 INC gCoun ;通道號加1 MOV A,gCoun CJNE A,#11,LOOP ;判斷是否到11了 MOV gCoun,#0 ;到則回零 JMP LOOP ;主程序到此結束 |