官术网_书友最值得收藏!

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
主站蜘蛛池模板: 衡阳县| 广安市| 宜兰县| 吉安县| 固安县| 焦作市| 施甸县| 涿鹿县| 进贤县| 银川市| 大洼县| 泰和县| 凌海市| 永定县| 邵东县| 邓州市| 衡山县| 淅川县| 泰来县| 依兰县| 海兴县| 塔城市| 弥勒县| 湖南省| 舟山市| 通辽市| 玛沁县| 七台河市| 辽阳市| 梁平县| 星子县| 裕民县| 新巴尔虎右旗| 铁岭县| 保康县| 社会| 营山县| 常山县| 灵山县| 克拉玛依市| 南昌市|