📄 ds18b20asm.txt
字号:
***************WAVE-E6000/T**********************
;*MCU: AT89C51 *
;*MCU-crystal: 12M *
;*Version: 01 *
;*Last Updata: 2005-9-27 *
;*Author: liaoguidong *
;*Description: *
;DS18B20的读写程序,数据脚P2.2 *
;温度传感器18B20汇编程序,采用器件默认的12位转化 *
;最大转化时间750微秒,显示温度-55到+125度,显示精度*
;为0.1度,显示采用4位LED共阳显示测温值 *
;*************************************************
;单片机内存分配申明!
;*************************************************
TEMPER_L EQU 40H ;用于保存读出温度的低8位
TEMPER_H EQU 41H ;用于保存读出温度的高8位
FLAG1 EQU 38H ;是否检测到DS18B20标志位
SEC EQU 20H ;数码管个位数存放内存位置
MIN EQU 21H ;数码管十位数存放内存位置
TEMPL EQU 30H ;用于保存读出温度的低8位
TEMPH EQU 31H ;用于保存读出温度的高8位
TEMPHC EQU 32H ;温度转换寄存器低8位
TEMPLC EQU 33H ;温度转换寄存器高8位
BUF1 EQU 34H ;显示缓冲寄存器小数位
BUF2 EQU 35H ;显示缓冲寄存器个数位
BUF3 EQU 36H ;显示缓冲寄存器十数位
BUF4 EQU 37H ;显示缓冲寄存器百数位
TEMPDIN BIT P2.2 ;数据脚定义
;**********************************************
ORG 0000H ;主程序入口地址
AJMP MAIN ;转主程序
ORG 0003H ;外中断0中断入口
DB 00H,00H,00H,00H,00H,00H,00H;
RETI ;跳至INTEX0执行中断服务程序
ORG 000BH ;定时器T0中断入口地址
DB 00H,00H,00H,00H,00H,00H,00H ;
RETI ;跳至定时器T0执行中断服务程序
ORG 0013H ;外中断1中断入口
DB 00H,00H,00H,00H,00H,00H,00H ;
RETI ;跳至INTEX1执行中断服务程序
ORG 001BH ;定时器T1中断入口地址
DB 00H,00H,00H,00H,00H,00H,00H ;
RETI ;中断返回(不开中断)
ORG 0023H ;串行口中断入口地址
DB 00H,00H,00H,00H,00H,00H,00H ;
RETI ;中断返回(不开中断)
;**********************************************
;两位数码管来显示温度,显示范围00到99度,显示精度为1度
;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
;无需乘于0.0625系数
;**********************************************
MAIN:
MOV SP, #50H ;
MOV P2, #0FFH ;
LPTEMP:
LCALL GET_TEMPER ;调用读温度子程序
LCALL CONVTEMP ;温度BCD码计算处理子程序
LCALL DISPBCD ;显示区BCD码温度值刷新子程序
;*************************************
LCALL DISPLAY ;调用数码管显示子程序
;*************************************
CPL P3.0 ;
AJMP LPTEMP ;
;*************************************
; 这是DS18B20复位初始化子程序
;*************************************
INIT_1820:
SETB TEMPDIN
NOP
CLR TEMPDIN ;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB TEMPDIN ;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB TEMPDIN,TSR3 ;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ;延时
TSR3:
SETB FLAG1 ;置标志位,表示DS1820存在
CLR P3.7 ;检查到DS18B20就点亮P3.7LED
LJMP TSR5
TSR4:
CLR FLAG1 ;清标志位,表示DS1820不存在
CLR P3.1
LJMP TSR7
TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ;时序要求延时一段时间
TSR7: SETB TEMPDIN ;
RET
;****************************************
; 读出转换后的温度值
;****************************************
GET_TEMPER:
SETB TEMPDIN ;
LCALL INIT_1820 ;先复位DS18B20
JB FLAG1,TSS2
RET ;判断DS1820是否存在?若DS18B20不存在则返回
TSS2:
CLR P3.3 ;DS18B20已经被检测到!!
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
;*****************************************
;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
;*****************************************
LCALL DISPLAY
;*****************************************
LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;将读出的温度数据保存到35H/36H
RET
;*******************************************
;写DS18B20的子程序(有具体的时序要求)
;*******************************************
WRITE_1820:
MOV R2,#8 ;一共8位数据
CLR C ;
WR1:
CLR TEMPDIN ;
MOV R3,#6
DJNZ R3,$
RRC A
MOV TEMPDIN,C ;
MOV R3,#23
DJNZ R3,$
SETB TEMPDIN ;
NOP
DJNZ R2,WR1 ;
SETB TEMPDIN ;
RET
;*************************************
;处理温度BCD码子程序
;*************************************
CONVTEMP: MOV A,TEMPH ;
ANL A,#80H ;
JZ TEMPC1 ; 判断温度是否在零下?
CLR C ; 温度值补码 变成原码
MOV A,TEMPL ;
CPL A
ADD A,#01H ;
MOV TEMPL,A ;
MOV A, TEMPH ; -
CPL A ;
ADDC A,#00H ;
MOV TEMPH,A ; TEMPHC HI=符号位
MOV TEMPHC,#0BH ; 置"-"标志
SJMP TEMPC11 ;
TEMPC1: MOV TEMPHC,#0AH ; 置"+"标志
;**************************************
TEMPC11: MOV A,TEMPHC ; 计算小数位温度BCD值
SWAP A
MOV TEMPHC,A ;
MOV A,TEMPL ;
ANL A,#0FH ; 乘0.0625
MOV DPTR,#TEMPDOTTAB ;
MOVC A,@A+DPTR ;
MOV TEMPLC,A ; TEMPLC LOW= 小数部分 BCD
;**************************************
MOV A,TEMPL ; 计算整数位温度BCD值
ANL A,#0F0H ;
SWAP A ;
MOV TEMPL,A ;
MOV A,TEMPH ;
ANL A,#0FH ;
SWAP A ;
ORL A,TEMPL ;
MOV TEMPER_L ,A ;
LCALL HEX2BCD1 ; 调用单字节十六进制转BCD子程序
;************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -