📄 main.asm.bak
字号:
A8: JB K2, A10 ;按下K2(设定键),程序向下运行
ACALL SPK_BZ ;蜂鸣器响一声
DEC TEMP_TH ;TH值减1
MOV A,TEMP_TH ;TH值送入A
CJNE A,#0FFH,A9 ;比较,若A=0FF,程序向下运行
JMP A12 ;转移到A12
A9: ACALL LOOK_ALARM ;调用显示信息区子程序
MOV R5, #10
ACALL DELAY ;调用延时子程序
JMP A0 ;转移到A12
;――――――――――――――
;TL值调整(减少)
A10: JB K3, A13 ;按K3(TL值设定键),程序向下运行
ACALL SPK_BZ ;蜂鸣器响一声
DEC TEMP_TL ;TL值减1
MOV A,TEMP_TL ;TH值送入A
CJNE A,#0FFH,A11 ;比较,若A=0FF,程序向下运行
JMP A12 ;转移到A12
A11: ACALL LOOK_ALARM ;调用显示信息区子程序
MOV R5, #10
ACALL DELAY ;调用延时子程序
JMP A0 ;转移到A0
A12: CPL 20H.1 ;UP/DOWN 标记反向
JMP A3 ;转移到A3 ,TH值调整(增加)
A13: JMP A7 ;转移到A7 ,确定调整 OK
RET ;子程序返回
;---------- 显示信息区子程序 -----------
LOOK_ALARM:
MOV DPTR,#M_ALAX2 ;存表
MOV A,#2 ;显示在第二行
ACALL LCD_PRINT ;调用显示字符子程序
MOV A,#0C6H ;显示起始地址为第二行第7位
ACALL TEMP_BJ1 ;调用显示温度标记子程序
MOV A,TEMP_TH ;加载TH数据
MOV X,#3 ;设置位置
ACALL SHOW_LINE2H ;显示数据
;―――――――――――――
MOV A,#0CEH ;设定显示起始地址为第二行第15位
ACALL TEMP_BJ1 ;调用显示温度标记子程序
MOV A,TEMP_TL ;加载TL数据
MOV X,#12 ;设置位置
ACALL SHOW_LINE2L ;显示数据
RET
;――――――――――――――
M_ALAX1:
DB " LOOK ALERT CODE",0
M_ALAX2:
DB "TH: TL: ",0
;――――――――――――――
;――――――显示温度标记子程序――――――
TEMP_BJ1:
ACALL WR_COMM ;调用写指令子程序
MOV DPTR,#BJ2 ;存代码表
MOV R1,#0 ;使指针指到表中第一个码
MOV R0,#2 ;取码次数
B0: MOV A,R1 ;A为0
MOVC A,@A+DPTR ;读取码
ACALL WR_DATA ;调用写数据子程序
INC R1 ;R1值加1
DJNZ R0,B0 ;判断是否将代码读取完?
RET
;―――――――――――――
BJ2: ;代码表
DB 00H,"C"
;―――――――――――――
;―――――在 LCD 的第二行显示高温数字――――
SHOW_LINE2H:
MOV B,#100 ;设置被除数,B为百位数
DIV AB ;除法运算,结果A存商数,B存余数
ADD A,#30H ;低半字节加30得到ASCII码(转换为字符)
PUSH B ;B放入堆栈暂存起来
MOV B,X ;设置LCD显示的位置
ACALL LCDP2 ;由LCD显示出来
;―――――――――――――
POP B ;B由堆栈取出来
MOV A,#0AH ;A赋值10
XCH A,B ;A、B数据互换,B为十位数
DIV AB ;除法运算,结果A存商数,B存余数
ADD A,#30H ;转换为字符
INC X ;LCD显示位位置加1
PUSH B ;B放入堆栈暂存起来
MOV B,X ;设置LCD显示的位置
ACALL LCDP2 ;由LCD显示出来
;―――――――――――――
POP B ;B由堆栈取出来
INC X ;LCD显示位位置加1
MOV A,B ;B为个位数
MOV B,X ;设置LCD显示的位置
ADD A,#30H ;转换为字符
ACALL LCDP2 ;由LCD显示出来
RET
;―――――在 LCD 的第二行显示低温数字―――――
SHOW_LINE2L:
MOV B,#100 ;设置被除数
DIV AB ;除法运算,结果A存商数,B存余数
MOV A,#0AH ;A赋值10
XCH A,B ;A、B数据互换,B为十位数
DIV AB ;除法运算,结果A存商数,B存余数
ADD A,#30H ;转换为字符
PUSH B ;B放入堆栈暂存起来
MOV B,X ;设置LCD显示的位置
CALL LCDP2 ;由LCD显示出来
;――――――――――――――
POP B ;B由堆栈取出来
INC X ;LCD显示位位置加1
MOV A,B ;B为个位数
MOV B,X ;设置LCD显示的位置
ADD A,#30H ;转换为字符
ACALL LCDP2 ;由LCD显示出来
RET
;----------- 温度值比较子程序------------
;实际温度值与标记温度值比较
TEMP_COMP:
MOV A,TEMP_TH ;高温报警值送入A
SUBB A,TEMP_ZH ;减数>被减数,则
JC TCL1 ;借位标志位C=1,转TCL1
MOV A,TEMP_ZH ;实时温度送入A
SUBB A,TEMP_TL ;减数>被减数,则
JC TCL2 ;借位标志位C=1,转TCL2
MOV DPTR,#BJ5 ;存表BJ5
ACALL TEMP_BJ3 ;调用显示高、低温度及加热标记子程序
CLR RELAY ;继电器吸合
RET
;―――――――――――――
TCL1: ;实时温度>高温报警值的处理程序
MOV DPTR,#BJ3 ;存入#BJ3表
ACALL TEMP_BJ3 ;调用显示高、低温度及加热标记子程序
SETB RELAY ;继电器关闭
ACALL SPK_BZ ;调用鸣响子程序
RET
;―――――――――――――-
TCL2: ;实时温度<高温报警值的处理程序
MOV DPTR,#BJ4 ;存入#BJ4表
ACALL TEMP_BJ3 ;调用显示高、低温度及加标记子程序
ACALL SPK_BZ ;调用鸣响子程序
RET
;--- 显示高、低温度及加热标记程序----
TEMP_BJ3:
MOV A,#0CEH ;设定显示位置
ACALL WR_COMM ;调用写指令子程序
MOV R1,#0 ;使指针指到表中第一个码
MOV R0,#2 ;取码次数
BJJ: MOV A,R1 ;A为0
MOVC A,@A+DPTR ;读取码
ACALL WR_DATA ;调用写数据子程序
INC R1 ;R1值加1
DJNZ R0,BJJ ;判断是否将代码读取完?
RET
;―――――――――――――
BJ3:
DB ">H"
BJ4:
DB "<L"
BJ5:
DB " !"
;―――――――――――――
;--------- 报警上下线写入暂存器子程序 --------
WR_THL:
JB FLAG,WR_T ;FLAG=1,表示DS18B20存在,转WR_T 处
RET
;―――――――――――――
WR_T:
ACALL RESET_1820 ;调用18B20复位子程序
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820 ;调用写入子程序
MOV A,#4EH ;写暂存寄存器
LCALL WRITE_1820 ;调用写入子程序
MOV A,TEMP_TH ;TH(报警上限)
LCALL WRITE_1820 ;调用写入子程序
MOV A,TEMP_TL ;TL(报警下限)
LCALL WRITE_1820 ;调用写入子程序
MOV A,#7FH ;12位精确度
LCALL WRITE_1820 ;调用写入子程序
RET
;--------- 报警值拷贝到EEROM子程序 -----------
WRITE_E2:
ACALL RESET_1820 ;调用18B20复位子程序
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820 ;调用写入子程序
MOV A,#48H ;[48H]为拷贝到EEROM的指令代码
LCALL WRITE_1820 ;调用写入子程序
RET
;---------- 报警值拷贝回暂存器子程序 ----------
RE_THL:
ACALL RESET_1820 ;调用18B20复位子程序
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820 ;调用写入子程序
MOV A,#0B8H ;把EEROM里的温度报警值拷贝回暂存器
ACALL WRITE_1820 ;调用写入子程序
RET
;---------- 处理温度 BCD 码子程序 ----------
CONV_TEMP:
MOV A,TEMPH ;判温度是否零下
ANL A,#80H
JZ TC1 ;温度零转TC1处
CLR C ;C=0
MOV A,TEMPL ;二进制数求补(双字节)
CPL A ;取反加1
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH
CPL A
ADDC A,#00H
MOV TEMPH,A
JMP TC2
;―――――――――――――
TC1: MOV TEMPHC,#0AH
TC2: MOV A,TEMPHC
SWAP A ;高、低位交换
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH ;乘0.0625
MOV DPTR,#DOTTAB
MOVC A,@A+DPTR
MOV TEMPLC,A ;TEMPLC LOW=小数部分 BCD
;―――――――――――――
MOV A,TEMPL ;整数部分
ANL A,#0F0H ;取出高四位
SWAP A ;高、低位交换
MOV TEMPL,A
MOV A,TEMPH
ANL A,#0FH ;取出低四位
SWAP A ;高、低位交换
ORL A,TEMPL ;重新组合
MOV TEMP_ZH,A
LCALL HEX2BCD1
MOV TEMPL,A
ANL A,#0F0H ;取出高四位
SWAP A ;高、低位交换
ORL A,TEMPHC ;TEMPHC LOW = 十位数 BCD
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH ;取出低四位
SWAP A ;高、低位交换
ORL A,TEMPLC ;TEMPLC HI = 个位数 BCD
MOV TEMPLC,A
MOV A,R4
JZ TC3
ANL A,#0FH ;取出低四位
SWAP A ;高、低位交换
MOV R4,A
MOV A,TEMPHC ;TEMPHC HI = 百位数 BCD
ANL A,#0FH ;取出低四位
ORL A,R4
MOV TEMPHC,A
TC3: RET
;―――――――――――――
HEX2BCD1:
MOV B,#064H ;十六进制-> BCD
DIV AB ;B= A % 100
MOV R4,A ;R4 = 百位数
MOV A,#0AH
XCH A,B
DIV AB ;B = A % B
SWAP A ;高、低位交换
ORL A,B
RET
;―――――――――――――
; 小数部分码表
DOTTAB:
DB 00H,00H,01H,01H,02H,03H,03H,04H
DB 05H,05H,06H,06H,07H,08H,08H,09H
;―――――――――――――
;-------- 显示区BCD 码温度值刷新子程序 --------
DISP_BCD:
MOV A,TEMPLC ;个位数BCD码送入A
ANL A,#0FH ;取低位码
MOV 70H,A ;小数位
MOV A,TEMPLC
SWAP A ;高、低位交换
ANL A,#0FH ;取结果数的高位
MOV 71H,A ;个位
MOV A,TEMPHC
ANL A,#0FH ;取低位码
MOV 72H,A ;十位
MOV A,TEMPHC
SWAP A ;高、低位交换
ANL A,#0FH ;取结果数的高位
MOV 73H,A ;百位
MOV A,TEMPHC
ANL A,#0F0H ;取低位码
CJNE A,#010H,DI0
JMP DI2
;―――――――――――――
DI0: MOV A,TEMPHC
ANL A,#0FH ;取低位码
JNZ DI2 ;十位数是0
MOV A,TEMPHC
SWAP A ;高、低位交换
ANL A,#0FH ;取结果数的高位
MOV 73H,#0AH ;符号位不显示
MOV 72H,A ;十位数显示符号
DI2: RET
;―――――――― DS18B20复位初始化子程序 ――――――――――
RESET_1820: ;复位(有具体的时序要求)
SETB DQ
NOP
CLR DQ
;―――――――――――――
;主机发出延时537微秒的复位低脉冲
MOV R1,#3
DLY: MOV R0,#107
DJNZ R0,$
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -