📄 复件 main.asm
字号:
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,$
DJNZ R1,DLY
;―――――――――――――
;然后拉高数据线
SETB DQ
NOP
NOP
NOP
;―――――――――――――
;等待DS18B20回应
MOV R0,#25H
T2: JNB DQ ,T3
DJNZ R0, T2
JMP T4
;―――――――――――――
;置标志位FLAG=1,表示DS1820存在
T3: SETB FLAG
JMP T5
;―――――――――――――
;清标志位FLAG=0,表示DS1820不存在
T4: CLR FLAG
JMP T7
;―――――――――――――
;时序要求延时一段时间
T5: MOV R0,#117
T6: DJNZ R0,T6
;――――――――――――――
T7: SETB DQ
RET
;―――――――――― 写入DS18B20子程序 ―――――――――――
;写入DS18B20(有具体的时序要求)
WRITE_1820:
MOV R2,#8 ;一共8位数据
CLR C ;C=0
WR1:
CLR DQ ;总线低位,开始写入
MOV R3,#6
DJNZ R3,$ ;保持16微秒以上
RRC A ;把字节DATA分成8个BIT环移给C
MOV DQ, C ;写入一个BIT
MOV R3,#23
DJNZ R3,$ ;等待
SETB DQ ;重新释放总线
NOP
DJNZ R2,WR1 ;写入下一个BIT
SETB DQ ;释放总线
RET
;―――――――――― 读出DS18B20子程序 ―――――――――――
;将温度值从DS18B20中读出(有具体的时序要求)
READ_1820:
MOV R4,#4
MOV R1,#TEMPL ;存入25H、26H、27H、28H
RE0:
MOV R2,#8 ;数据一共有8位
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -