IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于汇编语言的DS18B20温度传感器设计 -> 正文阅读

[嵌入式]基于汇编语言的DS18B20温度传感器设计

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

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-16 11:54:30  更:2021-08-16 11:54:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 2:21:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计