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
|