📄 温度计.asm
字号:
RS EQU P2.1
RW EQU P2.0
E EQU P2.2
CS EQU P3.5
TEMP_L EQU 30H
TEMP_H EQU 31H
TEMP EQU 32H
DS1820_OK EQU 33H
T_DF EQU 34H
TEMPDIN EQU P2.7
ORG 0000H
AJMP START
ORG 0100H
START:MOV SP,#70H
LCALL LCM_INIT
A1:LCALL DS1820_INIT ; 调用DS1820初始化
MOV A,#44H
LCALL WRITE_DS1820 ; 写入温度转换开始命令
LCALL DELAY_125MS
LCALL DS1820_INIT
MOV A,#0BEH
LCALL WRITE_DS1820 ; 写入温度读取命令
LCALL READ_DS1820 ; 调用读取命令
MOV TEMP_L,A ; 读出低8位温度值
LCALL READ_DS1820
MOV TEMP_H,A
LCALL CONVTEMP ; 进行温度值转换
MOV A,#86H
LCALL ENABLE ; 定位
MOV A,TEMP
LCALL DISPLAY ; 显示温度整数值
MOV A,#2EH
LCALL WRITE_DATA ; 显示小数点
MOV A,T_DF
LCALL WRITE_DATA ; 显示温度小数值
MOV A,#1AH
LCALL WRITE_DATA ; 显示符号℃
LCALL DELAY_125MS
AJMP A1
;DS1820初始化
DS1820_INIT:SETB TEMPDIN
MOV R5,#250 ; 赋值延时值,并使TEMPDIN保持高2us
CLR TEMPDIN
DJNZ R5,$ ; 延迟500us
SETB TEMPDIN
MOV R5,#30
TSR2:JNB TEMPDIN,TSR3 ; 如果60us内TEMPDIN出现低电位则识别成功
DJNZ R5,TSR2
LJMP TSR4
TSR3:SETB DS1820_OK ; DS1820正确识别
LJMP TSR5
TSR4:CLR DS1820_OK ; DS1820未能识别
LJMP TSR6
TSR5:MOV R5,#120
DJNZ R5,$ ; 初始化后要求延时
TSR6:SETB TEMPDIN ; 初始化完毕拉高数据线
MOV A,#0CCH
LCALL WRITE_DS1820 ; 写入跳过ROM匹配命令
RET
;写DS1820
WRITE_DS1820:MOV R2,#8 ; 数据有8位
CLR C
WR1:CLR TEMPDIN
MOV R5,#6
DJNZ R5,$ ; 延迟12us
RRC A ; A中数据右移一位进入C
MOV TEMPDIN,C ; 将C写入DS1820
MOV R5,#20
DJNZ R5,$ ; 等待40us
SETB TEMPDIN
NOP
NOP
DJNZ R2,WR1 ; 8位数据写完?
SETB TEMPDIN
RET
;读DS1820
READ_DS1820:MOV R2,#8 ; 数据位8
RE1:CLR C
SETB TEMPDIN
NOP
NOP
CLR TEMPDIN
NOP
NOP
SETB TEMPDIN
MOV R5,#4
DJNZ R5,$ ; 延迟8us
MOV C,TEMPDIN ; 读出数据到C
RRC A ; 将C数据移入A最右边(低)位
MOV R5,#30
DJNZ R5,$ ; 延时60us
DJNZ R2,RE1 ; 8位未读取完则继续读
SETB TEMPDIN
RET
;温度值换算
CONVTEMP:MOV A,#0FH
ANL A,TEMP_L ; 获得16进制温度小数值
MOV B,#10
MUL AB
MOV B,#16
DIV AB ; 转换成十进制
ADD A,#30H ; 转换成字符
MOV T_DF,A
MOV A,TEMP_L ; 低8位温度数载入A
SWAP A ; A低半字节交换
MOV TEMP_L,A ; A写回低8位温度地址
MOV R1,#30H
MOV A,TEMP_H
SWAP A ; 高8位温度半字节交换
XCHD A,@R1 ; A与40H地址数据低4位交换,获得实际温度整数值
MOV TEMP,A
RET
;显示
DISPLAY:MOV B,#10 ; 设置被除数
DIV AB ; 结果A存商数,A存余数
ADD A,#30H ; A为十进制十位数,转换为字符
LCALL WRITE_DATA
MOV A,B ; B为十进制个位数
ADD A,#30H ; 转换为字符
LCALL WRITE_DATA
RET
;LCM初始化
LCM_INIT:SETB CS
MOV A,#01H
LCALL ENABLE
MOV A,#38H
LCALL ENABLE
MOV A,#06H
LCALL ENABLE
MOV A,#0CH
LCALL ENABLE
RET
;LCM操作码写入
ENABLE:SETB CS
MOV P1,A
CLR RS
CLR RW
CLR E
LCALL DELAY
SETB E
RET
;LCM显示数据写入
WRITE_DATA:MOV P1,A
WRITE:SETB CS
SETB RS
CLR RW
CLR E
LCALL DELAY
SETB E
RET
;LCM忙判断
DELAY:SETB CS
MOV P1,#0FFH
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P1.7,DELAY
RET
DELAY_125MS:MOV R6,#0FFH
DEL1:MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DEL1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -