数字温度计课程设计报告Word文档格式.docx
《数字温度计课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《数字温度计课程设计报告Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
温度传感器的选择
DS18B20的简单介绍
DS18B20温度传感器是一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:
①独特的单线接口仅需要一个端口引脚进行通信;
②多个DS18B20可以并联在惟一的三线上,实现多点组网功能;
③无须外部器件;
④可通过数据线供电,电压范围为~V;
⑤零待机功耗;
⑥温度以9或12位数字;
⑦负电压特性,电极接反时,温度计不会因发热而烧毁,只是不能正常工作。
DS18B20的外形和内部结构
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的管脚排列、各种封装形式如图所示,DQ为数据输入/输出引脚。
开漏单总线接口引脚。
当被用着在寄生电源下,也可以向器件提供电源;
GND为地信号;
VDD为可选择的VDD引脚。
当工作于寄生电源时,此引脚必须接地。
图外部封装形式图DS18B20的电路
DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图2-4所示。
图2-4DS18B20内部结构
64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。
高速暂存RAM的结构为9字节的存储器。
头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。
第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。
DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。
低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。
DS18B20的测温原理
DS18B20的温度值的位数因分辨率不同而不同,温度转换时的最大延时为750ms。
DS18B20测温原理如图所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
图DS18B20测温原理
DS18B2的外部电路图
根据设计要求,传感器的硬件电路图如图所示。
图DS18B20外部电路图
三.程序流程
图DS18B20温度计主程序流程图图读出温度子程序流程图
图计算温度子程序图显示数据刷新子程序流程图
4.Proteus仿真调试结果及分析
温度计电路设计原理图如图所示,控制器使用单片机AT89C2052,温度计传感器使用DS18B20,用液晶实现温度显示。
本温度计大体分三个工作过程。
首先,由DS18820温度传感器芯片测量当前的温度,并将结果送入单片机。
然后,通过89C2052单片机芯片对送来的测量温度读数进行计算和转换,井将此结果送入液晶显示模块。
最后,SMC1602A芯片将送来的值显示于显示屏上。
由图可看到,本电路主要由DSl8820温度传感器芯片、SMCl602A液晶显示模块芯片和89C2052单片机芯片组成。
其中,DSI8B20温度传感器芯片采用“一线制”与单片机相连,它独立地完成温度测量以及将温度测量结果送到单片机的工作。
图温度计电路设计仿真图
5.硬件调试结果及分析
软件调试
根据流程图编写程序软件。
本次设计系统的调试以程序的调试为主。
程序的调试我们采用KeilC51.KeilC51软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM语言和C语言的程序设计,界面友好,易学易用。
系统调试
软硬件分别调试完成以后,将程序下载入单片机中,电路板接上电源,按刷新按钮LCD显示当前温度。
用手去碰触温度传感器,按刷新按钮,温度显示值出现变化,显示当前手的温度值。
完成了我们预期的要求。
6.设计感受与见解
本次综合实训是针对MCS-51系列的单片机芯片STC89C52来设计一个数字温度计,该设计充分利用了温度传感器DS18B20功能强大的优点,如DS18B20可以直接读出被测温度值,进行转换;
而且采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点,大大简化了硬件电路,也使得该数字温度计不仅具有结构简单、成本低廉、精确度较高、反应速度较快、数字化显示和不易损坏等特点,而且性能稳定,适用范围广,因此特别适用于对测温要求比较准确的场所。
在这次设计中,熟悉了制作一个产品的总体流程,能熟练使用一些必要的设计工具和仿真工具等。
通过选认元件,连线,调试检测等过程,锻炼自己的理论联系实际的能力和实际操作能力,从而综合性地巩固所学的知识,为将来的工作做一次实战演习。
经过将近2周的综合实训,终于完成了我的数字温度计的设计,虽然没有完全达到设计要求,但从心底里说,还是高兴的,
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次实训中的最大收获。
七.附件一:
元器件清单
STC89C511个
温度传感器DS18B201个
插针1排
LCD16021个
40脚插座1个
12MHZ晶振1个
电容30PF2个
22UF1个
电阻10K2个
1个
附件二:
源程序
#include<
>
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^7;
//ds18b20与单片机连接口
sbitRS=P3^0;
sbitRW=P3^1;
sbitEN=P3^2;
unsignedcharcodestr1[]={"
temperature:
"
};
unsignedcharcodestr2[]={"
uchardatadisdata[5];
uinttvalue;
//温度值
uchartflag;
//温度正负标志
/*************************lcd1602程序**************************/
voiddelay1ms(unsignedintms)//延时1毫秒(不够精确的)
{unsignedinti,j;
for(i=0;
i<
ms;
i++)
for(j=0;
j<
100;
j++);
}
voidwr_com(unsignedcharcom)//写指令//
{delay1ms
(1);
RS=0;
RW=0;
EN=0;
P2=com;
delay1ms
(1);
EN=1;
voidwr_dat(unsignedchardat)//写数据//
;
RS=1;
P2=dat;
voidlcd_init()//初始化设置//
{delay1ms(15);
wr_com(0x38);
delay1ms(5);
wr_com(0x08);
wr_com(0x01);
wr_com(0x06);
wr_com(0x0c);
voiddisplay(unsignedchar*p)//显示//
{
while(*p!
='
\0'
)
wr_dat(*p);
p++;
delay1ms
(1);
init_play()//初始化显示
{lcd_init();
wr_com(0x80);
display(str1);
wr_com(0xc0);
display(str2);
}
/*****************ds1820程序*********************************/
voiddelay_18B20(unsignedinti)//延时1微秒
while(i--);
voidds1820rst()/*ds1820复位*/
{unsignedcharx=0;
DQ=1;
//DQ复位
delay_18B20(4);
//延时
DQ=0;
//DQ拉低
delay_18B20(100);
//精确延时大于480us
//拉高
delay_18B20(40);
}
uchards1820rd()/*读数据*/
{unsignedchari=0;
unsignedchardat=0;
for(i=8;
i>
0;
i--)
{DQ=0;
//给脉冲信号
dat>
=1;
DQ=1;
if(DQ)
dat|=0x80;
delay_18B20(10);
return(dat);
voidds1820wr(ucharwdata)/*写数据*/
{unsignedchari=0;
for(i=8;
i>
i--)
{DQ=0;
DQ=wdata&
0x01;
wdata>
read_temp()/*读取温度值并转换*/
{uchara,b;
ds1820rst();
ds1820wr(0xcc);
//*跳过读序列号*/
ds1820wr(0x44);
//*启动温度转换*/
//*跳过读序列号*/
ds1820wr(0xbe);
//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<
<
=8;
tvalue=tvalue|a;
if(tvalue<
0x0fff)
tflag=0;
else
{tvalue=~tvalue+1;
tflag=1;
tvalue=tvalue*;
//温度值扩大10倍,精确到1位小数
return(tvalue);
/*******************************************************************/
voidds1820disp()//温度值显示
{ucharflagdat;
disdata[0]=tvalue/1000+0x30;
//百位数
disdata[1]=tvalue%1000/100+0x30;
//十位数
disdata[2]=tvalue%100/10+0x30;
//个位数
disdata[3]=tvalue%10+0x30;
//小数位
if(tflag==0)
flagdat=0x20;
//正温度不显示符号
flagdat=0x2d;
//负温度显示负号:
-
if(disdata[0]==0x30)
{disdata[0]=0x20;
//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;
//如果百位为0,十位为0也不显示
wr_com(0xc0);
wr_dat(flagdat);
//显示符号位
wr_com(0xc1);
wr_dat(disdata[0]);
//显示百位
wr_com(0xc2);
wr_dat(disdata[1]);
//显示十位
wr_com(0xc3);
wr_dat(disdata[2]);
//显示个位
wr_com(0xc4);
wr_dat(0x2e);
//显示小数点
wr_com(0xc5);
wr_dat(disdata[3]);
//显示小数位
/********************主程序***********************************/
voidmain()
{init_play();
//初始化显示
while
(1)
{read_temp();
//读取温度
ds1820disp();
//显示
9.附录三:
实物图及使用说明
说明:
按键刷新温度