3.6 輸入接口電路仿真舉例
3.6.1 數字溫度傳感器與單片機的接口仿真
數字傳感器因其可以直接輸出數字信號、使用方便而受到人們的歡迎,數字溫度傳感器DS18B20就是其中的一種。數字溫度傳感器內部一般包含溫度傳感器、A/D轉換器、信號處理器、存儲器和相應的接口電路,使用比較方便。
DS18B20是DALLAS公司生產的單總線接口數字溫度傳感器,具有3個引腳,溫度測量范圍為-55℃~+125℃,可通過編程輸出9~12位A/D轉換精度,測溫分辨率可達0.0625℃,被測的溫度用16位補碼形式串行輸出。
表3.7為DS18B20溫度值格式表,其中S是符號位,以12位轉換為例,如果測得的溫度大于0,這5位都為0,只要將所測得的數值乘以0.0625/LSB即可得到實際溫度;如果測得的溫度小于0,這5位都為1,測得的數值要取反加一,再乘以0.0625/LSB就可以得到實際溫度。溫度最大轉換時間為750ms。
表3.7 DS18B20溫度值格式表

DS18B20與單片機連接非常簡單,圖3.37為DS18B20與單片機通過P1.0口串行連接的仿真圖,但對DS18B20讀/寫編程時必須嚴格按照讀/寫時序,否則可能無法讀取測溫的結果。

圖3.37 DS18B20與單片機接口電路
DS18B20內部有三個主要的數字部件,分別是64位ROM,溫度傳感器,溫度報警觸發器TH和TL,每個DS18B20都有一個獨特的片序號(儲存在ROM中),所以多個DS18B20可以同時連在一根單線總線上。根據DS18B20的通信協議,單片機控制DS18B20必須經過三步。
(1)復位(初始化)操作。通過單線總線的所有操作都從一個初始化序列開始,初始化序列包括一個由總線控制器發出的復位脈沖和緊隨其后的DS18B20發出的存在脈沖。
(2)發送(寫)ROM操作指令。共有五條操作指令,如表3.8所示。
(3)發送操作命令。溫度變換,讀溫度,設置溫度的上、下限值等共六條操作指令,如表3.9所示。
表3.8 ROM操作指令

表3.9 RAM操作指令

8951只接一個DS18B20,最簡單的程序是初始化,跳過ROM命令,轉換溫度命令,再一次初始化,跳過ROM命令,讀取溫度命令,就完成了一次測溫過程。
讀取單個DS18B20轉換的溫度值的程序如下(讀取的溫度值放在31H和30H中):
宏定義: T_L EQU 30H ;溫度值低位放在30H中 T_H EQU 31H ;溫度值高位放在31H中 FLAG0 EQU 00H ;DS18B20存在標記 DQ EQU P1.0 ;DS18B20的硬件接口 SKIPDS18B20 EQU 0CCH ;跳過ROM命令 STARTDS18B20 EQU 44H ;開始溫度轉換命令 READDS EQU 0BEH ;讀溫度轉換命令
主程序: ORG 0000H SJMP MAIN ORG 0040H MAIN: MOV SP,#60H CLR EA CLR FLAG0 LCALL RE_CONFIG ;設置DS18B20 LCALL GET_TEMPER ;用DS18B20測溫子程序 LJMP MAIN 測溫子程序: GET_TEMPER: SETB DQ LCALL INITDS18B20 ;初始化 JB FLAG0,S22 RET S22: LCALL Delay64us ;測溫 MOV A,#SKIPDS18B20 LCALL WriteByDS18B20 MOV A,#STARTDS18B20 LCALL WriteByDS18B20 LCALL Delay1s LCALL INITDS18B20 JB FLAG0,ABC RET ABC: LCALL Delay64us MOV A,#SKIPDS18B20 LCALL WriteByDS18B20 MOV A,#READDS LCALL WriteByDS18B20 LCALL READDS18B20 RET READBYDS18B20: MOV R2,#08H ;讀DS18B20的一個字節 RE1: CLR C SETB DQ NOP CLR DQ NOP NOP NOP SETB DQ MOV R3,#07H DJNZ R3,$ MOV C,DQ MOV R3,#23 DJNZ R3,$ RRC A DJNZ R2,RE1
RET READDS18B20: LCALL READBYDS18B20 ;讀溫度值 MOV T_L,A LCALL READBYDS18B20 MOV T_H,A RET WriteByDS18B20: MOV R2,#8 ;寫入DS18B20 CLR C WR1: CLR DQ MOV R3,#6 DJNZ R3,$ RRC A MOV DQ,C MOV R3,#23 DJNZ R3,$ SETB DQ NOP DJNZ R2,WR1 SETB DQ RET RE_CONFIG: LCALL INITDS18B20 ;設置DS18B20 JB FLAG0,RE_CONFIG1 RET RE_CONFIG1: MOV A,#0CCH LCALL WriteByDS18B20 MOV A,#4EH LCALL WriteByDS18B20 MOV A,#00H LCALL WriteByDS18B20 MOV A,#00H LCALL WriteByDS18B20 MOV A,#7FH LCALL WriteByDS18B20 RET Delay500us: MOV R6,#00H ;延時500微秒子程序 DJNZ R6,$ RET Delay64us: MOV R6,#20H ;延時60微秒子程序 DJNZ R6,$ RET Delay1s: MOV B,#130 ;延時1秒子程序 DELAY1: NOP NOP NOP NOP DJNZ B,DELAY1 RET
INITDS18B20: CLR DQ ;初始化DS18B20 MOV R7,#00H DJNZ R7,$ SETB DQ MOV R7,#10H DJNZ R7,$ SETB FLAG0 JNB DQ,TSR5 CLR FLAG0 LJMP TSR7 TSR5: MOV R7,#6BH DJNZ R7,$ TSR7: SETB DQ RET END
從程序中可以看到,DS18B20的優點是硬件簡單,CPU只需一根線就可以與多個DS18B20通信,占用微處理器的端口少,可以用于多點溫度測控,但軟件程序相對比較長,要嚴格按照資料給出的時序要求編程。
仿真時還可以看到DS18B20內部溫度存儲器中的值和讀出的溫度值隨溫度變化的情況。假設溫度為50℃,讀到的溫度值為0320H,如圖3.38所示,對照表3.7,可知溫度值為正。

