数字温度计设计报告

数字温度计设计报告 本文关键词:温度计,数字,报告,设计

数字温度计设计报告 本文简介:河南质量工程职业学院目录一、引言2二、设计内容及性能指标3三、系统方案论证与比较33.1方案一33.2、方案二4四、系统器件选择54.1.单片机的选择54.2温度传感器的选择54.2.1.DS18B20的性能特点64.2.2.DS18B20使用中的注意事项64.2.3.DS18B20的内部结构74.

数字温度计设计报告 本文内容:

河南质量工程职业学院

一、引言2

二、设计内容及性能指标3

三、系统方案论证与比较3

3.1

方案一3

3.2、方案二4

四、系统器件选择5

4.1.

单片机的选择5

4.

2

温度传感器的选择5

4.2.1.

DS18B20的性能特点6

4.2.2.DS18B20使用中的注意事项6

4.2.3.

DS18B20的内部结构7

4.2.4.DS18B20测温原理8

4.3.显示及报警模块器件选择9

五、硬件设计电路9

5.1

主控制器:10

5.2显示电路10

5.3温度检测电路11

5.4温度报警电路18

六.软件设计18

6.1.主程序模块18

6.2.

软件功能组成模块:19

七、系统调试19

7.1.硬件调试19

7.1.1排除逻辑故障19

7.1.2排除元器件失效19

7.1.3排除电源故障20

7.2.软件调试20

7.3.软硬调试20

八、总结与体会20

九、致谢21

数字温度计

摘要:温度的检测与控制是工业生产过程中比较典型的应用之一,随着传感器在生活中的更加广泛的应用,利用新型数字温度传感器实现对温度的测试与控制得到更快的开发,本文设计了一种基于AT89C51的温度检测及报警系统。该系统可以方便的实现温度采集和显示,并可根据需要任意设定上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。该系统设计和布线简单,结构紧凑,抗干扰能力强,在大型仓库、工厂、智能化建筑等领域的温度检测中有广泛的应用前景。

关键词:单片机;温度传感器;AT89C51;DS18B20;报警信号

一、引言

当今社会,温度检测系统被广泛的社会生产、生活的各个领域。在工业、环境检测、医疗、家庭等多方面都有应用。同时单片机在电子产品中的应用已经越来越广泛。

随着温度检测理论与技术的不断更新,温度传感器的种类也越来越多,在微机系统中使用的传感器,必须是能够将非电量转换成电量的传感器,目前常用的有热电偶传感器、热电阻传感器和单导体传感器等,每种传感器根据其自身特性,都有它自己的应用领域。

本设计所介绍的数字温度计与传统的温度计相比,具有读数方便、测温范围广、测温准确、其输出温度采用数字显示等优点,主要用于对温度比较准确的场所,或科研实验室使用。该设计控制器使用单片机AT89C51,温度传感器使用DS18B20,用液晶来实现温度显示。

二、设计内容及性能指标

该系统本设计主要是介绍了单片机控制下的温度检测系统,详细介绍了其硬件和软件设计,并对其各功能模块做了详细介绍,其主要功能和指标如下:

●利用温度传感器(DS18B20)测量某一点环境温度

●测量范围为-55℃~+99℃,精度为±0.5℃

●用液晶进行温度值显示

●能够根据需要方便设定上下限报警温度

三、系统方案论证与比较

该系统主要由温度测量和数据采集两部分电路组成,实现的方法有很多种,下面将列出两种在日常生活中和工农业生产中经常用到的实现方案。

3.1

方案一

采用热电偶温差电路测温,温度检测部分可以使用低温热偶,热电偶由两个焊接在一起的异金属导线所组成(热电偶的构成如图

2.1),热电偶产生的热电势由两种金属的接触电势和单一导体的温差电势组成。通过将参考结点保持在已知温度并测量该电压,便可推断出检测结点的温度。数据采集部分则使用带有A/D

通道的单片机,在将随被测温度变化的电压或电流采集过来,进行A/D

转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来。热电偶的优点是工作温度范围非常宽,且体积小,但是它们也存在着输出电压小、容易遭受来自导线环路的噪声影响以及漂移较高的缺点,并且这种设计需要用到A/D

转换电路,感温电路比较麻烦。

2.1热电偶电路图

3.2、方案二

采用数字温度芯片DS18B20

测量温度,输出信号全数字化。便于单片机处理及控制,省去传统的测温方法的很多外围电路。且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好。在0—100

摄氏度时,最大线形偏差小于1

摄氏度。DS18B20

的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器AT89C51构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。这样,测温系统的结构就比较简单,体积也不大。采用51

单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。

该系统利用AT89C51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。该系统扩展性非常强,它可以在设计中加入时钟芯片DS1302以获取时间数据,在数据处理同时显示时间,并可以利用AT24C16芯片作为存储器件,以此来对某些时间点的温度数据进行存储,利用键盘来进行调时和温度查询,获得的数据可以通过MAX232芯片与计算机的RS232接口进行串口通信,方便的采集和整理时间温度数据。系统框图如图

3.3所示

3.3

DS18B20温度测温系统框图

从以上两种方案,容易看出方案一的测温装置可测温度范围宽、体积小,但是线性误差较大。方案二的测温装置电路简单、精确度较高、实现方便、软件设计也比较简单,故本次设计采用了方案二。

四、系统器件选择

4.1.

单片机的选择

对于单片机的选择,可以考虑8051系列。

AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash

Programmable

and

Erasable

Read

Only

Memory)的低电压、高性能CMOS

8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,

4.

2

温度传感器的选择

DALLAS

最新单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积更小、更适用于多种场合、且适用电压更宽、更经济。DALLAS

半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。温度测量范围为-55~+125

摄氏度,可编程为9位~12

位转换精度,测温分辨率可达0.0625摄氏度,分辨率设定参数以及用户设定的报警温度存储在EEPROM

中,掉电后依然保存。被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可以在远端引入,也可以采用寄生电源方式产生;多个DS18B20可以并联到3

根或2

根线上,CPU只需一根端口线就能与诸多DS18B20

通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。

4.2.1.

DS18B20的性能特点

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种集成温度传感器。与传统的热敏电阻等测温元件相比,它能直接输出二进制温敏信号,并通过串行输出方式与单片机通信。DS18B20的性能特点如下:

.适应电压范围3.0-5.5

V,在寄生电源方式下可由数据线供电;;

.

独特的单线接口仅需要一个端口引脚进行通信;

.多个DS18B20可以并联在唯一的三线上,实现多点组网功能;

.不需要外部器件;

.测温范围-55~+125

摄氏度,在-10~+85摄氏度时精度为±0.5摄氏度;

.零待机功耗;

.温度以9~12位数字量读出;

.用户可定义的非易失性温度报警设置;

.报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;

.

负电压特性,电源极性接反时,温度计不会因发热而烧毁,只是不能正常工作。

4.2.2.DS18B20使用中的注意事项

DS18B20虽然具有测温系统简单、测温精度高,连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:

1.较小的硬件开销需要相对复杂的软件进行补偿,由于DS18B20与微处理器间采用串行数据传送,因此,在对DS18B20进行读写编程时,必须严格地保证读写程序,否则将无法读取测量结果。在使用VC等高级语言进行系统程序设计时,对DS18B20操作部分仍要采用汇编语言实现。

2.连接DS18B20的总线电缆是有长度限制的。试验中,当采用普通信号电缆传输长度超过50m时,读取的测量数据将发生错误;当将总线电缆改为双绞线带屏蔽电缆时,正常通信距离进一步加长,这种情况主要有总线分布电容使信号波形产生畸变造成的。因此,在使用DS18B20进行长距离测温系统设计时,要充分考虑总线分布电容和阻抗匹配问题。

3.在DS18B20测温程序设计中,向DS18B20发出温度转换命令后,程序总要等待DS18B20的返回信号,一旦某个DS18B20接触不好或断线,当程序读该DS18B20时,将没有返回信号,程序将进入死循环,这一点在进行DS18B20硬件连接和软件设计时也要给予一定的重视。

4.2.3.

DS18B20的内部结构

DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器、配置寄存器。DS18B20的管脚排列、各种封装形式如图4.2所示,DQ为数据输入/输出引脚。开漏单总线接口引脚。当被用作在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。其电路图4.3所示。

图4.2外部封装形式

图4.3传感器电路图

DS18B20采用3脚PR-35封装,其内部结构框图如图4.4所示。

图4.4DS18B20内部结构框图

64位R光刻ROM的排列结构如图4.3所示。开始8位是产品类型的编号;接着的48位是DS18B20自身的序列号,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用单线进行通信的原因。通过非易失性温度报警触发器TH和TL的比较,DS18B20内的报警位置对主机发出的报警搜索命令作出响应。

图4.3

64位ROM结构框图

4.2.4.DS18B20测温原理

图4.4所示,图中低温度系数振荡器的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数振荡器随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输人。

图4.4

DS18B20的测温原理图

图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。

减法计数器1对低温度系数振荡器产生的脉冲信号进行减法计数,当减法计数器1的预置值减到。时,温度寄存器的值将加1,减法计数器1的预置值将重新被装人,并重新开始对低温度系数振荡器产生的脉冲信号进行计数。如此循环,直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值就是所测温度值。图4.8中的斜率累加器用于补偿和修正测温过程中的非线形性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直到温度寄存器值达到被测温度值。

另外

,由

于DS18B20单线通信功能是分时完成的,有严格的时隙概念,因此读/写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)—发ROM功能命令—发存储器操作命令—处理数据。

4.3.显示及报警模块器件选择

在本设计测量范围为0℃~+125℃,精度为±0.5℃,因此只需要用液晶就可以完成相关的显示功能,报警器可以用有源蜂鸣器配合三极管来代替。

五、硬件设计电路

温度计电路设计原理图如图4.1所示,温度计的控制器使用单片机AT89C2051,温度传感器使用DS18B20,用液晶实现温度显示。

本温度计大体分为三个工作过程。首先,由DS18B20温度传感器芯片测量当前温度,并将结果送入单片机。然后,通过AT89C2051单片机芯片对送来的测量温度读数进行计算和转换,并将此结果送入液晶显示模块。最后,SMC1602A芯片将送来的值显示与显示屏上。其中,DS18B20温度传感器芯片采用“一线制”与单片机相连,它独立完成温度测量以及将温度测量结果送到单片机工作。

图中有3个独立式按键可以分别调整温度的上下限报警设置,图中蜂鸣器可以在被测温度不在上下限范围内时,发出报警鸣叫声音,同时液晶模块将被测温度显示,这时可以调整上下限,从而测出被测的温度值。

5.1

主控制器:

单片机AT89C2051具有低电压供电和小体积等特点,两个端口刚好满足电路系统的设计需要。

主机控制DS18B20完成温度转换必须经过三个步骤:初始化、ROM操作指令、存储器操作指令。必须先启动DS18B20开始转换,在读出温度转换值。

5.2显示电路

显示电路采用4位共阳极LED数码管,从P0口输出段码,列扫描用P2.0~P2.3口来实现,列驱动用9012三极管。

5.3温度检测电路

DS18B20最大的特点是单总线数据传输方式,DS18B20的数据I/O均由同一条线来完成。DS18B20的电源供电方式由两种:外部供电方式和寄生电源方式。工作于寄生电源方式时,VDD和GND均接地,它在需要远程温度检测和空间受限的场合特别有用,原理是当1

wire总线的信号线DQ为高电平是,窃取信号能量给DS18B20供电,同时一部分能量给内部电容充电,当DQ为低电平时释放能量为DS18B20供电。但寄生电源方式需要强上拉电路,软件变得复杂(特别是在完成温度转换和拷贝数据到ROM时),同时芯片的性能也有所降低。因此,在条件允许的场合,尽量采用外供电方式。无论是内部寄生源还是外部供电,I/O口线要接5KΩ左右的上拉电。在这里采用外部供电方式。DS18B20与芯片连接电路如图所示。

外部电源供电方式是DS18B20最佳工作方式,工作稳定可靠,抗干扰能力强,而且电路也比较简单,可以开发出稳定可靠的多点温度监控系统。在外接电源方式下,可以充分发挥DS18B20宽电源电压范围的优点,即使电源电压VCC降到3V时,依然能够保证温度量精度。

由于DS18B20只有一根数据线,因此它和主机(单片机)通信时需要串行通信,而AT89C51有两个串行端口,所以可以不用软件来模拟实现。经过单线接口访问DS18B20必须遵循如下协议:初始化、ROM操作指令、存储器操作命令和控制操作。要使传感器工作,一切处理均严格按照时序。

主机发送(Tx)—复位脉冲(最短为480us的低电平信号)。接着主机便释放此线并进入接收方式(Rx)。总线经过4.7K的上拉电阻被拉至高电平状态。在检测到I/O引脚上的上升沿之后,DS18B20等待15~60μs,并且接着发送脉冲(60~240μs的低电平信号)。然后以存在复位脉冲表示DS18B20已经准备好发送或接收,然后给出正确的ROM命令和存储操作命令的数据。DS18B20通过使用时间片来读出和写入数据,时间片用于处理数据位和进行指定操作的命令。它有写时间片和读时间片两种:

l

写时间片:当有主机把数据线从逻辑高电平拉至逻辑低电平时,产生写时间片。有两种类型的写时间片:写1时间片和写0时间片。所有时间片必须有60微妙的持续期,在各写周期之间必须有最短为1微妙的恢复时间。

l

读时间片:从DS18B20读数据时,使用读时间片。当主机把数据线从逻辑高电平拉至逻辑低电平时产生读时间片。数据线在逻辑低电平必须保持至少1微妙;来自DS18B20的输出数据在时间下降沿之后的15微妙内有效。为了读出从读时间片开始算起15微妙的状态,主机必须停止把引脚驱动拉至低电平。在时间片结束时,I/O引脚经过外部的上拉电阻拉回高电平,所有读时间片的最短持续期为60微妙,包括两个读周期间至少1us的恢复时间。

一旦主机检测到DS18B20的存在,它便可以发送一个器件ROM操作命令。所有ROM操作命令均为8位长。

所有的串行通讯,读写每一个bit

位数据都必须严格遵守器件的时序逻辑来编程,同时还必须遵守总线命令序列,对单总线的DS18B20

芯片来说,访问每个器件都要遵守下列命令序列:首先是初始化;其次执行ROM

命令;最后就是执行功能命令(ROM

命令和功能命令后面以表格形式给出)。如果出现序列混乱,则单总线器件不会响应主机。当然,搜索ROM命令和报警搜索命令,在执行两者中任何一条命令之后,要返回初始化。

基于单总线上的所有传输过程都是以初始化开始的,初始化过程由主机发出的复位脉冲和从机响应的应答脉冲组成。应答脉冲使主机知道,总线上有从机,且准备就绪。

在主机检测到应答脉冲后,就可以发出ROM

命令。这些命令与各个从机设备的唯一64

位ROM

代码相关。在主机发出ROM命令,以访问某个指定的DS18B20,接着就可以发出DS18B20支持的某个功能命令。这些命令允许主机写入或读出DS18B20便笺式RAM、启动温度转换。软件实现DS18B20的工作严格遵守单总线协议:

(1)主机首先发出一个复位脉冲,信号线上的DS18B20

器件被复位。

(2)接着主机发送ROM命令,程序开始读取单个在线的芯片ROM编码并保存在单片机数据存储器中,把用到的DS18B20

的ROM

编码离线读出,最后用一个二维数组保存ROM

编码,数据保存在X25043中。

(3)系统工作时,把读取了编码的DS18B20

挂在总线上。发温度转换命令,再总线复位。

(4)然后就可以从刚才的二维数组匹配在线的温度传感器,随后发温度读取命令就可以获得对应的度值了。

在主机初始化过程,主机通过拉低单总线至少480μs,来产生复位脉冲。接着,主机释放总线,并进入接收模式。当总线被释放后,上拉电阻将单总线拉高。在单总线器件检测到上升沿后,延时15~60μs,接着通过拉低总线60~240μs,以产生应答脉冲。

写时序均起始于主机拉低总线,产生写1

时序的方式:主机在拉低总线后,接着必须在15μs之内释放总线。产生写0

时序的方式:在主机拉低总线后,只需在整个时序期间保持低电平即可(至少60μs)。在写字节程序中的写一个bit

位的时候,没有按照通常的分别写0时序和写1

时序,而是把两者结合起来,当主机拉低总线后在15μs

之内将要写的位c

给DO:如果c

是高电平满足15μs

内释放总线的要求,如果c是低电平,则DO=c这条语句仍然是把总线拉在低电平,最后都通过延时58μs

完成一个写时序(写时序0或写时序1)过程。

写时间时序:当主机把数据从逻辑高电平拉到逻辑低电平的时候,写时间隙开始。有两种写时间隙,写1

时间隙和写0

时间隙。所有写时间隙必须最少持续60μs,包括两个写周期至少1μs

的恢复时间。I/O线电平变低后,DS18B20

在一个15μs

到60μs

的窗口内对I/O

线采样。如果线上事高电平,就是写1,如果是低电平,就是写0。主机要生成一个写时间隙,必须把数据线拉到低电平然后释放,在写时间隙开始后的15μs

内允许数据线拉到高电平。主机要生成一个写0

时间隙,必须把数据线拉到低电平并保存60μs。

每个读时隙都由主机发起,至少拉低总线1us,在主机发起读时序之后,单总线器件才开始在总线上发送0

或1。所有读时序至少需要60us。

源程序:

假设要写1

B

的数据,且数据放在A

中。

SETB

TEM

PDN

NOP

NOP

WRITEDS1820LOP:

CLR

TEM

PD

IN

MOV

R6,#

08H

;

延时15

Ls

DJN

Z

R6,$

RRC

A

;

将要写数据存入C

MOV

TEM

PD

IN,C

;

将数据写入总线

MOV

R6,#

14H

;

延时40

Ls

DJN

Z

R6,$

SETB

TEM

PD

IN

;

释放总线

DJN

Z

R7,WR

ITEDS1820LO

P

;

写8

RET

读时间时序:当从DS18B20

读数据时,主机生成读时间隙。当主机把数据从高电平拉到低电平时,写时间隙开始,数据线必须保持至少1μs;从DS18B20输出的数据在读时间隙的下降沿出现后15μs

内有效。

因此,主机在读时间隙开始后必须把I/O

脚驱动拉为的电平保持15μs,以读取I/O

脚状态。在读时间隙的结尾,I/O

引脚将被外部上拉电阻拉到高电平。所有读时间隙必须最少60μs,包括两个读周期至少1μs的恢复时间。

源程序:

假设要读1B

的数据,且数据放在A

中。

SETB

TEM

PDN

NOP

NOP

WRITEDS1820LOP:

CLR

TEM

PD

IN

MOV

R6,#

08H

;

延时15

Ls

DJN

Z

R6,$

RRC

A

;

将要写数据存入C

MOV

TEM

PD

IN,C

;

将数据写入总线

MOV

R6,#

14H

;

延时40

Ls

DJN

Z

R6,$

SETB

TEM

PD

IN

;

释放总线

DJN

Z

R7,WR

ITEDS1820LO

P

;

写8

RET

读时间时序:当从DS18B20

读数据时,主机生成读时间隙。当主机把数据从高电平拉到低电平时,写时间隙开始,数据线必须保持至少1μs;从DS18B20输出的数据在读时间隙的下降沿出现后15μs

内有效。

因此,主机在读时间隙开始后必须把I/O

脚驱动拉为的电平保持15μs,以读取I/O

脚状态。在读时间隙的结尾,I/O

引脚将被外部上拉电阻拉到高电平。所有读时间隙必须最少60μs,包括两个读周期至少1μs的恢复时间。

源程序:

假设要读1B

的数据,且数据放在A

中。

READDS1820:MOV

R7,#

08H

;

1

个字节8

SETB

TEM

PD

IN

NO

P

NO

P

READDS1820LOO

P:

CLR

TEM

PD

IN

NO

P

SETB

TEM

PD

IN

;

释放总线

MOV

R6,#

05H

;

延时10

Ls

DJN

Z

R6,$

MOV

C,TEM

PD

N

;

采样总线数据

MOV

R6,#

14H

;

延时40

Ls

DJN

Z

R6,$

RRC

A

;

采样数据存入A

SETB

TEM

PD

IN

;

释放总线

DJN

Z

R7,READDS1820LOO

P

;

采样下一位

MOV

R6,#

14H

;

延时40

Ls

DJN

Z

R6,$

RET

读/写时序如图

5.3如下:

5.3

DS18B20的读写时序图

复位时序:复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60

微秒左右,后发出60~240

微秒的存在低脉冲,主CPU

收到此信号表示复位成功。

源程序:

其中TEM

PD

IN

定义为DS18B20

的数据管脚,主机为A

T89C2051。

N

ITDS1820:

SETB

TEM

PD

N

NO

P

NO

P

CLR

TEM

PD

N

MOV

R6,#

0A

0H

;

延时640

Ls

DJN

Z

R6,$

MOV

R6,#

0A

0H

DJN

Z

R6,$

SETB

TEM

PD

N

;

释放总线

MOV

R6,#

32H

;

延时100

Ls,等待回应

DJN

Z

R6,$

MOV

R6,#

3CH

LOO

P1820:

MOV

C,TEM

PD

N

;

采样总线信号

JC

N

ITDS1820OU

T

DJN

Z

R6,LOO

P1820

MOV

R6,#

064H

DJN

Z

R6,$

SJM

P

N

ITDS1820

RET

IN

ITDS1820OU

T:

SETB

TEM

PD

N

RET

复位时序如图

5.3所示:

5.4温度报警电路

本设计采用软件处理报警,利用有源蜂鸣器进行报警输出,采用直流供电。当所测温度超过或低于所设温度时,数据口相应拉高电平,报警输出。报警电路硬件连接如图所示。

六.软件设计

整个系统的功能是由硬件配合软件来实现的,当硬件基本定型后,软件的功能也就基本定下来了。从软件的功能不同可分为两大类:一是监控软件(主程序),它是整个控制系统的核心,专门用来协调各执行模块和操作者的关系。二是执行软件(子程序),它是用来完成各种实质性的功能如测量、计算、显示、通讯等。每一个执行软件也就是一个小的功能执行模块。这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义。各执行模块规划好后,就可以规划监控程序了。首先要根据系统的总体功能选择一种最合适的监控程序结构,然后根据实时性的要求,合理地安排监控软件和执行模块之间的调度关系。

6.1.主程序模块

主程序需要调用4个子程序,分别为数码管显示程序,温度测试及处理子程序,报警子程序,中断设定子程序。

●数码管显示程序:向数码的显示送数,控制系统的显示部分。

●温度测试及处理程序:对温度芯片送过来的数据进行处理,进行判断和显示。

●报警子程序:进行温度上下限判断及报警输出。

●中断设定程序:实现设定上下限报警功能

6.2.

软件功能组成模块:

系统程序主要包括主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和显示数据刷新子程序等。

主程序:主要功能是负责温度的实时显示、读出并处理DS18B20的测量温度值。温度测量每1

s

进行一次。

读出温度子程序:主要功能是读出RAM中的9字节。在读出时须进行CRC校验,校验有错时不进行温度数据的改写。

温度转换命令子程序:主要是发温度转换开始命令。

计算温度子程序:将RAM中读取值进行BCD码的转换运行,并进行温度值正负的判定。

显示数据刷新子程序:主要是对显示缓冲器中的显示数据进行刷新操作,当最高数据显示位为0时,将符号显示位移入下一位。

七、系统调试

根据方案设计的要求,调试过程共分3大部分:硬件调试、软件调试和软硬联调。单片机的硬件调试和软件调试是不能分开的,许多硬件错误是在软件调试中被发现和纠正的。但通常是先排除明显的硬件故障以后,在和软件结合起来调试以进一步排除故障。可见硬件的调试是基础。如果硬件调试不通过,软件设计就是无从说起。

7.1.硬件调试

硬件调试比较简单首先检查电路的焊接是否正确,然后可用万用表测试或通电检测。

7.1.1排除逻辑故障

这类故障往往由于设计和加工制板过程中工艺性错误所造成的。只要包括错线、开路、短路。排除的方法是首先将加工的印制板认真对照原理图,看两者是否一致。应特别注意电源系统检查,以防止电源短路和极性错误,并重点检查系统总线(地址总线、数据总线和控制总线)是否存在相互之间短路或与其他信号线短路。必要时利用数字万用表的短路测试功能,可以缩短排错时间。

7.1.2排除元器件失效

造成这类错误的原因有2个:一是元器件买来时就已坏了;另一个是安装错误,造成器件烧坏。可以采取检查元器件与设计要求的型号、规格和要求是否一致。在保证安装无误后,用替换方法排除错误。

7.1.3排除电源故障

在通电前,一定要检查电源电压的幅值和极性,否则很容易造成集成块损坏。

7.2.软件调试

本系统的软件系统较大,全面采用汇编语言编写,除语法和逻辑差错外,当确认程序没问题时,直接下载到单片机仿真调试。采取自下而上的方法,单独调好每一个模块,最后完成一个完整的系统调试。

7.3.软硬调试

系统做好后,进行系统的完整调试。联机仿真必须借助仿真开发装置、示波器、万用表等工具。这些工具是单片机开发的最基本工具。

八、总结与体会

本设计利用89S51

芯片控制温度传感器DS18B20,再辅之以部分外围电路实现对环境温度的测控,性能稳定,精度教高,而且扩展性能很强大。由于DS18B20

支持单总线协议,我们可以将多个DS18B20

可以并联到3

根或2

根线上,CPU

只需一根端口线就能与诸多DS18B20

通信,占用较少的微处理器的端口就可以实现多点测温监控系统。可以加入1302

时钟芯片实现对时间进行显示,加之AT24C16

存储芯片来实现对时间和温度数据的记录,利用MAX232芯片和计算机实现串口通讯,这样就可以方便的统计出特定时间内的需要的时间和温度数据。由于DS18B20的测量精度只有±0.5

度,往往很多场合需要更加精确的温度,在所测温度精度不变的基础上必须对数据进行校正。由于DS18B20

是基于带隙结构的数字式温度传感器,PN

结增量电压正比于IC

绝对温度(PTAT),它的测温精度较高,但存在着一定的误差.不过,其误差在时间和外部环境变化的条件下,保持相当高的稳定性。针对这一特性,基于线性插补的数学思想,利用DSP技术,对其进行误差校正补偿.这种误差校正的补偿方法,不需增加硬件电路,计算方法简单,软件费用也很小,既提高了测量精度,又不需增加成本。它充分利用监控计算机的处理能力,在监控计算机上用线性插补的数学方法对其进行误差校正补偿,能轻易地将其提高其精度。

从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。

九、致谢

在本毕业设计的设计和制作过程中,感谢老师给了我很大的帮助,同时也离不开很多的同学热心帮助,是他们在我遇到难题的时候给了我启发。通过本次毕业设计,我在专业知识、专业技能和解决问题方法方面得到很大的提高。更深入了解并掌握了传感器的基本理论知识,并在单片机实际电路开发和常用编程设计思路掌握方面有了一定程度的掌握,尽管本次设计还不是很完善,但这为我以后的设计之路积累了宝贵的经验。

20

篇2:《温度计设计报告》

《温度计设计报告》word版 本文关键词:温度计,报告,设计,word

《温度计设计报告》word版 本文简介:基于单片机并行口的数字温度计的设计学生姓名:龙小燕指导教师:邓宏贵专业:电信班级:0803学号:1404080612摘要本文将介绍一种基于单片机控制的数字温度计,就是用单片机实现温度测量,传统的温度检测大多以热敏电阻为温度传感器,但热敏电阻的可靠性差,测量温度准确率低,而且必须经过专门的接口电路转换

《温度计设计报告》word版 本文内容:

基于单片机并行口的数字温度计的设计

学生姓名:

龙小燕

指导教师:

邓宏贵

业:

电信

级:

0803

号:

1404080612

本文将介绍一种基于单片机控制的数字温度计,就是用单片机实现温度测量,传统的温度检测大多以热敏电阻为温度传感器,但热敏电阻的可靠性差,测量温度准确率低,而且必须经过专门的接口电路转换成数字信号才能由单片机进行处理。本次采用DS18B20数字温度传感器来实现基于AT89S52单片机的数字温度计的设计用LCD数码管以串口传送数据,实现温度显示,能准确达到以上要求,可以用于温度等非电信号的测量,主要用于对测温比较准确的场所,或科研实验室使用,能独立工作的单片机温度检测、温度控制系统已经广泛应用很多领域。

关键词

温度计;单片机;数字控制;DS18B20

1

绪论1

1.1

前言1

1.2

数字温度计设计方案论证1

1.2.1

方案一1

1.2.2

方案二1

1.3

方案二的总体设计框图2

1.3.1

主控制器2

1.3.2

温度传感器2

2

硬件电路设计7

2.1

主要芯片介绍7

2.1.1

STC89C52的介绍7

2.1.2

STC89C52各引脚功能介绍7

2.2

主板电路10

2.3

显示电路10

3

软件设计11

3.1

主程序流程图11

3.2

读出温度子程序流程图12

3.3

温度转换命令子程序流程图13

3.4

计算温度子程序流程图14

3.5

显示数据刷新子程序流程图14

4

总结与会

…………………………………………………………15

附录1

程序清单16

附录2

元器件清单20

附录3

原理图21

附录4

PCB图22

1

绪论

1.1

前言

随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,单片机已经在测控领域中获得了广泛的应用

本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,该设计控制器使用单片机AT89S52,测温传感器使用DS18B20,用LCD数码管以串口传送数据,实现温度显示,能准确达到以上要求。

1.2

数字温度计设计方案论证

1.2.1

方案一

由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。

1.2.2

方案二

进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。

从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。

1.3

方案二的总体设计框图

温度计电路设计总体设计方框图如图1.1所示,控制器采用单片机AT89S52,温度传感器采用DS18B20,用LCD液晶显示屏以串口传送数据实现温度显示:

LCD显

单片机复位

时钟振荡

图1.1

总体设计方框图

1.3.1

主控制器

单片机AT89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。

1.3.2

温度传感器

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。

DS18B20的性能特点如下:

●独特的单线接口仅需要一个端口引脚进行通信;

●多个DS18B20可以并联在惟一的三线上,实现多点组网功能;

●无须外部器件;

●可通过数据线供电,电压范围为3.0~5.5V;

●零待机功耗;

●温度以9或12位数字;

●用户可定义报警设置;

●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;

●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;

DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图2.2所示:

C

64

ROM

线

高速缓存

存储器与控制逻辑

温度传感器

高温触发器TH

低温触发器TL

配置寄存器

8位CRC发生器

Vdd

图1.2

DS18B20内部结构

64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器TH和TL,可通过软件写入户报警上下限。

DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,结构如图2.3.2所示。头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图2.3所示。低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。

温度

LSB

温度

MSB

TH用户字节1

TL用户字节2

配置寄存器

保留

保留

保留

CRC

图1.3

DS18B20字节定义

由表1.1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。

高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。

当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。

当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表1.2是一部分温度值对应的二进制温度数据。

表1.1

DS18B20温度转换时间表

DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索。

在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。

DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应的一个基数值。

减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。

另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作按协议进行。操作协议为:初使化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。

表1.2

一部分温度对应值表

温度/℃

二进制表示

十六进制表示

+125

0000

0111

1101

0000

07D0H

+85

0000

0101

0101

0000

0550H

+25.0625

0000

0001

1001

0000

0191H

+10.125

0000

0000

1010

0001

00A2H

+0.5

0000

0000

0000

0010

0008H

0

0000

0000

0000

1000

0000H

-0.5

1111

1111

1111

0000

FFF8H

-10.125

1111

1111

0101

1110

FF5EH

-25.0625

1111

1110

0110

1111

FE6FH

-55

1111

1100

1001

0000

FC90H

2

硬件电路设计

2.1

主要芯片介绍

2.1.1

STC89C52的介绍

选用的STC89C52与同系列的STC89C51在功能上有明显的提高,最突出是的可以实现在线的编程。用于实现系统的总的控制。其主要功能列举如下:

(1)为一般控制应用的

8

位单片机

(2)晶片内部具有时钟振荡器(传统最高工作频率可至

33MHz)

(3)内部程式存储器(ROM)为

4KB

(4)内部数据存储器(RAM)为

128B

(5)外部程序存储器可扩充至

64KB

(6)外部数据存储器可扩充至

64KB

(7)32

条双向输入输出线,且每条均单独做

I/O

的控制

(8)5

个中断向量源

(9)2

组独立的

16

位定时器

(10)1

个全双工串行通信端口

(12)8751

8752

单芯片具有数据保密的功能

(13)单芯片提供位逻辑运算指令

2.1.2

STC89C52各引脚功能介绍

VCC:

STC89C52

电源正端输入,接+5V。

VSS:

电源地端。

XTAL1:

单芯片系统时钟的反向放大器输入端

XTAL2:

系统时钟的反向放大器输出端,一般在设计上只要在

XTAL1

XTAL2

上接上一只石英振荡晶体系统就可以动作了,此外可以在两个引脚与地之间加入一个

20PF

的小电容,可以使系统更稳定,避免噪声干扰而死机。

RESET:

STC89C52的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S52便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。

EA/Vpp:

“EA“为英文“External

Access“的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。如果是使用

8751

内部程序空间时,此引脚要接成高电平。此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。

ALE/PROG:

ALE是英文“Address

Latch

Enable“的缩写,表示地址锁存器启用信号。ATAT89S51可以利用这支引脚来触发外部的8位锁存器(如74LS373),将端口0的地址总线(A0~A7)锁进锁存器中,因为STC89C51是以多工的方式送出地址及数据。平时在程序执行时ALE引脚的输出频率约是系统工作频率的1/6,因此可以用来驱动其他周边晶片的时基输入。此外在烧录8751程序代码时,此引脚会被当成程序规划的特殊功能来使用。

PSEN:

此为“Program

Store

Enable“的缩写,其意为程序储存启用,当8051被设成为读取外部程序代码工作模式时(EA=0),会送出此信号以便取得程序代码,通常这支脚是接到EPROM的OE脚。ATAT89S51可以利用PSEN及RD引脚分别启用存在外部的RAM与EPROM,使得数据存储器与程序存储器可以合并在一起而共用64K的定址范围。

PORT0(P0.0~P0.7):

端口0是一个8位宽的开路电极(Open

Drain)双向输出入端口,共有8个位,P0.0表示位0,P0.1表示位1,依此类推。其他三个I/O端口(P1、P2、P3)则不具有此电路组态,而是内部有一提升电路,P0在当作I/O用时可以推动8个LS的TTL负载。如果当EA引脚为低电平时(即取用外部程序代码或数据存储器),P0就以多工方式提供地址总线(A0~A7)及数据总线(D0~D7)。设计者必须外加一个锁存器将端口0送出的地址锁住成为A0~A7,再配合端口2所送出的A8~A15合成一组完整的16位地址总线,而定位地址到64K的外部存储器空间。

PORT2(P2.0~P2.7):

端口2是具有内部提升电路的双向I/O端口,每一个引脚可以推动4个LS的TTL负载,若将端口2的输出设为高电平时,此端口便能当成输入端口来使用。P2除了当作一般I/O端口使用外,若是在ATAT89S52扩充外接程序存储器或数据存储器时,也提供地址总线的高字节A8~A15,这个时候P2便不能当作I/O来使用了。

PORT1(P1.0~P1.7):

端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LS

TTL负载,同样地,若将端口1的输出设为高电平,便是由此端口来输入数据。如果是使用8052或是8032的话,P1.0又当作定时器2的外部脉冲输入脚,而P1.1可以有T2EX功能,可以做外部中断输入的触发引脚。

PORT3(P3.0~P3.7):

端口3也具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个TTL负载,同时还多工具有其他的额外特殊功能,包括串行通信、外部中断控制、计时计数控制及外部数据存储器内容的读取或写入控制等功能。

其引脚分配如下:

P3.0:RXD,串行通信输入。

P3.1:TXD,串行通信输出。

P3.2:INT0,外部中断0输入。

P3.3:INT1,外部中断1输入。

P3.4:T0,计时计数器0输入。

P3.5:T1,计时计数器1输入。

P3.6:WR:外部数据存储器的写入信号。

P3.7:RD,外部数据存储器的读取信号。

2.2

主板电路

系统整体硬件电路包括,传感器数据采集电路,温度显示电路,单片机主板电路等,如图2.5

所示:

图2.1

单片机主板电路

2.3

显示电路

显示电路是使用的串口显示,这种显示最大的优点就是使用口资源比较少,只用p2口串口的发送和接收,4位一体数码管显示。温度显示电路如图2.2所示:

3

软件设计

系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。

3.1

主程序流程图

主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,其程序流程见图3.1所示:

初始化

调用显示子程序

1S到?

初次上电

读出温度值温度计算处理显示数据刷新

发温度转换开始命令

N

Y

N

Y

图3.1

主程序流程图

3.2

读出温度子程序流程图

读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图3.2所示:

Y

发DS18B20复位命令

发跳过ROM命令

发读取温度命令

读取操作,CRC校验

9字节完?

CRC校验正?确?

移入温度暂存器

结束

N

N

Y

图3.2

温度子程序流程图

3.3

温度转换命令子程序流程图

温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。温度转换命令子程序流程图如上图,图3.3所示:

发DS18B20复位命令

发跳过ROM命令

发温度转换开始命令

结束

图3.3

温度转换命令子程序流程图

3.4

计算温度子程序流程图

计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图3.4所示:

开始

温度零下?

温度值取补码置“—”标志

计算小数位温度BCD值

计算整数位温度BCD值

结束

置“+”标志

N

Y

图3.4

温度子程序流程图

3.5

显示数据刷新子程序流程图

显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。程序流程图如图3.5所示:

温度数据移入显示寄存器

十位数0?

百位数0?

十位数显示符号百位数不显示

百位数显示数据(不显示符号)

结束

N

N

Y

Y

图3.5

显示数据刷新子程序流程图

4.

总结与体会

经过将近几周的设计,终于完成了我的数字温度计的设计,虽然没有完全达到设计要求,但从心底里说,还是高兴的,毕竟这次设计把仿真成功做了出来,高兴之余不得不深思呀!

在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,单片机毕业设计重点就在于软件算法的设计,需要有很巧妙的程序算法,。此外,本次毕业设计也使我对单片机技术有了更进一步的了解,实际操作和课本上的知识有很大的联系,又高于课本,一个看似很简单的电路,要动手做出来就比较困难了,因为是设计让我们在以后的学习中要注意这点,要把课本上所学的知识跟实际联系起来。有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握,同时本次电路的设计巩固了所学知识,也使我们把理论与实际从真正的意义上结合起来了,增强了学习的兴趣,考验了我们借助图书馆、互联网搜索、查阅相关资料,以及综合能力。

从这次的设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次设计中的最大收获,为以后从事电子电路设计、研制电子产品方面的工作奠定了一定的基础

附录1

程序清单

#include

#define

uchar

unsigned

char

#define

uint

unsigned

int

sbit

DQ=P3^0;

uchar

flag1;

uchar

tempL=0;

uchar

tempH=0;

uint

tt;

float

temperature;

unsigned

char

code

table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};

uchar

code

table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

uchar

code

scan_con[4]={0x01,0x02,0x04,0x08};

uchar

data

Dis_play[4]={0X00,0x00,0x00,0x00};

void

delay(uint

i)

{

while(i--);

}

Init_DS18B20(void)

{

uchar

x=0;

DQ

=

1;

//DQ复位

delay(8);

DQ

=

0;

//单片机将DQ拉低

delay(80);

//精确延时

大于

480us

DQ

=

1;

delay(14);

x=DQ;

//稍做延时后

如果x=0则初始化成功

x=1则初始化失败

delay(20);

}

//

读字节子函数

ReadOneChar(void)

{

uchar

i

=

0;

uchar

dat

=

0;

for

(i=8;i>0;i--)

{

DQ

=

0;

dat>>=1;

//

数据右移一位

DQ

=

1;

if(DQ)

//

DQ为1

dat|=0x80;

//

读出数据

delay(4);

}

return(dat);

}

//

写字节子函数

WriteOneChar(unsigned

char

dat)

{

uchar

i

=

0;

for

(i=8;

i>0;

i--)

{

DQ

=

0;

DQ

=

dat

//写入一位数据

delay(5);

DQ

=

1;

dat>>=1;

}

}

//

发送温度转换命令

ReadTemperature(void)

{

Init_DS18B20();

WriteOneChar(0xcc);

WriteOneChar(0x44);

//启动温度转换

delay(125);

Init_DS18B20();

WriteOneChar(0xcc);

//跳过读序列号的操作

WriteOneChar(0xbe);

//读温度寄存器(头两个值分别为温度的低位和高位)

tempL=ReadOneChar();

tempH=ReadOneChar();

if(tempH>0xfd)

{

flag1=1;

temperature=(65536-((tempH*256)+tempL))*0.0625;

tt=temperature*10+0.5;

delay(200);

return(tt);

}

else

{

temperature=((tempH*256)+tempL)*0.0625;

tt=temperature*10+0.5;

delay(200);

return(tt);

}

}

void

tem_deal(uint

tem)

{

Dis_play[0]=0xff;

Dis_play[0]=tem/1000;

Dis_play[1]=tem/100%10;

Dis_play[2]=tem%100/10;

Dis_play[3]=tem%10;

if(!Dis_play[0])

{

Dis_play[0]=0x0a;

if(!Dis_play[1])

{

Dis_play[1]=0x0a;

}

}

if(flag1)

{

Dis_play[0]=0x0b;

}

}

void

display()

{

char

k;

for(k=0;k<4;k++)

{

if

(k==2)

{

P2=scan_con[k];

P0=table1[Dis_play[k]];

}

else

{

P2=scan_con[k];

P0=table[Dis_play[k]];

}

delay(500);

}

}

void

main()

{

do

{

flag1=0;

tem_deal(ReadTemperature());

display();

}

while(1);

}

附录2

元器件清单

物质名称

规格型号

数量(单位)

芯片

AT89S52

1块

芯片

DS18B20

1块

4位一体数码管

CEM3461BE

1块

电解电容

22μF

1个

电解电容

100μF

1个

瓷片电容

33pF

3个

开关

2个

芯片插座

IC-40P

1块

电阻

1K

1个

电阻

0.2K

1个

电阻

100K

1个

限流电阻

0.3K

8个

上拉电阻

5.1K

4个

晶振

6MHz

1个

USB接口

1个

二极管

1个

附录3

原理图

附录4

PCB图

篇3:温度计实验报告

温度计实验报告 本文关键词:温度计,实验,报告

温度计实验报告 本文简介:4河南理工大学单片机课程设计报告姓名:王静杨晓雪学号:0828030090/0828010150专业:电气工程及其自动化指导老师:李宏伟时间:2011年6月24日摘要:在这个信息化高速发展的时代,单片机作为一种最经典的微控制器,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟

温度计实验报告 本文内容:

4

河南理工大学

单片机课程设计报告

王静

:0828030090/0828010150

业:电气工程及其自动化

指导老师:

间:2011年6月24日

摘要:在这个信息化高速发展的时代,单片机作为一种最经典的微控制器,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,作为自动化专业的学生,我们学习了单片机,就应该把它熟练应用到生活之中来。本文将介绍一种基于单片机控制的数字温度计,本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。本文设计的数字温度计具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。

关键词:单片机,数字控制,数码管显示,温度计,DS18B20,AT89S52。

目录

1、概述3

1.1设计目的3

1.2设计原理3

1.3设计难点3

2

、系统总体方案及硬件设计4

2.1数字温度计设计方案论证5

2.2.

主控制器5

2.2.3温度传感器…………………………………………………………5

2.3

DS18B20温度传感器与单片机的接口电路7

2.4

系统整体硬件电路设计8

3、系统软件设计9

3.1初始化程序9

3.2读出温度子程序10

3.3读、写时序子程序11

3.4延时程序12

4

Proteus软件仿真14

5、课程设计体会16

附录1…………………………………………………………………………………………….17

附录2……………………………………………………………………………….22

1概述

1.1设计目的

随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。

本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,可广泛用于食品库、冷库、粮库、温室大棚等需要控制温度的地方。目前,该产品已在温控系统中得到广泛的应用。

1.2设计原理

本系统是一个基于单片机AT89S52的数字温度计的设计,用来测量环境温度,测量范围为-50℃—110℃度。整个设计系统分为4部分:单片机控制、温度传感器、数码显示以及键盘控制电路。整个设计是以AT89S52为核心,通过数字温度传感器DS18B20来实现环境温度的采集和A/D转换,同时因其输出为数字形式,且为串行输出,这就方便了单片机进行数据处理,但同时也对编程提出了更高的要求。单片机把采集到的温度进行相应的转换后,使之能够方便地在数码管上输出。LED采用四位一体共阴的数码管。

1.3设计难点

此设计的重点在于编程,程序要实现温度的采集、转换、显示和上下限温度报警,其外围电路所用器件较少,相对简单,实现容易。

2

系统总体方案及硬件设计

2.1数字温度计设计方案论证

由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。

2.2总体设计框图

温度计电路设计总体设计方框图如图1所示,控制器采用单片机AT89S52,温度传感器采用DS18B20,用4位共阴LED数码管以串口传送数据实现温度显示。

图1

总体设计框图

2.2.1

主控制器

单片机AT89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,适合便携手持式产品的设计使用。

2.2.2

显示电路

显示电路采用4位共阴LED数码管,从P0口输出段码,P2.0—P2.3作片选端。但在焊电路板的时候发现数码管亮度不够,所以在P2.0—P2.3端口接四个10K的电阻和四个NPN的三极管,以使数码管高亮显示。

2.2.3温度传感器

DS18B20温度传感器是美国DALLAS半导体公司推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。

DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图2所示。

图2

DS18B20内部结构

64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器TH和TL,可通过软件写入用户报警上下限。

DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,结构如图3所示。头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图3所示。低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。

温度

LSB

温度

MSB

TH用户字节1

TL用户字节2

配置寄存器

保留

保留

保留

CRC

图3

DS18B20字节定义

由下面表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。

高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。

当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。

当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制温度数据。

表1

DS18B20温度转换时间表

DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索。

在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。

2.3

DS18B20温度传感器与单片机的接口电路

图4

DS18B20与单片机的接口电路

DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。另一种是寄生电源供电方式,如图4

所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉,多个DS18B20可以将2口串接到一条总线上,而本设计只用了一个DS18B20。

当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。采用寄生电源供电方式时VDD端接地。由于单线制只有一根线,因此发送接口必须是三态的。

2.4

系统整体硬件电路设计

2.4.1

主板电路

系统整体硬件电路包括,传感器数据采集电路,温度显示电路,上下限报警调整电路,单片机主板电路等,单片机主板电路如图5

所示:

图5

单片机主板电路

图5

中包括时钟振荡电路和按键复位电路,按键复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用在重起单片机电源,就可以实现复位。另外扩展电路中,蜂鸣器可以在被测温度不在上下限范围内时,发出报警鸣叫声音,同时LED数码管将没有被测温度值显示,这时可以调整报警上下限,从而测出被测的温度值。

2.4.2

显示电路

显示电路是使用的串口显示,这种显示最大的优点就是使用口资源比较少,只用P0和P3口,串口的发送和接收,采用4位共阴LED数码管,从P0口输出段码,P2.0—P2.3作片选端。但在焊电路板的时候发现数码管亮度不够,所以在P2.0—P2.3端口接四个10K的电阻和四个NPN的三极管,期望增加驱动电流,以使数码管高亮显示。

图6

温度显示电路

3系统软件设计

系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。

3.1初始化程序

DQ置1

短延时

DQ置0

延时450us

DQ置1

延时15-60us

延时至少60us

X=~DQ

结束

X=DQ

图7

初始化程序流程图

3.2读出温度子程序

读出温度子程序的主要功能是读出RAM中的2字节,读出温度的低八位和高八位,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图8示

初始化

发跳过ROM指令

开始温度转换

延时2ms

初始化

写入跳过ROM、读取暂存器和CRC字节指令

读取温度的低八位和高八位

取中间八位

结束

图8

读温度程序流程图

3.3读、写时序子程序

读写的程序是本次设计中的重点和难点,通过我们对其时序的分析,从而写出高效的程序。

写1,0时序

读0,1时序

DQ=0

延时15us

dat

//闪烁间隔标志

bit

beep_st;

//蜂鸣器间隔标志

sbit

DIAN

=

P0^7;

//小数点

uchar

x=0;

//计数器

signed

char

m;

//温度值全局变量

uchar

n;

//温度值全局变量

uchar

set_st=0;

//状态标志

signed

char

shangxian=38;

//上限报警温度,默认值为38

signed

char

xiaxian=5;

//下限报警温度,默认值为38

uchar

code

LEDData[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};

unsigned

int

ReadTemperature(void);

/*****延时子程序*****/

void

Delay(uint

num)

{

while(

--num

);

}

/*****初始化定时器0*****/

void

InitTimer(void)

{

TMOD=0x1;

TH0=0x3c;

TL0=0xb0;

//50ms(晶振12M)

}

/*****定时器0中断服务程序*****/

void

timer0(void)

interrupt

1

using

0

{

TH0=0x3c;

TL0=0xb0;

x++;

}

/*****外部中断0服务程序*****/

void

int0(void)

interrupt

0using

1

{

EX0=0;

//关外部中断0

if(DEC==0

if(shangxian99)shangxian=99;

}

else

if(ADD==0

if(xiaxian>shangxian)xiaxian=shangxian;

}

}

/*****读取温度*****/

void

check_wendu(void)

{

uint

a,b,c;

c=ReadTemperature()-5;

//获取温度值并减去DS18B20的温漂误差

a=c/100;

//计算得到十位数字

b=c/10-a*10;

//计算得到个位数字

m=c/10;

//计算得到整数位

n=c-a*100-b*10;

//计算得到小数位

if(m99){m=99;n=9;}

//设置温度显示上限

}

/*****显示开机初始化等待画面*****/

Disp_init()

{

P0

=

0x40;

//显示-

P2

=

0xf7;

Delay(200);

P2

=

0xfb;

Delay(200);

P2

=

0xfd;

Delay(200);

P2

=

0xfe;

Delay(200);

P2

=

0xff;

//关闭显示

}

/*****显示温度子程序*****/

Disp_Temperature()

//显示温度

{

P2

=

0xf7;

P0

=0x39;

//显示C

Delay(300);

P2

=

0xfb;

P0

=LEDData[n];

//显示个位

Delay(300);

P2

=

0xfd;

P0

=LEDData[m%10];

//显示十位

DIAN

=

1;

//显示小数点

Delay(300);

P2

=

0xfe;

P0

=LEDData[m/10];

//显示百位

Delay(300);

P2

=

0xff;

//关闭显示

}

/*****显示报警温度子程序*****/

Disp_alarm(uchar

baojing)

{P2

=

0xf7;

P0

=0x39;

//显示C

Delay(200);

P2

=

0xfb;

P0

=LEDData[baojing%10];

//显示十位

Delay(200);

P2

=

0xfd;

P0

=LEDData[baojing/10];

//显示百位

Delay(200);

P2

=

0xfe;

if(set_st==1)P0

=0x76;

else

if(set_st==2)P0

=0x38;

//上限H、下限L标示

Delay(200);

P2

=

0xff;

//关闭显示

}

/*****报警子程序*****/

void

Alarm()

{

unsigned

int

i;

{

for(i=0;i2)set_st=0;

}

if(set_st==0)

{

EX0=0;

//关闭外部中断0

EX1=0;

//关闭外部中断1

check_wendu();

Disp_Temperature();

if(m>=shangxian)

P1_0=1;

else

P1_0=0;

if(m=shangxian)||(m=10){shanshuo_st=~shanshuo_st;x=0;}

if(shanshuo_st)

{Disp_alarm(shangxian);}

}

else

if(set_st==2)

{

BEEP=1;

//关闭蜂鸣器

EX0=1;

//开启外部中断0

EX1=1;

//开启外部中断1

if(x>=10){shanshuo_st=~shanshuo_st;x=0;}

if(shanshuo_st)

{Disp_alarm(xiaxian);}

}

}

}

/*****END*****/

附录2:整体原理图: