單片機匯編程序:
- TEMPER_L EQU 31H ;用于保存讀出溫度低字節(jié)
- TEMPER_H EQU 30H ;用于保存讀出溫度高字節(jié)
- TEMPER_SET EQU 32H ;用于保存設(shè)定的預(yù)期溫度
- FLAG EQU 33H ;是否檢測到DS18B20標志位
- ORG 0000H
- LJMP MAIN
- ORG 0030H
- MAIN:
- MOV R0,#20 ;系統(tǒng)默認預(yù)期溫度為20℃
- START:
- CLR P2.6 ;點亮“實時溫度”指示燈
- SETB P2.5 ;熄滅“設(shè)定溫度”指示燈
- JNB P2.2,SELSUB ;是進入溫度設(shè)定
- LCALL GET_TEMPER ;調(diào)用溫度獲取子程序
- LCALL COMPARE ;調(diào)用溫度比較子程序
- LCALL DISPLAY ;調(diào)用顯示子程序
- LCALL KEY ;調(diào)用顯示切換子程序
- LJMP START
- SELSUB:
- MOV A,R0
- MOV B,#10
- DIV AB
- MOV R1,A ;溫度十位存R1
- MOV R2,B ;溫度個位存R2
- LCALL DISPLAY ;顯示溫度
- JNB P2.3,INC0
- JNB P2.4,DEC0
- JB P2.2,BACK
- LJMP SELSUB
- INC0: ;溫度加1℃
- MOV A,R1
- CJNE A,#63H,ADD0 ;溫度是否為99℃,不是則跳到ADD0
- MOV R1,#00H
- INC1:
- LCALL DELAY1 ;延時顯示
- JNB P2.3,INC1 ;按鍵是否松開,松開則程序往下執(zhí)行
- LJMP SELSUB
- ADD0:
- INC R0
- LCALL DELAY1
- LJMP SELSUB
- DEC0: ;溫度減1℃
- MOV A,R1
- JZ SETR1 ;溫度是0℃則跳到SETR1
- DEC R0
- DEC1:
- LCALL DELAY1
- JNB P2.4,DEC1 ;按鍵是否松開,松開則程序往下執(zhí)行
- LJMP SELSUB
- SETR1:
- MOV R1,#63H
- LCALL DELAY1
- LJMP SELSUB
- BACK:
- LJMP START
- GET_TEMPER:
- SETB P1.2
- LCALL SET_1820 ;DS18B20初始化
- JB FLAG,TSS2 ;檢測到DS18B20跳到TSS2
- RET
- TSS2:
- MOV A,#0CCH ;跳過ROM匹配
- LCALL WRITE_1820 ;寫DS18B20子程序
- MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令
- LCALL WRITE_1820
- LCALL DISPLAY ;用顯示溫度來等待AD轉(zhuǎn)換結(jié)束
- LCALL SET_1820
- MOV A,#0CCH ;跳過ROM匹配
- LCALL WRITE_1820
- MOV A,#0BEH ;發(fā)出讀溫度命令
- LCALL WRITE_1820
- LCALL READ_1820 ;讀DS18B20的溫度數(shù)據(jù)
- MOV A,TEMPER_L
- MOV R3,#4
- L1:
- SETB C
- RRC A
- DJNZ R3,L1
- MOV TEMPER_L,A
- MOV A,TEMPER_H
- MOV R3,#4
- L2:
- SETB C
- RLC A
- DJNZ R3,L2
- ANL A,TEMPER_L
- MOV R7,A ;讀出的溫度轉(zhuǎn)化問攝氏溫度存R7中
- MOV B,#10
- DIV AB
- MOV R1,A ;讀出的溫度十位存R1
- MOV R2,B ;讀出的溫度個位存R2
- RET
- SET_1820: ;DS18B20復(fù)位初始化子程序
- SETB P1.2
- NOP
- CLR P1.2
- MOV R3,#3 ;主機發(fā)出延時537微秒的復(fù)位低脈沖
- TSR1:
- MOV R4,#107
- DJNZ R4,$
- DJNZ R3,TSR1
- SETB P1.2 ;然后拉高數(shù)據(jù)線
- NOP
- NOP
- NOP
- MOV R4,#25H
- TSR2:
- JNB P1.2,TSR3 ;等待DS18B20回應(yīng)
- DJNZ R4,TSR2
- LJMP TSR4 ;延時
- TSR3:
- SETB FLAG ;置標志位,表示DS18B20存在
- LJMP TSR5
- TSR4:
- CLR FLAG ;清標志位,表示DS18B20不存在
- LJMP TSR7
- TSR5:
- MOV R4,#117
- TSR6:
- DJNZ R4,TSR6 ;時序要求延時一段時間
- TSR7:
- SETB P1.2
- RET
- WRITE_1820:
- MOV R3,#8 ;一共8位數(shù)據(jù)
- CLR C
- WR1:
- CLR P1.2
- MOV R4,#6
- DJNZ R4,$
- RRC A
- MOV P1.2,C
- MOV R4,#23
- DJNZ R4,$
- SETB P1.2
- NOP
- DJNZ R3,WR1
- SETB P1.2
- RET
- READ_1820: ;將溫度高位和地位從DS18B20中讀出
-
- MOV R4,#8
- RE01:
- CLR C
- SETB P1.2
- NOP
- NOP
- CLR P1.2
- NOP
- NOP
- NOP
- SETB P1.2
- MOV R6,#4
- DJNZ R6,$
- MOV C,P1.2
- RRC A
- MOV R6,#30
- DJNZ R6,$
- DJNZ R4,RE01
- MOV TEMPER_L,A ;地位存入31H
- MOV R4,#8
- RE02:
- CLR C
- SETB P1.2
- NOP
- NOP
- CLR P1.2
- NOP
- NOP
- NOP
- SETB P1.2
- MOV R6,#4
- DJNZ R6,$
- MOV C,P1.2
- RRC A
- MOV R6,#30
- DJNZ R6,$
- DJNZ R4,RE02
- MOV TEMPER_H,A ;高位存入32H
- RET
- COMPARE: ;比較溫度子程序
- MOV TEMPER_SET,R0
- MOV A,R7
- CJNE A,TEMPER_SET,COMP ;設(shè)定溫度與實時溫度不等則跳COMP
- SETB P1.0 ;關(guān)加熱器
- SETB P1.1 ;關(guān)制冷器
- RET
- COMP:
- MOV A,R7 ;實時溫度存入A
- MOV B,R0 ;設(shè)定溫度存入B
- DIV AB ;A除以B,商給A
- CJNE A,#0H,COMP1 ;若A不等于0,即實時溫度高,跳轉(zhuǎn)
- SETB P1.1 ;關(guān)制冷器
- CLR P1.0 ;開加熱器
- LJMP EXIT
- COMP1:
- SETB P1.0 ;關(guān)加熱器
- CLR P1.1 ;開制冷器
- EXIT:
- RET
- DISPLAY: ;顯示子程序
- MOV DPTR,#DAT
- MOV A,R1
- MOVC A,@A+DPTR
- CLR P2.0
- SETB P2.1
- MOV P0,A ;動態(tài)掃描,顯示十位
- LCALL DELAY ;延時約12毫秒
- MOV A,R2
- MOVC A,@A+DPTR
- SETB P2.0
- CLR P2.1
- MOV P0,A ;動態(tài)掃描,顯示個位
- LCALL DELAY
- SETB P2.0
- SETB P2.1 ;關(guān)顯示
- RET
- DAT:
- DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H
- ;“0”,“1”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,“9”,“滅”
- DELAY1: ;延時子程序,延時并顯示
- MOV 36H,#08H
- LOOP0:
- LCALL DISPLAY
- DJNZ 36H,LOOP0
- RET
- DELAY: ;延時子程序,延時約12ms
- MOV 34H,#24H
- LOOP:
- MOV 35H,#0AFH
- LOOP1:
- DJNZ 35H,LOOP1
- DJNZ 34H,LOOP
- RET
- KEY: ;顯示切換子程序
- JNB P2.7,KEY1
- RET
- KEY1:
- LCALL DELAY ;延時去抖動
- JNB P2.7,KEY2
- RET
- KEY2:
- LCALL INT
- RET
- INT:
- MOV A,R0 ;顯示設(shè)定溫度
- MOV B,#10
- DIV AB
- MOV R1,A
- MOV R2,B
- MOV R6,#50
- LCALL DELAY1
- DJNZ R6,$
- RET
- END
復(fù)制代碼
|