📄 456.aqd
字号:
TEMP_H EQU 30H
TEMP_L EQU 31H
TEMP_NUM EQU 32H
TEMP_BCD EQU 33H
COUNTER_H EQU 34H
COUNTER_L EQU 35H
BCD_H EQU 36H
BCD_L EQU 37H
COUNTER EQU 36H
FLAG1 BIT 00H
DQ BIT P1.3
LCD_E BIT P1.2
LCD_RS BIT P1.0
LCD_RW BIT P1.1
LCD_DB EQU P0
SWITCH BIT P1.4
LARUM BIT P1.5
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV SP,#70H
SETB LARUM
MOV TMOD,#05H ;设定计数器0工作方式
LCALL INI_1602 ;LCD初始化子程序调用
LCALL TEXT
CLR SWITCH
CYC: LCALL TEMP ;DS1820温度检测子程序调用
LCALL CONVERSION ;温度值转换子程序调用
LJMP CYC ;循环检测跳转
;********************************************************
; DS1820温度检测模块
;********************************************************
TEMP: SETB DQ
LP1: LCALL INI_1820 ;DS18B20初始化子程序调用
JB FLAG1,LP2
LJMP LP1 ;若DS18B20不存在则反复检测
LP2: MOV A,#0CCH ;DS1820跳过ROM匹配指令------0CCH
LCALL WRITE_1820 ;调用DS1820写入子程序
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820 ;调用DS1820写入子程序
LCALL MON ;借用延时执行显示程序,提高利用率(模数转换)
LCALL DP
CBA: LCALL INI_1820 ;重新初始化
JB FLAG1,ABC
LJMP CBA
ABC: MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820 ;调用DS1820写入子程序
MOV A,#0BEH ;DS1820读温度命令 ----0BEH
LCALL WRITE_1820 ;调用DS1820写入子程序
LCALL READ_18200 ;调用DS1820读取子程序读取温度
RET
;------------------读DS18B20子程序,从DS18B20中读出一个字节的数据
READ_1820: MOV R2,#8
RE1: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE1
RET
;-------------------写DS18B20子程序
WRITE_1820: MOV R2,#8 ;写入位数
CLR C
WR1: CLR DQ ;拉低总线,写开始
MOV R3,#6 ;延时12us+2us
DJNZ R3,$
RRC A ;移入一位给CY
MOV DQ,C ;送出
MOV R3,#20 ;延时40us+2us
DJNZ R3,$
SETB DQ ;释放总线,写一位结束
DJNZ R2,WR1 ;判断一个字节数据写入
RET
;-------------------读DS18B20子程序,从DS18B20中读出两个字节的温度数据
READ_18200: MOV R4,#2 ;将温度高位和低位从DS18B20中读出
MOV R1,#TEMP_L ;低位存入TEMP_L,高位存入TEMP_H
READ1: MOV R2,#8 ;一字节判断
READ2: CLR C
SETB DQ
NOP
NOP
CLR DQ ;拉低总线,读开始
NOP ;1us
NOP ;1us
SETB DQ ;1us
MOV R3,#5 ;1us
DJNZ R3,$ ;10us 延时14us
MOV C,DQ ;读入信号
MOV R3,#23
DJNZ R3,$ ;46us
RRC A ;读取信号移入A
DJNZ R2,READ2 ;循环读取
MOV @R1,A
DEC R1
DJNZ R4,READ1
RET
;-------------------将从DS18B20中读出的温度数据进行转换
CONVERSION: MOV A,TEMP_L
ANL A,#0F0H ; 舍去温度低位中小数点后的四位温度数值
SWAP A
MOV TEMP_NUM,A
MOV A,TEMP_H
ANL A,#07H
SWAP A
ORL A,TEMP_NUM
MOV TEMP_NUM,A ; 保存变换后的温度数据
MOV A,TEMP_L
JNB ACC.3,TEMP_COV1 ; 四舍五入温度值
INC TEMP_NUM
TEMP_COV1: LCALL BIN_BCD
RET
;-------------------将16进制的温度数据转换成压缩BCD码
BIN_BCD: MOV DPTR,#TEMP_TAB
MOV A,TEMP_NUM
MOVC A,@A+DPTR
MOV TEMP_BCD,A
RET
TEMP_TAB:
DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H,71H
DB 72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,90H,91H,92H,93H,94H,95H
DB 96H,97H,98H,99H
;-------------------DS18B20初始化程序
INI_1820: SETB DQ ;释放总线
NOP
CLR DQ ;拉低总线
LCALL DELAY2 ;延时512us
SETB DQ ;释放总线
LCALL DELAY1 ;延时64us
JNB DQ,TSR1 ;判断DS1820存在信号
LJMP TSR2
TSR1: SETB FLAG1 ;置标志位1,表示DS1820存在
LJMP TSR3
TSR2: CLR FLAG1 ;清标志位1,表示DS1820不存在
LJMP TSR4
TSR3: MOV R0,#100 ;延时200us
DJNZ R0,$
TSR4: SETB DQ
RET
;------------------重新写DS18B20暂存存储器设定值
RE_CONFIG: JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1: MOV A,#0CCH ; 发SKIP ROM命令
LCALL WRITE_1820
MOV A,#4EH ; 发写暂存存储器命令
LCALL WRITE_1820
MOV A,#00H ; TH(报警上限)中写入00H
LCALL WRITE_1820
MOV A,#00H ; TL(报警下限)中写入00H
LCALL WRITE_1820
MOV A,#7FH ; 选择12位温度分辨率
LCALL WRITE_1820
RET
;------------------延时子程序
DELAY: MOV R7,#00H ;延时132ms
MIN: DJNZ R7,YS500
RET
YS500: LCALL DELAY2
LJMP MIN
DELAY2: MOV R6,#00H ;延时512us
DJNZ R6,$
RET
DELAY1: MOV R7,#20H ;延时64us
DJNZ R7,$
RET
;****************************************************
; 显示子程序模块
;****************************************************
MON: LCALL TEMP_MON
LCALL REV_MON
RET
;------------------1602通用液晶初始化子程序
INI_1602: MOV R1,#38H
LCALL WRITE_IR
MOV R1,#01H
LCALL WRITE_IR
MOV R1,#06H
LCALL WRITE_IR
MOV R1,#0CH
LCALL WRITE_IR
RET
;-------------------1602通用液晶忙态检测子程序
BF: CLR LCD_RS
SETB LCD_RW
SETB LCD_E
SETB LCD_DB.7
JB LCD_DB.7,BF
CLR LCD_E
RET
;-------------------写LCD指令寄存器子程序
WRITE_IR: LCALL BF
CLR LCD_RS
CLR LCD_RW
SETB LCD_E
MOV LCD_DB,R1
CLR LCD_E
RET
;-------------------写LCD数据寄存器子程序
WRITE_DR: LCALL BF
SETB LCD_RS
CLR LCD_RW
SETB LCD_E
MOV LCD_DB,R2
CLR LCD_E
RET
TEMP_MON: MOV DPTR,#NUM_TAB
MOV R1,#85H
LCALL WRITE_IR
MOV A,TEMP_BCD
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
MOV R2,A
LCALL WRITE_DR
MOV A,TEMP_BCD
ANL A,#0FH
MOVC A,@A+DPTR
MOV R2,A
LCALL WRITE_DR
MOV R2,#43H
LCALL WRITE_DR
RET
REV_MON: MOV A,COUNTER
MOV B,#60
MUL AB
MOV COUNTER_L,B
MOV COUNTER_H,A
CLR A
CLR C
MOV BCD_L,A
MOV BCD_H,A
MOV R7,#10H
REV_01: MOV A,COUNTER_H
RLC A
MOV COUNTER_H,A
MOV A,COUNTER_L
RLC A
MOV COUNTER_L,A
MOV A,BCD_L
ADDC A,BCD_L
DA A
MOV BCD_L,A
MOV A,BCD_H
ADDC A,BCD_H
DA A
MOV BCD_H,A
DJNZ R7,REV_01
MOV DPTR,#NUM_TAB
MOV R1,#0C4H
LCALL WRITE_IR
MOV A,BCD_H
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
MOV R2,A
LCALL WRITE_DR
MOV A,BCD_H
ANL A,#0FH
MOVC A,@A+DPTR
MOV R2,A
LCALL WRITE_DR
MOV A,BCD_L
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
MOV R2,A
LCALL WRITE_DR
MOV A,BCD_L
ANL A,#0FH
MOVC A,@A+DPTR
MOV R2,A
LCALL WRITE_DR
RET
NUM_TAB:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 41H,42H,43H,44H,45H,46H
;-------------------不用更新的字符显示子程序
TEXT: MOV DPTR,#TEXT_TAB
MOV R1,#80H ;第一行显示
LCALL WRITE_IR
MOV R3,#5H
LCALL LOOP1
MOV R1,#0C0H ;第二行显示
LCALL WRITE_IR
MOV R3,#4H
LCALL LOOP1
RET
LOOP1: MOV A,#00H
MOVC A,@A+DPTR
MOV R2,A
LCALL WRITE_DR
INC DPTR
DJNZ R3,LOOP1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -