?? test.asm
字號:
TEMP EQU 40H ;緩存1820讀出的數據
TEML EQU 44H ;1820讀出溫度的低8位原始數據
TEMH EQU 45H ;1820讀出溫度的高8位原始數據
TEMPSJ EQU 46H ;實際溫度地址
SETTH EQU 33H ;設定溫度報警高位
SETTL EQU 34H ;設定溫度報警低位
REST_N EQU 42H ;1820復位標志位
ORG 0000H
LJMP MAIN ;主程序首地址為0000H
ORG 0030H ;程序從0030H開始執行
MAIN:
MOV SETTH,#1CH ;設定溫度報警的高位是28攝氏度
MOV SETTL,#16H ;設定溫度報警的低位是22攝氏度
LCALL GET_TEMP ;調用讀溫度子程序
CLR C ;清狀態位
MOV A, TEMP ;將35H地址單元的溫度值放到A中
CJNE A,34H,LOOP1
SJMP SS
LOOP1: JC SS
MOV A,TEMP
CLR C
CJNE A,33H,LOOP2
SJMP FMQ
LOOP2: JNC FMQ
SJMP KEEP
SS: SETB P1.1
LCALL DELAY
CLR P1.1
LCALL DELAY
LJMP SS
DELAY: MOV R7,#250
D1: MOV R6,#250
D2: DJNZ R6,D2
DJNZ R7,D1
KEEP: SJMP MAIN
FMQ: SETB P1.2
LCALL DELAY
CLR P1.2
LCALL DELAY
LJMP FMQ
DELAY2: MOV R2,#250
D3: MOV R1,#250
D4: DJNZ R1,D4
DJNZ R2,D3
GET_TEMP: ;溫度讀取程序
LCALL INI ;調用初始化程序
JNB REST_N,INIBEG
SJMP GET_TEMP
INIBEG:
MOV A ,#0CCH ;發跳過ROM命令
LCALL WRITE ;寫命令字
MOV A,#44 ;發開始溫度轉換命令
LCALL WRITE ;寫命令字,啟動18B20進行轉換
NOP
TEL2: CLR P1.0
NOP
SETB P1.0
MOV R4,#6
TEL3: DJNZ R4,TEL3
MOV C,P1.0
MOV R5,#30
TEL4: DJNZ R5,TEL4 ;判斷轉換是否結束
JC TEL2
TEL5: LCALL INI ;再調用初始化程序
MOV A,#0CCH ;發跳過ROM命令
LCALL WRITE ;寫命令字
MOV A,#0BEH ;發讀存儲器命令
LCALL WRITE ;寫命令字
LCALL READ ;讀出18B20的溫度值低位
MOV TEML,A ;將18B20的溫度值低位放到 44H中
LCALL READ ;讀出18B20的溫度值高位
MOV TEMH,A ;將18B20的溫度值低位放到 45H中
TEL6: LCALL INI
JB REST_N,TEL6
;****************************************************************************
;通過移位合并兩個字節中的溫度值為一個字節的溫度值
;****************************************************************************
MOV A,TEMH
CLR C
RLC A
ljmp tt4 ;溫度是正值
tt4: RLC A
RLC A
RLC A
RLC A
MOV TEMH,A
MOV A,TEML
CLR C
RRC A
CLR C
RRC A
CLR C
RRC A
MOV TEML,A
MOV A,TEMH
ORL A,TEML
MOV TEMPSJ,A
RET
;DS18B20的初始化子程序
INI: CLR REST_N ;初始化子程序程序名
L0: CLR P1.0 ;使P1.0輸出低電平
MOV R2,#200 ;將立即數200放在寄存器R2中
L1: CLR P1.0 ;使P1.0輸出低電平
DJNZ R2,L1 ;主機發置位脈沖,持續時間在600微秒左右
SETB P1.0 ;主機釋放總線,P1.0口改為輸入口
MOV R2,#32 ;將立即數32放在寄存器R2中
L4: DJNZ R2,L4 ;DS18B20等待64微秒
CLR C ;將命令字清零
JB P1.0,L0 ;DS18B20數據線應變低,如果沒有變低,說明還沒有準備好,需重來,即再從L0開始重新執行
MOV R6,#80 ;將立即數80放在寄存器R6中
L5: JB P1.0,L3 ;DS18B20數據線變高,收到響應脈沖,初始化成功
DJNZ R6,L5 ;DS18B20數據線低電平狀態可持續240微秒
SJMP L0 ;初始化失敗,重來
L3: MOV R2,#240 ;將立即數240放在寄存器R2中
L2: DJNZ R2,L2 ;DS18B20應答過程最少480微秒
RET
;DS18B20的寫子程序
WRITE: MOV R3,#8 ;將立即數 8放在寄存器R3中
WR1: SETB P1.0 ;將P1.0口設成高位,即主機釋放總線,P1.0口改為輸入口
MOV R4,#8 ;將立即數 8放在寄存器R4中
RRC A ;寫入位從A中移到CY
CLR P1.0 ;將P1.0口設成低位
WR2: DJNZ R4,WR2 ;DS18B20在數據線變低16微秒后開始采樣數據
MOV P1.0,C ;將命令字按位依次送給DS18B20
MOV R4,#30 ;將立即數30放在寄存器R4中
WR3: DJNZ R4,WR3 ;保證整個寫過程持續60微秒
DJNZ R3,WR1 ;是否送完整個命令字
SETB P1.0 ;將P1.0口設成高位,即主機釋放總線,P1.0口改為輸入口
RET
;DS18B20的讀子程序
READ: MOV R6,#8 ;將立即數8放在寄存器R6中
RE1: CLR P1.0 ;將總線設成低位
MOV R4,#4 ;將立即數4放在寄存器R4中
NOP ;空指令,即低電平持續2微秒
SETB P1.0 ;將P1.0口設成高位,即主機釋放總線,P1.0口改為輸入口
RE2: DJNZ R4,RE2 ;等待大約8微秒
MOV C,P1.0 ;主機按位讀入DS18B20的數據
RRC A ;數據送入A
MOV R5,#30 ;將立即數30放在寄存器R5中
RE3: DJNZ R5,RE3 ;保證讀數據過程持續60微秒
DJNZ R6,RE1 ;讀完一個字節的數據,存入A中
MOV TEMP,A
SETB P1.0 ;將P1.0口設成高位,即主機釋放總線,P1.0口改為輸入口
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -