|
;DS18B20和AT89C2051制作的熱水器程序!兩位數(shù)碼管顯示溫度,設(shè)定溫度時(shí)數(shù)碼管成閃爍狀態(tài),延時(shí)幾秒后跳轉(zhuǎn)到被測(cè)溫度
;本程序由陳永飛同志開(kāi)發(fā)! 信箱:baiyni888@163.com 電話:025-82053659,地址:江蘇省儀征市新集鎮(zhèn)凌東村黃莊組
;DS18B20的正電源就是紅線接+5伏,蘭線接地,黃線接P3.2,紅線和黃線之間接一個(gè)4.7K的上拉電阻
;這是關(guān)于DS18B20的讀寫(xiě)程序,數(shù)據(jù)腳P3.2,晶振12MHz
;溫度傳感器18B20匯編程序,采用器件默認(rèn)的12位轉(zhuǎn)化,最大轉(zhuǎn)化時(shí)間750微秒
;可以將檢測(cè)到的溫度直接顯示到AT89C2051的p1口輸數(shù)碼管段碼到兩位一體數(shù)碼管上
;顯示溫度00到99度,很準(zhǔn)確哦~~無(wú)需校正!
;p3.1驅(qū)動(dòng)加熱管裝置,讓溫度保溫在0-99度內(nèi)
;p3.0保溫指示燈,p3.4是溫度設(shè)定按鍵加1度;p3.5是溫度設(shè)定按鍵減1度,p3.7是數(shù)碼管高位位碼,p3.3是數(shù)碼管低位位碼
;程序16進(jìn)制的溫度值放在29h里,我用可調(diào)節(jié)0度到99度的16進(jìn)制值(#08H/#0EH)與之比較
;1至40度的16進(jìn)制為:01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 1-10度
; 0BH 0CH 0DH 0EH 0FH 10H 11H 12H 13H 14H 11-20度
; 15H 16H 17H 18H 19H 1AH 1BH 1CH 1DH 1EH 21-30度
; 1FH 2OH 21H 22H 23H 24H 25H 26H 27H 28H 31-40度
; 29H 2AH 2BH 2CH 2DH 2EH 2FH 30H 31H 32H 41-50度
; 33H 34H 35H 36H 37H 38H 39H 3AH 3BH 3CH 51-60度
; 3CH 3DH 3EH 3FH 40H 41H 42H 43H 44H 45H 61-70度
; 46H 47H 48H 49H 4AH 4BH 4CH 4DH 4EH 4FH 71-80度
; 51H 52H 53H 54H 55H 56H 57H 58H 59H 5AH 81-90度
; 5BH 5CH 5DH 5EH 5FH 60H 61H 62H 63H 64H 91-100度
;=========================================================================================
;單片機(jī)內(nèi)存分配申明!
TEMPER_L EQU 29H ;用于保存讀出溫度的低8位
TEMPER_H EQU 28H ;用于保存讀出溫度的高8位(特別是可位尋址,程序中用的著哦)
TIAO_H EQU 27H ;用于保存設(shè)定溫度的數(shù)據(jù)(最低溫度的設(shè)定,高溫度為低溫度加2度)
FLAG1 EQU 38H ;是否檢測(cè)到DS18B20標(biāo)志位
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碼位
DS18B20 BIT P3.2 ;定義DS18B20的數(shù)據(jù)腳為P3.2端口
ORG 0000H
MOV sdwd,#25H ;;;;設(shè)定初始溫度37度,上電后內(nèi)部設(shè)定溫度
MAIN:LCALL INIT_1820 ;調(diào)用復(fù)位DS18B20子程序
MAIN1:LCALL GET_TEMPER ;調(diào)用讀溫度子程序
;進(jìn)行溫度顯示,這里我是用兩位數(shù)碼管來(lái)顯示溫度,顯示范圍00到99度,顯示精度為1度
;因?yàn)?2位轉(zhuǎn)化時(shí)每一位的精度為0.0625度,我們不要求顯示小數(shù)所以可以拋棄29H的低4位
;將28H中的低4位移入29H中的高4位,這樣獲得一個(gè)新字節(jié),這個(gè)字節(jié)就是實(shí)際測(cè)量獲得的溫度
;這個(gè)轉(zhuǎn)化溫度的方法可是我想出來(lái)的哦~~非常簡(jiǎn)潔無(wú)需乘于0.0625系數(shù)
MOV A,29H
MOV C,40H ;將28H中的最低位移入C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
LCALL DISPLAY ;調(diào)用數(shù)碼管顯示子程序
;這里是后加的,做為控制在0-99度內(nèi)恒溫的程序!p3.1驅(qū)動(dòng)加熱管裝置
setb p3.4
setb p3.5
jnb p3.4,DD1 ;按下后轉(zhuǎn)加1程序
jnb p3.5,DD2 ;按下后轉(zhuǎn)減1程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TT: CLR C ;比較轉(zhuǎn)換值與設(shè)定值
MOV 26H,sdwd ;把低溫度設(shè)定保存到26H單元后減2度,作為低度的數(shù)據(jù)
DEC 26H
MOV A,29H
CJNE A,26H,LOOP1 ;下限設(shè)定溫度度,不相等跳LOOP1
SJMP HOTTING ;與下限值相等跳HOTTING,加熱
LOOP1:JC HOTTING ;溫度小于下限值跳HOTTING,加熱
MOV A,29H ;溫度大于下限值,與上限值比較
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 P3.1 ;小,加熱器驅(qū)動(dòng)
setb p3.0 ;關(guān)閉保溫?zé)?br />
KEEP:SJMP MAIN ;返回,保持原態(tài),保溫
STOPHOT:SETB P3.1 ;關(guān)閉加熱器
clr p3.0 ;點(diǎn)亮保溫?zé)?br />
AJMP MAIN ;反回主程序
;;;;;;;;;;;;;;;;;;;;;按鍵處理;;;;;;;;;;;;
;;;;;加限設(shè)定溫度度;;;;;;;;;;
DD1:LCALL displa ;調(diào)用數(shù)碼管閃爍設(shè)定顯示子程序
mov r5,#30
JNB P3.4,DD1
mov a,sdwd ;把設(shè)定溫度送累加器判斷
cjne a,#62h,ty1 ;比較設(shè)定溫度是否到99度,不是則加
ajmp dh2
ty1: INC sdwd
dh2:jnb p3.4,DD1
jnb p3.5,DD2 ;按下后轉(zhuǎn)減1程序
LCALL displa ;調(diào)用數(shù)碼管閃爍設(shè)定顯示子程序
djnz r5,dh2
LJMP TT
;;;減限設(shè)定溫度度;;;;;;;;;;;;
DD2:LCALL displa ;調(diào)用數(shù)碼管閃爍設(shè)定顯示子程序
mov r5,#30
JNB P3.5,DD2
mov a,sdwd ;把設(shè)定溫度送累加器判斷
cjne a,#01h,ty ;比較設(shè)定溫度是否到0度,不是則減
ajmp dh1
ty: DEC sdwd
dh1:jnb p3.5,DD2
jnb p3.4,DD1 ;按下后轉(zhuǎn)加1程序
LCALL displa ;調(diào)用數(shù)碼管閃爍設(shè)定顯示子程序
djnz r5,dh1
LJMP TT
;=========================================================================================
; DS18B20復(fù)位初始化程序
INIT_1820:SETB DS18B20
NOP
CLR DS18B20
MOV R0,#06BH ;主機(jī)發(fā)出延時(shí)537微秒的復(fù)位低脈沖
MOV R1,#03H
TSR1:DJNZ R0,TSR1
MOV R0,#6BH
DJNZ R1,TSR1
SETB DS18B20 ;然后拉高數(shù)據(jù)線
NOP
NOP
NOP
MOV R0,#25H
TSR2:JNB DS18B20,TSR3 ;等待DS18B20回應(yīng)
DJNZ R0,TSR2
LJMP TSR4 ;延時(shí)
TSR3:SETB FLAG1 ;置標(biāo)志位,表示DS1820存在
LJMP TSR5
TSR4:CLR FLAG1 ;清標(biāo)志位,表示DS1820不存在
LJMP TSR7
TSR5:MOV R0,#06BH
TSR6:DJNZ R0,TSR6 ;時(shí)序要求延時(shí)一段時(shí)間
TSR7:SETB DS18B20
RET
;=========================================================================================
; 讀出轉(zhuǎn)換后的溫度值
GET_TEMPER:SETB DS18B20 ;定時(shí)入口
LCALL INIT_1820 ;先復(fù)位DS18B20
JB FLAG1,TSS2
RET ;判斷DS1820是否存在?若DS18B20不存在則返回
TSS2:MOV A,#0CCH ;跳過(guò)ROM匹配
LCALL WRITE_1820
MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令
LCALL WRITE_1820
LCALL DISPLAY ;這里通過(guò)調(diào)用顯示子程序?qū)崿F(xiàn)延時(shí)一段時(shí)間,等待AD轉(zhuǎn)換結(jié)束,12位的話750微秒.
LCALL INIT_1820 ;準(zhǔn)備讀溫度前先復(fù)位
MOV A,#0CCH ;跳過(guò)ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;發(fā)出讀溫度命令
LCALL WRITE_1820
LCALL READ_18200 ;將讀出的溫度數(shù)據(jù)保存到35H/36H
RET
;寫(xiě)DS18B20的子程序(有具體的時(shí)序要求)
WRITE_1820:MOV R2,#8 ;一共8位數(shù)據(jù)
CLR C
WR1:CLR DS18B20
MOV R3,#6
DJNZ R3,$
RRC A
MOV DS18B20,C
MOV R3,#23
DJNZ R3,$
SETB DS18B20
NOP
DJNZ R2,WR1
SETB DS18B20
RET
; 讀DS18B20的程序,從DS18B20中讀出兩個(gè)字節(jié)的溫度數(shù)據(jù)
READ_18200:MOV R4,#2 ;將溫度高位和低位從DS18B20中讀出
MOV R1,#29H ;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:MOV R2,#8
RE01:CLR C
SETB DS18B20
NOP
NOP
CLR DS18B20
NOP
NOP
NOP
SETB DS18B20
MOV R3,#09
RE10:DJNZ R3,RE10
MOV C,DS18B20
MOV R3,#23
RE20:DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;=========================================================================================
;;;;;;;;;;;;;;;顯示子程序;;;;;;;;;;;;;;;;;;
display:mov a,29H ;將29H中的十六進(jìn)制數(shù)轉(zhuǎn)換成10進(jìn)制
mov b,#10 ;10進(jìn)制/10=10進(jìn)制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;個(gè)位在b
mov dptr,#numtab ;指定查表啟始地址
mov r1,#250 ;顯示250次
dplop:mov a,a_bit ;取個(gè)位數(shù)
MOVC A,@A+DPTR ;查個(gè)位數(shù)的7段代碼
mov p1,a ;送出個(gè)位的7段代碼
clr p3.3 ;開(kāi)個(gè)位顯示
acall d1ms ;顯示1ms
setb p3.3
mov a,b_bit ;取十位數(shù)
MOVC A,@A+DPTR ;查十位數(shù)的7段代碼
mov p1,a ;送出十位的7段代碼
clr p3.7 ;開(kāi)十位顯示
acall d1ms ;顯示1ms
setb p3.7
djnz r1,dplop ;250次沒(méi)完循環(huán)
RET
;;;===============================================================
;;;;;;;閃爍設(shè)定顯示子程序=====================
displa: MOV A,sdwd
mov b,#10 ;10進(jìn)制/10=10進(jìn)制
div ab
mov SL,a ;十位在a
mov SH,b ;個(gè)位在b
mov r1,#250 ;顯示250次
dpl2: mov a,SL ;取設(shè)定溫度個(gè)位數(shù)
mov dptr,#numtab ;指定查表啟始地址
MOVC A,@A+DPTR ;查個(gè)位數(shù)的7段代碼
mov p1,a ;送出個(gè)位的7段代碼
clr p3.7 ;開(kāi)個(gè)位顯示
acall d1ms ;顯示1ms
setb p3.7
mov a,SH ;取設(shè)定溫度十位數(shù)
MOVC A,@A+DPTR ;查十位數(shù)的7段代碼
mov p1,a ;送出十位的7段代碼
clr p3.3 ;開(kāi)十位顯示
acall d1ms ;顯示1ms
setb p3.3
djnz r1,dpl2 ;250次沒(méi)完循環(huán)
acall D1s ;顯示1ms
RET
;;=========================================================================================
;1MS延時(shí)(按12MHZ算)
D1MS:MOV R7,#80
DJNZ R7,$
RET
;;1S延時(shí)(按12MHZ算)
D1s:MOV R7,#255
l1:nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
DJNZ R7,l1
RET
;=========================================================================================
numtab: DB 0EEH;0
DB 048H;1
DB 0D6H;2
DB 0DCH;3
DB 078H;4
DB 0BCH;5
DB 0BEH;6
DB 0C8H;7
DB 0FEH;8
DB 0FCH;9
END
|
|