?? jerry.asm
字號:
;====================================================
;晶振為4M,一個指令周期為3μs
;====================================================
ORG 0000H
JMP START
;============================================
;定義管腳
;============================================
COMM DATA 30H
TEMPER_L EQU 27H;用于保存讀出溫度的低8位
TEMPER_H EQU 26H;用于保存讀出溫度的高8位
TEMPER_NUM EQU 28H
FIRST EQU 29H ;百位數的BCD碼
SECOND EQU 2AH ;十位數的BCD碼
THIRD EQU 2BH ;個位數的BCD碼
FLAG1 EQU 38H;是否檢測到DS18B20標志位
IN EQU P1.3
POWER EQU P1.2
;===========================================
;主程序開始
;===========================================
START:
CLR P1.0
CLR P1.1 ;P1.0和P1.1在不使用上拉電阻的情況下要設置為0,或者使用上拉電阻的情況下置1
WAIT:
LCALL INIT_1820
CALL RE_CONFIG ;調用18B20配置子程序
LCALL GET_TEMPER;調用讀溫度子程序
MOV A,#0F0H
ANL A,TEMPER_L; 舍去溫度低位中小數點后的四位溫度數值
SWAP A
MOV TEMPER_NUM,A
MOV A,#0FH
ANL A,TEMPER_H
SWAP A
ORL A,TEMPER_NUM
MOV TEMPER_NUM,A
MOV A,TEMPER_NUM
MOV R0,#30H
LCALL TEMP_COV
;==================================================================================
DISP:
MOV R0,#2BH
MOV R3,#3
MOV DPTR,#DUANMA
LLP:
MOV A , @R0
MOVC A,@A+DPTR
MOV R2 , #8
CLR C
LP0: RLC A
NOP
MOV P1.4 , C
NOP
NOP
CPL P1.6
NOP
NOP
CPL P1.6
NOP
NOP
DJNZ R2 , LP0
DEC R0
DJNZ R3,LLP
RET
;==================================================================================
SJMP WAIT
;=============================================
;主程序結束
;=============================================
;=============================================
;輸入格式為TEMPER_NUM ,輸入為FIRST,SECOND
;如TEMPER_NUM=55H,輸入FIRST=00H,SECOND=85H
;===========================================
TEMP_COV:
MOV A, TEMPER_NUM
MOV B,#64H
DIV AB
MOV FIRST,A
MOV A,B
MOV B,#0AH
DIV AB
MOV SECOND,A
MOV A,B
MOV THIRD,A
;SWAP A
;ORL A,B
;MOV SECOND, A
RET
;==========================================================================================
;主機控制DS18B20完成溫度轉換必須經過三個步驟:初始化、ROM操作指令、存儲器操作指令。
;必須先啟動DS18B20開始轉換,再讀出溫度轉換值。
;外接供電電源,可寫出完成一次轉換并讀取溫度值子程序GETWD。
;===========================================================================================
GET_TEMPER:
SETB IN
LCALL INIT_1820;先復位DS18B20
JB FLAG1,TSS2
CLR P1.6 ;復位成功18B20存在
RET ; 判斷DS1820是否存在?若DS18B20不存在則返回
TSS2:
CLR P1.5;DS18B20已經被檢測到!
MOV A,#0CCH ; 跳過ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 發出溫度轉換命令
LCALL WRITE_1820
;這里通過調用顯示子程序實現延時一段時間,等待AD轉換結束,12位的話750MS
MOV R2,#70
CON:
MOV R7,#250
call delay
DJNZ R2,CON
LCALL INIT_1820;準備讀溫度前先復位
MOV A,#0CCH ; 跳過ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 發出讀溫度命令
LCALL WRITE_1820
LCALL READ_18200; 將讀出的溫度數據保存到29H/28H
CLR P1.3;溫度成功讀出
RET
;=====================================================
;配置18B20溫度傳感器設置
;=====================================================
RE_CONFIG:
JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,轉RE_CONFIG1
RET
RE_CONFIG1:
MOV A,#0CCH ; 發SKIP ROM命令
LCALL WRITE_1820
MOV A,#4EH ; 發寫暫存存儲器命令
LCALL WRITE_1820
MOV A,#00H ; TH(報警上限)中寫入00H
LCALL WRITE_1820
MOV A,#00H ; TL(報警下限)中寫入00H
LCALL WRITE_1820
MOV A,#1FH ; 選擇9位溫度分辨率
LCALL WRITE_1820
RET
;===================================================
;延時子程序,R7傳遞延時參數,延時為R7*45us
;===================================================
delay: mov r6,#06h
d1: djnz r6,d1 ;延時=r7*45us(15個機器周期) ;;;;
djnz r7,delay
ret
;==================================================
; 這是DS18B20復位初始化子程序
;==================================================
INIT_1820:
SETB IN
NOP
CLR IN
;主機發出延時537微秒的復位低脈沖
MOV R7,#12
CALL delay
SETB IN;然后拉高數據線
NOP
MOV R0,#24
TSR2:
JNB IN,TSR3;等待DS18B20回應
DJNZ R0,TSR2
LJMP TSR4 ; 延時
TSR3:
SETB FLAG1 ; 置標志位,表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ; 清標志位,表示DS1820不存在
CLR P1.1
LJMP TSR7
TSR5:
MOV R0,#73
TSR6:
DJNZ R0,TSR6 ; 時序要求延時一段時間
TSR7:
SETB IN
RET
;====================================================
;寫命令或數據程序
;寫DS18B20的子程序(有具體的時序要求)
;====================================================
WRITE_1820:
MOV R2,#8;一共8位數據
CLR C
WR1:
CLR IN
RRC A
MOV IN,C
MOV R3,#8
NOP
DJNZ R3,$
SETB IN
NOP
DJNZ R2,WR1
SETB IN
RET
;======================================================
;讀數據子程序——————————————————————————
; 讀DS18B20的程序,從DS18B20中讀出兩個字節的溫度數據
;=======================================================
READ_18200:
MOV R4,#2 ; 將溫度高位和低位從DS18B20中讀出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV R2,#8;數據一共有8位
RE01:
CLR C
SETB IN
NOP
CLR IN
NOP
SETB IN
NOP
MOV C,IN
NOP
MOV R3,#10
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
DUANMA: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;LED段碼
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -