實驗六:溫度傳感DS18B20實驗(數碼管顯示)

 
1、實驗目的:
 
1)  AT89S52X單片機爲核心器件,組成一個數字式溫度計。
2)  瞭解DS18B20的工做原理及使用方法。
3)  掌握DS18B20讀寫時序的編程方法。
4)  鍛鍊單片機綜合應用和開發的能力
 
2、 實驗內容與要求:
 
1)顯示當前溫度:在數碼管顯示模塊上前四個數碼管顯示當前溫度(整數小數各兩位)。
2)編程要求:用匯編語言編寫此程序,寫出各個子程序的功能並在主要的指令後加上必要地文字說明增長程序的可讀性。
 
 
1)硬件電路原理圖:
如圖-1所示,
      -1 溫度測量使用P1.3端口,使用DS18B20器件,顯示使用4位數碼管。
 
   2)工做原理:本實驗經過DS18B20採集環境溫度,當單片機檢測到DSl820的存在即可以發出ROM操做命令之一,Read ROM(ROM)   Match ROM(匹配ROM)   Skip ROM(跳過ROM)   Search ROM(搜索ROM)    Alarm search(告警搜索)   而後對發存儲器操做命令對DS18B20進行讀寫數據轉換等操做。單片機使用時間隙(time slots)來讀寫DSl820的數據位和寫命令字的位,而後將讀到的數據轉換BCD碼在數碼管顯示出來(DS18B20的詳細資料詳見附錄)。
 
四.軟件流程設計:
該系統採用的方法,根據初始化溫度傳感器,再就是顯示溫度數值。測量出來溫度軟件系統基本流程如圖所示:   
 
       
 
五.參考程序:
 
/*------------------------------內存分配聲明--------------------------*/
TEMPER_L  EQU   31H     ;用於保存讀出溫度的低字節
TEMPER_H  EQU   30H   ;用於保存讀出溫度的高字節
T_DF      EQU   33H   ;FORMAT後的小數部分(decimal fraction),半字節的溫度小數(存在低四位)
T_INTEGER EQU   32H    ;FORMAT後的整數部分(integer),將兩字節的溫度整合成1字節
FLAG    BIT     20H       ;標誌位
DAT     BIT     P1.3       ;DS18B20數據線
 
/*------------------------------主函數開始-----------------------------*/
        ORG     0000H   ;函數入口地址
        AJMP    MAIN   ;跳轉指令
        ORG     0030H                
MAIN :
        CLR     EA              ;使用DS18B20必定要禁止中斷
        MOV     SP,#60H
        MOV     T_DF,#00H       ;賦初始溫度爲30
        MOV     T_INTEGER,#30H
START:  LCALL   GET_TEMPER      ;調用讀溫度子程序
        LCALL   T_FORMAT        ;將讀出的2字節溫度格式化,並轉換爲壓縮BCD
        LCALL   DISPLAY         ;顯示溫度
        AJMP    START
 
/*-----------------------DS18B20的溫度轉換子程序-----------------------*/
GET_TEMPER:
        LCALL   Set_18B20           ;調用DS18B20初始化程序
        MOV     A,#0CCH         ;跳過ROM匹配
        LCALL   WRITE_1820              ;調用寫DS18B20的子程序
        MOV     A,#44H          ;發出溫度轉換命令
        LCALL   WRITE_1820
        LCALL   DISPLAY         ;用顯示溫度(持續1s左右)來等待AD轉換結束,12位的話要轉換750ms
        LCALL   Set_18B20       ;準備讀溫度前先初始化
        MOV     A,#0CCH         ;跳過ROM匹配
        LCALL   WRITE_1820
        MOV     A,#0BEH         ;發出讀溫度命令
        LCALL   WRITE_1820
        LCALL   READ_1820       ;DS18B20的程序
        RET
 
/*--------------------------DS18B20初始化程序--------------------------*/
Set_18B20:
        SETB    DAT                           ;置位
        NOP                                          ;空操做
        CLR     DAT                           ;清零
        MOV     R2,#250         ;主機發出延時500微秒的復位低脈衝
        DJNZ    R2,$                    ;自減(-1)循環
        SETB    DAT             ;而後拉高數據線
        MOV     R2,#30
        DJNZ    R2,$            ;延時60us等待DS18B20迴應
        JNB     DAT,INIT1
        JMP     Set_18B20       ;超時而沒有響應,從新初始化
INIT1:  MOV     R2,#120
        DJNZ    R2,$            ;延時240us
        JB      DAT,INIT2       ;數據變高,初始化成功
        JMP     Set_18B20
INIT2:  MOV     R2,#240
        DJNZ    R2,$
        RET
 
/*-----------------DS18B20的子程序(有具體的時序要求)-----------------*/
WRITE_1820:
        MOV     R2,#8           ;8位數據
WR0:    CLR     DAT
        MOV     R3,#6
        DJNZ    R3,$
        RRC     A
        MOV     DAT,C
        MOV     R3,#20
        DJNZ    R3,$
        SETB    DAT
        NOP
        NOP
        DJNZ    R2,WR0
        SETB    DAT
        RET
 
/*------DS18B20的程序,DS18B20中讀出兩個字節的溫度數據----------------*/
READ_1820:
        MOV     R4,#2           ;將溫度高位和低位從DS18B20中讀出
        MOV     R1,#TEMPER_L    ;低位存入31H(TEMPER_L)
RE0:    MOV     R2,#8
RE1:    SETB    DAT
        NOP
        NOP
        CLR     DAT
        NOP
        NOP
        SETB    DAT
        MOV     R3,#4
        DJNZ    R3,$
        MOV     C,DAT
        RRC     A
        MOV     R3,#30
        DJNZ    R3,$
        DJNZ    R2,RE1
        MOV     @R1,A
        DEC     R1              ;高位存入30H(TEMPER_H)
        DJNZ    R4,RE0
        RET
 
/*------整合讀出的兩字節溫度(關於DS18B20讀出的2字節溫度格式請參考資料)-----*/
T_FORMAT:
        MOV     A,#0FH
        ANL     A,TEMPER_L
        MOV     T_DF,A          ;得到小數部分(4)
        MOV     A,TEMPER_L
        SWAP    A
        MOV     @R0,A
        MOV     A,TEMPER_H
        SWAP    A
        XCHD    A,@R0
        MOV     T_INTEGER,A     ;得到整數部分(1字節)
TO_BCD: MOV     A,T_INTEGER
        MOV     B,#10
        DIV     AB
        SWAP    A
        ADD     A,B
        MOV     T_INTEGER,A     ;整數部分壓縮BCD碼送T_INTEGER
        MOV     A,T_DF
        MOV     B,#10
        MUL     AB
        MOV     B,#16
        DIV     AB
        MOV     R2,A            ;暫存R2
        MOV     A, B
        MOV     B,#10
        MUL     AB
        MOV     B,#16
        DIV     AB
        MOV     B,A
        MOV     A,R2
        SWAP    A
        ADD     A,B
        MOV     T_DF,A          ;小數部分壓縮BCD碼送T_DF
        RET
 
/*---------------------------顯示溫度子程序----------------------------*/
DISPLAY:MOV     R1,#250
DISP1:  MOV     A,T_INTEGER
        MOV     R3,#0FEH
        MOV     R4,#0FDH
        SETB    FLAG
DISP2:  CPL     FLAG
        MOV     B,#10H
        DIV     AB
        MOV     R2,A            ;高位送R2暫存
        MOV     DPTR,#2000H     ;字位口
        MOV     A,R3
        MOVX    @DPTR,A         ;送字位
        MOV     A,R2            ;字型R2A
        MOV     DPTR,#TAB       ;表首地址送DPTR
        MOVC    A,@A+DPTR       ;查表
        MOV     DPTR,#6000H     ;字型口
        MOVX    @DPTR,A         ;送字型
        CALL    D1MS            ;延時
        MOV     A,#0FFH
        MOVX    @DPTR,A         ;關閉字型顯示
        MOV     R2,B            ;低位送R2暫存
        MOV     DPTR,#2000H     ;字位口
        MOV     A,R4
        MOVX    @DPTR,A         ;送字位
        MOV     A,R2            ;字型R2A
        MOV     DPTR,#TAB       ;表首地址送DPTR
        MOVC    A,@A+DPTR       ;查表
        JNB     FLAG,D1                    ;FLAG 爲零,跳到D1
        JMP     D2                       ;不然,跳到D2
D1:     ANL     A,#7FH                ;相與
D2:     MOV     DPTR,#6000H     ;字型口
        MOVX    @DPTR,A         ;送字型
        CALL    D1MS            ;延時
        MOV     A,#0FFH
        MOVX    @DPTR,A         ;關閉字型顯示
        MOV     A,T_DF
        MOV     R3,#0FBH
        MOV     R4,# 0F 7H
        JNB     FLAG,DISP2
        DJNZ    R1,DISP1
        RET
 
