资源描述
吉 吉林工商学院
温度测控器课程设计
设计名称: 温度测控器
班 级:电子信息10403班
2012年 12 月 14 日
一、温度测控器的原理及功能
如图1-1所示此多点温度测量电路主要由以下几部分组成:两个温度传感器DS18B20择开关电路,控制器单片机AT89S52、扫描驱动电路、数码管LED显示器、报警及电源电路等。
LED显示器
预设温度 实际温度
单片机
AT89S52
扫描驱动
DS18B20
电 源
温度控制电路
图1-1系统组成方框图
温度传感器从测试点采集温度,然后把温度转换成电压(或电流),温度传感器输出电压的大小随温度的高低变化而变化,电压值的变化范围从几个微伏到几个毫伏,不同的温度传感器,输出电压的范围也差别很大。单片机AT89S52是多点温度测量电路的控制核心,它将采集到的数字温度电压值,经过计算处理,得到相应的温度值,经扫描驱动送到LED显示器以数字形式显示测量的温度。LED显示器用于显示预设温度和实际测量温度的结果。
二、系统硬件电路的设计
2.1 温度测量电路
多点温度测量电路由主控器单片机AT89S52作为多点温度测量电路的核心,温度传感器DS18B20负责从测量点采集温度,七位共阳LED数码管以动态扫描法实现温度显示。
2.1.1 DS18B20单线智能温度传感器的工作原理
(1) DS18B20单线智能温度传感器的性能特点
DS18B20温度传感器是美国DALLAS半导体公司最近推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。
DS18B20的性能特点如下:
独特的单线接口仅需要一个端口引脚进行通信;
多个DS18B20可以并联在唯一的三线上,实现多点组网功能;
无须外接部件;
可通过数据供电,电压范围为3.0—5.5V;
零待机功耗;
温度以9或12位数字量读出;
用户可定义的非易失性温度报警设置;
报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
负电压特性,电源极性接反时,温度计不会因发热而烧坏,但不能正常工作.
(2) DS18B20的内部结构框图如图2—1 所示,它采用3脚PR—35封装或8脚SOIC封装其管脚封装如图2-2所示。
(3) DS18B20单线智能温度传感器的工作原理
64位ROM的位结构如图2—3 所示。开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个 DS18B20可以采用一线进行通信的原因。非易失性温度报警触发器TH和TL,可通过软件写入户报警上下限。
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可
电擦除的EEPRAM。高速暂存RAM的结构为8字节的存储器,结构如图2—6 所示。
C
VDD
I/O
存储器与控制器
高速缓存
8位 CRC发生器
配置寄存器
低温触发器TL
高温触发器TH
温度传感器
64位ROM和单线接口
图2-1 DS18B20内部结构
图2-2 DS18B20的引脚排列
头2个字节包含测得的温度信息,第3和第4字节是TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时按此寄存器中的分辨率将温度转换为相应精度的数值。该字节各位的定义如图2-5所示。低5位一直为1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20 出厂时该位被设置为0,用户不要改动,R1和R0决定温度转换的精度位数,即用来设置分辨率,方法见表2—4 。
8位检验CRC
48位序列号
8位工厂代码(10H)
MSB LSB MSB LSB MSB LSB
图2—3 位64位ROM结构图
由表3—3可见,DS18B20温度转换时间比较长,而且设定的分辨率越高,所需要的温度数据转换时间就越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
表2—4 DS18B20分辨率的定义规定
R1
R0
分辨率/位
温度最大转换时间/ms
0
0
9
93.75
0
1
10
187.5
1
0
11
375
1
1
12
750
温度LSB
温度MSB
TH用户字节1
TL用户字节2
配置寄存器
保留
保留
保留
CRC
1字节
TH用户字节1
2字节
3字节
4字节
TL用户字节2
5字节
6字节
7字节 EEPROM
8字节
9字节
图2-5 配置寄存器
图2—6 高速暂存RAM结构图
TM
R1
R0
1
1
1
1
1
当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单总线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。温度值格式如图2—8 所示。
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制值。表2—4 是一部分温度值对应的二进制温度数据。
23
22
21
20
2-1
2-2
2-3
2-4
S
S
S
S
S
S
S
S
LS字节
MS字节
图2—7 温度数据值格式
在64位ROM的最高有效字节中存储器循环冗余检验码(CRC)。主机根据ROM的前56位来计算CRC值,并和存入DS18B20的CRC值做比较,以判断主机收到的ROM数据是否正确。
DS18B20的测温原理如图2—9所示.图中低温度系数晶振的振荡频率受温度的影响很小,用它产生的信号作为减法计数器1的脉冲输入;高温度系数晶振随温度变化其振荡频率明显变化,所以产生的信号作为减法计数器2的脉冲输入。图中还隐含着计数门,当计数门打开时,DS18B20对低温度系数振荡器产生的时钟脉冲进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器决定,每次测量前,首先将—55℃所对应的一个基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在—55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置值将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值就是所测温度值。图2—9 中的斜率累加器用于温度补偿和修正测温过程中的非线形性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直到温度寄存器值达到被测温度值。
另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲) 发ROM功能命令 发存储器操作命令 处理数据。
(4) DS18B20与单片机的接口电路
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。另一种是寄生电源方式,如图2—10 所示。单片机端口接单总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开始时间最大为10μs。采用寄生电源供电方式时VDD和GND 端均接地。由于单线制只有一根线,因此发送接口必须是三态的。
温度/℃
二进制
十六进制表示
+125
0000 0111 1101 0000
07D0H
+85
0000 0101 0101 0000
0550H
+25.0625
0000 0001 1001 0001
0191H
+10.125
0000 0000 1010 0010
00A2H
+0.5
0000 0000 0000 1000
0008H
0
0000 0000 0000 0000
0000H
—0.5
1111 1111 1111 1000
FFF8H
—10.125
1111 1111 0101 1110
FF5EH
—25.0625
1111 1110 0110 1111
FE6FH
—55
1111 1100 1001 0000
FC90H
表2—8 DS18B20温度与测得值对应表
图2—9 DS18B20测温原理图
图2—10 DS18B20采用寄生电源的电路图
2.2 驱动电路
74ls245引脚图与用法
74LS245是我们常用的芯片,用来驱动led或者其他的设备,用法很简单如上图,这里简单的给出一些资料,他是8路同相三态双向总线收发器,可双向传输数据。
74LS245还具有双向三态功能,既可以输出,也可以输入数据。
当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。
当片选端/CE低电平有效时,DIR=“0”,信号由 B 向 A 传输;(接收)
*DIR=“1”,信号由 A 向 B 传输;(发送)当/CE为高电平时,A、B均为高阻态。
2.3 显示电路
LED 数码管显示原理
常用的LED显示器为8段(或7段)分别记作 a、b、c、d、e、f、g、dp 、其中 dp 为小数点,每一只发光二极管都有一根电极引到外部引脚上,而另外一只 引脚就连接在一起同样也引到外部引脚上,记作公共端(COM),如上图所示。
LED 数码管有两种,分为共阳极与共阴极.共阳极:当数码管里面的发 光二极管的阳极接在一起作为公共引脚,在正常使用时此引脚接电源正极.当发光二 极管的阴极接低电平时, 发光二极管被点亮, 从而相应的数码段显示, 而输入高电平的段则不能点亮。相反,共阴极:当数码管里面的发光二极管的阴极接 在一起作为公共引脚,在正常使用时此引脚接电源负极.当发光二极管的阳极接高电平时,发光二极管被点亮,从而相应的数码段显示,而输入低电平的 段则不能点亮。
为了使LED显示器显示不同的符号或数字,要把某些段的发光二极管点亮,这样就要为LED显示器提供代码,因为这些代码可使LED相应的段发光,从而显示不同字型,因此该代码也成为段码(或称字型码)。
段码与字节中各位对应关系
代码位
D7
D6
D5
D4
D3
D2
D1
D0
显示段
dp
g
f
e
d
c
b
a
八段LED数码管段代码编码表
字形
0
1
2
3
4
5
6
7
8
9
共阳
C0H
F9H
A4H
B0H
99H
92H
82H
F8H
80H
90H
共阴
3FH
06H
5BH
4FH
66H
6DH
7DH
07H
7FH
6FH
三、 系统软件的设计
系统程序主要包括主程序、DS18B20复位初始化子程序,读出转换后的温度值,生成显示码子程序及显示子程序
3.1 主程序
主程序的主要功能是负责温度的实际显示、读数并处理DS18B20的测量温度值,温度测量每1s进行一次。
3.2 DS18B20复位初始化子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC检验,校验有错时不进行温度数据的改写。
3.3读出转换后的温度值
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率知转换时间约750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
3.4生成显示码子程序及显示子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0将符号显示位移入下一位
四、程序设计流程
程序流程图如图
主程序
开始
初始化、设置常量
调DS18B20初始化子程序
读取转换温度值
调数据处理子程序
生成显示码
显示温度值
DS18B20复位子程序
DQ置1
DQ置0
延时至少573微秒
DQ置1
短延时,等待DS18B20回应
DQ=0?
FLAG1置1
延时
DQ置1
返回
FLAG1置0
Y
N
读温度值子程序
DQ置1
DS18B20复位
FLAG1=1
发送0CCH命令,跳过ROM匹配
发送温度转换命令44H
延时750微秒以上
DS18B20初始化
跳过ROM匹配
发送读温度命令0BEH
调用读数据子程序
返回
写DS18B20命令子程序
设R2=8
进位标志位C清零
短延时
DQ置0
ACC带进位右移1位
将C值写入DQ
短延时
DQ置1
已读8位
DQ置1
返回
Y
N
Y
N
读温度值子程序
设R1=31H
设R4=2(2字节)
已读8位
返回
数据处理子程序
C清零
设R2=8(8位数据)
进位标志位C清0
为DQ提供一个低脉冲
将DQ值读入C
ACC带进位右移1位
将ACC中的值存入@R1
R1=R1-1
读完2字节
符号位SIGN清零
将转换数据高字节最高位移入C
C=1
C清零
SIGN置1,表示负数
将转换数据低字节逐位取反再加1
转换数据高字节加进位C
分离整数与小数,整数存入INTEG,小数存入DECIM
返回
Y
N
Y
N
Y
N
附录一 程序
DQ BIT P3.6
FLAG1 BIT 00H
SIGN BIT 01H
MSB EQU 30H ;转换数据高位字节
LSB EQU 31H ;转换数据低位字节
INTEG EQU 32H ;转换数据整数部分
DECIM EQU 33H ;转换数据小数部分
SEG_S EQU 34H
SEG_I3 EQU 35H
SEG_I2 EQU 36H
SEG_I1 EQU 37H ;3位整数段码
SEG_D1 EQU 38H ;1位小数段码
SEG_C EQU 39H
SEG_I6 EQU 40H
SEG_I5 EQU 41H
SEG_I4 EQU 42H
;******************************************************
;主程序
;******************************************************
ORG 0000H
MAIN: LCALL INIT_1820 ;DS18B20初始化
LCALL GET_TEMPER ;读取转换数据
LCALL DATA_PROC ;数据处理
LCALL SEG_GEN ;生成显示码
LCALL DISPLAY ;数码显示
SJMP MAIN
;****************************************************************
;DS18B20复位初始化子程序
;****************************************************************
INIT_1820: SETB DQ
NOP
CLR DQ ;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB DQ ;拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB DQ,TSR3 ;等待DS18B20回应
DJNZ R0,TSR2 ;延时并检测应答信号
LJMP TSR4
TSR3: SETB FLAG1 ;置标志位,表示DS1820存在
LJMP TSR5
TSR4: CLR FLAG1 ;清标志位,表示DS1820不存在
LJMP TSR6
TSR5: MOV R0,#117
DJNZ R0,$ ;时序要求延时一段时间
TSR6: SETB DQ
RET
;*****************************************************************
;读出转换后的温度值
;*****************************************************************
GET_TEMPER: SETB DQ
LCALL INIT_1820 ;先复位DS18B20
JB FLAG1,TSS2
RET ;判断DS1820是否存在
TSS2: MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
LCALL DELAY ;等待AD转换结束,12位转换需750微秒
LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;将读出的温度数据保存到35H/36H
RET
;*****************************************************************
;写DS18B20的子程序(有具体的时序要求)
;*****************************************************************
WRITE_1820: MOV R2,#8 ;一共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
;****************************************************************
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
;****************************************************************
READ_18200: MOV R4,#2 ;将温度高位和低位从DS18B20中读出
MOV R1,#31H ;低位存入31H,高位存入30H
RE00: MOV R2,#8 ;数据一共有8位
RE01: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#9
RE10: DJNZ R3,RE10
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;***********************************************************
;数据处理子程序,判断正负,并分离转换值的整数和小数部分
;符号位为SIGN,0为正,1为负
;整数部分存放在INTEG(32H)中,小数部分存放在DECIM(33H)中
;***********************************************************
DATA_PROC: CLR C
CLR SIGN
MOV A,MSB
RLC A
JC NEG ;判断符号位
LJMP PROC
NEG: CLR C ;对负数取补码
SETB SIGN
MOV A,LSB
CPL A
ADD A,#1
MOV LSB,A
MOV A,MSB
CPL A
ADDC A,#0
MOV MSB,A
PROC: MOV A,LSB ;分离转换值的整数和小数部分
ANL A,#0FH
MOV DECIM,A ;存储小数部分
MOV A,MSB
SWAP A
ANL A,#0F0H
MOV INTEG,A
MOV A,LSB
SWAP A
ANL A,#0FH
MOV R0,INTEG
ORL A,R0
MOV INTEG,A ;存储整数部分
RET
;***************************************************************
;生成显示码子程序
;符号位段码存放在SEG_S中,整数段码存放在SEG_I3到SEG_I1中
;小数部分段码存放在SEG_D1到SEG_D4中
;***************************************************************
SEG_GEN: MOV DPTR,#TABLE
JB SIGN,S_NEG
MOV SEG_S,#00H
SJMP S_INT
S_NEG: MOV SEG_S,#40H
S_INT: MOV A,INTEG
MOV B,#100
DIV AB
MOVC A,@A+DPTR
MOV SEG_I3,A ;百位数段码
MOV A,B
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV SEG_I2,A ;十位数段码
MOV A,B
MOVC A,@A+DPTR
ORL A,#80H ;加小数点
MOV SEG_I1,A ;个位数段码
MOV DPTR,#SWITCH
MOV A,DECIM
MOV B,DECIM
ADD A,B
JMP @A+DPTR ;根据小数值查表,求段码
SWITCH: AJMP K0
AJMP K1
AJMP K2
AJMP K3
AJMP K4
AJMP K5
AJMP K6
AJMP K7
AJMP K8
AJMP K9
AJMP K10
AJMP K11
AJMP K12
AJMP K13
AJMP K14
AJMP K15
K0: MOV SEG_D1,#3FH
AJMP RETURN
K1: MOV SEG_D1,#06H
AJMP RETURN
K2: MOV SEG_D1,#06H
AJMP RETURN
K3: MOV SEG_D1,#5BH
AJMP RETURN
K4: MOV SEG_D1,#4FH
AJMP RETURN
K5: MOV SEG_D1,#4FH
AJMP RETURN
K6: MOV SEG_D1,#66H
AJMP RETURN
K7: MOV SEG_D1,#66H
AJMP RETURN
K8: MOV SEG_D1,#6DH
AJMP RETURN
K9: MOV SEG_D1,#7DH
AJMP RETURN
K10: MOV SEG_D1,#7DH
AJMP RETURN
K11: MOV SEG_D1,#07H
AJMP RETURN
K12: MOV SEG_D1,#7FH
AJMP RETURN
K13: MOV SEG_D1,#7FH
AJMP RETURN
K14: MOV SEG_D1,#6FH
AJMP RETURN
K15: MOV SEG_D1,#6FH
AJMP RETURN
RETURN: MOV SEG_C,#39H ;符号"C"的段码
MOV DPTR,#TABLE
MOV A,#25
MOV B,#100
DIV AB
MOVC A,@A+DPTR
MOV SEG_I6,A ;百位数段码
MOV A,B
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV SEG_I5,A ;十位数段码
MOV A,B
MOVC A,@A+DPTR
MOV SEG_I4,A
RET
;*************************************************************
;显示子程序,首位为符号位,三位整数,1位小数
;最后一位"C"为摄氏度标志
;*************************************************************
DISPLAY: MOV P3,#0FFH
CLR P3.0
MOV P1,SEG_D1
LCALL DELAY
SETB P3.0
CLR P3.1
MOV P1,SEG_I1
LCALL DELAY
SETB P3.1
CLR P3.2
MOV P1,SEG_I2
LCALL DELAY
SETB P3.2
CLR P3.3
MOV p1,SEG_I3
LCALL DELAY
SETB P3.3
CLR P3.7
MOV P1,SEG_I6
LCALL DELAY
SETB P3.7
CLR P3.6
MOV P1,SEG_I5
LCALL DELAY
SETB P3.6
CLR P3.5
MOV P1,SEG_I4
LCALL DELAY
SETB P3.5
RET
;**********************************************************
;延时子程序,延时5ms
;**********************************************************
DELAY: MOV R5,#5 ;延时5ms
D1: MOV R6,#248
DJNZ R6,$
DJNZ R5,D1
RET
;**********************************************************
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H ;段码表
DB 92H,82H,0F8H,80H,90H
END
附录二 原理图
在此仿真图中数码管为共阴极的,段选码用的是共阳极的
附录三 实物电路图
结论
由于本设计采用了集成温度传感器,这样不仅减少了硬件电路的设计与调试,并且此温度传感元件的集成性能比传统的元件要优越得多,这样简化了电路的设计难度还降低了产品的价格。如果我们采用传统的元件则在设计中还要加入A/D转换器和模拟开关,这样就增加了电路的设计难度并且感温元件的精度和转换性能也是远不及集成的感温元件DS18B20的。所以在以后的设计过程中应该尽量的采用集成元件。另外,本设计还可以实现高低温报警功能和多点温度测量功能,因此,能够适用于多种场合。
22
展开阅读全文