圖3.38 轉換后輸出的溫度值
由圖3.38可知,DS18B20內部有9個字節RAM,分別為CRC校驗寄存器,溫度轉換后的低字節,高字節,報警用的高溫度觸發值,低溫度觸發值,在此例程序中均被設為0,配置寄存器,最后為三個保留字(可以讓用戶定義)。
從8051的內部RAM窗(圖3.38)可見,轉換后溫度值保留在31H和30H中。
3.6.2 A/D轉換芯片ADC0809的接口電路
ADC0809是較常用的8路輸入通道的A/D轉換器,由單一電源+5V供電,且片內帶有鎖存功能的8路模擬開關,可對0~5V的8路輸入模擬電壓信號進行分時轉換,轉換一次的時間約為100μs,帶有三態鎖存緩沖器,可直接與MCS-51系列單片機的數據總線相連。
由器件資料知,ADC0809的控制引腳定義為:
ALE:地址鎖存允許信號,輸入,高電平有效。
START:A/D轉換啟動信號,輸入,高電平脈沖。
EOC:A/D轉換結束信號,輸出,當啟動轉換后,該引腳為低電平,當A/D轉換結束時,該引腳輸出高電平信號,CPU可以通過查詢該引腳得知轉換是否結束,也可以由該引腳通過反相器接中斷,轉換結束時進入中斷,讀取數據。
CLOCK:時鐘脈沖信號,要求時鐘頻率不高于640kHz。
最簡單的ADC0809與8951的接口電路如圖3.39所示。這里只用了一路輸入,需要時可以通過改變輸入地址,分時獲取8路輸入的轉換結果。為了簡潔,圖中ADC0809的CLOCK端直接輸入640kHz的時鐘脈沖,該脈沖也可以由單片機ALE輸入脈沖經分頻得到,還可以由單片機編程輸出。

圖3.39 ADC0809與8951接口電路
ADC0809的工作流程如下所述。
(1)輸入三位地址,并使ALE=1,將地址存入地址鎖存器。經地址譯碼器從8路通道中選通一路模擬量送到比較器。
(2)送START一個高電平脈沖,其上升沿使逐次逼近寄存器復位,其下降沿啟動A/D轉換,并使EOC信號為低電平。
(3)轉換結束,轉換結果存入輸出三態鎖存器中,并使EOC信號回到高電平,通知CPU已轉換結束。
(4)當CPU執行讀數據命令時,使OE為高電平,從D0~D7中讀出數據。
編寫程序如下:
ORG 0000H AJMP MAIN ORG 0060H MAIN: SETB P1.4 SETB P1.5 CLR P1.6 ;給出輸入口地址 SETB P1.2 ;給START一個高電平脈沖 NOP NOP CLR P1.2 NOP NOP AA: JNB P1.1,AA ;查詢轉換是否結束 SETB P1.0 MOV A,P3 ;讀取轉換結果 MOV 30H,A ;存在內部RAM 30H中 SJMP $ END
可以看到,ADC0809與8951是并行連接的,相對來說硬件連接線比較多,但程序比較簡單,如果P0口和P2口已并行擴展了外部數據存儲器等,也可以用P0口擴展接ADC0809。
3.6.3 A/D轉換芯片ADC0832的接口電路
ADC0832是美國國家半導體公司生產的一種8位分辨率、雙通道A/D轉換芯片,其輸入/輸出電平與TTL/CMOS都兼容,5V電源供電時輸入電壓為0~5V,工作頻率為250kHz,轉換時間為32μs,采用串行通信方式輸出轉換后的數據,與單片機連接十分方便,如圖3.40所示,其引腳功能為:
CS:片選使能,低電平有效。
CH1、CH0:模擬輸入通道方式選擇,當兩位數據為“1”、“0”時,只對CH0進行單通道轉換;當兩位數據為“1”、“1”時,只對CH1進行單通道轉換;當兩位數據為“0”、“0”時,將CH0作為正輸入端IN+,CH1作為負輸入端IN-;當兩位數據為“0”、“1”時,將CH0作為負輸入端IN-,CH1作為正輸入端IN+。
DI:數據信號輸入,選擇輸入通道。
DO:數據信號輸出,輸出轉換數據。
CLK:芯片時鐘輸入。
正常情況下,ADC0832與單片機的接口線是四條,但因為DI與DO不是同時與單片機通信,且是雙向的,所以電路設計時可以用一根數據線并聯DI和DO使用。圖3.39給出了ADC0832與單片機最簡單的連接方法。

圖3.40 ADC0832與單片機接口電路
可以看到,串行連接硬件連接很方便,圖中用通道0(CH0)對輸入的模擬電壓進行采樣,轉換成數字量后通過P1.2送給CPU,圖中加入了一個電壓表顯示模擬電壓值,主程序通過調用子程序ADC可獲取A/D轉換的數據,在主程序中送入要轉換的模擬通道號,轉換后的數據存放在內部RAM 30H。注意,程序中CPU主要是通過軟件按協議來控制ADC0832,要進行A/D轉換時,須先將CS使能端置于低電平并且保持低電平直到轉換完全結束。此時芯片開始轉換工作,同時由處理器向芯片時鐘輸入端CLK輸入時鐘脈沖,DO/DI端則使用DI端輸入通道功能選擇的數據信號。在第1個時鐘脈沖下降前DI端必須是高電平,表示啟始信號。在第2、3個脈沖下降前DI端應輸入兩位數據用于選擇通道功能,本例中用P1.1端口輸出時鐘控制脈沖,其程序如下:
ORG 0000H AJMP MAIN ORG 0060H MAIN: MOV B,#10H LCALL ADC ;調用模/數轉換子程序 SJMP $ ADC: SETB P1.2 ;初始化通道選擇信號 NOP NOP CLR P1.0 ;選中芯片 NOP NOP SETB P1.1 ;通過輸出高/低電平形成時鐘脈沖 NOP
NOP CLR P1.1 NOP NOP SETB P1.1 MOV A,B MOV C,ACC.1 MOV P1.2,C ;輸入地址高位 NOP NOP CLR P1.1 NOP NOP SETB P1.1 MOV A,B MOV C,ACC.0 MOV P1.2,C ;輸入地址低位 NOP NOP CLR P1.1 SETB P1.2 ;地址輸入結束 NOP NOP MOV R7,#8 A1: MOV C,P1.2 ;P1.2與DO相連,CPU讀取數據 MOV ACC.0,C RL A ;左循環,(首先輸入最高位) SETB P1.1 NOP NOP CLR P1.1 NOP NOP DJNZ R7,A1 ;輸入8位了嗎?沒有則繼續 MOV 30H,A ;把數據存入30H SETB P1.0 CLR P1.1 SETB P1.2 RET END
- 大數據項目管理:從規劃到實現
- PIC單片機C語言非常入門與視頻演練
- 流處理器研究與設計
- 完全掌握AutoCAD 2008中文版:綜合篇
- JSF2和RichFaces4使用指南
- Java Web整合開發全程指南
- 工業機器人安裝與調試
- 水晶石影視動畫精粹:After Effects & Nuke 影視后期合成
- INSTANT Adobe Story Starter
- Unreal Development Kit Game Design Cookbook
- Deep Learning Essentials
- Machine Learning in Java
- PostgreSQL 10 High Performance
- JSP通用范例開發金典
- Eclipse全程指南