📄 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 + -