基于DS18B20在单片机AT89S52上实现的数字式温度计.docx
《基于DS18B20在单片机AT89S52上实现的数字式温度计.docx》由会员分享,可在线阅读,更多相关《基于DS18B20在单片机AT89S52上实现的数字式温度计.docx(17页珍藏版)》请在冰豆网上搜索。
基于DS18B20在单片机AT89S52上实现的数字式温度计
基于DS18B20在单片机AT89S52上实现的数字式温度计
功能要求
数字式温度计要求测温范围为-50~110℃,精度误差在0.1℃以内,LED数码管直读显示并通口串口发送到PC机上显示
方案论述
在日常生活及工农业生产中经常要用到温度的检测及控制,传统的测温元件有热电偶和热电阻。
而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,需要比较多的外部硬件支持,硬件电路复杂,软件调试复杂,制作成本高。
本数字温度设计采用美国DALLAS半导体公司继DS1820之后推出的一种改进型智能温度传感器DS18B20作为检测元件,测温范围为-55~125℃,最大分辩率可达0.0625℃。
DS18B20可以直接读出被测温度值,而且采用1-wire与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。
系统硬件电路的设计
温度计电路设计原理图如下图所示,控制器使用单片机AT89S52,温度传感器使用DS18B20,用4位共阴LED数码管以动态扫描法实现温度显示
基于DS18B20在单片机AT89S52上实现的数字式温度计
温度传感器工作原理
DS18B20功能特点
1.采用单总线技术,与单片机通信只需要一根I/O线,在一根线上可以挂接多个DS18B20。
2.每只DS18B20具有一个独有的,不可修改的64位序列号,根据序列号访问地应的器件。
3.低压供电,电源范围从3~5V,可以本地供电,也可以直接从数据线上窃取电源(寄生电源方式)。
4.测温范围为-55℃~+125℃,在-10℃~85℃范围内误差为±0.5℃。
5.可编辑数据为9~12位,转换12位温度时间为750ms(最大)
6.用户可自设定报警上下限温度
7.报警搜索命令可识别和寻址哪个器件的温度超出预定值。
8.DS18B20的分辩率由用户通过EEPROM设置为9~12位
9.DS18B20可将检测到温度值直接转化为数字量,并通过串行通信的方式与主控制器进行数据通信。
DS18B20内部结构及功能
DS18B20的内部结构如下图所示,主要包括:
寄生电源,温度传感器,64位ROM和单总线接口,存放中间数据的高速暂存器RAM,用于存储用户设定温度上下限值的TH和TL触发器,存储与控制逻辑,8位循环冗余校验码(CRC)发生器等7部分
温度和数字量的关系
ROM操作命令
指令
说明
读ROM命令(33H)
读18B20的序行号
搜索ROM命令(F0H)
识别总线上各器件的编码
匹配ROM命令(55H)
用于多个DS18B20的定位
跳过ROM命令(CCH)
此命令执行后,存储器操作将针对总线上的所有操作
报警搜索ROM命令(ECH)
仅温度超限的器件对此命令做出响应
RAM操作命令
指令
说明
温度转换(44H)
启动温度转换
读暂存器(BEH)
读全部暂存器内容,包括CRC字节
写暂存器(4EH)
写暂存器第2,3和4个字节的数据
复制暂存器(48EH)
将暂存器中的TH,TL和配置寄存器内容复制到EEPROM中
读EEPROM(B8H)
将TH,TL和配置寄存器内容从EEPROM中回读至暂存器
字节
ROM
RAM
0
产品代号
温度低8位
1
48位
器件
序列
号
温度高8位
2
TH
3
TL
4
配置寄存器
5
保留
6
保留
7
CRC
保留
8
CRC
温度配置寄存器的格式如下
0
R1
R2
1
1
1
1
1
分辩率设置如表
R1
R2
分辩率设置/位
测温精度/C
转换时间/ms
0
0
9
0.5
93.75
0
1
10
0.25
187.5
1
0
11
0.125
375
1
1
12(默认)
0.0625
750
DS18B20的通信协议
DS18B20器件要求采用严格的通信协议,以保证数据的完整性。
该协议定义了几种信号类型:
复位脉冲,应答脉冲时隙;写0,写1时隙;读0,读1时隙。
与DS18B20的通信,是通过操作时隙完成单总线上的数据传输。
发送所有的命令和数据时,都是字节的低位在前,高位在后。
1. 复位和应答脉冲时隙
每个通信周期起始于微控制器发出的复位脉冲,其后紧跟DS18B20发出的应答脉冲,在写时隙期间,主机向DS18B20器件写入数据,而在读时隙期间,主机读入来自DS18B20的数据。
在每一个时隙,总线只能传输一位数据。
2. 写时隙
当主机将单总线DQ从逻辑高拉为逻辑低时,即启动一个写时隙,所有的写时隙必须在60~120us完成,且在每个循环之间至少需要1us的恢复时间。
写0和写1时隙如图所示。
在写0时隙期间,微控制器在整个时隙中将总线拉低;而写1时隙期间,微控制器将总线拉低,然后在时隙起始后15us之释放总线。
3. 读时隙
DS18B20器件仅在主机发出读时隙时,才向主机传输数据。
所以在主机发出读数据命令后,必须马上产生读时隙,以便DS18B20能够传输数据。
所有的读时隙至少需要60us,且在两次独立的读时隙之间,至少需要1us的恢复时间。
每个读时隙都由主机发起,至少拉低总线1us。
在主机发起读时隙之后,DS18B20器件才开始在总线上发送0或1,若DS18B20发送1,则保持总线为高电平。
若发送为0,则拉低总线当发送0时,DS18B20在该时隙结束后,释放总线,由上拉电阻将总线拉回至高电平状态。
DS18B20发出的数据,在起始时隙之后保持有效时间为15us。
因而主机在读时隙期间,必须释放总线。
并且在时隙起始后的15us之内采样总线的状态。
单片机程序设计
DOUTBITP1.7 ;定义P1.7为与DS18B20的通信口
ORG0000H
MOVTMOD,#20H ;定时器T1工作于方式2
MOVTH1,#0E6H ;传输速率为1200波特
MOVTL1,#0E6H
SETBTR1 ;启动定时器T1
MOVSCON,#40H ;串行口工作于方式1
MOVR0,#38H ;将温度的最高位符号位放入Ro寄存器
MAIN:
LCALLRESET ;调用复用子程序
MOVA,#0CCH ;写跳过ROM命令
LCALLWRITE ;调用写子程序
MOVA,#44H ;启动温度转换
LCALLWRITE
LCALLRESET ;调用复用子程序
MOVA,#0CCH ;写跳过ROM命令
LCALLWRITE
MOVA,#0BEH ;发读存储器命令
LCALLWRITE
LCALLREAD ;调用读子程序
MOV32H,3DH ;温度值存储在32H,33H单元
LCALLREAD
MOV33H,3DH
LCALLCONVERT ;温度转换子程序
LCALLDISPLAY ;调用显示子程序
LCALLSEND ;把温度发送到PC
SJMPMAIN
RESET:
CLRDOUT
MOVR2,#200
NE1:
NOP
DJNZR2,NE1
SETBDOUT
MOVR2,#30
DJNZR2,$ ;控制适当的延时
CLRC
MOVC,DOUT
JCNE3
MOVR6,#80
NE5:
MOVC,DOUT
JCNE3
DJNZR6,NE5
SJMPRESET
NE3:
MOVR2,#250
DJNZR2,$ ;控制适当的延时
RET
WRITE:
MOVR3,#8 ;定义循环次数
WR1:
SETBDOUT
MOVR4,#8
RRCA ;把对DS18B20操作的命令一位一位的从A移到CY位中
CLRDOUT
DJNZR4,$ ;控制适当的延时
MOVDOUT,C ;把CY位中的命令通过P1.7口发给DS18B20
MOVR4,#20
DJNZR4,$ ;控制适当的延时
DJNZR3,WR1 ;循环八次
SETBDOUT
RET
READ:
MOVR6,#8 ;定义循环次数
RE1:
CLRDOUT
MOVR4,#6
SETBDOUT
DJNZR4,$ ;控制适当的延时
MOVC,DOUT ;把从P1.7的数读到CY位中
RRCA ;把数据一位一位从CY位移到A中
MOVR5,#30
DJNZR5,$ ;控制适当的延时
DJNZR6,RE1 ;循环八次
MOV3DH,A ;把读到的数据从A中放在3DH中
SETBDOUT
RET
CONVERT:
MOVA,33H
ADDA,#00H
DAA
MOV33H,A
ANLA,#0F0H
SWAPA
MOV38H,A ;33H高4位
MOVA,33H
ANLA,#0FH
MOV37H,A ;33H低4位
MOVA,32H
ADDA,#00H
DAA
MOV32H,A
ANLA,#0F0H
SWAPA
MOV36H,A ;32H高4位
MOVA,32H
ANLA,#0FH
MOV35H,A ;32H低4位
RET
DISPLAY:
MOVB,#10H ;数码管位选信号起始的位
MOVA,35H ;显示温度的小数位
LCALLREVEAL
LCALLDELAY
MOVA,36H ;显示温度整数位的低位
LCALLREVEAL
LCALLDELAY
MOVA,37H ;显示温度整数位的高位
LCALLREVEAL
LCALLDELAY
MOVA,38H ;显示温度的符号位
LCALLREVEAL
LCALLDELAY
RET
REVEAL:
MOVDPTR,#TAB ;查表字形码
MOVCA,@A+DPTR
MOVP2,A ;P2口段选
MOVA,B ;循环右移数码管位选信号
RRA
MOVB,A
MOVP1,A ;P1口位选
RET
DELAY:
MOVR6,#70
D2:
MOVR7,#10
D1:
NOP
NOP
NOP
DJNZR7,D1
DJNZR6,D2
RET
SEND:
MOVA,@R0 ;将存放温度的起始位放入A中
MOVDPTR,#TAB2 ;从表中查找温度对应的ASCII码
MOVCA,@A+DPTR
MOVSBUF,A ;将温度发送到发送缓冲区SBUF
JNBTI,$ ;一帧未发完继续查询
CLRTI ;一帧发完了就清发送中断标志位为0
DECR0 ;将R0的地址减一以读取下一位的温度值
CJNER0,#34H,J1 ;温度未发完则继续发,直到把温度的四位值全部发完
MOVR0,#38H ;修改R0的起始地址为存放温度的首地址
RET
J1:
SJMPSEND
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H
TAB2:
DB30H,31H,32H,33H,34H,35H,36H,37H,38H,39H ;0~9的ASCII码表
END
PC程序设计
stacksegmentstack’stack’
dw32dup(?
)
stackends
datasegment
dataends
codesegment
beginprocfar
assumess:
stack,cs:
code,ds:
data
pushds
movax,0
pushax
mov ax,data
movds,ax
MAIN:
MOVDX,3FBH ;操作对象为线路控制寄存器LCR
MOVAL,80H ;通过给DLAB置1选波特率除数锁存器
OUTDX,AL
MOVDX,3F8H ;操作对象为波特率除数锁存器的低8位
MOVAL,60H ;波特率为1200
OUTDX,AL
MOVDX,3F9H ;操作对象为波特率除数锁存器的高8位
MOVAL,00H
OUTDX,AL
MOVDX,3FBH ;每帧8位,1个停止位,无校验位
MOVAL,03H
OUTDX,AL
MOVDX,3FCH ;Moderm控制寄存器LCR
MOVAL,03H
OUTDX,AL
MOVDX,3F8H ;接收缓冲区RDR
INAL,DX
AGAIN:
MOVCX,4 ;循环输出四次后会回车换行再输出
REC:
MOVDX,3FDH ;传输线状态寄存器LSR
WAIT:
INAL,DX
TESTAL,01H ;检测接收数据准备好了没有
JZWAIT ;为0表示接收数据未准备好则等待
MOVDX,3F8H ;接收缓冲区RDR
INAL,DX ;读入端口数据
MOVDL,AL ;DL中置输出字符的ASCII码
MOVAH,2 ;2号功能调用,显示一个字符
INT21H
LOOPREC
MOVDL,0DH ;在显示器上输出回车
MOVAH,2 ;2号功能调用,显示一个字符
INT21H
MOVDL,0AH ;在显示器上输出换行
MOVAH,2 ;2号功能调用,显示一个字符
INT21H
JMPAGAIN
ret
beginendp
codeends
endbegin