基于汇编语言的DS18B20温度传感器设计

您所在的位置:网站首页 数码管显示温度程序 基于汇编语言的DS18B20温度传感器设计

基于汇编语言的DS18B20温度传感器设计

2024-06-20 23:08| 来源: 网络整理| 查看: 265

1 概述

1.1 课题内容

         利用温度传感器DS18B20与MCS-51单片机结合来测量温度,通过一根单总线连接,即可直接读出被测温度,读出或写入信息只需要一根数据线。读出的数据用LED数码管显示,显示温度为-99.5℃到99.5℃,精确到0.5℃。测量的温度用四位数码管显示。

1.2 课题原理

    DS18B20内部有一个激光刻录的唯一的64位ROM序号,内部还有用于储存测得的温度值的两个8位RAM存储器。DS18B20的工作时序包括初始化时序、写时序、读时序。通过主控制器发送高低电平,来与从机传输信号,得到DS18B20的数据内容并储存到单片机内部RAM中,通过片选LED数码管来将数据显示。

1.3 课程意义

    DS18B20与MCS-51单片机通过单总线连接,通过课程设计,掌握了单总线扩展技术,理解了

机与从机之间的交互关系

2 系统设计

  2.1 流程图设计

   程序分成了多个子程序,由多个子程序共同完成温度的读取与显示。

图一 DS18B20温度传感器简易流程图

程序主要分为了复位模块、写时序模块、读时序模块、改变分辨率模块、温度数据转换模块、数码管显示模块。通过定义的FLAG的数据进行判断单总线上是否存在DS18B20从机。然后对其进行分辨率规定,读数据,数据转换,数据显示。

                                                          

3 硬件设计

3.1 DS18B20

图二 DS18B20与51单片机的连接

DS18B20连接在单片机的P3.4口上。P3口发挥了作为I/O口的功能。通过一根单总线连接,单片机向DS18B20发出时序信号来对DS18B20做出指令。

             

                                          图三 DS18B20的暂存寄存器

当单片机通过单总线读取DS18B20的数据时,总是从Byte 0的最低位开始传输的。Byte 0和Byte 1用来存储温度的第八位和高八位。本次设计只用到byte0和byte1以及用byte4的配置寄存器来设定分辨率。                                                     

     

                                          图四 配置寄存器与温度分辨率的配置

       配置寄存器只有bit5和bit6是可以写入的,其他不可以写入。上电默认R1R0=11(十二位分辨率),精度过太高,转换时间长,减小精度,使温度的精度为0.5℃

3.2 LED数码管显示

数码管显示部分由四块LED八段数码管和两个锁存器组成。通过改变P2.1口的数值来改变U4的开关,然后再改变P0口的值进行选择数码管显示,以此来实现数码管的动态显示。

本次设计所要用LED1来显示正负号,用LED2显示DS18B20测得的温度数据的十位部分,用LED3来显示测得的温度数据的个位部分并显示小数点,用LED4来显示温度数据的小数部分,由于设定精度为0.5,所以LED4只会显示0或5

             

                                                 图五 数码管显示电路

                                                 4 软件设计

4.1 复位

                                                  图六 初始化时序

       主控制器首先发送一个高电平,然后再拉低,并维持500us,然后主机转为输入状态,上大电阻将总线拉为高电平。DS18B20在上电之后就检测是否存在480-960us的低电平出现,如果有总线拉为高电平之后的50us左右等待时间后将总线拉低60-240us告诉主机DS18B20处于ready状态。复位程序中使用FLAG来做响应标志位,FLAG=1表示从机存在,FLAG=0表示从机不存在。

;复位程序                

RESET: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

4.2 写入数据

                                                         图七 写时序

       主控制器的写时序包括写1和写0,写时序周期大于60us小于120us。每一个写时序都开始于主控制器拉低总线0-15us,若要写“0”,继续拉低总线,使总线自开始到拉高至少60us。若要写“1”,则在拉低总线开始写时序1us之后释放总线为高电平。

       写入数据必须先复位然后跳过ROM,再进行读写。

;写入数据                     ; 不可超过120us,否则无法写入

WRITE:MOV R2,#8 ; 写入八位二进制码,即循环次数 CLR C ; 进位标志位初始置零 WR1: CLR DQ ; 拉低总线为写入做准备 MOV R3,#6 DJNZ R3,$ ; 延时 RRC A ; A的最低为给CY,使A从低到高写入从机 MOV DQ,C ; 将A又循环写入C,写入总线以输入到传感器 MOV R3,#23 DJNZ R3,$ ; 延时 SETB DQ ; 释放,表示此位写入完毕 NOP DJNZ R2,WR1 ; 循环八次,一次写入八位 SETB DQ ; 释放总线 RET

4.3 读出数据

                                         图八 读时序

只有在读时段期间DS18B20才能向主设备传输数据,在读数据前可以对数据进行转换为温度操作。读时段通过主控制器将总线拉低至少1us再释放总线来完成初始化,初始化完成后DS18B20会向总线发送0或1。DS18B20通过将总线拉高来发送1,将总线拉低来发送0。发送完后,总线通过上拉电阻恢复到高电平。DS18B20发送的数据在初始化后只有15us的有效时间。读出数据后延时50us。

;读出数据

READ: MOV R4,#2 ; 读取两个八位数据,外层循环次数 MOV R1,#29H ; 立即数寻址给定存储位置 REE0: MOV R2,#8 ; 给定数据位数,是内层循环次数 REE1: CLR C ; 进位标志位初始置零 SETB C NOP NOP CLR DQ NOP NOP NOP SETB DQ ; 输入脉冲并持续2-3个机器周期 MOV R3,#7 DJNZ R3,$ ; 延时,等待传感器响应 MOV C,DQ ; 按位读出 MOV R3,#23 DJNZ R3,$ ; 延时 RRC A ; 把C存入A内 DJNZ R2,REE1 ; 循环8次 MOV @R1,A ; 存储A DEC R1 ; 更换地址 DJNZ R4,REE0 ; 循环2次 RET

                                                       

4.4 温度转换

图九 RAM操作指令

图十 ROM操作指令

首先根据FLAG判断DS18B20是否存在。不存在跳回主程序,存在则写0CCH入DS18B20跳过ROM指令,然后写44H,使DS18B20温度转换。然后读时序,先复位,然后写入0CCH跳过ROM,然后写0BEH读暂存器内容。

;得到温度并转换

GET_TEMP: SETB DQ ; 释放总线 LCALL RESET ; 复位 JB FLAG,TSS2 ; 若传感器不存在,则直接返回主程序 RET TSS2: MOV A,#0CCH 8 LCALL WRITE ; 执行跳过ROM指令 MOV A,#44H LCALL WRITE ; 执行测温指令 LCALL DISPLAY ; 不仅延时,还让程序完全生效前数码管置零 LCALL RESET ; 复位 MOV A,#0CCH LCALL WRITE ; 执行跳过ROM置零 MOV A,#0BEH LCALL WRITE ; 执行读取温度数据指令 LCALL READ ; 跳转至通信子程序 RET

4.5 数据处理

;数据处理函数

CHANGE: MOV A,29H MOV 26H,29H MOV 25H,28H MOV 24H,28H ; 在24H存储原始数据防止丢失 MOV C,25H.7 ; 存储符号位进C JNC SN1 ; 判断温度的正负,正数则跳过转补码程序 MOV A,25H CPL 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 9 SL5: MOV 29H,A ; 为小数部分显示0和5做准备 LCALL DISPLAY ; 转入显示函数 LJMP MAIN ; 返回主函数,程序执行完毕

29H存放温度低八位,28H存放温度高八位,首先将28H的最高位放在进位CY中,对CY判断,若CY=0则读取的温度为正数,若CY=1则读取的温度为负数。

若是正数,温度高八位的低四位与温度低八位的高四位组成了温度的整数部分,将28H中存放的温度高八位通过进位标志位CY传输到29H中,使温度高八位的低四位与温度低八位的高四位组合。

若是负数,则将25H中暂存的温度高八位取反,将26H中暂存的温度低八位取反加一,再放回到28H和29H,进行与正数一样的移位操作。

移位操作的最后一步可以bit3的内容存到CY中,若CY=1,则小数位为5,若CY=0,则小数位为0。最后调用显示子程序。

4.6 数码管显示

   

                                                 图十一 数码管显示模块

数码管显示部分由四块LED八段数码管和两个锁存器组成。通过改变P2.1口的数值来改变U4的开关,然后再改变P0口的值进行选择数码管显示,以此来实现数码管的动态显示。

本次设计所要用LED1来显示正负号,用LED2显示DS18B20测得的温度数据的十位部分,用LED3来显示测得的温度数据的个位部分并显示小数点,用LED4来显示温度数据的小数部分,由于设定精度为0.5,所以LED4只会显示0或5

;显示函数

DISPLAY: MOV A,29H MOV B,#10 DIV AB 10 MOV ABIT,B MOV B,#10 DIV AB MOV BBIT,B MOV CBIT,A ; 此时可知CBA即为百十个位 MOV R0,#4 MOV P2,#21H ; 循环显示 DIS0: MOV R1,#250 ; 长时间延时循环 DIS1: MOV C,24H.7 JNC DIS2 ; 正数转移,负数继续 MOV R0,#0EH SETB P2.1 MOV A,R0 MOV P0,A CLR P2.1 MOV A,#40H MOV P0,A LCALL DELAY AJMP DIS3 DIS2: MOV R0,#0EH SETB P2.1 MOV A,R0 MOV P0,A CLR P2.1 MOV A,#00H MOV P0,A LCALL DELAY ; 符号位判断显示 DIS3: MOV A,27H ; 显示小数 MOV DPTR,#TAB MOVC A,@A+DPTR MOV R0,#07H SETB P2.1 MOV P0,R0 CLR P2.1 MOV P0,A LCALL DELAY ; 小数位判断显示 DIS4: MOV A,ABIT ;显示个位 MOV DPTR,#TAB1 MOVC A,@A+DPTR MOV R0,#0BH SETB P2.1 MOV P0,R0 CLR P2.1 MOV P0,A LCALL DELAY DIS5: MOV A,BBIT ;显示十位 MOV DPTR,#TAB MOVC A,@A+DPTR MOV R0,#0DH SETB P2.1 MOV P0,R0 CLR P2.1 MOV P0,A LCALL DELAY RET

附录

FLAG BIT F0 ; 声明传感器复位返回的标志位 DQ BIT P3.4 ; 定义DQ 作为数据传输端口名 ABIT EQU 35H ; 个 BBIT EQU 36H ; 十 CBIT EQU 37H ; 百 ORG 0000H AJMP MAIN ORG 0100H ;主程序 MAIN: LCALL RESET ; 复位 LCALL FBLCHANGE ; 改变温度的初始分辨率为9位 LCALL GET_TEMP ; 得到温度 AJMP CHANGE ; 跳转到数据处理子程序 ;复位程序 RESET:SETB DQ ; 总线释放 NOP ; 保持高电平,延时 CLR DQ ; 总线置 0,请求响应 MOV R0,#0FBH 16 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 RESET ; 复位 MOV A,#0CCH ; 跳过ROM LCALL WRITE ; 把A写入传感器 MOV A,#1FH ; 改变温度分辨率为9 LCALL WRITE ; 把A写入传感器 RET ;得到温度并转换 GET_TEMP: SETB DQ ; 释放总线 LCALL RESET ; 复位 JB FLAG,TSS2 ; 若传感器不存在,则直接返回主程序 RET TSS2: MOV A,#0CCH LCALL WRITE ; 执行跳过ROM指令 MOV A,#44H LCALL WRITE ; 执行测温指令 LCALL DISPLAY ; 不仅延时,还让程序完全生效前数码管置零 LCALL RESET ; 复位 MOV A,#0CCH LCALL WRITE ; 执行跳过ROM置零 MOV A,#0BEH LCALL WRITE ; 执行读取温度数据指令 LCALL READ ; 跳转至通信子程序 RET 17 ;写入数据 ; 不可超过120us,否则无法写入 WRITE:MOV R2,#8 ; 写入八位二进制码,即循环次数 CLR C ; 进位标志位初始置零 WR1: CLR DQ ; 拉低总线为写入做准备 MOV R3,#6 DJNZ R3,$ ; 延时 RRC A ; A的最低为给CY,使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 NOP NOP CLR DQ NOP NOP NOP SETB DQ ; 输入脉冲并持续2-3个机器周期 MOV R3,#7 DJNZ R3,$ ; 延时,等待传感器响应 MOV C,DQ ; 按位读出 MOV R3,#23 DJNZ R3,$ ; 延时 RRC A ; 把C存入A内 DJNZ R2,REE1 ; 循环8次 MOV @R1,A ; 存储A DEC R1 ; 更换地址 DJNZ R4,REE0 ; 循环2次 RET 18 ;数据处理函数 CHANGE: MOV A,29H MOV 26H,29H MOV 25H,28H MOV 24H,28H ; 在24H存储原始数据防止丢失 MOV C,25H.7 ; 存储符号位进C JNC SN1 ; 判断温度的正负,正数则跳过转补码程序 MOV A,25H CPL 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 19 MOV CBIT,A ; 此时可知CBA即为百十个位 MOV R0,#4 MOV P2,#21H ; 循环显示 DIS0: MOV R1,#250 ; 长时间延时循环 DIS1: MOV C,24H.7 JNC DIS2 ; 正数转移,负数继续 MOV R0,#0EH SETB P2.1 MOV A,R0 MOV P0,A CLR P2.1 MOV A,#40H MOV P0,A LCALL DELAY AJMP DIS3 DIS2: MOV R0,#0EH SETB P2.1 MOV A,R0 MOV P0,A CLR P2.1 MOV A,#00H MOV P0,A LCALL DELAY ; 符号位判断显示 DIS3: MOV A,27H ; 显示小数 MOV DPTR,#TAB MOVC A,@A+DPTR MOV R0,#07H SETB P2.1 MOV P0,R0 CLR P2.1 MOV P0,A LCALL DELAY ; 小数位判断显示 DIS4: MOV A,ABIT ;显示个位 MOV DPTR,#TAB1 MOVC A,@A+DPTR MOV R0,#0BH SETB P2.1 MOV P0,R0 CLR P2.1 MOV P0,A LCALL DELAY DIS5: MOV A,BBIT ;显示十位 MOV DPTR,#TAB 20 MOVC A,@A+DPTR MOV R0,#0DH SETB P2.1 MOV P0,R0 CLR P2.1 MOV P0,A LCALL DELAY RET ;延迟函数 DELAY: MOV R5,#08H DD: MOV R6,#0FAH DJNZ R6,$ DJNZ R5,DD RET TAB: ; 共阴极数码管0-9 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH TAB1: ; 带小数点的个位显示数码0-9 DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH LOOP: JMP LOOP ; END



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3