;DS18B20和AT89C2051制作的熱水器程序!兩位數碼管顯示溫度,設定溫度時數碼管成閃爍狀態,延時幾秒后跳轉到被測溫度;DS18B20的正電源就是紅線接+5伏,蘭線接地,黃線接P3.2,紅線和黃線之間接一個4.7K的上拉電阻 ;這是關于DS18B20的讀寫程序,數據腳P3.2,晶振12MHz ;溫度傳感器18B20匯編程序,采用器件默認的12位轉化,最大轉化時間750微秒 ;可以將檢測到的溫度直接顯示到AT89C2051的p1口輸數碼管段碼到兩位一體數碼管上 ;顯示溫度00到99度,很準確哦~~無需校正! ;p3.1驅動加熱管裝置,讓溫度保溫在0-99度內 ;p3.0保溫指示燈,p3.4是溫度設定按鍵加1度;p3.5是溫度設定按鍵減1度,p3.7是數碼管高位位碼,p3.3是數碼管低位位碼 ;程序16進制的溫度值放在29h里,我用可調節0度到99度的16進制值(#08H/#0EH)與之比較 ;1至40度的16進制為: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度 ;========================================================================================= ;單片機內存分配申明! TEMPER_L EQU 29H ;用于保存讀出溫度的低8位 TEMPER_H EQU 28H ;用于保存讀出溫度的高8位(特別是可位尋址,程序中用的著哦) TIAO_H EQU 27H ;用于保存設定溫度的數據(最低溫度的設定,高溫度為低溫度加2度) FLAG1 EQU 38H ;是否檢測到DS18B20標志位 a_bit equ 20h ;數碼管個位數存放內存位置 b_bit equ 21h ;數碼管十位數存放內存位置 SL EQU 22H ;設定溫度時數碼管個位數存放內存位置 SH EQU 23H ;設定溫度時數碼管十位數存放內存位置 sdwd equ 24h ;設定溫度壓縮BCD碼位 DS18B20 BIT P3.2 ;定義DS18B20的數據腳為P3.2端口 ORG 0000H MOV sdwd,#25H ;;;;設定初始溫度37度,上電后內部設定溫度 MAIN:LCALL INIT_1820 ;調用復位DS18B20子程序 MAIN1:LCALL GET_TEMPER ;調用讀溫度子程序 ;進行溫度顯示,這里我是用兩位數碼管來顯示溫度,顯示范圍00到99度,顯示精度為1度 ;因為12位轉化時每一位的精度為0.0625度,我們不要求顯示小數所以可以拋棄29H的低4位 ;將28H中的低4位移入29H中的高4位,這樣獲得一個新字節,這個字節就是實際測量獲得的溫度 ;這個轉化溫度的方法可是我想出來的哦~~非常簡潔無需乘于0.0625系數 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 ;調用數碼管顯示子程序 ;這里是后加的,做為控制在0-99度內恒溫的程序!p3.1驅動加熱管裝置 setb p3.4 setb p3.5 jnb p3.4,DD1 ;按下后轉加1程序 jnb p3.5,DD2 ;按下后轉減1程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TT: CLR C ;比較轉換值與設定值 MOV 26H,sdwd ;把低溫度設定保存到26H單元后減2度,作為低度的數據 DEC 26H MOV A,29H CJNE A,26H,LOOP1 ;下限設定溫度度,不相等跳LOOP1 SJMP HOTTING ;與下限值相等跳HOTTING,加熱 LOOP1:JC HOTTING ;溫度小于下限值跳HOTTING,加熱 MOV A,29H ;溫度大于下限值,與上限值比較 CLR C mov 27h,sdwd inc 27h CJNE A,27h,LOOP2 ;上限設定溫度度,不相等跳LOOP2 SJMP STOPHOT ;相等跳STOPHOT,停止加熱 LOOP2:JNC STOPHOT ;溫度大于上限值跳STOPHOT,停止加熱 SJMP KEEP ;溫度小于上限且大于下限值跳KEEP,保溫 HOTTING:CLR P3.1 ;小,加熱器驅動 setb p3.0 ;關閉保溫燈 KEEP:SJMP MAIN ;返回,保持原態,保溫 STOPHOT:SETB P3.1 ;關閉加熱器 clr p3.0 ;點亮保溫燈 AJMP MAIN ;反回主程序 ;;;;;;;;;;;;;;;;;;;;;按鍵處理;;;;;;;;;;;; ;;;;;加限設定溫度度;;;;;;;;;; DD1:LCALL displa ;調用數碼管閃爍設定顯示子程序 mov r5,#30 JNB P3.4,DD1 mov a,sdwd ;把設定溫度送累加器判斷 cjne a,#62h,ty1 ;比較設定溫度是否到99度,不是則加 ajmp dh2 ty1: INC sdwd dh2:jnb p3.4,DD1 jnb p3.5,DD2 ;按下后轉減1程序 LCALL displa ;調用數碼管閃爍設定顯示子程序 djnz r5,dh2 LJMP TT ;;;減限設定溫度度;;;;;;;;;;;; DD2:LCALL displa ;調用數碼管閃爍設定顯示子程序 mov r5,#30 JNB P3.5,DD2 mov a,sdwd ;把設定溫度送累加器判斷 cjne a,#01h,ty ;比較設定溫度是否到0度,不是則減 ajmp dh1 ty: DEC sdwd dh1:jnb p3.5,DD2 jnb p3.4,DD1 ;按下后轉加1程序 LCALL displa ;調用數碼管閃爍設定顯示子程序 djnz r5,dh1 LJMP TT ;========================================================================================= ; DS18B20復位初始化程序 INIT_1820:SETB DS18B20 NOP CLR DS18B20 MOV R0,#06BH ;主機發出延時537微秒的復位低脈沖 MOV R1,#03H TSR1:DJNZ R0,TSR1 MOV R0,#6BH DJNZ R1,TSR1 SETB DS18B20 ;然后拉高數據線 NOP NOP NOP MOV R0,#25H TSR2:JNB DS18B20,TSR3 ;等待DS18B20回應 DJNZ R0,TSR2 LJMP TSR4 ;延時 TSR3:SETB FLAG1 ;置標志位,表示DS1820存在 LJMP TSR5 TSR4:CLR FLAG1 ;清標志位,表示DS1820不存在 LJMP TSR7 TSR5:MOV R0,#06BH TSR6:DJNZ R0,TSR6 ;時序要求延時一段時間 TSR7:SETB DS18B20 RET ;========================================================================================= ; 讀出轉換后的溫度值 GET_TEMPER:SETB DS18B20 ;定時入口 LCALL INIT_1820 ;先復位DS18B20 JB FLAG1,TSS2 RET ;判斷DS1820是否存在?若DS18B20不存在則返回 TSS2:MOV A,#0CCH ;跳過ROM匹配 LCALL WRITE_1820 MOV A,#44H ;發出溫度轉換命令 LCALL WRITE_1820 LCALL DISPLAY ;這里通過調用顯示子程序實現延時一段時間,等待AD轉換結束,12位的話750微秒. LCALL INIT_1820 ;準備讀溫度前先復位 MOV A,#0CCH ;跳過ROM匹配 LCALL WRITE_1820 MOV A,#0BEH ;發出讀溫度命令 LCALL WRITE_1820 LCALL READ_18200 ;將讀出的溫度數據保存到35H/36H RET ;寫DS18B20的子程序(有具體的時序要求) WRITE_1820:MOV R2,#8 ;一共8位數據 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中讀出兩個字節的溫度數據 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中的十六進制數轉換成10進制 mov b,#10 ;10進制/10=10進制 div ab mov b_bit,a ;十位在a mov a_bit,b ;個位在b mov dptr,#numtab ;指定查表啟始地址 mov r1,#250 ;顯示250次 dplop:mov a,a_bit ;取個位數 MOVC A,@A+DPTR ;查個位數的7段代碼 mov p1,a ;送出個位的7段代碼 clr p3.3 ;開個位顯示 acall d1ms ;顯示1ms setb p3.3 mov a,b_bit ;取十位數 MOVC A,@A+DPTR ;查十位數的7段代碼 mov p1,a ;送出十位的7段代碼 clr p3.7 ;開十位顯示 acall d1ms ;顯示1ms setb p3.7 djnz r1,dplop ;250次沒完循環 RET ;;;=============================================================== ;;;;;;;閃爍設定顯示子程序===================== displa: MOV A,sdwd mov b,#10 ;10進制/10=10進制 div ab mov SL,a ;十位在a mov SH,b ;個位在b mov r1,#250 ;顯示250次 dpl2: mov a,SL ;取設定溫度個位數 mov dptr,#numtab ;指定查表啟始地址 MOVC A,@A+DPTR ;查個位數的7段代碼 mov p1,a ;送出個位的7段代碼 clr p3.7 ;開個位顯示 acall d1ms ;顯示1ms setb p3.7 mov a,SH ;取設定溫度十位數 MOVC A,@A+DPTR ;查十位數的7段代碼 mov p1,a ;送出十位的7段代碼 clr p3.3 ;開十位顯示 acall d1ms ;顯示1ms setb p3.3 djnz r1,dpl2 ;250次沒完循環 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