標(biāo)題:
基于51單片機(jī)的DS18b20數(shù)字溫度計(jì)(匯編)(原程序+protues仿真)
[打印本頁(yè)]
作者:
韓國(guó)電風(fēng)扇
時(shí)間:
2019-6-10 11:20
標(biāo)題:
基于51單片機(jī)的DS18b20數(shù)字溫度計(jì)(匯編)(原程序+protues仿真)
程序編寫(xiě)使用的是匯編語(yǔ)言,還有一些小問(wèn)題,就是調(diào)溫之后顯示的溫度值不改變,需要按幾下復(fù)位鍵之后顯示才會(huì)改變。
單片機(jī)源程序如下:
TEMPER_L EQU 36H ;存放讀出溫度低位數(shù)據(jù)
TEMPER_H EQU 35H ;存放讀出溫度高位數(shù)據(jù)
TEMPER_NUM EQU 60H ;存放轉(zhuǎn)換后的溫度值
FLAG1 BIT 00H
DQ BIT P3.2 ;一線(xiàn)總線(xiàn)控制端口
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV SP,#70H
LCALL GET_TEMPER ;從DS18B20讀出溫度數(shù)據(jù)
LCALL TEMPER_COV ;轉(zhuǎn)換讀出的溫度數(shù)據(jù)并保存
LCALL SHUJU
LCALL HEX2BCD
LCALL LOOP
LCALL DISPLAY
LCALL TAB
SJMP [ DISCUZ_CODE_3 ]nbsp; ;完成一次數(shù)字溫度采集
;-------讀出轉(zhuǎn)換后的溫度值
GET_TEMPER:
SETB DQ ; 定時(shí)入口
BCD: LCALL INIT_1820
JB FLAG1,S22
LJMP BCD ; 若DS18B20不存在則返回
S22: LCALL DELAY1
MOV A,#0CCH ; 跳過(guò)ROM匹配------0CC
LCALL WRITE_1820
MOV A,#44H ; 發(fā)出溫度轉(zhuǎn)換命令
LCALL WRITE_1820
NOP
LCALL DELAY
LCALL DELAY
CBA: LCALL INIT_1820
JB FLAG1,ABC
LJMP CBA
ABC: LCALL DELAY1
MOV A,#0CCH ; 跳過(guò)ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 發(fā)出讀溫度命令
LCALL WRITE_1820
LCALL READ_18200 ;READ_1820
RET
;-------讀DS18B20的程序,從DS18B20中讀出一個(gè)字節(jié)的數(shù)據(jù)
READ_1820:
MOV R2,#8
RE1: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE1
RET
;-------寫(xiě)DS18B20的程序
WRITE_1820:
MOV R2,#8
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
;-------讀DS18B20的程序,從DS18B20中讀出兩個(gè)字節(jié)的溫度數(shù)據(jù)
READ_18200:
MOV R4,#2 ; 將溫度高位和低位從DS18B20中讀出
MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00: MOV R2,#8
RE01: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;-------將從DS18B20中讀出的溫度數(shù)據(jù)進(jìn)行轉(zhuǎn)換
TEMPER_COV:
MOV A,#0F0H
ANL A,TEMPER_L ; 舍去溫度低位中小數(shù)點(diǎn)后的四位溫度數(shù)值
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_L
JNB ACC.3,TEMPER_COV1 ; 四舍五入去溫度值
INC TEMPER_NUM
TEMPER_COV1:
MOV A,TEMPER_H
ANL A,#07H
SWAP A
ADD A,TEMPER_NUM
MOV TEMPER_NUM,A ; 保存變換后的溫度數(shù)據(jù)
RET
;-------DS18B20初始化程序
INIT_1820:
CLR DQ
MOV R0,#0FBH
TSR1: DJNZ R0,TSR1 ; 延時(shí)
SETB DQ
MOV R0,#25H ;96US-25H
TSR2: DJNZ R0,TSR2
TSR3: SETB FLAG1 ; 置標(biāo)志位,表示DS1820存在
TSR6: DJNZ R0,TSR6 ; 延時(shí)
TSR7: SETB DQ
RET
;-------重新寫(xiě)DS18B20暫存存儲(chǔ)器設(shè)定值
RE_CONFIG:
JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,轉(zhuǎn)RE_CONFIG1
RET
RE_CONFIG1:
MOV A,#0CCH ; 發(fā)SKIP ROM命令
LCALL WRITE_1820
MOV A,#4EH ; 發(fā)寫(xiě)暫存存儲(chǔ)器命令
LCALL WRITE_1820
MOV A,#00H ; TH(報(bào)警上限)中寫(xiě)入00H
LCALL WRITE_1820
MOV A,#00H ; TL(報(bào)警下限)中寫(xiě)入00H
LCALL WRITE_1820
MOV A,#7FH ; 選擇12位溫度分辨率
LCALL WRITE_1820
RET
;------------------延時(shí)子程序
DELAY:
MOV R7,#00H
MIN: DJNZ R7,YS500
RET
YS500: LCALL YS500US
LJMP MIN
YS500US:MOV R6,#00H
DJNZ R6,$
RET
DELAY1: MOV R7,#20H
DJNZ R7,$
RET
SHUJU:
MOV R0, #0H
MOV R1, TEMPER_NUM
CALL HEX2BCD ;調(diào)用子程序把R0 R1中的數(shù)字,轉(zhuǎn)換成BCD碼,送到R2 R3 R4;-------下面,把萬(wàn)千百十個(gè)位,分別存入R4 R3 R2 R1 R0
MOV A, R4
MOV B, #16
DIV AB ;除以16,目的是分離出高、低四位
MOV 42H, A ;存放十位
MOV 43H, B ;存放個(gè)位;
MOV A, R2
MOV R4, A ;存放萬(wàn)位;
MOV A, R3
MOV B, #16
DIV AB
MOV 40H, A
MOV 41H, B
SJMP DISPLAY
HEX2BCD: CLR A ;把R0 R1中的數(shù)字,轉(zhuǎn)換成BCD碼,送到R2 R3 R4
MOV R2, A ;先清零
MOV R3, A
MOV R4, A
MOV R5, #16 ;共轉(zhuǎn)換十六位數(shù)
LOOP: CLR C
MOV A,R1 ;從待轉(zhuǎn)換數(shù)的高端移出一位到Cy
RLC A
MOV R1,A
MOV A, R0 ;搜索
RLC A
MOV R0,A
MOV A,R4 ;送到BCD碼的低端
ADDC A,R4 ;帶進(jìn)位加。自身相加,相當(dāng)于左移一位
DA A ;十進(jìn)制調(diào)整,變成BCD碼
MOV R4,A
MOV A,R3
ADDC A,R3
DA A
MOV R3,A
MOV A,R2
ADDC A,R2
MOV R2, A
DJNZ R5, LOOP ;共轉(zhuǎn)換十六位數(shù)
RET
DISPLAY:MOV R1,#40H
INC R1
INC R1
MOV R5,#0F1H
MOV A,R5
MOV P0,#0FFH
MOV P2,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INC R1
MOV R5,#0F2H
MOV A,R5
MOV P0,#0FFH
MOV P2,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV R2,#80H
ADD A,R2
MOV P0,A
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
AJMP DISPLAY
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
END
復(fù)制代碼
所有資料51hei提供下載:
由于有會(huì)員測(cè)試打不開(kāi),已經(jīng)被管理刪除
作者:
筱豆先生
時(shí)間:
2019-11-15 13:58
給的仿真文件打開(kāi)之后是損壞的,資料無(wú)用
作者:
133456789
時(shí)間:
2021-3-23 16:14
可惜沒(méi)有仿真圖
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1