📄 温控程序.asm
字号:
LCALL JZKEY
MOV A,5BH
ANL A,#0F0H
MOV 5BH,A
MOV A,3FH
ADD A,5BH
MOV 5BH,A
K15:MOV R6,#2
LCALL XSLOOP
MOV A,5AH
LCALL XSLOOP4
MOV A,5BH
LCALL XSLOOP3
LCALL DELAY1
RET
SETALMOFF: ;设定关机时间(4位)
ACALL K16
LCALL JZKEY
MOV A,5CH ;设定小时
ANL A,#0FH
MOV 5CH,A
MOV A,3FH
SWAP A
ADD A,5CH
MOV 5CH,A
ACALL K16
LCALL JZKEY
MOV A,5CH
ANL A,#0F0H
MOV 5CH,A
MOV A,3FH
ADD A,5CH
MOV 5CH,A
ACALL K16
LCALL JZKEY
MOV A,5DH ;设定分钟
ANL A,#0FH
MOV 5DH,A
MOV A,3FH
SWAP A
ADD A,5DH
MOV 5DH,A
ACALL K16
LCALL JZKEY
MOV A,5DH
ANL A,#0F0H
MOV 5DH,A
MOV A,3FH
ADD A,5DH
MOV 5DH,A
K16:MOV R6,#2
LCALL XSLOOP
MOV A,5CH
LCALL XSLOOP4
MOV A,5DH
LCALL XSLOOP3
LCALL DELAY1
RET
SETTIME: ;设定时间(6位)
LCALL DISPTIME
LCALL JZKEY
MOV A,37H ;设定小时
ANL A,#0FH
MOV 37H,A
MOV A,3FH
SWAP A
ADD A,37H
MOV 37H,A
LCALL DISPTIME
LCALL JZKEY
MOV A,37H
ANL A,#0F0H
MOV 37H,A
MOV A,3FH
ADD A,37H
MOV 37H,A
LCALL DISPTIME
LCALL JZKEY
MOV A,36H ;设定分钟
ANL A,#0FH
MOV 36H,A
MOV A,3FH
SWAP A
ADD A,36H
MOV 36H,A
LCALL DISPTIME
LCALL JZKEY
MOV A,36H
ANL A,#0F0H
MOV 36H,A
MOV A,3FH
ADD A,36H
MOV 36H,A
LCALL DISPTIME
LCALL JZKEY
MOV A,35H ;设定秒
ANL A,#0FH
MOV 35H,A
MOV A,3FH
SWAP A
ADD A,35H
MOV 35H,A
LCALL DISPTIME
LCALL JZKEY
MOV A,35H
ANL A,#0F0H
MOV 35H,A
MOV A,3FH
ADD A,35H
MOV 35H,A
LCALL DISPTIME
LCALL SEND8563 ;@@@@@@@@@@@@@@@@@@@@@@@*****
RET
SETDATE: ;设定日期(6位)
LCALL DISPDATE
LCALL JZKEY
MOV A,3BH ;设定年
ANL A,#0FH
MOV 3BH,A
MOV A,3FH
SWAP A
ADD A,3BH
MOV 3BH,A
LCALL DISPDATE
LCALL JZKEY
MOV A,3BH
ANL A,#0F0H
MOV 3BH,A
MOV A,3FH
ADD A,3BH
MOV 3BH,A
LCALL DISPDATE
LCALL JZKEY
MOV A,3AH ;设定月
ANL A,#0FH
MOV 3AH,A
MOV A,3FH
SWAP A
ADD A,3AH
MOV 3AH,A
LCALL DISPDATE
LCALL JZKEY
MOV A,3AH
ANL A,#0F0H
MOV 3AH,A
MOV A,3FH
ADD A,3AH
MOV 3AH,A
LCALL DISPDATE
LCALL JZKEY
MOV A,38H ;设定DAY
ANL A,#0FH
MOV 38H,A
MOV A,3FH
SWAP A
ADD A,38H
MOV 38H,A
LCALL DISPDATE
LCALL JZKEY
MOV A,38H
ANL A,#0F0H
MOV 38H,A
MOV A,3FH
ADD A,38H
MOV 38H,A
LCALL DISPDATE
LCALL SEND8563
RET
SETTEMPH: ;设定温度上限值(2位)
ACALL K14
LCALL JZKEY
MOV A,4DH
ANL A,#0FH
MOV 4DH,A
MOV A,3FH
SWAP A
ADD A,4DH
MOV 4DH,A
ACALL K14
LCALL JZKEY
MOV A,4DH
ANL A,#0F0H
MOV 4DH,A
MOV A,3FH
ADD A,4DH
MOV 4DH,A
ACALL K14
;SJMP TEMPHZH
TEMPHZH: CLR C
MOV A,4DH
CJNE A,#10H,TZ1
TZ1:JNC TZ2
MOV 59H,A
RET
TZ2:CJNE A,#20H,TZ3
TZ3:JNC TZ4
SUBB A,#5
MOV 59H,A
RET
TZ4:CJNE A,#30H,TZ5
TZ5:JNC TZ6
SUBB A,#11
MOV 59H,A
RET
TZ6:CJNE A,#40H,TZ7
TZ7:JNC TZ8
SUBB A,#17
MOV 59H,A
RET
TZ8:CJNE A,#50H,TZ9
TZ9:JNC TZ10
SUBB A,#23
MOV 59H,A
RET
TZ10:CJNE A,#60H,TZ11
TZ11:JNC TZ12
SUBB A,#29
MOV 59H,A
RET
TZ12:CJNE A,#70H,TZ13
TZ13:JNC TZ14
SUBB A,#35
MOV 59H,A
RET
TZ14:CJNE A,#80H,TZ15
TZ15:JNC TZ16
SUBB A,#41
MOV 59H,A
RET
TZ16:SUBB A,#47
MOV 59H,A
RET
K14: MOV R6,#4
LCALL XSLOOP
MOV A,4DH
LCALL XSLOOP3
LCALL DELAY1
RET
;DS18B20操作子程序
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;DS18B20初始化程序
INIT_1820:
SETB DQ
NOP
CLR DQ
MOV R0,#36 ;主机发出延时540微秒的复位低脉冲
LCALL DELAY
SETB DQ ;然后拉高数据线
NOP
NOP
MOV R0,#36
TS2:
JNB DQ,TS3 ;等待DS18B20回应
DJNZ R0,TS2 ;延时
LJMP TS4
TS3:
SETB FLAG1 ;置标志位,表示DS1820存在
LJMP TS5
TS4:
CLR FLAG1 ;清标志位,表示DS1820不存在
LJMP TS6
TS5: ;复位成功!时序要求延时一段时间
MOV R0,#06BH
DJNZ R0,$
TS6:
SETB DQ
RET
; 读出转换后的温度值
GET_TEMPER:
SETB DQ
LCALL INIT_1820 ;先复位DS18B20
JB FLAG1,TSS2
RET ;若DS18B20不存在则返回
TSS2:
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
MOV R0,#50 ;等待AD转换结束
LCALL DELAY
LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_1820
RET
;写DS18B20的子程序
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
WRITE_1820:
MOV R2,#8 ;一共8位数据
CLR C
WR11:
CLR DQ
MOV R3,#6 ;延时
DJNZ R3,$
RRC A ;右移,低位送入C
MOV DQ,C
MOV R3,#23 ;延时
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR11 ;等待写完8位数据
SETB DQ
RET
;读DS18B20的程序
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
READ_1820:
MOV R4,#2
MOV R1,#56H ;低位存入56H,高位存入55H
RE0:
MOV R2,#8 ;8位数据
RE1:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#09 ;延时
DJNZ R3,$
MOV C,DQ ;温度数据送入C
MOV R3,#23 ;延时
DJNZ R3,$
RRC A
DJNZ R2,RE1
MOV @R1,A
DEC R1
DJNZ R4,RE0
RET
;温度计算子程序
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
WENDUZH:
MOV A,#0FH ;将56H低四位送入小数58H
ANL A,56H
MOV 58H,A
MOV A,#0F0h ;将56H高四位和55H低四位送入整数57H
ANL A,56H
SWAP A
MOV 57H,A
MOV A,55H
ANL A,#0FH
SWAP A
ADD A,57H
MOV 57H,A
WENDUZH1:
;整数转换
MOV A,ZHENGSHU
MOV B,#10
DIV AB
MOV WD1,A ;十位在A,送入WD1
MOV WD2,B ;个位在B,送入WD2
;小数转换,A*0.0625并对第二位小数进行四舍五入
;将处理结果送入WD3,WD4
MOV A,XIAOSHU
CJNE A,#0,L1
MOV WD3,#0
MOV WD4,#0
LJMP L16
L1: CJNE A,#1,L2
MOV WD3,#0
MOV WD4,#6
LJMP L16
L2: CJNE A,#2,L3
MOV WD3,#1
MOV WD4,#3
LJMP L16
L3: CJNE A,#3,L4
MOV WD3,#1
MOV WD4,#9
LJMP L16
L4: CJNE A,#4,L5
MOV WD3,#2
MOV WD4,#5
LJMP L16
L5: CJNE A,#5,L6
MOV WD3,#3
MOV WD4,#1
LJMP L16
L6: CJNE A,#6,L7
MOV WD3,#3
MOV WD4,#8
LJMP L16
L7: CJNE A,#7,L8
MOV WD3,#4
MOV WD4,#4
LJMP L16
L8: CJNE A,#8,L9
MOV WD3,#5
MOV WD4,#0
LJMP L16
L9: CJNE A,#9,L10
MOV WD3,#5
MOV WD4,#6
LJMP L16
L10:CJNE A,#10,L11
MOV WD3,#6
MOV WD4,#3
LJMP L16
L11:CJNE A,#11,L12
MOV WD3,#6
MOV WD4,#9
LJMP L16
L12:CJNE A,#12,L13
MOV WD3,#7
MOV WD4,#5
LJMP L16
L13:CJNE A,#13,L14
MOV WD3,#8
MOV WD4,#1
LJMP L16
L14:CJNE A,#14,L15
MOV WD3,#8
MOV WD4,#8
LJMP L16
L15:MOV WD3,#9
MOV WD4,#4
L16:CLR P1.4
NOP
RET
;显示子程序
;*************************************************************
DISPTIME:
MOV A,37H ;显示小时
LCALL XSLOOP4
MOV A,36H ;显示分
LCALL XSLOOP4
MOV A,35H ;显示秒
LCALL XSLOOP3
LCALL DELAY1
RET
DISPDATE:
MOV A,3BH ;显示年
LCALL XSLOOP4
MOV A,3AH ;显示月
LCALL XSLOOP4
MOV A,38H ;显示日
LCALL XSLOOP3
LCALL DELAY1
RET
XSLOOP3:MOV 4EH,A ;HAVE NODOT
ANL A,#0F0H
SWAP A
MOV 5FH,A
MOV A,4EH
ANL A,#0FH
MOV 5EH,A
MOV DPTR,#TAB
MOV A,5FH
LCALL XSLOOP1
MOV A,5EH
LCALL XSLOOP1
RET
XSLOOP4: ;HAVE DOT
MOV 4EH,A
ANL A,#0F0H
SWAP A
MOV 5FH,A
MOV A,4EH
ANL A,#0FH
MOV 5EH,A
MOV DPTR,#TAB
MOV A,5FH
LCALL XSLOOP1
MOV DPTR,#TAB1
MOV A,5EH
LCALL XSLOOP1
RET
XSLOOP31:
MOV B,#10
DIV AB ;低位在B,高位在A
MOV 5EH,B
MOV 5FH,A
MOV DPTR,#TAB
MOV A,5FH ;显示高位
LCALL XSLOOP1
MOV A,5EH ;显示低位(无小数点)
LCALL XSLOOP1
RET
XSLOOP41:
MOV B,#10
DIV AB
MOV 5EH,B
MOV 5FH,A
MOV DPTR,#TAB
MOV A,5FH ;显示高位
LCALL XSLOOP1
MOV DPTR,#TAB1
MOV A,5EH ;显示低位(有小数点)
LCALL XSLOOP1
RET
DISPTEMP:
MOV R6,#2
ACALL XSLOOP
MOV A,33H ;显示十位
MOV DPTR,#TAB
ACALL XSLOOP1
MOV A,32H ;显示个位
MOV DPTR,#TAB1
ACALL XSLOOP1
MOV A,31H ;显示十分位
MOV DPTR,#TAB
ACALL XSLOOP1
MOV A,30H ;显示百分位
MOV DPTR,#TAB
ACALL XSLOOP1
RET
;不用数码管不显示
MOV R6,#02H
XSLOOP:
MOV A,#10
MOV DPTR,#TAB
ACALL XSLOOP1
DJNZ R6,XSLOOP
RET
;移位显示子程序
XSLOOP1:
MOVC A,@A+DPTR
CLR C
MOV R5,#8
XSLOOP2:
RLC A
MOV P1.0,C
CLR P1.1
NOP
SETB P1.1
NOP
DJNZ R5,XSLOOP2
RET
;0.5s延时子程序
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
DELAY1:
MOV R7,#50
DE2:MOV R6,#100
DE1:MOV R0,#50
DJNZ R0,$
DJNZ R6,DE1
DJNZ R7,DE2
RET
DISPOFF:
MOV R6,#3
LCALL XSLOOP
MOV DPTR,#TAB
MOV A,#0
LCALL XSLOOP1
MOV A,#12
LCALL XSLOOP1
MOV A,#12
LCALL XSLOOP1
LCALL DELAY1
RET
DISPON:
MOV R6,#4
LCALL XSLOOP
MOV DPTR,#TAB
MOV A,#0
LCALL XSLOOP1
MOV A,#11
LCALL XSLOOP1
LCALL DELAY1
RET
DISPERRO:
MOV DPTR,#TAB ;错误信息显示程序
MOV A,#11
LCALL XSLOOP1
MOV A,#0
LCALL XSLOOP1
MOV A,#1
LCALL XSLOOP1 ;显示"no1820"
MOV A,#8
LCALL XSLOOP1
MOV A,#2
LCALL XSLOOP1
MOV A,#0
LCALL XSLOOP1
LCALL DELAY1
RET
;TAB:八段无小数点代码,TAB1:八段有小数点代码
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFh,0C8H,8EH
TAB1:DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
;15us延时子程序
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
DELAY:
LP:MOV R1,#06H
LP1:DJNZ R1,LP1
DJNZ R0,LP
RET
;15ms延时
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
DELAY2:
MOV R7,#30
DE3:MOV R6,#248
DJNZ R6,$
DJNZ R7,DE3
RET
;100ms延时
DY100MS:
MOV R5,#10
DE4:LCALL DY10MS
DJNZ R5,DE4
RET
;10ms延时
DY10MS:
MOV R7,#20
DE5:MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,DE5
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -