⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 温度计.asm

📁 这是基于MCS-51单片机的DS18B20测温程序
💻 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 + -