/*-------------------------1mS延時(12MHZ)--------------------------*/
D1MS:   MOV     R7,#250
LOOP0:  NOP
        NOP
        DJNZ    R7,LOOP0
        RET
 
/*-------------------------共陽數碼管對應字型表-------------------------*/
TAB:    DB 0C 0H, 0F 9H, 0A 4H,0B0H,99H,92H,82H, 0F 8H  ;段碼錶
        ;   0    1    2     3   4   5   6    7   對應內容
        DB 80H,90H,88H,83H, 0C 6H, 0A 1H,86H,8EH
        ;   8   9    A     B   C   D    E   F
 END
六.實驗步驟:
    1.DS18B20的數據手冊,弄明白其時序及編程思路。
    2.看實驗開發板的連線手冊,分析計算出顯示模塊數碼管的物理地址。
    3.畫出程序流程圖編寫相應的程序。
    4.將程序下載到開發板上並調試程序,使程序達到預約功能。
1.寫出項目方案,包括硬件設計方案和軟件設計方案。
2.給出電路原理圖和程序流程圖的設計。
3.提供程序清單,並加以註釋。
4.在調試過程當中發現了哪些問題?你是怎麼解決的?
5.總結項目開發的經驗
八.思考題:
     本實驗實現了單點的溫度採集,你可否在本實驗的基礎上設計實驗實現多點溫度採集的系統。
 
 
 
                                      附錄
數字溫度傳感器 DS1820(DS18B20) 的應用
 
一 單線數字溫度計 DSl820 介紹
 
DSl820 數字溫度計提供 9 ( 二進制 ) 溫度讀數指示器件的溫度信息通過單線接口送入 DSl820 或從 DSl820 送出所以從主機 CPU DSl820 僅需一條線 ( 和地線 )DSl820 的電源能夠由數據線自己提供而不須要外部電源由於每個 DSl820 在出廠時已經給定了惟一的序號所以任意多個 DSl820 能夠存放在同一條單線總線上這容許在許多不一樣的地方放置溫度敏感器件 DSl820 的測量範圍從 -55 +125 增量值爲 0.5 可在 l s( 典型值 ) 內把溫度變換成數字每個 DSl820 包括一個惟一的 64 位長的序號該序號值存放在 DSl820 內部的 ROM( 只讀存貯器 ) 中開始 8 位是產品類型編碼 (DSl820 編碼均爲 10H) 接着的 48 位是每一個器件惟一的序號最後 8 位是前面 56 位的 CRC( 循環冗餘校驗 ) DSl820 中還有用於貯存測得的溫度值的兩個 8 位存貯器 RAM 編號爲 0 號和 1 1 號存貯器存放溫度值的符號若是溫度爲負 () 1 號存貯器 8 位全爲 1 不然全爲 00 號存貯器用於存放溫度值的補碼 LSB( 最低位 ) 1 表示 0.5 將存貯器中的二進制數求補再轉換成十進制數併除以 2 就獲得被測溫度值 (-550125) DSl820 的引腳如圖 226l 所示每隻 D51820 均可以設置成兩種供電方式即數據總線供電方式和外部供電方式採起數據總線供電方式能夠節省一根導線但完成溫度測量的時間較長採起外部供電方式則多用一根導線但測量速度較快溫度計算
 
1 Ds1820 9 位存貯溫值度最高位爲符號位下圖爲 18b20 的溫度存儲方式負溫度 S=1 正溫度 S=0
 
00AAH +85 ,0032H 25 ,FF92H 55
2. Ds18b20 12 位存貯溫值度最高位爲符號位下圖爲 18b20 的溫度存儲方式負溫度 S=1 正溫度 S=0
0550H +85 ,0191H 25.0625 ,FC90H -55
. DSl820 工做過程及時序
DSl820 工做過程當中的協議以下
初始化 RoM 操做命令存儲器操做命令處理數據
1 初始化
單總線上的全部處理均從初始化開始
2ROM 操做品令
總線主機檢測到 DSl820 的存在即可以發出 ROM 操做命令之一這些命令如
指令 代碼
Read ROM( ROM) [33H]
Match ROM( 匹配 ROM) [55H]
Skip ROM( 跳過 ROM] [CCH]
Search ROM( 搜索 ROM) [F0H]
Alarm search( 告警搜索 ) [ECH]
3 存儲器操做命令
指令 代碼
Write Scratchpad( 寫暫存存儲器 ) [4EH]
Read Scratchpad( 讀暫存存儲器 ) [BEH]
Copy Scratchpad( 複製暫存存儲器 ) [48H]
Convert Temperature( 溫度變換 ) [44H]
Recall EPROM( 從新調出 ) [B8H]
Read Power supply( 讀電源 ) [B4H]
4 時 序
主機使用時間隙 (time slots) 來讀寫 DSl820 的數據位和寫命令字的位
(1) 初始化
時序見圖 2.25-2 主機總線 to 時刻發送一復位脈衝 ( 最短爲 480us 的低電平信號 ) 接着在 tl 時刻釋放總線並進入接收狀態 DSl820 在檢測到總線的上升沿以後等待 15-60us 接着 DS1820 t2 時刻發出存在脈衝 ( 低電平持續 60-240 us) 如圖中虛線所示
如下子程序在 MCS51 仿真機上經過其晶振爲 12M. 初始化子程序
RESET
PUSH B ; 保存 B 寄存器
PUSH A 保存 A 寄存器
MOV A,#4 ; 設置循環次數
CLR P1.0 ; 發出復位脈衝
MOV B,#250 ; 計數 250
DJNZ B,$ ; 保持低電平 500us
SETB Pl.0 ; 釋放總線
MOV B,#6 ; 設置時間常數
CLR C ; 清存在信號標誌
WAITL: JB Pl.0,WH ; 若總線釋放跳出循環
DJNZ B,WAITL ; 總線低等待
DJNZ ACC,WAITL; 釋放總線等待一段時間
SJMP SHORT
WH: MOV B,#111
WH1: ORL C,P1.0
DJNZ B,WH1 ; 存在時間等待
SHORT: POP A
POP B
RET
(2) 寫時間隙
當主機總線 t o 時刻從高拉至低電平時就產生寫時間隙見圖 2253 2254 to 時刻開始 15us 以內應將所需寫的位送到總線上 DSl820 t 15-60us 間對總線採樣若低電平寫入的位是 0 見圖 2253 若高電平寫入的位是 1 見圖 2254 連續寫 2 位間的間隙應大於 1us
寫位子程序 ( 待寫位的內容在 C )
WRBIT:
PUSH B ; 保存 B
MOV B,#28 ; 設置時間常數
CLR P1.0 ; 寫開始
NOP ;1us
NOP ;1us
NOP ;1us
NOP ;1us
N0P ;1us
MOVPl.0,C ;C 內容到總線
WDLT: DJNZ B,WDLT; 等待 56Us
POP B
SETB Pl.0 ; 釋放總線
RET ; 返回
寫字節子程序 ( 待寫內容在 A ):
WRBYTB:
PUSH B : 保存 B
MOV B#8H ; 設置寫位個數
WLOP: RRC A ; 把寫的位放到 C
ACALL WRBIT ; 調寫 1 位子程序
DJNZ BWLOP ;8 位全寫完 ?
POP B
RET
(3) 讀時間隙
見圖 2255 主機總線 to 時刻從高拉至低電平時總線只須保持低電平 l 7ts 以後在 t1 時刻將總線拉高產生讀時間隙讀時間隙在 t1 時刻後 t 2 時刻前有效 t z to 15 s 也就是說 t z 時刻前主機必須完成讀位並在 t o 後的 60 s 120 fzs 內釋放總線
讀位子程序 ( 讀得的位到 C )
RDBIT:
PUSH B ; 保存 B
PUSH A ; 保存 A
MOV B,#23 ; 設置時間常數
CLR P1.0 ; 讀開始圖 2255 t0 時刻
NOP ;1us
NOP ;1us
NOP ;1us
NOP ;1us
SETB Pl.0 ; 釋放總線
MOV A,P1 ;P1 口讀到 A
MOV C,EOH ;P1.0 內容 C
NOP ;1us
NOP ;1us
NOP ;1us
NOP ;1us
RDDLT: DJNZ B,RDDLT ; 等待 46us
SETB P1.0
POP A
POP B
RET
讀字節子程序 ( 讀到內容放到 A )
RDBYTE:
PUSH B ; 保存 B
RLOP MOV B,#8H ; 設置讀位數
ACALL RDBIT ; 調讀 1 位子程序
RRC A ; 把讀到位在 C 中並依次送給 A
DJNZ B,RLOP ;8 位讀完 ?
POP B ; 恢復 B
RET
相關文章
相關標籤/搜索