標(biāo)題:
數(shù)字式溫度計(jì)實(shí)驗(yàn)(18B20、ZLG7290)源程序
[打印本頁]
作者:
安安嗷嗷
時(shí)間:
2018-3-18 16:54
標(biāo)題:
數(shù)字式溫度計(jì)實(shí)驗(yàn)(18B20、ZLG7290)源程序
數(shù)字式溫度計(jì)實(shí)驗(yàn)
(18B20
、
ZLG7290)
; **************主程序(MAIN.ASM)***********************
; 向DS18B20發(fā)出溫度轉(zhuǎn)換信號,延時(shí)等待,讀出溫度;將溫度值由十六進(jìn)制轉(zhuǎn)換成十進(jìn)制數(shù),使用8155控制LED顯示溫度
TEMPER_L EQU 29H ;用于保存讀出溫度的低8位
TEMPER_H EQU 28H ;用于保存讀出溫度的高8位
TIAO_H EQU 27H ;用于保存設(shè)定溫度的數(shù)據(jù)
;FLAG1 EQU 38H ;是否檢測到DS18B20標(biāo)志位
buffer EQU 35H ;溫度臨時(shí)存放區(qū)
;a_bit EQU 20H ;數(shù)碼管個(gè)位數(shù)存放內(nèi)存位置
;b_bit EQU 21H ;數(shù)碼管十位數(shù)存放內(nèi)存位置
SL EQU 22H ;設(shè)定溫度時(shí)數(shù)碼管個(gè)位數(shù)存放內(nèi)存位置
SH EQU 23H ;設(shè)定溫度時(shí)數(shù)碼管十位數(shù)存放內(nèi)存位置
sdwd EQU 24H ;設(shè)定溫度壓縮BCD碼位
DQ BIT P3.0 ;數(shù)據(jù)輸入/輸出端
ORG 0000H
AJMP MAIN0
ORG 0100H
MAIN0: MOV SP,#70H
MOV A,#89H ; ;8155方式控制字0DH(A、C口輸出,B口輸入)送累加器A
MOV DPTR,#0F003H
MOVX @DPTR,A
MOV sdwd, #25H ;設(shè)定初始溫度37度,上電后內(nèi)部設(shè)定溫度
MAIN1: LCALL BH_DISBCD
LCALL KEY
JNB 00H,MAIN1
CLR 00H
MAIN2: LCALL START_Temperature ;向DS18B20發(fā)送讀溫度指令
LCALL DelayTime
LCALL RD_Temperature ;讀出溫度值,并轉(zhuǎn)換為BCD碼
MOV TEMPER_L,B ;溫度個(gè)位,小數(shù)位數(shù)據(jù)
MOV TEMPER_H,A ;溫度十位數(shù)據(jù)
;LCALL DIS_BCD ;提取溫度數(shù)據(jù),轉(zhuǎn)換為非壓縮型BCD碼,并顯示
LCALL BH_DISBCD
LCALL KEY
LCALL TContral
AJMP MAIN2
;**********************************************************
; 判斷DS18B20是否存在,啟動(dòng)DS18B20 ;CY為判斷標(biāo)志
START_Temperature: SETB DQ
ACALL INIT_18B20 ;先復(fù)位DS18B20
JC GET_T0
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE_18B20
MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令
LCALL WRITE_18B20
CLR C
GET_T0: RET
;***********************************************************
; 讀出轉(zhuǎn)換后的溫度值,保存于:A-高8位數(shù)據(jù),B-低8位數(shù)據(jù)
RD_Temperature:LCALL INIT_18B20 ;準(zhǔn)備讀溫度前先復(fù)位
JC GET_T1
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE_18B20
MOV A,#0BEH ;發(fā)出讀溫度命令
LCALL WRITE_18B20
LCALL READ_18B20 ;讀出溫度
MOV B,A ;存放到A,B中
LCALL READ_18B20
GET_T1: RET
;***********************************************************
; DS18B20溫度轉(zhuǎn)換/顯示
DIS_BCD: MOV R0,#buffer+3 ;設(shè)置顯示內(nèi)容存放區(qū)首地址
MOV @R0,#10H ;正數(shù)
MOV A,TEMPER_H
JNB ACC.3,DIS_BCD1 ;判斷溫度是否為負(fù)
MOV @R0,#11H ;負(fù)數(shù)
CPL A
XCH A,TEMPER_L
CPL A
ADD A,#1
XCH A,TEMPER_L
ADDC A,#0
DIS_BCD1: ANL A,#0FH ;將溫度整數(shù)位轉(zhuǎn)換為ASCII
MOV B,A
MOV A,TEMPER_L
ANL A,#0F0H
ORL A,B ;將溫度的個(gè)位與十位BCD合在一起
SWAP A
MOV B,#10
DIV AB
JNZ DIS_BCD2 ;判斷溫度的十位是否為0進(jìn)行相應(yīng)處理
MOV A,#10H ;十位為0
XCH A,@R0
DEC R0
MOV @R0,A
SJMP DIS_BCD3
DIS_BCD2: DEC R0
MOV @R0,A
DIS_BCD3: DEC R0
MOV A,B
;ORL A,#80H ;小數(shù)點(diǎn)
MOV @R0,A
DEC R0
MOV A,TEMPER_L ;轉(zhuǎn)換小數(shù)部分
ANL A,#0FH
MOV B,A
CLR A
JNB B.0, DIS_BCD4
MOV A,#6
DIS_BCD4: JNB B.1, DIS_BCD5
ADD A,#12H
DA A
DIS_BCD5: JNB B.2, DIS_BCD6
ADD A,#25H
DA A
DIS_BCD6: JNB B.3, DIS_BCD7
ADD A,#50H
DA A
DIS_BCD7: SWAP A
ANL A,#0FH
MOV @R0,A
MOV R0,#buffer+4 ;顯示數(shù)據(jù)首地址
MOV @R0,#10H
INC R0
MOV @R0,#10H
INC R0
MOV @R0,#10H
INC R0
MOV @R0,#10H
MOV R0,#buffer
LCALL Display
RET
;***********************************************************
;DS18B20溫度轉(zhuǎn)換/顯示
BH_DISBCD: MOV A,TEMPER_L ;
MOV C,40H ;將28H中的最低位移入C(28H.0-C)
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV TEMPER_L,A ;新字節(jié)29H是實(shí)際測量的溫度
LCALL BCDBHDA
LCALL Display
RET
;***********************************************************
TContral: CLR C ;比較轉(zhuǎn)換值與設(shè)定值
MOV 26H,sdwd ;把溫度設(shè)定保存到26H單元后減2度,作為低度的數(shù)據(jù)
DEC 26H
MOV A,TEMPER_L
CJNE A,26H,LOOP1 ;下限設(shè)定溫度,不相等跳LOOP1
LJMP HOTTING ;與下限值相等跳HOTTING,加熱
LOOP1: JC HOTTING ;溫度小于下限值跳HOTTING,加熱
MOV A,TEMPER_L ;溫度大于下限值,與上限值比較
CLR C
MOV 27H,sdwd
INC 27H
CJNE A,27H,LOOP2 ;上限設(shè)定溫度,不相等跳LOOP2
SJMP STOPHOT ;相等跳STOPHOT,停止加熱
LOOP2: JNC STOPHOT ;溫度大于上限值跳STOPHOT,停止加熱
SJMP KEEP ;溫度小于上限且大于下限值跳KEEP,保溫
HOTTING: CLR P1.0 ;小,加熱器驅(qū)動(dòng)
SETB P1.1 ;關(guān)閉保溫?zé)?br />
KEEP: SJMP BACK ;返回,保持原態(tài),保溫
STOPHOT: SETB P1.0 ;關(guān)閉加熱器
CLR P1.1 ;點(diǎn)亮保溫?zé)?nbsp;
BACK: RET
;***********************************************************
;鍵盤響應(yīng)子程序
KEY: MOV DPTR,#0F002H
MOVX A,@DPTR ;讀列線狀態(tài)
ORL A,#0F0H
CJNE A,#0FFH,NEXT1
SS: RET
NEXT1: LCALL D10ms
MOV DPTR,#0F002H ;指向8255C口
MOVX A,@DPTR
ORL A,#0F0H
CJNE A,#0FFH,NEXT2
LJMP SS
NEXT2: MOV R3,#4
MOV DPTR,#0F002H
MOV R4,#00H
MOVX A,@DPTR
NEXT3: RRC A
JNC NEXT4
INC R4
DJNZ R3,NEXT3
LJMP SS
NEXT4: MOVX A,@DPTR ;等待鍵釋放
ORL A,#0F0H
CJNE A,#0FFH,NEXT4
MOV DPTR,#TAB ;指向按鍵轉(zhuǎn)移指令表首地址
MOV A,R4
RL A
JMP @A+DPTR
TAB: AJMP KEY0
AJMP KEY1
AJMP KEY2
AJMP KEY3
;AJMP KEY4
;AJMP KEY5
;AJMP KEY6
;AJMP KEY7
;*********************************
;按下KEY0后轉(zhuǎn)加1程序
KEY0: MOV R5,#30H
LCALL Displa
MOV A,sdwd ;把設(shè)定溫度送累加器判斷
CJNE A,62H,JIA0 ;比較設(shè)定溫度是否到99度,不是則加
MOV sdwd,#00H
LJMP JIA1
JIA0: INC sdwd
JIA1: LCALL Displa
DJNZ R5,JIA1
LJMP SS
;*************************
KEY1: MOV R5,#30H
LCALL Displa
MOV A,sdwd ;把設(shè)定溫度送累加器判斷
CJNE A,01H,JIAN0 ;比較設(shè)定溫度是否到0度,不是則減
MOV sdwd,#62H
LJMP JIAN1
JIAN0:DEC sdwd
JIAN1:LCALL Displa
DJNZ R5,JIAN1
LJMP SS
;*************************
KEY2: SETB 00H
LJMP SS
;*************************
KEY3: LJMP SS
;***********************************************************
;DS18B20復(fù)位初始化子程序
INIT_18B20: SETB DQ
NOP
CLR DQ ;主機(jī)發(fā)出501us的復(fù)位低脈沖
MOV R7,#250
DJNZ R7,$
SETB DQ ;拉高數(shù)據(jù)線
MOV R7,#30
TSR: JNB DQ,TSR1 ;等待DS18B20回應(yīng)
DJNZ R7,TSR
SETB C ;置位標(biāo)志位,表示DS18B20不存在
RET
TSR1: CLR C ;復(fù)位標(biāo)志位,表示DS18B20存在
MOV R7,#250
DJNZ R7,[ DISCUZ_CODE_2 ]nbsp; ;時(shí)序要求延時(shí)一段時(shí)間
RET
;***************************************************************
;DS18B20寫操作
WRITE_18B20: MOV R7,#8 ;一共8位數(shù)據(jù)
CLR C
WRI: NOP
CLR DQ
MOV R6,#3
DJNZ R6,[ DISCUZ_CODE_2 ]nbsp;
RRC A
MOV DQ,C
MOV R6,#26
DJNZ R6,[ DISCUZ_CODE_2 ]nbsp;
SETB DQ
DJNZ R7,WRI
SETB DQ
RET
;****************************************************************
;DS18B20讀操作
READ_18B20: MOV R7,#8 ;數(shù)據(jù)一共有8位
READ1: CLR DQ
NOP
NOP
SETB DQ
NOP
MOV R6,#3
DJNZ R6,[ DISCUZ_CODE_2 ]nbsp;
MOV C,DQ
MOV R6,#26
DJNZ R6,[ DISCUZ_CODE_2 ]nbsp;
RRC A
DJNZ R7,READ1
RET
;******************************************************************
BCDBHDA: MOV R0,#buffer
MOV A,TEMPER_L ;將29H中的十六進(jìn)制數(shù)轉(zhuǎn)換成10進(jìn)制
MOV B,#10 ;10進(jìn)制/10=10進(jìn)制
DIV AB
MOV @R0,B ;個(gè)位在buffer(35H)
INC R0
MOV @R0,A ;十位在buffer+1(36H)
;*************************
INC R0
MOV A,sdwd
MOV B,#10 ;10進(jìn)制/10=10進(jìn)制
DIV AB
MOV @R0,B ;個(gè)位在buffer+2(37H)
INC R0
MOV @R0,A ;十位在buffer+3(38H)
RET
;******************************************************************
Display: MOV R0,#buffer
MOV R7,#04H ;----1顯示子程序開始
MOV R1,#60H ;60H 61H(62H 63H)存放測量(設(shè)定)溫度個(gè)位、十位段碼
DISP0: MOV A,@R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV @R1,A
INC R0
INC R1
DJNZ R7,DISP0
;*****************************
MOV R7,#04H
MOV R0,#60H
MOV R3,#0FEH
DISP1: MOV DPTR,#0F001H ;指定字位碼入口地址:8155的C口
MOV A,R3
MOVX @DPTR,A
RL A
MOV R3,A
MOV DPTR,#0F000H ;指定字型碼入口地址:8155的A口
MOV A,@R0
MOVX @DPTR,A
INC R0
LCALL DELAY
DJNZ R7,DISP1
RET ;----1顯示子程序結(jié)束
;******************************************************************
;;閃爍設(shè)定顯示
Displa: MOV A,sdwd
MOV B,#10 ;10進(jìn)制/10=10進(jìn)制
DIV AB
MOV SL,B ;十位在b
MOV SH,A ;個(gè)位在a
MOV R1,#250 ;顯示250次
dpl2: MOV A,SL ;取設(shè)定溫度個(gè)位數(shù)
MOV DPTR,#TABLE ;指定查表啟始地址
MOVC A,@A+DPTR ;查個(gè)位數(shù)的7段代碼
MOV DPTR,#0F000H
MOVX @DPTR,A ;送出個(gè)位的7段代碼
MOV DPTR,#0F001H
MOV A,#0FBH
MOVX @DPTR,A ;開個(gè)位顯示
ACALL D1ms ;顯示1ms
MOV A,#0FFH
MOVX @DPTR,A
MOV A,SH ;取設(shè)定溫度十位數(shù)
MOV DPTR,#TABLE ;指定查表啟始地址
MOVC A,@A+DPTR ;查十位數(shù)的7段代碼
MOV DPTR,#0F000H
MOVX @DPTR,A ;送出十位的7段代碼
MOV DPTR,#0F001H
MOV A,#0F7H
MOVX @DPTR,A ;開十位顯示
ACALL D1ms ;顯示1ms
MOV A,#0FFH
MOVX @DPTR,A
DJNZ R1,dpl2 ;250次沒完循環(huán)
RET
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;******************************************************************
;延時(shí)程序
DelayTime: PUSH 07H
PUSH 06H
PUSH 05H
MOV R7,#1
DelayTime_1: MOV R6,#1
DelayTime_2: MOV R5,#0
DJNZ R5,$
DJNZ R6,DelayTime_2
DJNZ R7,DelayTime_1
POP 05H
POP 06H
POP 07H
RET
;*************************************************
DELAY: NOP
MOV R6,#2 ;----2延時(shí)子程序開始
DEL2: MOV R5,#0FFH
DEL1: NOP
NOP
DJNZ R5, DEL1
DJNZ R6, DEL2
RET
;*************************************************
D10ms: MOV R5,#20
DL: MOV R6,#0FFH
DL0: DJNZ R6,DL0
DJNZ R5,DL
RET
;*************************************************
D1ms: MOV R7,#1
DJNZ R7,$
RET
;*************************************************
END
復(fù)制代碼
新建 Microsoft Word 文檔.docx
2018-3-18 16:54 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
22.28 KB, 下載次數(shù): 6, 下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1