?? 修改.asm
字號:
RS EQU P2.5
RW EQU P2.6
E EQU P2.7
lcd equ p1
TEMPER_L EQU 29H;用于保存讀出溫度的低8位
TEMPER_H EQU 28H;用于保存讀出溫度的高8位
FLAG1 EQU 38H;是否檢測到DS18B20標志位
a_bit equ 20h ;數(shù)碼管個位數(shù)存放內存位置
b_bit equ 21h ;數(shù)碼管十位數(shù)存放內存位置
ORG 0000H
START: SETB F0
LCALL GET_TEMPER ;調用讀溫度子程序
; MOV 28H,#00H
;MOV 29H,#80H
ANL 28H,#0FH ;將結果進行轉換
ANL 29H,#0F0H
MOV A,28H
ORL A,29H
SWAP A
MOV 29H,A ;轉換結果的八位數(shù)值放在29H中
MOV B,#10 ;將所讀出的 數(shù)值轉換位兩位十進制數(shù)值
DIV AB
ANL A,#0FH
ORL A,#30H
MOV B_BIT,A ;數(shù)碼管十位數(shù)存放內存位置
MOV A,B
ANL A,#0FH
ORL A,#30H
MOV A_BIT,A ;數(shù)碼管個位數(shù)存放內存位置
MOV LCD,#01H ;LCD初始化
ACALL ENABLE
MOV LCD,#38H
ACALL ENABLE
MOV LCD,#0FH
ACALL ENABLE
MOV LCD,#06H
ACALL ENABLE
MOV LCD,#80H ;1602顯示 第一行顯示
ACALL ENABLE
MOV A,#31H ;顯示1
ACALL WRITE
ACALL BUSY
MOV LCD,#81H
ACALL ENABLE
MOV A,#3AH ;顯示 :
ACALL WRITE
ACALL BUSY
MOV LCD,#82H
ACALL ENABLE
MOV A,B_BIT ;顯示高位
ACALL WRITE
ACALL BUSY
MOV LCD,#83H
ACALL ENABLE
MOV A,A_BIT ;顯示低位
ACALL WRITE
ACALL BUSY
MOV LCD,#84H
ACALL ENABLE
MOV A,#0DFH ;顯示℃
ACALL WRITE
ACALL BUSY
MOV LCD,#85H
ACALL ENABLE
MOV A,#43H
ACALL WRITE
ACALL BUSY
;這里還卻一個判斷!通過判斷來改變F0值------判斷我沒寫,想讓你練練以熟悉程序!
;下面這里我給你加入一個標志位F0,來決定是不是因為超過溫度顯示 >!!℃
;你在程序的某個地方做一個判斷小程序,來比較當前溫度值與設定值的大小
;方法:如果現(xiàn)在溫度超過所定溫度就將F0清零
;因為我在開始已經把測量得到的數(shù)值放在29H中,你可以將設定溫度與29H比較
;這個溫度的數(shù)值你自己定!提示:30℃ --#1EH 5℃--#05H
;當29H=#1EH時候 LCD顯示30°C
JB F0,BAN_START ;判斷是否超過溫度 標志位F0
MOV LCD,#89H ;如果超過就會顯示你要求的 那部分東西
ACALL ENABLE
MOV A,#29H
ACALL WRITE
ACALL BUSY
MOV LCD,#8AH
ACALL ENABLE
MOV A,#33H
ACALL WRITE
ACALL BUSY
MOV LCD,#8BH
ACALL ENABLE
MOV A,#30H
ACALL WRITE
ACALL BUSY
MOV LCD,#8CH
ACALL ENABLE
MOV A,#0DFH ;顯示℃
ACALL WRITE
ACALL BUSY
MOV LCD,#8DH
ACALL ENABLE
MOV A,#43H
ACALL WRITE
ACALL BUSY
BAN_START: AJMP START
; 讀出轉換后的溫度值
GET_TEMPER:
SETB P3.0
LCALL INIT_1820;先復位DS18B20
JB FLAG1,TSS2
CLR P3.7
RET ; 判斷DS1820是否存在?若DS18B20不存在則返回
TSS2: setb p3.7;DS18B20已經被檢測到!!!!!!!!!!!!!!!!!!指示燈亮
MOV A,#0CCH ; 跳過ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 發(fā)出溫度轉換命令
LCALL WRITE_1820
;這里通過調用顯示子程序實現(xiàn)延時一段時間,等待AD轉換結束,12位的話750微秒
; LCALL DISPLAY
MOV R7,#250
DE1: NOP
NOP
DJNZ R7,DE1
LCALL INIT_1820;準備讀溫度前先復位
MOV A,#0CCH ; 跳過ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 發(fā)出讀溫度命令
LCALL WRITE_1820
LCALL READ_18200; 將讀出的溫度數(shù)據(jù)保存到35H/36H
CLR P3.7 ;指示燈滅
RET
;===================================================
; 這是DS18B20復位初始化子程序
INIT_1820:
SETB P3.0
NOP
CLR P3.0
;主機發(fā)出延時537微秒的復位低脈沖
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB P3.0;然后拉高數(shù)據(jù)線
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB P3.0,TSR3;等待DS18B20回應
DJNZ R0,TSR2
LJMP TSR4 ; 延時
TSR3: SETB FLAG1 ; 置標志位,表示DS1820存在
setb P3.7;檢查到DS18B20就點亮P1.7LED
LJMP TSR5
TSR4: CLR FLAG1 ; 清標志位,表示DS1820不存在
CLR P3.7
LJMP TSR7
TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ; 時序要求延時一段時間
TSR7: SETB P3.0
RET
;寫DS18B20的子程序(有具體的時序要求)
WRITE_1820:
MOV R2,#8;一共8位數(shù)據(jù)
CLR C
WR1: CLR P3.0
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3.0,C
MOV R3,#23
DJNZ R3,$
SETB P3.0
NOP
DJNZ R2,WR1
SETB P3.0
RET
;=======================================================
; 讀DS18B20的程序,從DS18B20中讀出兩個字節(jié)的溫度數(shù)據(jù)
READ_18200:
MOV R4,#2 ; 將溫度高位和低位從DS18B20中讀出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00: MOV R2,#8;數(shù)據(jù)一共有8位
RE01: CLR C
SETB P3.0
NOP
NOP
CLR P3.0
NOP
NOP
NOP
SETB P3.0
MOV R3,#9
RE10: DJNZ R3,RE10
MOV C,P3.0
MOV R3,#23
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;這下面就是1602的子程序,你復制就可以!
WRITE: ACALL BUSY ;寫程序
CLR E
SETB RS
CLR RW
SETB E
MOV LCD,A
CLR E
RET
ENABLE: CLR RS
CLR RW
CLR E
ACALL BUSY
SETB E
RET
BUSY: MOV LCD,#0FFH ;讀忙程序
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P1.7,BUSY
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -