📄 zong.asm
字号:
;内存分配声明
TEMPER_L EQU 29H;用于保存读出温度的低字节
TEMPER_H EQU 28H;用于保存读出温度的高字节
T_DF EQU 27H ;FORMAT后的小数部分(decimal fraction),半字节的温度小数(存在低四位)
T_INTEGER EQU 26H ;FORMAT后的整数部分(integer),将两字节的温度整合成1字节
FLAG1 BIT 50H;位地址50H是字节2AH的最低位,用作是否检测到DS18B20的标志位
A_BIT EQU 20h ;液晶十位数存放内存位置
B_BIT EQU 21h ;液晶个位数存放内存位置
C_BIT EQU 22H ;个位小数
D_BIT EQU 23H ;十位小数
E_BIT EQU 24H ;百位小数
F_BIT EQU 25H ;千位小数
RS BIT P2.6 ;这3位是液晶屏的控制信号,连接方式由具体硬件而定
RW BIT P2.7
E BIT P2.5
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT
ORG 0100H
MAIN: SETB EA
SETB EX0
SETB IT0
LCALL MAIN1
LCALL MAIN2
LCALL MAIN3
LCALL MAIN4
LJMP MAIN
INT: MOV A,P1
ORL A,#0FH
MOV P1,A
MOV A,P1
ANL A,#0FH
CJNE A,#0FH,NEXT
AJMP INT2
NEXT: JNB ACC.3,FUNC3
JNB ACC.2,FUNC2
JNB ACC.1,FUNC1
JNB ACC.0,FUNC0
INT2:
RETI
FUNC3: LCALL MAIN4
FUNC31: MOV A,P1
JNB ACC.3,FUNC31
AJMP INT2
FUNC2: LCALL MAIN3
FUNC21: MOV A,P1
JNB ACC.2,FUNC21
AJMP INT2
FUNC1: LCALL MAIN2
FUNC11: MOV A,P1
JNB ACC.1,FUNC11
AJMP INT2
FUNC0: LCALL MAIN1
FUNC01: MOV A,P1
JNB ACC.0,FUNC01
AJMP INT2
;----------------------------------------------
MAIN1:
LCALL T_CONVERSION1;调用读温度子程序1
LCALL T_FORMAT;将读出的2字节温度格式化
LCALL DISPLAY;调用液晶显示子程序
LCALL CHANEL1
LCALL D1S;延时1秒后再测
RET
MAIN2:
LCALL T_CONVERSION2;调用读温度子程序2
LCALL T_FORMAT;将读出的2字节温度格式化
LCALL DISPLAY;调用液晶显示子程序
LCALL CHANEL2
LCALL D1S;延时1秒后再测
RET
MAIN3:
LCALL T_CONVERSION3;调用读温度子程序3
LCALL T_FORMAT;将读出的2字节温度格式化
LCALL DISPLAY;调用液晶显示子程序
LCALL CHANEL3
LCALL D1S;延时1秒后再测
RET
MAIN4:
LCALL T_CONVERSION4;调用读温度子程序4
LCALL T_FORMAT;将读出的2字节温度格式化
LCALL DISPLAY;调用液晶显示子程序
LCALL CHANEL4
LCALL D1S;延时1秒后再测
RET
;--------------DS18B201的温度转换子程序,具体时序请参考资料-------------------
T_CONVERSION1:LCALL INIT_18201;先复位DS18B201
JB FLAG1,T_C01
RET ; 判断DS1820是否存在?若DS18B201不存在则返回
T_C01: MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_18201
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_18201
LCALL D1S ;这里等待AD转换结束,12位的话要延时750m秒
LCALL INIT_18201;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_18201
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_18201
LCALL READ_18201; 将读出的温度数据保存到2EH(TEMPER_H)和2FH(TEMPER_L)处
RET
;------DS18B201复位初始化程序-----------------------------------------
INIT_18201: SETB P1.4
NOP
CLR P1.4
MOV R0,#2 ;主机发出延时500微秒的复位低脉冲
INIT10: MOV R1,#150;;;;250
DJNZ R1,$
DJNZ R0,INIT10
SETB P1.4;然后拉高数据线
NOP
MOV R0, #15
INIT11: JNB P1.4, INIT13;延时60us等待DS18B20回应
DJNZ R0, INIT11
LJMP INIT14 ; 超时而没有响应
INIT13: SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP INIT15
INIT14: CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP INIT16
INIT15: MOV R0, #120
DJNZ R0, $ ; 延时240us
INIT16: SETB P1.4
RET
;---------写DS18B201的子程序(有具体的时序要求)-------------------------------------
WRITE_18201: MOV R2,#8;一共8位数据
WR10: CLR P1.4
MOV R3,#6
DJNZ R3,$
RRC A
MOV P1.4,C
MOV R3,#20
DJNZ R3,$
SETB P1.4
NOP
NOP
DJNZ R2,WR10
SETB P1.4
RET
;------读DS18B201的程序,从DS18B201中读出两个字节的温度数据------------------------
READ_18201: MOV R4,#2 ; 将温度高位和低位从DS18B201中读出
MOV R1,#TEMPER_L ; 低位存入2FH(TEMPER_L)
RE10: MOV R2,#8
RE11: SETB P1.4
NOP
NOP
CLR P1.4
NOP
NOP
SETB P1.4
MOV R3,#5
DJNZ R3, $
MOV C,P1.4
MOV R3,#20
DJNZ R3, $
RRC A
DJNZ R2,RE11
MOV @R1,A
DEC R1 ; 高位存入2EH(TEMPER_H)
DJNZ R4,RE10
RET
;--------------------------------------------------------------------
;--------------DS18B202的温度转换子程序,具体时序请参考资料-------------------
T_CONVERSION2:LCALL INIT_18202;先复位DS18B202
JB FLAG1,T_C02
RET ; 判断DS18202是否存在?若DS18B202不存在则返回
T_C02: MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_18202
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_18202
LCALL D1S ;这里等待AD转换结束,12位的话要延时750m秒
LCALL INIT_18202;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_18202
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_18202
LCALL READ_18202; 将读出的温度数据保存到2EH(TEMPER_H)和2FH(TEMPER_L)处
RET
;------DS18B202复位初始化程序-----------------------------------------
INIT_18202: SETB P1.5
NOP
CLR P1.5
MOV R0,#2 ;主机发出延时500微秒的复位低脉冲
INIT20: MOV R1,#150;;;;250
DJNZ R1,$
DJNZ R0,INIT20
SETB P1.5;然后拉高数据线
NOP
MOV R0, #15
INIT21: JNB P1.5, INIT23;延时60us等待DS18B20回应
DJNZ R0, INIT21
LJMP INIT24 ; 超时而没有响应
INIT23: SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP INIT25
INIT24: CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP INIT26
INIT25: MOV R0, #120
DJNZ R0, $ ; 延时240us
INIT26: SETB P1.5
RET
;---------写DS18B202的子程序(有具体的时序要求)-------------------------------------
WRITE_18202: MOV R2,#8;一共8位数据
WR20: CLR P1.5
MOV R3,#6
DJNZ R3,$
RRC A
MOV P1.5,C
MOV R3,#20
DJNZ R3,$
SETB P1.5
NOP
NOP
DJNZ R2,WR20
SETB P1.5
RET
;------读DS18B202的程序,从DS18B202中读出两个字节的温度数据------------------------
READ_18202: MOV R4,#2 ; 将温度高位和低位从DS18B201中读出
MOV R1,#TEMPER_L ; 低位存入2FH(TEMPER_L)
RE20: MOV R2,#8
RE21: SETB P1.5
NOP
NOP
CLR P1.5
NOP
NOP
SETB P1.5
MOV R3,#5
DJNZ R3, $
MOV C,P1.5
MOV R3,#20
DJNZ R3, $
RRC A
DJNZ R2,RE21
MOV @R1,A
DEC R1 ; 高位存入2EH(TEMPER_H)
DJNZ R4,RE20
RET
;-------------------------------------------------------------------
;--------------DS18B23的温度转换子程序,具体时序请参考资料-------------------
T_CONVERSION3:LCALL INIT_18203;先复位DS18B203
JB FLAG1,T_C03
RET ; 判断DS18203是否存在?若DS18B203不存在则返回
T_C03: MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_18203
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_18203
LCALL D1S ;这里等待AD转换结束,12位的话要延时750m秒
LCALL INIT_18203;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_18203
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_18203
LCALL READ_18203; 将读出的温度数据保存到2EH(TEMPER_H)和2FH(TEMPER_L)处
RET
;------DS18B203复位初始化程序-----------------------------------------
INIT_18203: SETB P1.6
NOP
CLR P1.6
MOV R0,#2 ;主机发出延时500微秒的复位低脉冲
INIT30: MOV R1,#150;;;;;250
DJNZ R1,$
DJNZ R0,INIT30
SETB P1.6;然后拉高数据线
NOP
MOV R0, #15
INIT31: JNB P1.6, INIT33;延时60us等待DS18B20回应
DJNZ R0, INIT31
LJMP INIT34 ; 超时而没有响应
INIT33: SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP INIT35
INIT34: CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP INIT36
INIT35: MOV R0, #120
DJNZ R0, $ ; 延时240us
INIT36: SETB P1.6
RET
;---------写DS18B203的子程序(有具体的时序要求)-------------------------------------
WRITE_18203: MOV R2,#8;一共8位数据
WR30: CLR P1.6
MOV R3,#6
DJNZ R3,$
RRC A
MOV P1.6,C
MOV R3,#20
DJNZ R3,$
SETB P1.6
NOP
NOP
DJNZ R2,WR30
SETB P1.6
RET
;------读DS18B203的程序,从DS18B203中读出两个字节的温度数据------------------------
READ_18203: MOV R4,#2 ; 将温度高位和低位从DS18B203中读出
MOV R1,#TEMPER_L ; 低位存入2FH(TEMPER_L)
RE30: MOV R2,#8
RE31: SETB P1.6
NOP
NOP
CLR P1.6
NOP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -