?? ex10-4.asm
字號:
TEMP_ZH EQU 24H ;實測溫度值存放單元
TEMPL EQU 25H
TEMPH EQU 26H
TEMP_TH EQU 27H ;高溫報警值存放單元
TEMP_TL EQU 28H ;低溫報警值存放單元
TEMPHC EQU 29H ;正、負溫度值標記
TEMPLC EQU 2AH
TEMPFC EQU 2BH
K1 EQU P1.4 ;查詢按鍵
K2 EQU P1.5 ;設置/調整鍵
K3 EQU P1.6 ;調整鍵
K4 EQU P1.7 ;確定鍵
BEEP EQU P3.7 ;蜂鳴器
RELAY EQU P1.3 ;指示燈
LCD_X EQU 2FH ;LCD 字符顯示位置
LCD_RS EQU P2.0 ;LCD 寄存器選擇信號
LCD_RW EQU P2.1 ;LCD 讀寫信號
LCD_EN EQU P2.2 ;LCD 允許信號
FLAG1 EQU 20H.0 ;DS18B20是否存在標志
KEY_UD EQU 20H.1 ;設定按鍵的增、減標志
DQ EQU P3.3 ;DS18B20數據信號
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV SP,#60H
MOV A,#00H
MOV R0,#20H ;將20H~2FH 單元清零
MOV R1,#10H
CLEAR: MOV @R0,A
INC R0
DJNZ R1,CLEAR
LCALL SET_LCD
LCALL RE_18B20
START: LCALL RST ;調用18B20復位子程序
JNB FLAG1,START1 ;DS1820不存在
LCALL MENU_OK ;DS1820存在,調用顯示正確信息子程序
MOV TEMP_TH,#055H ;設置TH初值85度
MOV TEMP_TL,#019H ;設置TL初值25度
LCALL RE_18B20A ;調用暫存器操作子程序
LCALL WRITE_E2 ;寫入DS18B20
LCALL TEMP_BJ ;顯示溫度標記
JMP START2
START1: LCALL MENU_ERROR ;調用顯示出錯信息子程序
LCALL TEMP_BJ ;顯示溫度標記
SJMP $
START2: LCALL RST ;調用DS18B20復位子程序
JNB FLAG1,START1 ;DS18B20不存在
MOV A,#0CCH ;跳過ROM匹配命令
LCALL WRITE
MOV A,#44H ;溫度轉換命令
LCALL WRITE
LCALL RST
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE
MOV A,#0BEH ;讀溫度命令
LCALL WRITE
LCALL READ ;調用DS18B20數據讀取操作子程序
LCALL CONVTEMP ;調用溫度數據BCD 碼處理子程序
LCALL DISPBCD ;調用溫度數據顯示子程序
LCALL CONV ;調用LCD顯示處理子程序
LCALL TEMP_COMP ;調用實測溫度值與設定溫度值比較子程序
LCALL PROC_KEY ;調用鍵掃描子程序
SJMP START2 ;循環
;*************************** 鍵掃描子程序 *****************************
PROC_KEY:JB K1,PROC_K1
LCALL BEEP_BL
JNB K1,$
MOV DPTR,#M_ALAX1
MOV A,#1
LCALL LCD_PRINT
LCALL LOOK_ALARM
JB K3,$
LCALL BEEP_BL
JMP PROC_K2
PROC_K1: JB K2,PROC_END
LCALL BEEP_BL
JNB K2,$
MOV DPTR,#RST_A1
MOV A,#1
LCALL LCD_PRINT
LCALL SET_ALARM
LCALL RE_18B20 ;將設定的TH,TL值寫入DS18B20
LCALL WRITE_E2
PROC_K2: LCALL MENU_OK
LCALL TEMP_BJ
PROC_END:RET
;*************************** 設定溫度報警值 TH、TL ***************************
SET_ALARM:LCALL LOOK_ALARM
AS0: JB K1,AS00
LCALL BEEP_BL
JNB K1,$
CPL 20H.1 ;UP/DOWN 標記
AS00: JB 20H.1,ASZ01 ;20H.1=1,增加
JMP ASJ01 ;20H.1=0,減小
ASZ01: JB K2,ASZ02 ;TH值調整(增加)
LCALL BEEP_BL
INC TEMP_TH
MOV A,TEMP_TH
CJNE A,#120,ASZ011
MOV TEMP_TH,#0
ASZ011: LCALL LOOK_ALARM
MOV R5,#10
LCALL DELAY
JMP ASZ01
ASZ02: JB K3,ASZ03 ;TL值調整(增加)
LCALL BEEP_BL
INC TEMP_TL
MOV A,TEMP_TL
CJNE A,#99,ASZ021
MOV TEMP_TL,#00H
ASZ021: LCALL LOOK_ALARM
MOV R5,#10
LCALL DELAY
JMP ASZ02
ASZ03: JB K4,AS0 ;確定調整
LCALL BEEP_BL
JNB K4,$
RET
ASJ01: JB K2,ASJ02 ;TH值調整(減少)
LCALL BEEP_BL
DEC TEMP_TH
MOV A,TEMP_TH
CJNE A,#0FFH,ASJ011
JMP ASJ022
ASJ011: LCALL LOOK_ALARM
MOV R5,#10
LCALL DELAY
JMP AS0
ASJ02: JB K3,ASJ03 ;TL值調整(減少)
LCALL BEEP_BL
DEC TEMP_TL
MOV A,TEMP_TL
CJNE A,#0FFH,ASJ021
JMP ASJ022
ASJ021: LCALL LOOK_ALARM ;
MOV R5,#10
LCALL DELAY
JMP AS0
ASJ022: CPL 20H.1
JMP ASZ01
ASJ03: JMP ASZ03
RET
RST_A1: DB " SET ALERT CODE " ,0
;*********************** 實測溫度值與設定溫度值比較子程序 **********************
TEMP_COMP:MOV A,TEMP_TH
SUBB A,TEMP_ZH ;減數>被減數,則
JC CHULI1 ;借位標志位C=1,轉
MOV A,TEMPFC
CJNE A,#0BH,COMP
SJMP CHULI2
COMP: MOV A,TEMP_ZH
SUBB A,TEMP_TL ;減數>被減數,則
JC CHULI2 ;借位標志位C=1,轉
MOV DPTR,#BJ5
LCALL TEMP_BJ3
CLR RELAY ;點亮指示燈
RET
CHULI1: MOV DPTR,#BJ3
LCALL TEMP_BJ3
SETB RELAY ;熄滅指示燈
LCALL BEEP_BL ;蜂鳴器響
RET
CHULI2: MOV DPTR,#BJ4
LCALL TEMP_BJ3
SETB RELAY ;熄滅指示燈
LCALL BEEP_BL ;蜂鳴器響
RET
;-----------------------------------------
TEMP_BJ3: MOV A,#0CEH
LCALL WCOM
MOV R1,#0
MOV R0,#2
BBJJ3: MOV A,R1
MOVC A,@A+DPTR
LCALL WDATA
INC R1
DJNZ R0,BBJJ3
RET
BJ3: DB ">H"
BJ4: DB "<L"
BJ5: DB " !"
;
;**************************** 顯示溫度標記子程序 ***************************
TEMP_BJ: MOV A,#0CBH
LCALL WCOM
MOV DPTR,#BJ1 ;指針指到顯示消息
MOV R1,#0
MOV R0,#2
BBJJ1: MOV A,R1
MOVC A,@A+DPTR
LCALL WDATA
INC R1
DJNZ R0,BBJJ1
RET
BJ1: DB 00H,"C"
;******************************** 顯示正確信息子程序 ***************************
MENU_OK: MOV DPTR,#M_OK1 ;指針指到顯示消息
MOV A,#1 ;顯示在第一行
LCALL LCD_PRINT
MOV DPTR,#M_OK2 ;指針指到顯示消息
MOV A,#2 ;顯示在第一行
LCALL LCD_PRINT
RET
M_OK1: DB " DS18B20 OK ",0
M_OK2: DB " TEMP: ",0
;******************************** 顯示出錯信息子程序 ***************************
MENU_ERROR:MOV DPTR,#M_ERROR1 ;指針指到顯示消息
MOV A,#1 ;顯示在第一行
LCALL LCD_PRINT
MOV DPTR,#M_ERROR2 ;指針指到顯示消息1
MOV A,#2 ;顯示在第一行
LCALL LCD_PRINT
RET
M_ERROR1: DB " DS18B20 ERROR ",0
M_ERROR2: DB " TEMP: ---- ",0
;****************************DS18B20復位子程序 *****************************
RST: SETB DQ
NOP
CLR DQ
MOV R0,#6BH ;主機發出延時復位低脈沖
MOV R1,#04H
TSR1: DJNZ R0,$
MOV R0,#6BH
DJNZ R1,TSR1
SETB DQ ;拉高數據線
NOP
NOP
NOP
MOV R0,#32H
TSR2: JNB DQ,TSR3 ;等待DS18B20回應
DJNZ R0,TSR2
JMP TSR4 ; 延時
TSR3: SETB FLAG1 ; 置1標志位,表示DS1820存在
JMP TSR5
TSR4: CLR FLAG1 ; 清0標志位,表示DS1820不存在
JMP TSR7
TSR5: MOV R0,#06BH
TSR6: DJNZ R0,$ ; 時序要求延時一段時間
TSR7: SETB DQ
RET
;************************ DS18B20暫存器操作子程序 ***************************
RE_18B20:JB FLAG1,RE_18B20A
RET
RE_18B20A:
LCALL RST
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE
WR_SCRAPD:
MOV A,#4EH ;寫暫器
LCALL WRITE
MOV A,TEMP_TH ;TH(報警上限)
LCALL WRITE
MOV A,TEMP_TL ;TL(報警下限)
LCALL WRITE
MOV A,#7FH ;12位精度
LCALL WRITE
RET
;************************ 復制暫存器子程序 *******************************
WRITE_E2:LCALL RST
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE
MOV A,#48H ;把暫存器里的溫度報警值拷貝到EEROM
LCALL WRITE
RET
;*********************** 重讀EEROM子程序 ********************************
READ_E2:LCALL RST
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE
MOV A,#0B8H ;把EEROM里的溫度報警值拷貝回暫存器
LCALL WRITE
RET
;************************ 將自定義字符寫入LCD的CGRAM中 *********************
STORE_DATA:
MOV A,#40H
LCALL WCOM
MOV R2,#08H
MOV DPTR,#D_DATA
MOV R3,#00H
S_DATA: MOV A,R3
MOVC A,@A+DPTR
LCALL WDATA ;寫入數據
INC R3
DJNZ R2,S_DATA
RET
D_DATA: DB 0CH,12H,12H,0CH,00H,00H,00H,00H
;*********************** DS18B20數據寫入操作子程序 ************************
WRITE: MOV R2,#8 ;一共8位數據
CLR C
WR1: CLR DQ ;開始寫入DS18B20總線要處于復位(低)狀態
MOV R3,#07
DJNZ R3,$ ;總線復位保持16微妙以上
RRC A ;把一個字節DATA 分成8個BIT環移給C
MOV DQ,C ;寫入一位
MOV R3,#3CH
DJNZ R3,$ ;等待100微妙
SETB DQ ;重新釋放總線
NOP
DJNZ R2,WR1 ;寫入下一位
SETB DQ
RET
;********************** DS18B20數據讀取操作子程序 **************************
READ: MOV R4,#4 ;將溫度低位、高位、TH、TL從DS18B20中讀出
MOV R1,#TEMPL ;存入25H、26H、27H、28H單元
RE00: MOV R2,#8
RE01: CLR CY
SETB DQ
NOP
NOP
CLR DQ ;讀前總線保持為低
NOP
NOP
NOP
SETB DQ ;開始讀總線釋放
MOV R3,#09 ;延時18微妙
DJNZ R3,$
MOV C,DQ ;從DS18B20總線讀得一位
MOV R3,#3CH
DJNZ R3,$ ;等待100微妙
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -