|
單片機(jī)匯編程序:
- TEMPER_L EQU 31H ;用于保存讀出溫度低字節(jié)
- TEMPER_H EQU 30H ;用于保存讀出溫度高字節(jié)
- TEMPER_SET EQU 32H ;用于保存設(shè)定的預(yù)期溫度
- FLAG EQU 33H ;是否檢測(cè)到DS18B20標(biāo)志位
- ORG 0000H
- LJMP MAIN
- ORG 0030H
- MAIN:
- MOV R0,#20 ;系統(tǒng)默認(rèn)預(yù)期溫度為20℃
- START:
- CLR P2.6 ;點(diǎn)亮“實(shí)時(shí)溫度”指示燈
- SETB P2.5 ;熄滅“設(shè)定溫度”指示燈
- JNB P2.2,SELSUB ;是進(jìn)入溫度設(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 ;溫度個(gè)位存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 ;延時(shí)顯示
- JNB P2.3,INC1 ;按鍵是否松開(kāi),松開(kāi)則程序往下執(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 ;按鍵是否松開(kāi),松開(kāi)則程序往下執(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 ;檢測(cè)到DS18B20跳到TSS2
- RET
- TSS2:
- MOV A,#0CCH ;跳過(guò)ROM匹配
- LCALL WRITE_1820 ;寫(xiě)DS18B20子程序
- MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令
- LCALL WRITE_1820
- LCALL DISPLAY ;用顯示溫度來(lái)等待AD轉(zhuǎn)換結(jié)束
- LCALL SET_1820
- MOV A,#0CCH ;跳過(guò)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)化問(wèn)攝氏溫度存R7中
- MOV B,#10
- DIV AB
- MOV R1,A ;讀出的溫度十位存R1
- MOV R2,B ;讀出的溫度個(gè)位存R2
- RET
- SET_1820: ;DS18B20復(fù)位初始化子程序
- SETB P1.2
- NOP
- CLR P1.2
- MOV R3,#3 ;主機(jī)發(fā)出延時(shí)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 ;延時(shí)
- TSR3:
- SETB FLAG ;置標(biāo)志位,表示DS18B20存在
- LJMP TSR5
- TSR4:
- CLR FLAG ;清標(biāo)志位,表示DS18B20不存在
- LJMP TSR7
- TSR5:
- MOV R4,#117
- TSR6:
- DJNZ R4,TSR6 ;時(shí)序要求延時(shí)一段時(shí)間
- 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è)定溫度與實(shí)時(shí)溫度不等則跳COMP
- SETB P1.0 ;關(guān)加熱器
- SETB P1.1 ;關(guān)制冷器
- RET
- COMP:
- MOV A,R7 ;實(shí)時(shí)溫度存入A
- MOV B,R0 ;設(shè)定溫度存入B
- DIV AB ;A除以B,商給A
- CJNE A,#0H,COMP1 ;若A不等于0,即實(shí)時(shí)溫度高,跳轉(zhuǎn)
- SETB P1.1 ;關(guān)制冷器
- CLR P1.0 ;開(kāi)加熱器
- LJMP EXIT
- COMP1:
- SETB P1.0 ;關(guān)加熱器
- CLR P1.1 ;開(kāi)制冷器
- EXIT:
- RET
- DISPLAY: ;顯示子程序
- MOV DPTR,#DAT
- MOV A,R1
- MOVC A,@A+DPTR
- CLR P2.0
- SETB P2.1
- MOV P0,A ;動(dòng)態(tài)掃描,顯示十位
- LCALL DELAY ;延時(shí)約12毫秒
- MOV A,R2
- MOVC A,@A+DPTR
- SETB P2.0
- CLR P2.1
- MOV P0,A ;動(dòng)態(tài)掃描,顯示個(gè)位
- 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: ;延時(shí)子程序,延時(shí)并顯示
- MOV 36H,#08H
- LOOP0:
- LCALL DISPLAY
- DJNZ 36H,LOOP0
- RET
- DELAY: ;延時(shí)子程序,延時(shí)約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 ;延時(shí)去抖動(dòng)
- 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ù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|