;DS18B20和AT89C2051制作的熱水器程序!兩位數(shù)碼管顯示溫度,設(shè)定溫度時數(shù)碼管成閃爍狀態(tài),延時幾秒后跳轉(zhuǎn)到被測溫度;DS18B20的正電源就是紅線接+5伏,蘭線接地,黃線接P3.2,紅線和黃線之間接一個4.7K的上拉電阻 ;這是關(guān)于DS18B20的讀寫程序,數(shù)據(jù)腳P3.2,晶振12MHz ;溫度傳感器18B20匯編程序,采用器件默認(rèn)的12位轉(zhuǎn)化,最大轉(zhuǎn)化時間750微秒 ;可以將檢測到的溫度直接顯示到AT89C2051的p1口輸數(shù)碼管段碼到兩位一體數(shù)碼管上 ;顯示溫度00到99度,很準(zhǔn)確哦~~無需校正! ;p3.1驅(qū)動加熱管裝置,讓溫度保溫在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 ;是否檢測到DS18B20標(biāo)志位 a_bit equ 20h ;數(shù)碼管個位數(shù)存放內(nèi)存位置 b_bit equ 21h ;數(shù)碼管十位數(shù)存放內(nèi)存位置 SL EQU 22H ;設(shè)定溫度時數(shù)碼管個位數(shù)存放內(nèi)存位置 SH EQU 23H ;設(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ù)碼管來顯示溫度,顯示范圍00到99度,顯示精度為1度 ;因為12位轉(zhuǎn)化時每一位的精度為0.0625度,我們不要求顯示小數(shù)所以可以拋棄29H的低4位 ;將28H中的低4位移入29H中的高4位,這樣獲得一個新字節(jié),這個字節(jié)就是實際測量獲得的溫度 ;這個轉(zhuǎn)化溫度的方法可是我想出來的哦~~非常簡潔無需乘于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ū)動加熱管裝置 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ū)動 setb p3.0 ;關(guān)閉保溫?zé)? KEEP:SJMP MAIN ;返回,保持原態(tài),保溫 STOPHOT:SETB P3.1 ;關(guān)閉加熱器 clr p3.0 ;點亮保溫?zé)? 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ā)出延時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 ;延時 TSR3:SETB FLAG1 ;置標(biāo)志位,表示DS1820存在 LJMP TSR5 TSR4:CLR FLAG1 ;清標(biāo)志位,表示DS1820不存在 LJMP TSR7 TSR5:MOV R0,#06BH TSR6:DJNZ R0,TSR6 ;時序要求延時一段時間 TSR7:SETB DS18B20 RET ;========================================================================================= ; 讀出轉(zhuǎn)換后的溫度值 GET_TEMPER:SETB DS18B20 ;定時入口 LCALL INIT_1820 ;先復(fù)位DS18B20 JB FLAG1,TSS2 RET ;判斷DS1820是否存在?若DS18B20不存在則返回 TSS2:MOV A,#0CCH ;跳過ROM匹配 LCALL WRITE_1820 MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令 LCALL WRITE_1820 LCALL DISPLAY ;這里通過調(diào)用顯示子程序?qū)崿F(xiàn)延時一段時間,等待AD轉(zhuǎn)換結(jié)束,12位的話750微秒. LCALL INIT_1820 ;準(zhǔn)備讀溫度前先復(fù)位 MOV A,#0CCH ;跳過ROM匹配 LCALL WRITE_1820 MOV A,#0BEH ;發(fā)出讀溫度命令 LCALL WRITE_1820 LCALL READ_18200 ;將讀出的溫度數(shù)據(jù)保存到35H/36H RET ;寫DS18B20的子程序(有具體的時序要求) 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中讀出兩個字節(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 ;個位在b mov dptr,#numtab ;指定查表啟始地址 mov r1,#250 ;顯示250次 dplop:mov a,a_bit ;取個位數(shù) MOVC A,@A+DPTR ;查個位數(shù)的7段代碼 mov p1,a ;送出個位的7段代碼 clr p3.3 ;開個位顯示 acall d1ms ;顯示1ms setb p3.3 mov a,b_bit ;取十位數(shù) MOVC A,@A+DPTR ;查十位數(shù)的7段代碼 mov p1,a ;送出十位的7段代碼 clr p3.7 ;開十位顯示 acall d1ms ;顯示1ms setb p3.7 djnz r1,dplop ;250次沒完循環(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 ;個位在b mov r1,#250 ;顯示250次 dpl2: mov a,SL ;取設(shè)定溫度個位數(shù) mov dptr,#numtab ;指定查表啟始地址 MOVC A,@A+DPTR ;查個位數(shù)的7段代碼 mov p1,a ;送出個位的7段代碼 clr p3.7 ;開個位顯示 acall d1ms ;顯示1ms setb p3.7 mov a,SH ;取設(shè)定溫度十位數(shù) MOVC A,@A+DPTR ;查十位數(shù)的7段代碼 mov p1,a ;送出十位的7段代碼 clr p3.3 ;開十位顯示 acall d1ms ;顯示1ms setb p3.3 djnz r1,dpl2 ;250次沒完循環(huán) acall D1s ;顯示1ms RET ;;========================================================================================= ;1MS延時(按12MHZ算) D1MS:MOV R7,#80 DJNZ R7,$ RET ;;1S延時(按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