基于DS18B20数字温度传感器的温度计设计

本报告为哈尔滨工业大学电子与信息工程学院大二学期微机原理课程的课设报告。请注意,本文所述代码均在Quartus II 13.0程序内使用汇编语言运行。

一、课程设计任务要求

利用数字温度传感器DS18B20与AT89C51单片机结合来测量温度,并在LED数码管上显示相应的温度值。温度测量范围为-55~125℃,精确至0.5℃。测量的温度采用数字显示,用三位共阳极LED数码管来实现温度显示。

二、工作原理

DS18B20数字温度传感器是美国DALLAS半导体公司推出的一种改进型具有单总线接口的智能温度传感器。与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字读数方式。DS18B20的基本性能及详细资料请参考相关资料。

三、单片机应用系统设计及原理图

DS18B20数字温度传感器数据端口DQ接于P1.7,单片机接电源和晶振,八位共阳数码管位选接于P1.2~P1.6,断码接于P0.0~P0.7并连接排阻。

四、实现方法及扩展创新

  1. 基本功能实现方法
    利用 DS18B20 数字温度传感器的数据传输机制编写程序,将温度数值从温度传感器中取回到 AT89C51 之中,再根据数据的转换形式,在单片机中对数据进行处理变换成十进制,并动态显示在数码管中。

  2. 扩展创新设计
    根据实验要求:精度在 0.5℃范围内,则不必四舍五入,取出整数部分直接处理,只需考查数据的小数第一位,来决定小数点显示位置显示 0 或者 5,便可保证精度;并且在个位位置附加上小数点;最后补充符号位,负温度时显示负号。

五、实现步骤

首先需要了解 DS18B20 的数据传输方式,因为这一芯片只有一个数据通信口,需要遵守严格的时序,脉冲的规则,介绍如下。

首先设定 DQ 为总线数据位,连接于 P1.7。

DQ BIT P1.7

1.复位功能

主机首先发出一个 480~960us 的低电平脉冲,然后释放总线变为高电平,并在随后的480us 时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。

作为从器件的 DS18B20 在一上电后就一直在检测总线上是否有 480-960 us 的低电平出现,如果有,在总线转为高电平后等待 15-60us 后将总线电平拉低60~240us 做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。

这一段程序设计加入 FLAG 位变量作为传感器是否相应,正常工作的标志:

FLAG BIT F0
INIT_1:SETB DQ NOP CLR DQ MOV R0,#0FBH
TSR1: DJNZ R0,TSR1 SETB DQ MOV R0,#25H
TSR2: JNB DQ,TSR3 DJNZ R0,TSR2
TSR3: SETB FLAG MOV R0,#06BH
TSR4: DJNZ R0,TSR4 SETB DQ
RET

2.写入操作

写周期最少为 60us,最长不超过 120us。写周期一开始做为主机先把总线拉低1us 表示写周期开始。随后若主机想写 0,则继续拉低电平最少 60us 直至写周期结束,然后释放总线为高电平。若主机想写 1,在一开始拉低总线电平 1us 后就释放总线为高电平,一直到写周期结束。而做为从机的 DS18B20 则在检测到总线被拉底后等待 15 us 然后从 15us 到 45us 开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为 0。

写入要遵守规则,需要先复位,跳过 ROM,才能进行读写,更改初值等操作。

WRITE:MOV R2,#8 CLR C
WR1:  CLR DQ MOV R3,#6 DJNZ R3,$ RRC A MOV DQ,C MOV R3,#23 DJNZ R3,$  SETB DQ NOP DJNZ R2,WR1 SETB DQ
RET

3.读数操作

对于读数据操作时序也分为读 0 时序和读 1 时序两个过程。读时隙是从主机把单总线拉低之后,在 1us 之后就得释放单总线为高电平,以让 DS18B20 把数据传输到单总线上。DS18B20 在检测到总线被拉低 1us 后,便开始送出数据,若是要送出0 就把总线拉为低电平直到读周期结束。若要送出 1 则释放总线为高电平。主机在一开始拉低总线 1us 后释放总线,然后在包括前面的拉低总线电平 1us在内的 15us 时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为 1。完成一个读时序过程,至少需要 60us 才能完成。

读数代码如下,在读数的时候要同样要复位,跳 ROM,写入操作码再读写。

READ: MOV R4,#2 MOV R1,#29H
REE0: MOV R2,#8
REE1: CLR C SETB C      NOP NOP CLR DQNOPNOPNOPSETB DQMOV R3,#7 DJNZ R3,$ MOV C,DQ MOV R3,#23 DJNZ R3,$ RRC A DJNZ R2,REE1 MOV @R1,A DEC R1 DJNZ R4,REE0
RET

4.设定温度分辨率

由于温度传感器的温度精度为 0.0625℃,对于要求的精度太高,可以适当减少精度,使小数点后四位仅余一位有效,在符合条件的情况下理想化后三位。

FBLCHANGE: LCALL INIT_1 MOV A,#0CCH LCALL WRITE MOV A,#1FH LCALL WRITE
RET

5.主程序编写

主程序应完全按照通信规则进行。

DS18B20 单线通信功能是分时完成的,他有严格的时隙概念,如果出现序列混乱,1-WIRE 器件将不响应主机,因此读写时序很重要。系统对 DS18B20 的各种操作必须按协议进行。根据 DS18B20 的协议规定,微控制器控制 DS18B20 完成温度的转换必须经过以下三个步骤 :

  1. 每次读写前对 DS18B20 进行复位初始化;
  2. 发送一条 ROM 指令;
  3. 发送存储器指令。

现在我们做的是让DS18B20进行一次温度转换,那具体操作如下:

  1. 主机先作复位操作;
  2. 主机再写跳过ROM的操作(CCH)命令;
  3. 然后主机接着写个转换温度的操作命令,后面释放总线至少 1s,让DS18B20 完成转换的操作。在这里要注意的是每个命令字节在写的时候都是低字节先写,例如 CCH 的二进制为 11001100,在写到总线上时要从低位开始写,写的顺序是“1、1、0、0、1、1、0、0”。

读取 RAM 内的温度数据同样也要接照三个步骤:

  1. 主机发出复位操作并接收 DS18B20 的应答(存在)脉冲。
  2. 主机发出跳过对 ROM 操作的命令(CCH)。
  3. 主机发出读取 RAM 的命令(BEH),随后主机依次读取 DS18B20 发出的从第0 到第 8,共九个字节的数据。如果只想读取温度数据,那在读完第 0 和第 1 个数据后就不再理会后面 DS18B20 发出的数据即可。同样读取数据也是低位在前的。

故主函数设置如下:

MAIN: LCALL INIT_1LCALL FBLCHANGE LCALL GET_TEMP AJMP CHANGE
GET_TEMP:SETB DQ LCALL INIT_1 JB FLAG,TSS2
RET
TSS2: MOV A,#0CCH LCALL WRITEMOV A,#44H LCALL WRITE LCALL DISPLAY LCALL INIT_1 MOV A,#0CCH LCALL WRITE MOV A,#0BEH LCALL WRITE LCALL READ
RET

6.数据处理与显示

对于传回的数据,DS18B20 的数据格式如下:

温度 二进制表示 十六进制表示
+125 00000111 11010000 07D0H
+25.0625 00000001 10010001 0191H
+10.125 00000000 10100010 00A2H
+0.5 00000000 00001000 0008H
0 00000000 00000000 0000H
-0.5 11111111 11111000 FFF8H
-10.125 11111111 01011110 FF5EH
-25.0625 11111110 01101111 FE6FH
-55 11111100 10010000 FC90H

故我们可以由如下步骤分析:

  1. 判断温度的正负。首先可知,取回原始数据的最后四位无效,这就保证了数据在取回绝对值时不会溢出。此时检查数据的最高位,如果是正数,则正常执行;如果是负数,则进行取反加一的操作,得到绝对值,并保留原数,为判断是否显示负号做准备。
  2. 取出绝对值放入地址中作为二进制整数。利用进位标志位 C,将八高位的后四位传入低八位的前四位,得到绝对值。
  3. 判断小数后第一位是 0 还是 1,得到小数位显示为 0 或 5。这时需要在新地址存储00H,05H,为显示做准备。 此时我们可以发现对于绝对值小数位为.0~.4 的,则显示的十分位置 0,绝对值小数位为.5~.9 的,则显示的十分位置 5,且不影响去掉小数位的整数值,整数值依旧存在。由此可知,显示数字和真实数字的关系并不符合四舍五入,但在精度范围之内,这样做减少了数据处理的复杂度,增加了数码管显示数量,是本实验的创新之处。
  4. 整数部分转为十进制。DIV 指令提供了方便,我们只需执行两次除以10 的操作,便可以得到个,十,百位。
  5. 显示:显示采用共阳八位数码管。首先由数据的正负,判断是否输出负号(g 亮,即 BFH),否则输出全灭状态(即 FFH)。再依次输出个十百位,注意个位为表达准确,需要加上小数点,故要对正常的数码表最高位置零(即最高位减 8),故个位要查最高位置零后的表以显示小数点。再根据小数位提前存储的00H,05H,判断小数第一位的状态,输出相应的 0 和 5。延时函数不必多说。

实际代码如下:

CHANGE: MOV A,29H MOV 26H,29H MOV 25H,28H MOV 24H,28H MOV C,25H.7 JNC SN1 MOV A,25H CPL A MOV 25H,A MOV A,26H CPL A INC A MOV 26H,A MOV 29H,26H MOV 28H,25H
SN1:  MOV C,28H.0 RRC A MOV C,28H.1 RRC A MOV C,28H.2 RRC A MOV C,28H.3 RRC A JC SL0 MOV 27H,#00H AJMP SL5
SL0:  MOV 27H,#05H
SL5:  MOV 29H,A LCALL DISPLAY LJMP MAIN
DISPLAY:MOV A,29H MOV B,#10 DIV AB MOV ABIT,B MOV B,#10 DIV AB MOV BBIT,B MOV CBIT,A MOV R0,#4
DPL1: MOV R1,#250
DPL2: MOV C,24H.7JNC DPL3 MOV P0,#0BFH SETB P1.2 LCALL DELAY CLR P1.2 AJMP DPL4
DPL3: MOV P0,#0FFH SETB P1.2 LCALL DELAY CLR P1.2
DPL4: MOV DPTR,#TAB MOV A,27H MOVC A,@A+DPTR MOV P0,A SETB P1.6 LCALL DELAY CLR P1.6 MOV A,ABIT MOV DPTR,#TAB1 MOVC A,@A+DPTR MOV P0,A SETB P1.5 LCALL DELAY CLR P1.5 MOV A,BBIT MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,A SETB P1.4 LCALL DELAY CLR P1.4 MOV A,CBIT MOVC A,@A+DPTR MOV P0,A SETB P1.3 LCALL DELAY CLR P1.3 DJNZ R1,DPL2 DJNZ R0,DPL1
RET
DELAY:MOV R5,#10
DEL0: MOV R6,#1
DEL1: MOV R7,#20
DEL2: DJNZ R7,DEL2DJNZ R6,DEL1 DJNZ R5,DEL0
RET
TAB: DB  0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
TAB1: DB  40H,79H,24H,30H,19H,12H,02H,78H,00H,10H

至此,课程设计原理全部介绍完毕。

六、数据记录与结果分析

经过试验得到如下仿真结果:

-32.3℃显示结果

49.6℃显示结果

113.2℃显示结果

七、实验程序

完整程序代码:

;===================================================================================
; Main.asm file generated by New Project wizard
;
; Created:   周四 6 月 7 2018
; Processor: 80C51
; Compiler:  ASEM-51 (Proteus)
;=================================================================================== $NOMOD51
$INCLUDE (8051.MCU) ;===================================================================================
; DEFINITIONS
;=================================================================================== ;===================================================================================
; VARIABLES
;=================================================================================== ;===================================================================================
; RESET and INTERRUPT VECTORS
;===================================================================================FLAG BIT F0                  ;  声明传感器复位返回的标志位 DQ BIT P1.7                  ;  定义DQ 作为数据传输端口名 ABIT EQU 35H BBIT EQU 36H CBIT EQU 37H                 ;  固定个,十,百位的存储位置,名称ORG 0000H AJMP MAIN ORG 0100H ;主程序
MAIN: LCALL INIT_1                 ;  复位 LCALL FBLCHANGE           ;  改变温度的初始分辨率为9位LCALL GET_TEMP              ;  得到温度AJMP CHANGE                  ;  跳转到数据处理子程序
;复位程序INIT_1:SETB DQ            ;  总线释放 NOP                         ;  保持高电平,延时CLR DQ                        ;  总线置 0,请求响应MOV R0,#0FBH
TSR1: DJNZ R0,TSR1                 ;  延时SETB DQ                        ;  再释放MOV R0,#25H
TSR2: JNB DQ,TSR3                  ;  改变为 0,则代表得到对应DJNZ R0,TSR2                 ;  未得到则继续等待,判断
TSR3: SETB FLAG                    ;  得到相应则标志位置 1,代表传感器正常存在 MOV R0,#06BH
TSR4: DJNZ R0,TSR4                 ;  延时SETB DQ                        ;  释放总线,完成复位
RET ;改变温度分辨率
FBLCHANGE:LCALL INIT_1                 ;  复位MOV A,#0CCH                ;  跳过ROMLCALL WRITE                 ;  把A写入传感器MOV A,#1FH                ;  改变温度分辨率为9LCALL WRITE                 ;  把A写入传感器
RET:得到温度并转换
GET_TEMP:SETB DQ                       ;  释放总线LACALL INIT_1                ;  复位JB FLAG,TSS1                   ;  若传感器不存在,则直接返回主程序
RETTSS2: MOV A,#0CCHLCALL WRITE                ;  执行跳过ROM指令MOV A,#44HLCALL WRITE                   ;  执行测温指令LCALL DISPLAY              ;  不仅延时,还让程序完全生效前数码管置零LCALL INIT_1               ;  复位MOV A,#0CCH LCALL WRITE                    ;  执行跳过ROM置零MOV A,#0BEH LCALL WRITE                     ;  执行读取温度数据指令LCALL READ                 ;  跳转至通信子程序
RET ;写入数据                          ;  注:不可超过120us,否则无法写入
WRITE:MOV R2,#8                    ;  写入八位二进制码,即循环次数CLR C                       ;  进位标志位初始置零
WR1:  CLR DQ                       ;  拉低总线为写入做准备MOV R3,#6 DJNZ R3,$                    ;  快速延时RRC A MOV DQ,C                   ;  将A又循环写入C,写入总线以输入到传感器MOV R3,#23 DJNZ R3,$                  ;  快速延时SETB DQ                      ;  释放,表示此位写入完毕NOP DJNZ R2,WR1                    ;  循环八次,一次写入八位SETB DQ                        ;  释放总线
RET ;读入数据
READ: MOV R4,#2                    ;  读取两个八位数据,是外层循环次数MOV R1,#29H                   ;  立即数寻址给定存储位置
REE0: MOV R2,#8                    ;  给定数据位数,是内层循环次数
REE1: CLR C                        ;  进位标志位初始置零SETB C NOPNOP CLR DQ NOP NOP NOP SETB DQ                         ;  输入脉冲并持续2-3个机器周期MOV R3,#7                    DJNZ R3,$                    ;  快速延时,等待传感器响应MOV C,DQ                      ;  按位读出MOV R3,#23DJNZ R3,$                      ;  快速延时RRC A                        ;  把C存入A内DJNZ R2,REE1                   ;  循环8次MOV @R1,A                   ;  存储ADEC R1                        ;  更换地址DJNZ R4,REE0                     ;  循环2次
RET;数据处理函数
CHANGE: MOV A,29H MOV 26H,29HMOV 25H,28H MOV 24H,28H                    ;  在24H存储原始数据防止丢失MOV C,25H.7                    ;  存储符号位进CJNC SN1                       ;  判断温度的正负,正数则跳过转补码程序MOV A,25HCPL A                          ;  取补码,由于无效位置1,25H不必担心数据溢出MOV 25H,A MOV A,26H CPL A INC A                         ;  由于是末位,需要加一MOV 26H,A MOV 29H,26H MOV 28H,25H                   ;  在26H,25H中操作后放回29H,28H
SN1:  MOV C,28H.0                    ;  正负温度到此均得到整数部分绝对值RRC A MOV C,28H.1 RRC A MOV C,28H.2 RRC A MOV C,28H.3                     ;  分别循环,存入A内,连续4次滤掉小数部分RRC A                          ;  可分析A内八位恰为整数部分(最高位为0)JC SL0 MOV 27H,#00H AJMP SL5
SL0:  MOV 27H,#05H
SL5:  MOV 29H,A                       ;  为小数部分显示0和5做准备LCALL DISPLAY                   ;  转入显示函数
LJMP MAIN                             ;  返回主函数,程序执行完毕;显示函数
DISPLAY:MOV A,29H MOV B,#10 DIV AB MOV ABIT,B MOV B,#10 DIV AB MOV BBIT,B MOV CBIT,A                      ;  此时可知CBA即为百十个位MOV R0,#4                       ;  循环显示
DPL1: MOV R1,#250                     ;  长时间延时循环
DPL2: MOV C,24H.7 JNC DPL3 MOV P0,#0BFH SETB P1.2 LCALL DELAY CLR P1.2 AJMP DPL4
DPL3: MOV P0,#0FFH  SETB P1.2 LCALL DELAY CLR P1.2                        ;  符号位判断显示
DPL4: MOV DPTR,#TAB MOV A,27H MOVC A,@A+DPTR MOV P0,A SETB P1.6 LCALL DELAY CLR P1.6                        ;  小数位判断显示MOV A,ABIT MOV DPTR,#TAB1 MOVC A,@A+DPTR MOV P0,A SETB P1.5 LCALL DELAY CLR P1.5 MOV A,BBIT MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,A SETB P1.4 LCALL DELAY                       ;  个十百位显示CLR P1.4     MOV A,CBIT MOVC A,@A+DPTR MOV P0,A SETB P1.3 LCALL DELAY  CLR P1.3 DJNZ R1,DPL2 DJNZ R0,DPL1
RET ;延迟函数
DELAY:MOV R5,#10
DEL0: MOV R6,#1
DEL1: MOV R7,#20
DEL2: DJNZ R7,DEL2DJNZ R6,DEL1 DJNZ R5,DEL0
RET TAB:                                  ;  正常阳极数码0-9DB  0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
TAB1:                                 ;  带小数点的个位显示数码0-9DB  40H,79H,24H,30H,19H,12H,02H,78H,00H,10H LOOP:JMP LOOP ;====================================================================
END

基于DS18B20数字温度传感器的温度计设计相关推荐

  1. Arduino基础篇(七)-- 如何使用DS18B20数字温度传感器(基于OneWire和DallasTemperature库)

    温度传感器是指能感受温度并转换成可用输出信号的传感器.按测量方式分为接触式和非接触式,按照传感器材料及电子元件分为热电阻和热电偶两类,按照工作原理分为模拟式和数字式.本篇主要介绍数字温度传感器 DS1 ...

  2. 【正点原子FPGA连载】第二十七章DS18B20数字温度传感器实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  3. 【正点原子STM32连载】第三十九章 DS18B20数字温度传感器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  4. 温度传感器的c语言程序,DS18B20数字温度传感器C语言程序实例

    51单片机DS18B20数字温度传感器设计 与C程序 #include #define uchar unsigned char #define uint unsigned int #define DQ ...

  5. DS18B20数字温度传感器及单总线协议规定

    1,DS18B20数字温度传感器的主要特点 通信采用1-Wire接口 每个DS18B20都有唯一的64位序列码储存在板载ROM中 无需外部元件 可从数据线供电,电源范围为3.0V ~ 5.5V. 可测 ...

  6. STM32与DS18B20数字温度传感器寄生供电方式的优化方案与1-wire总线程序设计

    STM32与DS18B20数字温度传感器寄生供电方式的优化方案与1-wire总线程序设计 DS18B20是常用的一种数字温度传感器,通过1-wire总线实现传感器内部寄存器的访问.传感器有两种供电方式 ...

  7. 【正点原子MP157连载】第二十六章 DS18B20数字温度传感器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  8. DS18B20数字温度传感器

    目录 一.基础知识 1.基础介绍: 2.DS18B20特点: 3.单总线时序 4.相关操作时序 5.部分ROM指令 二.相关代码 1. 使用步骤(单点总线情况) 2. 代码展示 数字温度传感器你会用了 ...

  9. ESP32-IDF开发实例-传感器模块编程-DS18B20数字温度传感器

    DS18B20温度传感器 ESP32是一系列高度集成的.专为移动设备.可穿戴电子产品设计的物联网模块,其集成了天线开关.RF balun.功率放大器.低接收噪声放大器,滤波器.电源管理模块等,可以独立 ...

最新文章

  1. 微信红包要哭了...给抢红包设计一个新交互
  2. 数据结构排序法之堆排序he归并排序
  3. 修改uid gid 的起始范围
  4. 分区表(Partitioned object)
  5. java 的记住用户名和密码,JAVA--高级基础开发Cookie实现记住用户名和密码
  6. python的from_bytes属性_Python parse.quote_from_bytes方法代碼示例
  7. 微博同步ValidatorException
  8. 笔记(3)——Clustering the tagged web
  9. 郭天祥《新概念51单片机C语言教程》序言
  10. cocoscreator摘星星补充-添加结束游戏
  11. Arm开发板上使用ldd命令
  12. 企业邮箱怎么收发邮件,怎么保护公司邮件安全?
  13. 架构:短址(short URL)原理及其实现(短地址|短url)
  14. 安卓手机内存卡测试软件,安卓手机硬件检测软件
  15. 牛客每日一题系列(持续更新)
  16. c语言 爱心 (koi奋斗中~~)
  17. 期货反向对冲-要成为长期赚钱的1%,你得学会反着干
  18. html标签图片填充背景色快捷键,ps中填充颜色的快捷键是什么?
  19. 自媒体推广渠道,如何推广来看看这3步能帮到你
  20. 《卓有成效的管理者》第一次心得

热门文章

  1. Qt 股票资金流向评估
  2. SSM框架下对信息执行修改操作时的信息弹窗回显以及对信息修改后对数据库的更新问题
  3. 【第十二篇】Flowable事件-定时器事件
  4. 如何剪出一个圆形,保存出来还是圆形图片
  5. 探寻平台经济健康发展和垄断规制
  6. Swift实战-豆瓣电台(三)获取网络数据
  7. 为什么女性朋友容易患上拇外翻?
  8. 工业级光纤收发器的芯片介绍
  9. 对比Google翻译、百度翻译和有道翻译
  10. 一千年的沉睡作者深秋葉蕭蕭