1、實驗目的:
1)
以AT89S52X單片機爲核心器件,組成一個數字式溫度計。
2)
瞭解DS18B20的工做原理及使用方法。
3)
掌握DS18B20讀寫時序的編程方法。
4)
鍛鍊單片機綜合應用和開發的能力
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 ;字型R2送A
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 ;字型R2送A
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