?? text1.asm
字號:
RX EQU P1.6 ;DS18B20接收數據.
TX EQU P1.7 ;51發送數據.
FLAG1 EQU 00H ;DS18B20初始化標志位.
FLAG2 EQU 01H ;通知水循環維持時間寄存器(WATER2)開始計時,間隔(WATER1)無需被操作.
FLAG3 EQU 02H ;通知喂食維持時間寄存器(FEED2)開始計時,間隔(FEED1)無需被操作.
FLAG4 EQU 03H ;被置1則可以去啟動溫度轉換.
FLAG5 EQU 04H ;被置1則可以去取轉換好的溫度.
TEMPL EQU 26H ;16位溫度量低8位.
TEMPH EQU 27H ;16位溫度量高8位.
TH EQU 28H ;溫度上限值.
TL EQU 29H ;溫度下限值.
TEMP1 EQU 30H ;采集溫度符號位.
TEMP2 EQU 31H ;采集溫度整數位.
TEMP3 EQU 32H ;采集溫度小數位.
ZC1 EQU 33H ;數據暫存地址1.
ZC2 EQU 34H ;數據暫存地址2.
ZC3 EQU 35H ;數據暫存地址2.
HOUR EQU 36H ;小時數據暫存.
MINUTE EQU 37H ;分鐘數據暫存.
SECOND EQU 38H ;秒數據暫存.
WATER1 EQU 39H ;水循環開啟間隔控制寄存器. 2h(max 12h)
WATER2 EQU 40H ;水循環維持時間控制寄存器. 10min(max 30min)
HEAT1 EQU 41H ;檢測水溫開啟間隔控制寄存器. 5S
FEED1 EQU 42H ;喂食開啟間隔控制寄存器. 8h
FEED2 EQU 43H ;喂食維持時間控制寄存器. 2S
COUNT1 EQU 44H ;每1秒引發一次中斷.
SETTEMP EQU 45H ;采集溫度低于此值加熱棒開啟.
ZC4 EQU 46H ;裝需要送顯的數值
ZC5 EQU 47H ;1秒顯示ZC4中數值子程序.
ZC6 EQU 48H ;1秒顯示子程序十位值暫存.
ORG 0000H
SJMP INITIAL
ORG 0003H
LJMP INT0P
ORG 001BH
LJMP IT1P
ORG 0030H
;=====================================================
;各參數,元器件初始化
;=====================================================
INITIAL:
MOV SP,#50H
MOV TMOD,#00H
SETB IT0
MOV COUNT1,#140 ;140
MOV SECOND,#00H
MOV MINUTE,#00H
MOV HOUR,#00H
MOV HEAT1,#05H
MOV FEED1,#8
MOV FEED2,#2
MOV WATER1,#2
MOV WATER2,#10
MOV SETTEMP,#17H
CLR FLAG3
CLR FLAG4
CLR FLAG5
SETB ET1
SETB EA
MOV TH1,#63H
MOV TL1,#18H
SETB RX
CLR TX
CLR P1.0
CLR P1.1
CLR P1.2
CLR P2.5
CLR P2.6
CLR P2.7
SETB P1.3
SETB P1.4
SETB P1.5
SETB P3.3
SETB TR1 ;啟動定時器.
;=====================================================
;主程序
;=====================================================
MAIN:
JNB P1.5,XSXS ;KEYLOCK
SETB TR1
CLR EX0
JB FLAG4,ST1
ST2:
JB FLAG5,ST3
SJMP XS1
ST1:
LCALL TRANSFORM
SJMP ST2
ST3:
LCALL GETTEMP
LCALL CONVERT
;================
JNB P3.3,XS3 ;是否仍需比較,默認為需要.
;================
MOV A,TEMP1
CJNE A,#00H,ST4
MOV A,TEMP2
CJNE A,SETTEMP,ST5
ST5:
JC ST6
CLR P2.7
SJMP XS1
ST4:
SETB P2.7
SJMP XS1
ST6:
SETB P2.7
SJMP XS1
;=================
XS3:
CLR P2.7 ;若不需系統維持恒溫,則總是關閉加熱棒.
;=================
XS1:
JB FLAG3,FOOD
CLR P2.6
SJMP XS2
FOOD:
SETB P2.6
XS2:
JB FLAG2,WATER
CLR P2.5
SJMP XS
WATER:
SETB P2.5
SJMP XS
;===========
XSXS:
CLR P2.7
CLR TR1 ;KEYLOCK
SETB EX0
;===========
XS:
LCALL DISTIME
SJMP MAIN
;=====================================================
;計時器T1中斷服務程序
;=====================================================
IT1P:
PUSH PSW
PUSH ACC
MOV TH1,#63H
MOV TL1,#18H
DJNZ COUNT1,COMEBACK
MOV COUNT1,#180
KAISHI:
DJNZ HEAT1,LOGIC1
MOV HEAT1,#05H ;TIME: 00 01 02 03 04 05 06 07 08 09 10 11 12 13
LOGIC1: ;HEAT1: 5 4 3 2 1 5 4 3 2 1 5 4 3 2
MOV A,HEAT1 ;FLAG4: 0 1 0 0 0 0 1 0 0 0 0 1 0 0
CJNE A,#4,LOGIC2 ;FLAG5: 0 0 0 0 1 0 0 0 0 1 0 0 0 0
SETB FLAG4
SJMP LOGIC6
LOGIC2:
CLR FLAG4
CJNE A,#1,LOGIC3
SETB FLAG5
SJMP LOGIC6
LOGIC3:
CLR FLAG5
LOGIC6:
JNB FLAG3,LOGIC
DJNZ FEED2,LOGIC
MOV FEED2,#2
MOV FEED1,#8
CLR FLAG3
LOGIC:
INC SECOND ;秒.
MOV A,SECOND
CJNE A,#60,COMEBACK
JNB FLAG2,LOGIC8
DJNZ WATER2,LOGIC8
MOV WATER2,#10
MOV WATER1,#8
CLR FLAG2
LOGIC8:
MOV SECOND,#00H
INC MINUTE ;分.
MOV A,MINUTE
CJNE A,#60,COMEBACK
JB FLAG3,LOGIC4
DJNZ FEED1,LOGIC4
SETB FLAG3
LOGIC4:
JB FLAG2,LOGIC7
DJNZ WATER1,LOGIC7
SETB FLAG2
LOGIC7:
MOV MINUTE,#00H
INC HOUR ;時
MOV A,HOUR
CJNE A,#24,COMEBACK
MOV HOUR,#00H
COMEBACK:
POP ACC
POP PSW
RETI
;=====================================================
;采集溫度命令發出,及溫度數據采回.
;=====================================================
TRANSFORM:
LCALL RESET0
JNB FLAG1,TRANSFORM
MOV A,#0CCH ; 跳過ROM匹配
LCALL WRITE
MOV A,#044H ; 發出溫度轉換命令
LCALL WRITE
RET
GETTEMP: CLR TR1
LCALL RESET0
JNB FLAG1,GETTEMP
MOV A,#0CCH ; 跳過ROM匹配
LCALL WRITE
MOV A,#0BEH ; 發出讀溫度命令
LCALL WRITE
LCALL READ ;讀溫度數據
SETB TR1
RET
;=====================================================
;DS18B20 復位與檢測子程序
;FLAG1=1 OK, FLAG1=0 ERROR
;=====================================================
RESET0:
SETB TX
NOP
CLR TX
MOV R7,#64H ;主機發出延時600微秒的復位低脈沖
MOV R6,#03H
RESET1: DJNZ R7,$ ;200v
MOV R7,#64H
DJNZ R6,RESET1
SETB TX ;然后拉高數據線
NOP
MOV R7,#25H
RESET2: JNB RX,RESET3 ;等待DS18B20回應
DJNZ R7,RESET2
SJMP RESET4 ; 延時
RESET3: SETB FLAG1 ; 置標志位,表示DS1820存在
SJMP RESET5
RESET4: CLR FLAG1 ; 清標志位,表示DS1820不存在
SJMP RESET6
RESET5: MOV R0,#0F0H
DJNZ R0,$ ; 時序要求延時一段時間
RESET6: SETB TX
RET
;======================================================
;寫1BYTE數據
;======================================================
WRITE: MOV R7,#8 ;一共8位數據
CLR CY
WR1:
CLR TX ;開始寫入DS18B20總線要處于復位(低)狀態
MOV R6,#09
DJNZ R6,$ ;總線復位保持18微妙以上
RRC A ;把一個字節DATA 分成8個BIT環移給C
MOV TX,C ;寫入一個BIT
MOV R6,#23
DJNZ R6,$ ;等待46微妙
SETB TX ;重新釋放總線
NOP
DJNZ R7,WR1 ;寫入下一個BIT
SETB TX
RET
;======================================================
;從DS18B20中讀出溫度低位、高位和報警值TH、TL
;存入26H、27H、28H、29H
;======================================================
READ: MOV R4,#4 ; 將溫度高位和低位從DS18B20中讀出
MOV R1,#26H ; 存入26H、27H、28H、29H
RE00: MOV R2,#8
RE01: CLR C
SETB TX
NOP
NOP
CLR TX ;讀前總線保持為低
NOP
NOP
NOP
SETB TX ;開始讀總線釋放
MOV R3,#09 ;延時18微妙
DJNZ R3,$
MOV C,RX ;從DS18B20總線讀得一個BIT
MOV R3,#23
DJNZ R3,$ ;等待46微妙
RRC A ;把讀得的位值環移給A
DJNZ R2,RE01 ;讀下一個BIT
MOV @R1,A
INC R1
DJNZ R4,RE00
RET
;=======================================================
;采集溫度轉化:符號位存于TEMP1(30H),
;整數位存于TEMP2(31H),
;小數位存于TEMP3(32H).
;=======================================================
CONVERT:
LCALL CONVERTZ
MOV A,TEMP1
CJNE A,#00H,LOOP
SJMP FANHUI
LOOP: LCALL CONVERTF
FANHUI: RET
CONVERTZ: ;采集溫度為+。
MOV R7,#3
MOV A,27H
CONVERT1: CLR C
RRC A
DJNZ R7,CONVERT1
MOV TEMP1,A
MOV R7,#4
MOV A,TEMPH
MOV ZC2,TEMPL
CONVERT2: CLR C
RRC A
MOV ZC1,A
MOV A,TEMPL
RRC A
MOV TEMPL,A
MOV A,ZC1
DJNZ R7,CONVERT2
MOV A,TEMPL
CLR ACC.7
MOV TEMP2,A
MOV TEMPL,ZC2
CONVERT3: MOV A,TEMPL
ANL A,#0FH
MOV TEMP3,A
RET
CONVERTF: ;采集溫度為-。
MOV A,TEMP3
CPL A
ANL A,#0FH
MOV TEMP3,A
MOV A,TEMP2
CPL A
ANL A,#7FH
MOV TEMP2,A
MOV A,TEMP3
ADD A,#01H
CJNE A,#10H,LOOP1
MOV TEMP3,#0
MOV A,TEMP2
ADD A,#01H
MOV TEMP2,A
SJMP RETURN
LOOP1: MOV TEMP3,A
RETURN: RET
;=======================================================
;延時子程序
;=======================================================
DELAY: ;(1S)
MOV R7,#10
D1: MOV R6,#200
D2: MOV R5,#250
DJNZ R5,$
DJNZ R6,D2
DJNZ R7,D1
RET
DELAY1: ;(4MS)
MOV R6,#10
D3: MOV R5,#200
DJNZ R5,$
DJNZ R6,D3
RET
;=======================================================
;溫度表
;=======================================================
TAB1: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H,06H,07H,08H,08H,09H,09H ;采集小數位(四舍五入).
TAB2: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH ;個位帶小數點(共陰帶小數點數碼管表).
TAB3: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;十位,小數位不帶小數點(共陰不帶小數點數碼管表).
TAB4: DB 00H,40H ;符號位
;=======================================================
;溫度顯示子程序
;=======================================================
DISTEMP:
MOV R7,#50
CB: MOV A,TEMP3 ;顯示小數位。
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV P0,A
CLR P2.3
LCALL DELAY1
SETB P2.3
MOV DPTR,#TAB2 ;顯示個位。
MOV A,TEMP2
MOV B,#10
DIV AB
MOV 35H,A
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
CLR P2.2
LCALL DELAY1
SETB P2.2
MOV DPTR,#TAB3 ;顯示十位。
MOV A,35H
MOVC A,@A+DPTR
MOV P0,A
CLR P2.1
LCALL DELAY1
SETB P2.1
MOV DPTR,#TAB4 ;顯示符號位。
MOV A,TEMP1
CJNE A,#00H,LOOP3
SJMP LOOP4
LOOP3: MOV A,#01H
LOOP4: MOVC A,@A+DPTR
MOV P0,A
CLR P2.0
LCALL DELAY1
SETB P2.0
DJNZ R7,CB
RET
;=======================================================
;時間顯示子程序
;=======================================================
DISTIME:
MOV DPTR,#TAB3
MOV A,SECOND
MOV B,#10
DIV AB
MOV ZC3,A
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
CLR P2.3
LCALL DELAY1
SETB P2.3
MOV A,ZC3
MOVC A,@A+DPTR
MOV P0,A
CLR P2.2
LCALL DELAY1
SETB P2.2
MOV DPTR,#TAB2
MOV A,MINUTE
MOV B,#10
DIV AB
MOV ZC3,A
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
CLR P2.1
LCALL DELAY1
SETB P2.1
MOV DPTR,#TAB3
MOV A,ZC3
MOVC A,@A+DPTR
MOV P0,A
CLR P2.0
LCALL DELAY1
SETB P2.0
RET
ZC4XS:
SETB P2.0
SETB P2.1
MOV DPTR,#TAB3
MOV ZC5,#100
A1: MOV A,ZC4
MOV B,#10
DIV AB
MOV ZC6,A
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
CLR P2.3
LCALL DELAY1
SETB P2.3
MOV A,ZC6
MOVC A,@A+DPTR
MOV P0,A
CLR P2.2
LCALL DELAY1
SETB P2.2
DJNZ ZC5,A1
MOV P1,#78H
RET
;==============================
;中斷鍵盤掃描服務子程序
;==============================
INT0P:
CLR EA ;保護現場,不允許任何中斷。
PUSH ACC
PUSH DPH
PUSH DPL
PUSH PSW
;SETB EA ; ;若不加按鍵去抖則會出錯,中斷被觸發多次引起誤差。(只有此法可以解決按鍵亂跳問題)
G1: MOV R7,#0FEH ;第一行出0
MOV A,#0
MOV R6,#0 ;行值暫存
MOV R5,#0 ;列值暫存
G2: MOV A,R7
MOV P1,A
NOP
NOP
NOP
MOV A,P1
MOV R5,A ;暫存列值。
CPL A
ANL A,#00011000B
JNZ G3 ;累加器A若不為0,轉到判列值子程序,否則進行下一行掃描。
INC R6
MOV A,R7
SETB C
RLC A
MOV R7,A
CJNE R6,#3,G2
LJMP HUI
G3: MOV A,R5
JNB ACC.3,LIE0
JNB ACC.4,LIE1
LJMP HUI
;/*賦列值*/
LIE0: MOV R5,#0
SJMP DECODE
LIE1: MOV R5,#1
SJMP DECODE
DECODE:MOV A,R6
MOV B,#2
MUL AB
ADD A,R5
CLR C
RL A
MOV DPTR,#KeyTab
JMP @A+DPTR
;/*****按鍵功能子程序*****/
KeyTab:
SJMP Fu0
SJMP Fu1
SJMP Fu2
SJMP Fu3
SJMP Fu4
SJMP Fu5
Fu0:
INC MINUTE ;分鐘調整
MOV A,MINUTE
CJNE A,#60,Fu01
MOV MINUTE,#00H
Fu01: LJMP HUI
Fu1:
INC HOUR ;小時調整.
MOV A,HOUR
CJNE A,#60,Fu11
MOV HOUR,#00H
Fu11: LJMP HUI
Fu2:
INC WATER1 ;水泵工作間隔調整.
MOV A,WATER1
CJNE A,#12,Fu21
MOV WATER1,#01H
Fu21:
MOV ZC4,WATER1
LCALL ZC4XS
LJMP HUI
Fu3:
INC SETTEMP ;設定溫度調整.
MOV A,SETTEMP
CJNE A,#30,Fu31
MOV SETTEMP,#20
Fu31: MOV ZC4,SETTEMP
LCALL ZC4XS
LJMP HUI
Fu4:
LCALL DISTEMP
LJMP HUI
Fu5: ;水泵每次工作時間調整.
INC WATER2
MOV A,WATER2
CJNE A,#60,Fu51
MOV WATER2,#01H
Fu51:
MOV ZC4,WATER2
LCALL ZC4XS
HUI:
;CLR EA
POP PSW
POP DPL
POP DPH
POP ACC
SETB EA
MOV P1,#78H
SETB P1.6
RETI
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -