📄 zong.asm
字号:
NOP
SETB P1.6
MOV R3,#5
DJNZ R3, $
MOV C,P1.6
MOV R3,#20
DJNZ R3, $
RRC A
DJNZ R2,RE31
MOV @R1,A
DEC R1 ; 高位存入2EH(TEMPER_H)
DJNZ R4,RE30
RET
;-------------------------------------------------------------------
;--------------DS18B204的温度转换子程序,具体时序请参考资料-------------------
T_CONVERSION4:LCALL INIT_18204;先复位DS18B204
JB FLAG1,T_C04
RET ; 判断DS18204是否存在?若DS18B204不存在则返回
T_C04: MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_18204
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_18204
LCALL D1S ;这里等待AD转换结束,12位的话要延时750m秒
LCALL INIT_18204;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_18204
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_18204
LCALL READ_18204; 将读出的温度数据保存到2EH(TEMPER_H)和2FH(TEMPER_L)处
RET
;------DS18B204复位初始化程序-----------------------------------------
INIT_18204: SETB P1.7
NOP
CLR P1.7
MOV R0,#2 ;主机发出延时500微秒的复位低脉冲
INIT40: MOV R1,#150;;;;;250
DJNZ R1,$
DJNZ R0,INIT40
SETB P1.7;然后拉高数据线
NOP
MOV R0, #15
INIT41: JNB P1.7, INIT43;延时60us等待DS18B20回应
DJNZ R0, INIT41
LJMP INIT44 ; 超时而没有响应
INIT43: SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP INIT45
INIT44: CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP INIT46
INIT45: MOV R0, #120
DJNZ R0, $ ; 延时240us
INIT46: SETB P1.7
RET
;---------写DS18B204的子程序(有具体的时序要求)-------------------------------------
WRITE_18204: MOV R2,#8;一共8位数据
WR40: CLR P1.7
MOV R3,#6
DJNZ R3,$
RRC A
MOV P1.7,C
MOV R3,#20
DJNZ R3,$
SETB P1.7
NOP
NOP
DJNZ R2,WR40
SETB P1.7
RET
;------读DS18B204的程序,从DS18B204中读出两个字节的温度数据------------------------
READ_18204: MOV R4,#2 ; 将温度高位和低位从DS18B201中读出
MOV R1,#TEMPER_L ; 低位存入2FH(TEMPER_L)
RE40: MOV R2,#8
RE41: SETB P1.7
NOP
NOP
CLR P1.7
NOP
NOP
SETB P1.7
MOV R3,#5
DJNZ R3, $
MOV C,P1.7
MOV R3,#20
DJNZ R3, $
RRC A
DJNZ R2,RE41
MOV @R1,A
DEC R1 ; 高位存入28H(TEMPER_H)
DJNZ R4,RE40
RET
;-----整合读出的两字节温度(关于DS18B20读出的2字节温度格式请参考资料)----------
T_FORMAT: MOV A, #0FH
ANL A, TEMPER_L
MOV T_DF, A ;获得小数部分(4位)
MOV A, TEMPER_L
SWAP A
MOV TEMPER_L, A
MOV A, TEMPER_H
SWAP A
MOV R0, #TEMPER_L
XCHD A, @R0
MOV T_INTEGER, A ;获得整数部分(1字节)
RET
;-------液晶显示的子程序(显示前先格式转换)---------------------------------------
DISPLAY: MOV A, T_INTEGER
MOV B,#10
DIV AB
MOV A_BIT,A ;十位存在A_BIT
MOV B_BIT,B ;个位存在B_BIT
MOV A, T_DF
MOV R0, #C_BIT
MOV R2, #4
D0: MOV B, #10
MUL AB
MOV B, #16
DIV AB
MOV @R0, A ;从个位小数C_BIT,到十位D_BIT,百位E_BIT,千位F_BIT
INC R0
MOV A, B
DJNZ R2, D0
;----二进制到ASCII码转换--------------
MOV A, #30H
ORL A_BIT, A
ORL B_BIT, A
ORL C_BIT, A
ORL D_BIT, A
ORL E_BIT, A
ORL F_BIT, A
RET
;-------------------------------------
CHANEL1: LCALL INITIAL
MOV A, #10000000B ; LINE1: DB 'Now is:',00H
LCALL WRITE_INSTRUCTION
MOV DPTR, #LINE1
LCALL PR_STRING
MOV A, A_BIT
LCALL WRITE_LCDDATA
MOV A, B_BIT
LCALL WRITE_LCDDATA
MOV A, #2EH ;'.'字符
LCALL WRITE_LCDDATA
MOV A, C_BIT
LCALL WRITE_LCDDATA
MOV A, D_BIT
LCALL WRITE_LCDDATA
MOV A, E_BIT
LCALL WRITE_LCDDATA
MOV A, F_BIT
LCALL WRITE_LCDDATA
MOV A, #0DFH ;下面两个是摄氏度的数字符号
LCALL WRITE_LCDDATA
MOV A, #63H
LCALL WRITE_LCDDATA
MOV a, #11000000B ; LINE2: DB 'Design by liang!',00H
LCALL write_instruction
MOV DPTR, #LINE
LCALL PR_STRING
RET
;------------------------------------------------------------------------------
CHANEL2: LCALL INITIAL
MOV A, #10000000B ; LINE1: DB 'Now is:',00H
LCALL WRITE_INSTRUCTION
MOV DPTR, #LINE2
LCALL PR_STRING
MOV A, A_BIT
LCALL WRITE_LCDDATA
MOV A, B_BIT
LCALL WRITE_LCDDATA
MOV A, #2EH ;'.'字符
LCALL WRITE_LCDDATA
MOV A, C_BIT
LCALL WRITE_LCDDATA
MOV A, D_BIT
LCALL WRITE_LCDDATA
MOV A, E_BIT
LCALL WRITE_LCDDATA
MOV A, F_BIT
LCALL WRITE_LCDDATA
MOV A, #0DFH ;下面两个是摄氏度的数字符号
LCALL WRITE_LCDDATA
MOV A, #63H
LCALL WRITE_LCDDATA
MOV a, #11000000B ; LINE2: DB 'Design by liang!',00H
LCALL write_instruction
MOV DPTR, #LINE
LCALL PR_STRING
RET
;------------------------------------------------------------------------------
CHANEL3: LCALL INITIAL
MOV A, #10000000B ; LINE1: DB 'Now is:',00H
LCALL WRITE_INSTRUCTION
MOV DPTR, #LINE3
LCALL PR_STRING
MOV A, A_BIT
LCALL WRITE_LCDDATA
MOV A, B_BIT
LCALL WRITE_LCDDATA
MOV A, #2EH ;'.'字符
LCALL WRITE_LCDDATA
MOV A, C_BIT
LCALL WRITE_LCDDATA
MOV A, D_BIT
LCALL WRITE_LCDDATA
MOV A, E_BIT
LCALL WRITE_LCDDATA
MOV A, F_BIT
LCALL WRITE_LCDDATA
MOV A, #0DFH ;下面两个是摄氏度的数字符号
LCALL WRITE_LCDDATA
MOV A, #63H
LCALL WRITE_LCDDATA
MOV a, #11000000B ; LINE2: DB 'Design by liang!',00H
LCALL write_instruction
MOV DPTR, #LINE
LCALL PR_STRING
RET
;------------------------------------------------------------------------------
CHANEL4: LCALL INITIAL
MOV A, #10000000B ; LINE1: DB 'Now is:',00H
LCALL WRITE_INSTRUCTION
MOV DPTR, #LINE4
LCALL PR_STRING
MOV A, A_BIT
LCALL WRITE_LCDDATA
MOV A, B_BIT
LCALL WRITE_LCDDATA
MOV A, #2EH ;'.'字符
LCALL WRITE_LCDDATA
MOV A, C_BIT
LCALL WRITE_LCDDATA
MOV A, D_BIT
LCALL WRITE_LCDDATA
MOV A, E_BIT
LCALL WRITE_LCDDATA
MOV A, F_BIT
LCALL WRITE_LCDDATA
MOV A, #0DFH ;下面两个是摄氏度的数字符号
LCALL WRITE_LCDDATA
MOV A, #63H
LCALL WRITE_LCDDATA
MOV a, #11000000B ; LINE2: DB 'Design by liang!',00H
LCALL write_instruction
MOV DPTR, #LINE
LCALL PR_STRING
RET
;---液晶屏初始化,具体请参考资料-------------------------------------------------
initial: MOV A, #01H
LCALL WRITE_INSTRUCTION
MOV A, #38H
LCALL WRITE_instruction
MOV A, #0FH
LCALL WRITE_instruction
MOV A, #06H
LCALL WRITE_instruction
RET
;----写液晶指令的子程序------------------------------------------
WRITE_instruction: MOV P0, A
CLR RS ;写入控制命令
CLR RW
CLR E
LCALL DELAY
SETB E
RET
;----写液晶数据的子程序---------------------------------------------
write_lcddata: MOV P0, A
SETB RS ;写入数据
CLR RW
CLR E
LCALL DELAY ;判断液晶模块是否忙?
SETB E
RET
;-----写行字符的子程序---------------------------------------------------------------
PR_STRING: CLR A
MOVC A, @A+DPTR
JZ END_PR
LCALL WRITE_LCDDATA
INC DPTR
LJMP PR_STRING
END_PR: RET
;----查看液晶忙碌信号的子程序---------------------------------------------------------
DELAY: call D1mS
;MOV P0,#0FFH ;判断液晶显示器是否忙的子程序
;CLR RS
;SETB RW
;CLR E
;NOP
;SETB E
;JB P0.7,DELAY ;如果P1.7为高电平表示忙就循环等待
RET
;---1mS延时(按12MHZ算)-----------------------------------------------------------------
D1mS: MOV R7,#250
LOOP0: NOP
NOP
DJNZ R7,LOOP0
RET
;----1S延时(按12MHZ算)-----------------------------------------------------------------
D1S: MOV R6,#4
LOOP2: MOV R5,#250
LOOP1: LCALL D1mS
DJNZ R5,LOOP1
DJNZ R6,LOOP2
RET
;--------------------------------------------------------------------------------------
LINE1: DB 'CH1 is:',00H
LINE2: DB 'CH2 is:',00H
LINE3: DB 'CH3 is:',00H
LINE4: DB 'CH4 is:',00H
LINE: DB 'Design by DAJIA!',00H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -