*
程序效果:通過DS18B20讀取溫度值,顯示對應的溫度值
程序重在理解時序,及延時時間
*/
DS18DQ EQU P1.3 //P1.3與DS18DQ等同,便于理解
SPEAKER EQU P2.0 //驅(qū)動蜂鳴器
TEMPH EQU 29H //保存讀出溫度的低8位
TEMPL EQU 28H //保存讀出溫度的高8位
DS18FLAG EQU 40H //設置標志
ORG 0000H
LJMP START
ORG 0030H
START: MOV 30H,#00 //設置初始值
MOV 31H,#00
MOV 32H,#00
START1: LCALL DS18_GF //設置DS18B20的工作方式
LCALL CONVERT_TEMPERATURE //輸出轉換溫度命令
LCALL DELAY750MS //延時750ms
LCALL GET_TEMPERATURE //獲?溫度數(shù)據(jù)
LCALL CAL_TEMPERATURE //計算溫度數(shù)值
LCALL DISPLAY //調(diào)用顯示,防止掉顯
LJMP START1 //無限循環(huán)
//初始化子程序
DS18_START:
PUSH 07H //保存R7的值,防止改變R7的數(shù)值
SETB DS18DQ //將數(shù)據(jù)線拉高
NOP //延時1us
CLR DS18DQ //將數(shù)據(jù)線拉低
MOV R7,#0 //延時大約512us
DJNZ R7,$
SETB DS18DQ //將數(shù)據(jù)線拉高
MOV R7,#40
DS18_START1: //延時大約160us
JNB DS18DQ,DS18_START2 //檢查DS18B20是否工作正常
DJNZ R7,DS18_START1
SETB DS18FLAG //工作不正常
CLR SPEAKER //驅(qū)動蜂鳴器,報警
DS18_START2:
CLR DS18FLAG
MOV R7,#100 //延時月200us
DJNZ R7,$
POP 07H //恢復R7的值
RET
//設置DS18B20工作方式
DS18_GF:CLR DS18FLAG //清除標志
LCALL DS18_START //調(diào)用初始化子程序
MOV A,#0CCH //跳躍ROM指令
LCALL DS18_SEND //
MOV A,#4EH //向RAM寫數(shù)據(jù)
LCALL DS18_SEND
MOV A,#75
LCALL DS18_SEND
MOV A,#0
LCALL DS18_SEND
MOV A,#7FH //設置工作方式
LCALL DS18_SEND
CLR DS18DQ //釋放總線
LCALL DELAY500US //延時500us
LOOP: LCALL CONVERT_TEMPERATURE //調(diào)用轉子程序
MOV R5,#80
LOOP1: LCALL DISPLAY //調(diào)用顯示防止掉顯,同時等待轉換完成
DJNZ R5,LOOP1
LCALL GET_TEMPERATURE //獲?轉換值
LCALL CAL_TEMPERATURE //計算溫度值
LJMP LOOP
RET
//輸出轉換溫度命令
CONVERT_TEMPERATURE:
LCALL DS18_START //調(diào)用初始化子程序
MOV A,#0CCH //跳躍ROM指令
LCALL DS18_SEND
MOV A,#44H //溫度轉換
LCALL DS18_SEND
RET
//讀?溫度數(shù)據(jù)
GET_TEMPERATURE:
LCALL DS18_START //調(diào)用初始化子程序
MOV A,#0CCH //跳躍ROM指令
LCALL DS18_SEND
MOV A,#0BEH //從RAM中的數(shù)據(jù)
LCALL DS18_SEND
LCALL DELAY60US
LCALL DS18_READ
MOV TEMPL,A //將獲得數(shù)據(jù)的低八位存到TEMPL
LCALL DS18_READ
MOV TEMPH,A //將獲得數(shù)據(jù)的高八位存到TEMPH
CLR DS18DQ //即復位。否則會一直讀到
LCALL DELAY501US //暫存第九字節(jié)
RET
//計算獲得溫度值,便于現(xiàn)實
CAL_TEMPERATURE:
PUSH 07H //暫存,防止改變R7的數(shù)據(jù)
CLR C //進位標志清零
MOV R7,#04H //循環(huán)次數(shù)
EX2: MOV A,TEMPH // 這些語句的作用是:
RRC A // 整數(shù)位在:TEMPL中
MOV TEMPH,A //?數(shù)位在:TEMPH中的高半
MOV A,TEMPL
RRC A
MOV TEMPL,A
DJNZ R7,EX2 //
MOV A,TEMPH //
RLC A //這些語句的作用是:
RLC A //把TEMPH得高半移到低四位中
RLC A
RLC A //
ANL A,#0FH //屏蔽高四位,保留低四位
MOV DPTR,#TAB_TEMP //賦帶?數(shù)點的數(shù)值表的表首地址
MOVC A,@A+DPTR
MOV 30H,A //暫存該值,用于顯示
MOV A,TEMPL
CLR C
MOV B,#0AH
DIV AB //分離整數(shù)位的高低四位
MOV 32H,A //暫存十位
MOV A,B
ADD A,#10H
MOV 31H,A //暫存?zhèn)位
POP 07H //恢復R7的值
RET
//寫數(shù)據(jù)子程序
DS18_SEND:
PUSH 06H //保護Rn的值
PUSH 07H
//以下語句是"寫 筆斃虻腦?
SETB DS18DQ //寫時序是有DS18DQ的下降沿決定
NOP //延時1us
MOV R6,#08H //循環(huán)次數(shù),一個字節(jié)
DS18_SEND1:
CLR DS18DQ //拉低,產(chǎn)生下降沿
MOV R7,#07 //延時大約15us
DJNZ R7,$
RRC A //把要寫入得數(shù)據(jù)的高位移到C中
MOV DS18DQ,C //再把C的值賦給DS18DQ
MOV R7,#30 //延時時間約為60us,只要大約45us即可
DJNZ R7,$
SETB DS18DQ //拉高準備,下次產(chǎn)生下降沿
DJNZ R6,DS18_SEND1 //判斷循環(huán)次數(shù)夠了沒
POP 07H //恢復Rn的數(shù)據(jù)
POP 06H
RET
篇幅太大完整程序請從這里下載:http://www.zg4o1577.cn/ziliao/file/ds182051hei.asm
本程序已經(jīng)測試成功。