📄 温控程序.asm
字号:
ZHENGSHU EQU 57H ;温度整数
XIAOSHU EQU 58H ;温度小数
TEMPH EQU 59H ;设定温度上限值(BCD)
TEMPH1 EQU 4DH ;键盘设定温度值(16进制)
WD1 EQU 33H ;温度十位
WD2 EQU 32H ;温度个位
WD3 EQU 31H ;温度十分位
WD4 EQU 30H ;温度百分位
DQ BIT P1.4 ;温度数据入口
SDA BIT P1.3 ;时间数据传送
SCK BIT P1.2 ;时钟控制状态
ALMONHOU EQU 5AH ;定时开小时寄存器
ALMONMIN EQU 5BH ;定时开分钟寄存器
ALMOFFHOU EQU 5CH ;定时关小时寄存器
ALMOFFMIN EQU 5DH ;定时关分钟寄存器
FLAG1 EQU 34H ;DS18B20的标志位
SEC EQU 35H ;秒寄存器
MIN EQU 36H ;分寄存器
HOU EQU 37H ;时寄存器
DAY EQU 38H ;日寄存器
WEEK EQU 39H ;星期寄存器
MON EQU 3AH ;月寄存器
YEA EQU 3BH ;年寄存器
QJDZH EQU 3CH ;时钟芯片地址
ZJDZH EQU 3DH ;字节地址
NUMBYT EQU 4FH ;数据字节数
MRD EQU 60H ;读出数据缓冲区首地址
EPDA EQU 40H ;发送单个数据缓冲区
FLAG2 EQU 4CH ;外部中断标志位
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP TT0
ORG 0013H
LJMP INT1
ORG 001BH
LJMP TT1
ORG 0030H
;主程序
;**************************************************************
MAIN: MOV 5AH,#20H
MOV 5BH,#40H
MOV 5CH,#20H
MOV 5DH,#41H
MOV 37H,#20H
MOV 36H,#40H
MOV 35H,#40H
MOV 59H,#25
LCALL SEND8563
MAIN1: MOV SP,#70H
MOV TMOD,#11H
MOV TH0,#63H
MOV TL0,#0C0H
MOV TH1,#3CH
MOV TL1,#0B0H
SETB ET0
SETB TR1
SETB TR0
SETB ET1
SETB EX1
SETB PX1
SETB IT1
SETB EA
LCALL GETTIME
LCALL GETTEMP
;LCALL DISPTEMP
;LCALL DELAY1
SJMP MAIN1
TT0: PUSH ACC
PUSH PSW
MOV TH0,#63H
MOV TL0,#0C0H
CLR C
MOV A,57H
CJNE A,59H,N1
N1:JC N2
CLR P1.5
SJMP T0RT
N2:SETB P1.5
T0RT:POP PSW
POP ACC
RETI
TT1: PUSH ACC
PUSH PSW
MOV TH1,#3CH
MOV TL1,#0B0H
CLR C
MOV A,5AH
CJNE A,5CH,CP1
LJMP CP2
CP1:CLR C
MOV A,5AH
CJNE A,5CH,J1
J1:JNC J2 ;TON>TOFF
LJMP N5 ;TON<TOFF
J2:MOV A,HOU
CJNE A,5CH,J3
J3:JNC J4
SETB TR0
LJMP T1RT
J4:CJNE A,5CH,J5
CLR C
MOV A,MIN
CJNE A,5DH,J6
J6:JNC J7
SETB TR0
LJMP T1RT
J7:CLR TR0
LJMP T1RT
J5:CLR C
MOV A,HOU
CJNE A,5AH,J8
J8:JNC J9
CLR TR0
LJMP T1RT
J9:CJNE A,5AH,J12
CLR C
MOV A,MIN
CJNE A,5BH,J11
J11:JNC J12
CLR TR0
LJMP T1RT
J12:SETB TR0
LJMP T1RT
;************************************
CP2:CLR C
MOV A,5BH
CJNE A,5DH,CP4
CP4:JNC NY1
LJMP NX1
NY1:CLR C
MOV A,HOU
CJNE A,5AH,T1RT1
;CLR C
MOV A,MIN
CJNE A,5DH,CP5
CP5:JNC CP6
SETB TR0
LJMP T1RT
CP6:CJNE A,5BH,CP7
CP7:JNC CP8
CLR TR0
LJMP T1RT
CP8:SETB TR0
LJMP T1RT
NX1:CLR C
MOV A,HOU
CJNE A,5AH,T1RT1
SJMP B2
T1RT1:LJMP T1RT
B2:;CLR C
MOV A,MIN
CJNE A,5BH,CP9
CP9:JNC CP10
CLR TR0
LJMP T1RT
CP10:CJNE A,5DH,CP11
CP11:JNC CP12
SETB TR0
LJMP T1RT
CP12:CLR TR0
LJMP T1RT
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;TON<TOFF TON<T<TOFF--ON
;IF HOU>=TON,则先判断二者是否相等,若相等则比较分钟,min大,则开
;若hou>ton,则判断是否小于TOFF,若小于则开,若大于等于TOFF,则先判
;段是否等于,若等于,则判断分钟大小;若大于则关
N5:CLR C
MOV A,HOU
CJNE A,5AH,N14
N14:JNC N15 ;HOU>=5AH
CLR TR0 ;OPEN
LJMP T1RT
N15:MOV A,MIN
CJNE A,5BH,N16
N16:JNC N17 ;MIN>=5DH
SETB TR0
LJMP T1RT
N17:CLR C
MOV A,HOU
CJNE A,5AH,N18
N18:JNC N19 ;HOU>=5AH
CLR TR0
LJMP T1RT
N19:MOV A,MIN
CJNE A,5BH,N20
N20:JNC N21 ;MIN>=5BH
CLR TR0
LJMP T1RT
N21:SETB TR0
LJMP T1RT
T1RT:POP PSW
POP ACC
RETI
INT1: ;键盘锁定(NumLock)
POP ACC
POP PSW
JB FLAG2,T3 ;MOV A,3EH
CLR FLAG2 ;INC A
CLR P1.6
T1:LCALL JZKEY ;MOV 3EH,A
SJMP T1 ;JNB ACC.0,T3
;CLR P1.6
;T1:LCALL JZKEY
;SJMP T1
T3:SETB FLAG2
SETB P1.6
POP PSW
POP ACC
RETI
GETTIME:
PUSH ACC
PUSH PSW
LCALL READTIME
LCALL DISPTIME
POP PSW
POP ACC
RET
GETTEMP:
PUSH ACC
PUSH PSW
LCALL INIT_1820 ;调用复位DS18B20子程序
JB FLAG1,TE1 ;判断DS18B20是否连接正常
LCALL DISPERRO ;显示错误信息
SJMP TE2
TE1:LCALL GET_TEMPER ;调用读温度子程序
LCALL WENDUZH ;调用温度转换子程序
;LCALL DELAY1 ;调用延时0.5s子程序
POP PSW
POP ACC
TE2:RET
;PCF8583操作子程序
;*****************************************************************
SEND8563:
Lcall dy100ms
MOV QJDZH,#0A2H ;设置系统时间
mov zjdzh,#02h
mov epda,SEC
LCALL wrep1b
MOV QJDZH,#0A2H
mov zjdzh,#03h
mov epda,MIN
LCALL wrep1b
MOV QJDZH,#0A2H
mov zjdzh,#04h
mov epda,HOU
LCALL wrep1b
MOV QJDZH,#0A2H
mov zjdzh,#05h
mov epda,DAY
LCALL wrep1b
MOV QJDZH,#0A2H
mov zjdzh,#07h
mov epda,MON
LCALL wrep1b
MOV QJDZH,#0A2H
mov zjdzh,#08h
mov epda,YEA
LCALL wrep1b
Lcall dy100ms
ret
READTIME:
MOV QJDZH,#0A2H ;读实时时间 60h........
MOV ZJDZH,#02H
MOV NUMBYT,#08H ;8个数据
LCALL RDNBYT
mov a,60h
anl a,#7fh
mov SEC,a
mov a,61h
anl a,#7fh
mov MIN,a
mov a,62h
anl a,#3fh
mov HOU,a
mov a,63h
anl a,#3fh
mov DAY,a
mov a,65h
anl a,#1fh
mov MON,a
mov a,66h
anl a,#0FFh
mov YEA,a
ret
;###############################i2c总线协议
STA:SETB SDA
SETB SCK
NOP
NOP
CLR SDA
NOP
NOP
CLR SCK
RET
STOP:CLR SDA
SETB SCK
NOP
NOP
SETB SDA
NOP
NOP
CLR SCK
RET
SACK:CLR SDA
SETB SCK
NOP
NOP
CLR SCK
SETB SDA
RET
SNACK:SETB SDA
SETB SCK
NOP
NOP
CLR SCK
CLR SDA
RET
CACK:SETB SDA
SETB SCK
CLR F0
mov c,sda
jnc cend
SETB F0
CEND:CLR SCK
NOP
NOP
RET
WRBYT:MOV R7,#8
WLP:RLC A
JC WR1
LJMP WR0
WLP1:DJNZ R7,WLP
RET
WR1:SETB SDA
SETB SCK
NOP
NOP
CLR SCK
CLR SDA
LJMP WLP1
WR0:CLR SDA
SETB SCK
NOP
NOP
CLR SCK
LJMP WLP1
RDBYT:MOV R7,#8
RLP:SETB SDA
SETB SCK
MOV C,SDA
MOV A,EPDA
RLC A
MOV EPDA,A
NOP
CLR SCK
NOP
DJNZ R7,RLP
RET
WREP1B:LCALL STA
MOV A,QJDZH
LCALL WRBYT
LCALL CACK
JB F0,WREP1B
MOV A,ZJDZH
LCALL WRBYT
LCALL CACK
JB F0,WREP1B
MOV A,EPDA
LCALL WRBYT
LCALL CACK
JB F0,WREP1B
LCALL STOP
LCALL DY10MS
RET
RDNBYT:LCALL STA
MOV A,QJDZH
LCALL WRBYT
LCALL CACK
JB F0,RDNBYT
MOV A,ZJDZH
LCALL WRBYT
LCALL CACK
JB F0,RDNBYT
LCALL STA
MOV A,QJDZH
INC A
LCALL WRBYT
LCALL CACK
JB F0,RDNBYT
MOV R1,#MRD
RDN1:LCALL RDBYT
MOV @R1,A
DJNZ NUMBYT,ACK
LCALL SNACK
LCALL STOP
RET
ACK:LCALL SACK
INC R1
LJMP RDN1
;键盘扫描子程序
;****************************************************************
JZKEY:
PUSH ACC
PUSH PSW
RS:MOV P0,#0F0H
MOV A,P0
CPL A
ANL A,#0F0H
MOV R1,A
JZ RS ;无键按下继续扫描
MOV P0,#0FH
MOV A,P0
CPL A
ANL A,#0FH
MOV R2,A
JZ RS
LCALL DELAY2
WAIT:
MOV A,P0
CPL A
ANL A,#0FH
JNZ WAIT
MOV A,R1
MOV R1,#03H
MOV R3,#04H
CLR C
JZKEY2:
RLC A
JC JZKEY3
DEC R1
DJNZ R3,JZKEY2
RET
JZKEY3:
MOV A,R2
MOV R2,#00H
MOV R3,#04H
CLR C
JZKEY4:
RRC A
JC JZKEY5
INC R2
DJNZ R3,JZKEY4
JZKEY5:
MOV A,R2
CLR C
RLC A
RLC A
ADD A,R1
CLR C
;*****************************
CJNE A,#10,JK1
JK1:JNC JK2
MOV 3FH,A
;SJMP JKRT
RET
JK2:CJNE A,#11,JK3
JK3:JNC JK4
LJMP KEY10
JK4:CJNE A,#12,JK5
JK5:JNC JK6
LJMP KEY11
JK6:CJNE A,#13,JK7
JK7:JNC JK8
LJMP KEY12
JK8:CJNE A,#14,JK9
JK9:JNC JK10
LJMP KEY13
JK10:LJMP KEY14
JKRT:RET
;键盘功能 KEY10~KEY14功能键
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
KEY10: ;温度/日期显示控制
MOV A,50H
INC A
MOV 50H,A
JNB ACC.0,K5
LCALL GETTEMP
LCALL DISPTEMP
LCALL DELAY1
SJMP K6
K5:LCALL DISPDATE
LCALL DELAY1
K6:POP PSW
POP ACC
RET
KEY11: ;闹钟开关
MOV A,51H
JNB ACC.0,K1
CLR TR1
LCALL DISPOFF
SJMP K2
K1:SETB TR1
LCALL DISPON
K2:INC A
MOV 51H,A
POP PSW
POP ACC
RET
KEY12: ;开关机
MOV A,52H
JB ACC.0,K3
ACALL TURNON
SJMP K4
K3:ACALL TURNOFF
K4:INC A
MOV 52H,A
POP PSW
POP ACC
RET
KEY13: ;设定定时开关时间
MOV A,53H
INC A
MOV 53H,A
JNB ACC.0,K7
LCALL DISPON
LCALL SETALMON ;定时开
SJMP K8
K7:LCALL DISPOFF
LCALL SETALMOFF ;定时关
K8:POP PSW
POP ACC
RET
KEY14:LCALL SETtemph
POP PSW
POP ACC
RET
KEY141: ;设定时间、温度上限值、日期
CLR C
MOV A,54H
INC A
MOV 54H,A
CJNE A,#2,K9
K9:JNC K10
LCALL SETTIME
SJMP K13
K10:CJNE A,#3,K11
K11:JNC K12
LCALL SETTEMPH
SJMP K13
K12:LCALL SETDATE
MOV 54H,#0
K13:POP PSW
POP ACC
RET
TURNOFF:
SETB P1.5
CLR TR0
CLR TR1
LCALL DISPOFF
RET
TURNON:
CLR P1.5
SETB TR0
SETB TR1
LCALL DISPON
RET
SETALMON: ;设定开机时间(4位)
ACALL K15
LCALL JZKEY
MOV A,5AH ;设定小时
ANL A,#0FH
MOV 5AH,A
MOV A,3FH
SWAP A
ADD A,5AH
MOV 5AH,A
ACALL K15
LCALL JZKEY
MOV A,5AH
ANL A,#0F0H
MOV 5AH,A
MOV A,3FH
ADD A,5AH
MOV 5AH,A
ACALL K15
LCALL JZKEY
MOV A,5BH ;设定分钟
ANL A,#0FH
MOV 5BH,A
MOV A,3FH
SWAP A
ADD A,5BH
MOV 5BH,A
ACALL K15
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -