MCS-51单片机的数字体温计。用DS18B20制作的 程序
发布网友
发布时间:2023-03-19 02:11
我来回答
共1个回答
热心网友
时间:2023-11-14 00:08
DQ BIT P3.3 ;DS18B20的数据口位P3.3
TPH DATA 20H ;存放温度值的高字节
TPL DATA 21H ;存放温度值的低字节
ORG 0
JMP Reset
ORG 100H
Reset:
CALL DS18B20_Reset ;设备复位
MOV A,#0CCH ;跳过ROM命令
CALL DS18B20_WriteByte ;送出命令
MOV A,#044H ;开始转换
CALL DS18B20_WriteByte ;送出命令
JNB DQ,$ ;等待转换完成
CALL DS18B20_Reset ;设备复位
MOV A,#0CCH ;跳过ROM命令
CALL DS18B20_WriteByte ;送出命令
MOV A,#0BEH ;读暂存存储器
CALL DS18B20_WriteByte ;送出命令
CALL DS18B20_ReadByte ;读温度低字节
MOV TPL,A ;存储数据
CALL DS18B20_ReadByte ;读温度高字节
MOV TPH,A ;存储数据
JMP $
;**************************************
;延时X*10微秒
;不同的工作环境,需要调整此函数
;入口参数:R7
;出口参数:无
;**************************************
DelayX0us: ;2 当改用1T的MCU时,请调整此延时函数
NOP ;1
NOP ;1
NOP ;1
NOP ;1
NOP ;1
NOP ;1
NOP ;1
NOP ;1
DJNZ R7,DelayX0us ;2
RET ;2
;**************************************
;复位DS18B20,并检测设备是否存在
;入口参数:无
;出口参数:无
;**************************************
DS18B20_Reset:
CLR DQ ;送出低电平复位信号
MOV R7,#48 ;延时至少480us
CALL DelayX0us
SETB DQ ;释放数据线
MOV R7,#6 ;等待60us
CALL DelayX0us
MOV C,DQ ;检测存在脉冲
MOV R7,#42 ;等待设备释放数据线
CALL DelayX0us
JC DS18B20_Reset ;如果设备不存在,则继续等待
RET
;**************************************
;从DS18B20读1字节数据
;入口参数:无
;出口参数:ACC
;**************************************
DS18B20_ReadByte:
CLR A
PUSH 0
MOV 0,#8 ;8位计数器
ReadNext:
CLR DQ ;开始时间片
NOP
NOP
SETB DQ ;准备接收
NOP
NOP
MOV C,DQ ;读取数据
RRC A
MOV R7,#6 ;等待时间片结束
CALL DelayX0us
DJNZ 0,ReadNext
POP 0
RET
;**************************************
;向DS18B20写1字节数据
;入口参数:ACC
;出口参数:无
;**************************************
DS18B20_WriteByte:
PUSH 0
MOV 0,#8 ;8位计数器
WriteNext:
CLR DQ ;开始时间片
NOP
NOP
RRC A ;输出数据
MOV DQ,C
MOV R7,#6 ;等待时间片结束
CALL DelayX0us
SETB DQ ;准备送出下一位数据
DJNZ 0,WriteNext
POP 0
RET
END