单片机数字温度计.docx

上传人:b****8 文档编号:9410535 上传时间:2023-05-18 格式:DOCX 页数:27 大小:215.41KB
下载 相关 举报
单片机数字温度计.docx_第1页
第1页 / 共27页
单片机数字温度计.docx_第2页
第2页 / 共27页
单片机数字温度计.docx_第3页
第3页 / 共27页
单片机数字温度计.docx_第4页
第4页 / 共27页
单片机数字温度计.docx_第5页
第5页 / 共27页
单片机数字温度计.docx_第6页
第6页 / 共27页
单片机数字温度计.docx_第7页
第7页 / 共27页
单片机数字温度计.docx_第8页
第8页 / 共27页
单片机数字温度计.docx_第9页
第9页 / 共27页
单片机数字温度计.docx_第10页
第10页 / 共27页
单片机数字温度计.docx_第11页
第11页 / 共27页
单片机数字温度计.docx_第12页
第12页 / 共27页
单片机数字温度计.docx_第13页
第13页 / 共27页
单片机数字温度计.docx_第14页
第14页 / 共27页
单片机数字温度计.docx_第15页
第15页 / 共27页
单片机数字温度计.docx_第16页
第16页 / 共27页
单片机数字温度计.docx_第17页
第17页 / 共27页
单片机数字温度计.docx_第18页
第18页 / 共27页
单片机数字温度计.docx_第19页
第19页 / 共27页
单片机数字温度计.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机数字温度计.docx

《单片机数字温度计.docx》由会员分享,可在线阅读,更多相关《单片机数字温度计.docx(27页珍藏版)》请在冰点文库上搜索。

单片机数字温度计.docx

单片机数字温度计

目录

一.引言………………………………………………………………

(2)

二.设计任务及性能指标……………………………………………

(2)

三.总体设计方案……………………………………………………

(2)

1.功能简介

2.硬件功能模块组成

3.软件功能模块组成

4.总体框图

5.系统调试

4.系统硬件电路设计………………………………………………(5)

1.原理图

2.原理图各部分连线方法和功能说明

5.系统软件电路设计………………………………………………(7)

1.主程序

2.读出温度子程序

3.温度转换子程序

4.计算温度子程序

5.显示数据刷新子程序

6.按键扫描处理子程序

六.系统调试…………………………………………………………(11)

1.硬件调试

2.软件调试

3.软硬调试

七.总结与体会………………………………………………………(13)

八.程序………………………………………………………………(14)

参考文献

 

一.引言

随着电子技术的不断发展,电子产品的应用越来越多,电子产品越来越轻巧,价格也越来越便宜.利用电子芯片实现的东西也越来越来越多,比如数字温度计。

此次课设论文所介绍的是自己动手制作的一个高精度数字温度计。

本次课设不但丰富了课余生活,还从实践中学到并了很多新知识,并从中巩固了以前的知识。

用DSP2004软件和proteus软件来设计制作电路板,布置一系列的芯片、电阻、电容等元件,通过PCB上的导线相连,构成电路,电路通过连接器或者插槽进行输入/输出,有时还有显示部分(如发光二极管LED、.数码显示器等)。

PCB在各种电子设备中有如下功能:

(1)提供集成电路等各种电子元件固定、装配的机械支撑。

(2)实现集成电路等各种电子元件之间的布线和电气连接或电绝缘,提供所要的电气特性。

(3)为电动装配提供阻焊徒刑,为元器件插装、检查、维修提供识别符和图形。

本课题所用到的知识是我们学过的模拟电子电路以及数字逻辑电路等,还用到了刚刚学过不久的单片机知识。

本次课设是把理论和实践结合起来,这不但可以锻炼自己的动手能力,而且还可以加深对数字逻辑电路和模拟电子电路的学习和理解。

同时也激起了我学好单片机的斗志。

为了全面清晰的表达,本论文用图文并茂的方式,尽可能详细的地介绍此次设计的全过程。

二、设计任务及性能指标

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

设计要求:

1、基本范围-50℃-110℃

2、精度误差小于0.5℃

3、LED数码直读显示

扩展功能1、可以任意设定温度的上下限报警功能;2、实现语音报数

3、总体设计方案

方案一

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

而且在对采集的信号进行放大时容易受温度的影响从而出现较大的偏差。

方案二

考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,电路简单,精度高,软硬件都以实现,而且使用单片机的接口便于系统的再扩展,满足设计要求。

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

1.功能简介:

以STC89C52单片机为主控制器,以数字式温度传感器DS18B20为传感元件,以四位共阳数码管作为显示器件实时显示测量温度(十进制数)。

数字式温度计测温范围在-50~110℃,误差在±0.5℃以内。

温度测量间隔时间选择1s。

通过按键实现温度上下限值的设定及温度报警功能。

对温度采。

2.硬件功能模块组成:

温度计的控制器使用单片机STC89C52,用4位共阳LED数码管以动态扫描法实现温度显示,温度传感器使用DS18B20。

DS18B20的性能特点:

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器。

与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。

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

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

3>不需要外部器件;

4>可通过数据线供电,电压范围为3.0-5.5V;

5>零待机功耗;

6>温度以9^12位数字量读出;

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

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

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

主控制器:

单片机STC89C52具有低电压供电和小体积等特点,四个端口只需要两个口就能满足电路系统的设计需要,晶振采用12MHZ。

显示电路:

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

3.软件功能组成模块:

主程序:

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

温度测量每1s进行一次。

读出温度子程序:

主要功能是读出RAM中字节。

在读出时须进行CRC校验,校验有错时不进行温度数据的改写。

温度转换命令子程序:

主要是发温度转换开始命令。

计算温度子程序:

将RAM中读取值进行BCD码的转换运行,并进行温度值正负的判定。

显示数据刷新子程序:

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

4.总体框图:

5.系统调试:

1>硬件测试:

主要测试各部分硬件是否正常工作,每部分通过简单程序来检测。

2>软件测试:

测试软件是否符合设计要求.

四、系统硬件电路设计

1.原理图如图所示:

2.原理图各部分连线方法和功能说明:

1>按键:

可以分别调整温度的上下限报警设置.

调节方法:

当按下SET键一次时,进入温度报警上线调节,此时显示软件设置的温度报警上线,按ADD或DEC分别对报警温度进行加一或减一。

当再次按下SET键时,进入温度报警下线调节,此时显示软件设置的温度报警下线,按ADD或DEC分别对报警温度进行加一或减一。

当第三次按下SET键时,退出温度报警线设置,显示当前温度。

2>蜂鸣器:

可以在被测温度不在上下限范围内时,发出报警鸣叫声音,同时LED数码管将没有被测温度显示,可以调整上下限,测出被测的温度值。

3>指示灯:

1》上电时,若闪亮一下或长明,代表系统已通上电。

2》当上电时,会先闪一下,然后熄灭,代表系统正常工作,若不灭,则说明系统不能正常工作。

3>可以和蜂鸣器一样作为温度范围报警器.

4>由单片机P0口接数码管八个段选线引脚,控制需要显示的数字,外加上拉电阻。

5>由单片机P2口接数码管共八个位选引脚,控制显示数字的位。

6>DS18B20

测温原理:

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

测温原理图

图中的计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数,进而完成温度测量。

计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-50℃所对应的一个基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-50℃所对应的一个基数值。

减法计数器1对低温度系数振荡器产生的脉冲信号进行减法计数,当减法计数器1的预置值减到时,温度寄存器的值将加1,减法计数器1的预置值将重新被装人,并重新开始对低温度系数振荡器产生的脉冲信号进行计数。

如此循环,直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值就是所测温度值。

图4中的斜率累加器用于补偿和修正测温过程中的非线形性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直到温度寄存器值达到被测温度值。

另外,由于DS18B20单线通信功能是分时完成的,有严格的时隙概念,因此读/写时序很重要。

系统对DS18B20的各种操作必须按协议进行。

操作协议为:

初始化DS18B20(发复位脉冲)--发ROM功能命令--发存储器操作命令--处理数据。

接口方法:

DS18B20可以采用两种方式供电:

一种是采用电源供电方式,此时DS18B20的第1脚接单片机课程设计指导地,第2脚作为信号线,第3脚接电源;另一种是寄生电源供电方式,如图4.5所示。

单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。

当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最长为500ms。

采用寄生电源供电方式时,VDD和GND端均接地。

由于单线制只有一根线,因此发送接口必须是三态的。

7>测温系统的硬件工作原理

对DS18B20初始化后,主机发出SKIPROM命令,此命令执行后的存储器操作命令将对所在线的DS18B20,在发出温度转换启动码(44H),等待750ms后,先发出匹配ROM命令(55H)紧接着主机提供一片DS18B20的64位序列号,读取其温度存储器值,存入数据缓存。

五.系统软件电路设计

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

各模块程序功能如下:

1.数码管显示程序:

向数码的显示送数,控制系统的显示部分。

2.温度测试及处理程序:

对温度芯片送过来的数据进行处理,进行判断和显示。

3.报警子程序:

进行温度上下限判断及报警输出。

4.中断设定程序:

实现设定上下限报警功能。

1.主程序流程图

主程序流程图

2.读出温度子程序

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

读DS18B20流程图

3.温度转换命令子程序

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

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

4.计算温度子程序

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

计算温度子程序

5.显示数据刷新子程序

显示数据刷新子程序主要是对分离后的温度显示数据进行刷新操作,当标志位位为1时将符号显示位移入第一位。

显示数据刷新流程图

6.按键扫描处理子程序

按键采用扫描查询方式,设置标志位,当标志位为1时,显示设置温度,否则显示当前温度。

按键扫描处理流程图

六、系统调试

根据方案设计的要求,调试过程共分3大部分:

硬件调试、软件调试和软硬联调。

单片机的硬件调试和软件调试是不能分开的,许多硬件错误是在软件调试中被发现和纠正的。

但通常是先排除明显的硬件故障以后,在和软件结合起来调试以进一步排除故障。

可见硬件的调试是基础。

如果硬件调试不通过,软件设计就是无从说起。

1.硬件调试

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

1>排除逻辑故障

这类故障往往由于设计和焊接板过程中所造成的。

只要包括错线、开路、短路。

排除的方法:

1》将焊接的板认真对照原理图,看两者是否一致。

应特别注意电源系统检查,以防止电源短路和极性错误。

2》重点检查系统总线(地址总线、数据总线和控制总线)是否存在相互之间短路或与其他信号线短路。

必要时利用数字万用表的短路测试功能,可以缩短排错时间。

2>排除元器件失效

造成这类错误的原因有2个:

一是元器件买来时就已坏了;另一个是安装错误,造成器件烧坏。

可以采取检查元器件与设计要求的型号、规格和要求是否一致。

在保证安装无误后,用替换方法排除错误。

3>排除电源故障

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

2.软件调试

本系统的软件系统较大,全面采用汇编语言编写,除语法和逻辑差错外,当确认程序没问题时,直接下载到单片机仿真调试。

采取自下而上的方法,单独调好每一个模块,最后完成一个完整的系统调试。

3.软硬调试

系统做好后,进行系统的完整调试。

在设计过程中用到得工具有;

仿真开发装置、示波器、万用表工具.烙铁.protues软件keil软件

七.总结与体会

本次课程设计即将进入尾声,回想这周来的电子设计制作经历,我感触甚是深刻。

通过本次课程设计,使我对电子设计及制作产生了较为浓厚的兴趣,这不仅加强了自己对理论知识的理解和巩固,还能提高自己的动手能力,可以说受益匪浅。

当然更重要的是,激起了我学好单片机的斗志。

本次课程设计主要分为四部分:

设计、仿真、制作及调试。

这四个步骤在整个课程设计过程中起着重要的作用。

本次课程设计的任务是:

根据老师给出的设计题目的要求选择合适的电路,确定元件参数,对原理图进行电路仿真,制作实物。

在整个设计制作过程中用到了两个软件,protues仿真软件和keil汇编软件。

可以说,在此之前自己未曾使用过protues软件。

而且keil用起来也是相当的陌生。

本次课设让我学到了如何去运用protues软件对电路进行仿真,仿真出来的效果与理论上的效果以及与实物做出来的效果有何不同或相似。

最能体现一个人的耐心程度,也最能学到东西的阶段还是在调试过程。

在整个过程中既要求熟练掌握设计的原理,懂得运用所学电学的基本理论,还要求善于查错,改错。

如果在调试过程中无法达到预期结果,就要从整个设计制作过程中认真分析,细心查找错误,一步一步仔细排查。

在找到错误之后,切不可马上放弃这块板子重新做,如果不懂如何做,可以请教在这方面能力较强的同学,尽量做到以较少的改动来改正错误。

这样可以节约时间以及做板的成本。

当调板不成功,尤其是花了很久时间都未能成功的时候,大多数人都会显得相当急燥,而我就是其中一个。

后来我去请教同学和老师,在他们的开导和讲解之下,我静下心来重新开始分析,当检查到电路板时才发现,原来有一根铜线与周边所附的铜被一点点没腐蚀掉的铜点连在了一起,虽然这只是一小点的铜点,却能造成了比较大的错误,导致有整个电路处于短路状态。

幸亏没把主控芯片给烧咯。

在修改之后,终于,一直期盼出现的结果出来了。

从确定题目,寻找原理图,制作protues到焊接调试,每一个步骤都付出了努力,倾注了我的心血,也从中积累了宝贵的经验,最后终于大抵上完成了设计任务。

从总体上看,这次电路设计制作还是比较成功的,板子的调试结果与仿真得出的效果图还是比较接近的。

拿着自己调试好的板子,心里总有些许的“成就感”,这也只有真正是自己动过手的人才能体会到其中的喜悦。

本次课程设计给我的第一大感觉就是:

要成功,就要有付出。

从这一次制作过程的心得体会当中,我意识到在以后的设计中我还需要做到再细心、再耐心、再专心。

回想从制作开始到结束,没有哪一步不是注入了自己的心血,心情就激动不已,此次课程设计必将让自己的理论水平和实践能力上升到一个新的台阶,同时也让自己认识到实践的重要性。

8.程序

#include"reg52.h"

#include"intrins.h"//_nop_();延时函数用

#definedmP0//段码输出口

#defineucharunsignedchar

#defineuintunsignedint

sbitDQ=P2^7;//温度输入口

sbitw0=P2^0;//数码管4

sbitw1=P2^1;//数码管3

sbitw2=P2^2;//数码管2

sbitw3=P2^3;//数码管1

sbitbeep=P1^7;//蜂鸣器和指示灯

sbitset=P2^6;//温度设置切换键

sbitadd=P2^4;//温度加

sbitdec=P2^5;//温度减

inttemp1=0;//显示当前温度和设置温度的标志位为0时显示当前温度

uinth;

uinttemp;

ucharr,k;

ucharhigh=110,low=0;

ucharsign;

ucharq=0;

uchartt=0;

ucharscale;

//**************温度小数部分用查表法***********//

ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//小数断码表

//共阳

ucharcodetable_dm[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};//共阳断码表

uchartable_dm1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//个位带小数点的断码表

uchardatatemp_data[2]={0xff,0xff};//读出温度暂放

uchardatadisplay[5]={0xff,0xff,0xff,0xff,0xff};//显示单元数据,共4个数据和一个运算暂用

/*****************11us延时函数*************************/

voiddelay(uintt)

{

for(;t>0;t--);

}

voidscan()

{

intj;

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

{

switch(j)

{

case0:

dm=table_dm[display[0]];w0=1;delay(50);w0=0;//xiaoshu

case1:

dm=table_dm1[display[1]];w1=1;delay(50);w1=0;//gewei

case2:

dm=table_dm[display[2]];w2=1;delay(50);w2=0;//shiwei

case3:

dm=table_dm[display[3]];w3=1;delay(50);w3=0;//baiwei

//else{dm=table_dm[b3];w3=0;delay(50);w3=1;}

}

}

}

//***************DS18B20复位函数************************/

ow_reset(void)

{

charpresence=1;

while(presence)

{

while(presence)

{

DQ=1;_nop_();_nop_();//从高拉倒低

DQ=0;

delay(50);//550us

DQ=1;

delay(6);//66us

presence=DQ;//presence=0复位成功,继续下一步

}

delay(45);//延时500us

presence=~DQ;

}

DQ=1;//拉高电平

}

/****************DS18B20写命令函数************************/

//向1-WIRE总线上写1个字节

voidwrite_byte(ucharval)

{

uchari;

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

{

DQ=1;_nop_();_nop_();//从高拉倒低

DQ=0;_nop_();_nop_();_nop_();_nop_();//5us

DQ=val&0x01;//最低位移出

delay(6);//66us

val=val/2;//右移1位

}

DQ=1;

delay

(1);

}

/****************DS18B20读1字节函数************************/

//从总线上取1个字节

ucharread_byte(void)

{

uchari;

ucharvalue=0;

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

{

DQ=1;_nop_();_nop_();

value>>=1;

DQ=0;_nop_();_nop_();_nop_();_nop_();//4us

DQ=1;_nop_();_nop_();_nop_();_nop_();//4us

if(DQ)value|=0x80;

delay(6);//66us

}

DQ=1;

return(value);

}

/*****************读出温度函数************************/

read_temp()

{

ow_reset();//总线复位

delay(200);

write_byte(0xcc);//发命令

write_byte(0x44);//发转换命令

ow_reset();

delay

(1);

write_byte(0xcc);//发命令

write_byte(0xbe);

temp_data[0]=read_byte();//读温度值的第字节

temp_data[1]=read_byte();//读温度值的高字节

temp=temp_data[1];

temp<<=8;

temp=temp|temp_data[0];//两字节合成一个整型变量。

returntemp;//返回温度值

}

/****************温度数据处理函数************************/

//二进制高字节的低半字节和低字节的高半字节组成一字节,这个

//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩

//下的低字节的低半字节转化成十进制后,就是温度值的小数部分

/********************************************************/

work_temp(uinttem)

{

k=0;

if(tem>6348)//温度值正负判断

{tem=65536-tem;k=1;}//负温度求补码,标志位置1

display[4]=tem&0x0f;//取小数部分的值

display[0]=ditab[display[4]];//存入小数部分显示值

display[4]=tem>>4;//取中间八位,即整数部分的值

display[3]=display[4]/100;//取百位数据暂存

display[1]=display[4]%100;//取后两位数据暂存

display[2]=display[1]/10;//取十位数据暂存

display[1]=display[1]%10;//个位数据

r=displa

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 临床医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2