课程设计实验报告温度计的设计.docx
《课程设计实验报告温度计的设计.docx》由会员分享,可在线阅读,更多相关《课程设计实验报告温度计的设计.docx(21页珍藏版)》请在冰豆网上搜索。
课程设计实验报告温度计的设计
课程设计报告
课题名称:
基于DS18B20的温度计的设计
******
学号:
**********
班级:
11级通信工程
时间:
2014年6月10日
摘要
本实验介绍了一种基于单片机控制的数字温度计,就是用单片机AT89C51实现温度测量和报警,采用DS18B20温度传感器来作为温度监测元件,测温范围是-30度~120度,使用LCD显示模块,能通过按键调整报警的上下限温度。
该电路设计结构简单,可靠性高,功能强大。
关键词:
单片机,温度计,AT89C51,DS18B20,LCD显示
Abstract
ThedesignoftheDigitalThermometer,usingAT89C51MCDasthecoretocontrolthetemperaturemeasurementandalarm,usesDS18B20temperaturesensorfortemperaturemonitoringdevice,whichcanmeasuretemperaturesfrom-30to120degrees.ThisstudyusesLCDtoshowthecurrenttemperature.Itcanadjusttheupperandlowertemperatureofthealarmbythethreebuttons.Thiscircuitdesignhassimplestructure,highreliabilityandpowerfulfunctions.
Keywords:
MCD,Thermometer,AT89C51,DS18B20,LCD
1.设计目标·················································4
1.1设计要求·······················································4
1.2设计背景·······················································4
2.设计方案
2.1设计思路······················································4
2.2设计框图······················································4
2.3所需器材······················································5
3.硬件设计························································5
3.1主控制器AT89C51··············································5
3.2温度传感器DS18B20·············································5
3.3各部分电路说明···············································7
3.3.1晶振电路··················································7
3.3.2复位电路··················································8
3.3.3蜂鸣器和指示灯电路········································8
3.3.4DS18B20温度采集电路及按键控制电路························8
3.3.5LCD显示电路··············································8
4.电路测试及分析·················································9
4.1实物图························································9
4.2实测结果·······················································9
4.2.1温度显示及报警············································9
4.2.2掉电保存··················································10
5.总结····························································11
附录一、proteus仿真电路图·······································11
附录二、总程序···················································11
1.设计目标
1.1设计要求
1、使用DS18B20温度传感器设计温度测量电路,温度范围设置为-30度到150度。
2、能进行温度显示
3、温度报警设定,掉电后数据保存。
4、温度超限报警功能。
1.2设计背景
在一些传统温控系统电路中,广泛采用的是通过热电偶、热电阻或PN结测温电路经过相应的信号调理电路,转换成A/D转换器能接收的模拟量,再经过采样/保持电路进行A/D转换,最终送入单片机及其相应的外围电路,完成监控。
但是由于传统的信号调理电路实现复杂、易受干扰、不易控制且精度不高。
本实验介绍单片机结合DS18B20进行温度控制系统设计,因此,本系统用一种新型的可编程温度传感(DS18B20),不需复杂的信号调理电路和A/D转换电路能直接与单片机完成数据采集和处理,实现方便、精度高,可根据不同需要用于各种场合。
2.设计方案
2.1设计思路
在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
显示模块采用的是液晶显示屏。
2.2温度计电路设计总体设计方框图如图1所示
2.3所需器材
AT89C51芯片一个,DS18B20温度传感器一个,LCD液晶屏一个,22pF电容2个,12M晶振1个,10uF电容1个,触碰式按键4个,220欧电阻3个,1K欧电阻一个,4.7K欧电阻一个,10K欧电阻一个,10K欧滑动变阻器一个,1K欧排阻一个,三极管一个,蜂鸣器一个,LED灯2个。
3.硬件设计
3.1主控制器AT89C51
40个引脚,4kbytesflash片内程序存储器,128bytes的随机存取数据存储器(ram),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。
在闲置模式下,CPU停止工作。
但RAM,定时器,计数器,串口和中断系统仍在工作。
在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
单片机AT89S51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
单片机AT89S51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
3.2温度传感器DS18B20
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
TO-92封装的DS18B20的引脚排列见下图。
DS18B20的特点如下:
•1、适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下可由数据线供电。
•2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
•3、DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。
•4、DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。
•5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃。
•6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。
•7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。
•8、测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。
•9、负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
•10、内部含有E2PROM,其报警上、下限温度值和设定的分辨率倍数在芯片掉电的情况下不丢失。
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
DS18B20的初始化
1.时序图
2.写时序图
3.读时序图
3.3各部分电路说明
3.3.1晶振电路
每个单片机系统里都有晶振,全程是叫晶体震荡器。
如右图电路所示,C1、C2为瓷片电容,其大小均为22PF;X1即为晶振,其大小为11.0592MHz,电路中的XTAL1与XTAL2分别与AT89S51的第19脚和第18脚相连。
在单片机系统里晶振的作用非常大,他结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速度也就越快。
3.3.2复位电路
单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。
如上图所示电路可实现上电复位与手动复位。
图中的SW为微动按钮,C3为电解电容,其大小为10uF/16V,所用的电阻R为10KΩ。
手动按钮复位需要人为在复位输入端RST上加入高电平。
当人为按下按钮时,则Vcc的+5V电平就会直接加到RST端。
由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。
3.3.3蜂鸣器和指示灯电路
当温度在安全范围内时,D2灯保持点亮;当超出安全温度时,D1灯点亮,同时,蜂鸣器报警。
3.3.4DS18B20温度采集电路及按键控制电路
电路中采用R2为4.7K的上拉电阻,作用是在电路驱动器关闭时给线路(节点)以一个固定的电平。
三个按键是用来调整温度报警的上下限值。
3.3.5LCD显示电路
本实验中是采用的LCD液晶显示模块。
4.电路测试及分析
4.1实物图
实物图如下所示,左边是正面图,右边是反面图。
4.2实测结果
4.2.1温度显示及报警
左图中显示的温度下限是26度,当实际温度下降到温度下限以下时,D1等点亮,蜂鸣器报警;右图显示的是温度上限80度,实际温度高于下限温度,D2灯点亮,且蜂鸣器不响。
4.2.2掉电保存
下面左图显示的是掉电前温度上限设置为69度,右图是掉电后重启时,温度上限仍为69度,实现了掉电后保存温度上下限。
5.总结
经过我们小组成员的共同努力,终于完成了这次关于温度计的设计实验。
虽然还有一点点不足,但总算是完成了任务,总体来说是达到了目标。
通过这次实验,让我加深了对单片机的认识,同时也了解了DS18B20温度传感器的一些工作原理,以及如何写入掉电保存。
当然,在实验过程中也碰到很多困难,其中程序上的就是关于掉电保存的问题,DS18B20内部含有E2PROM,芯片本身可以实现掉电保存,但是必须事先用程序写进去,这一步花了我们好多时间查找资料,最终是完成了。
还有就是电路焊接的时候遇到点小麻烦,有的地方焊得不牢固,导致电路板测试时不稳定。
这次实验让我收获颇多,学到了不少知识,也增加了我对单片机的兴趣。
附录一、仿真电路图
附录二、程序代码
#include
#include
#include
#defineINT8Uunsignedchar
#defineINT16Uunsignedint
sbitSET=P3^7;//定义调整键
sbitDEC=P3^6;//定义减少键
sbitADD=P3^5;//定义增加键
sbitDQ=P3^4;
INT16Uwarn_h1=0x20;
INT16Uwarn_l1=0x14;
INT8UTemp_Disp_Buff[17];
INT8Uset_st=0;
voidXianshi();
voidKEY_Scan();
voidcopyRAMtoEE();
voidhuidiaotoRAM();
externINT8UTemp_Value[];
externINT8UInit_DS18B20();
externvoidLCD_Initialise();
externvoidLCD_ShowString(INT8Ur,INT8Uc,INT8U*str);
externvoiddelay_ms(INT16U);
externvoidDelayX(INT16Ux);
externINT8URead_Temperature();
externvoidWriteOneByte(INT8Udat);
//-----------------------------------------------------------------
//主函数
//----------------------------------------------------------------
sbitbeep=P2^3;
sbitled0=P1^0;
sbitled1=P1^1;
sbitled2=P1^2;
sbitled3=P1^3;
voidwarn(INT16Us,INT8Uled)
{
INT8Ui;i=s;
beep=1;
P1=led;
while(i--)
{
delay_ms
(1);
}
}
voidcopyRAMtoEE()//把RAM中的TH,TL,CONFIGUREREGISTER数据复制到EEPROM中
{
Init_DS18B20();
WriteOneByte(0xcc);
WriteOneByte(0x48);//RAM中数据复制到EEPROM
DelayX(100);//当数据完全复制到EEPROM中时总线会输出1
}
voidwritetoRAM(INT8UCR)//CR-Configureregister
{
Init_DS18B20();
WriteOneByte(0xcc);//跳过写ROM
WriteOneByte(0x4e);//向RAM中写数据
WriteOneByte(warn_h1);
WriteOneByte(warn_l1);
WriteOneByte(CR);
Init_DS18B20();
}
voidhuidiaotoRAM()
{Init_DS18B20();
WriteOneByte(0xcc);//跳过写ROM
WriteOneByte(0xb8);
}
voidKEY_Scan()
{
writetoRAM(0x7f);
if(DEC==0||ADD==0||SET==0)
{
delay_ms(10);
if(SET==0)
{while(SET==0);
{set_st++;
if(set_st==3)
{set_st=0;
}
}
}
elseif
(1)
{
if((DEC==0)&&(set_st==1))
{
delay_ms(10);
if((DEC==0)&&(set_st==1))
{while((DEC==0)&&(set_st==1));
LCD_Initialise();
warn_h1--;
sprintf(Temp_Disp_Buff,"TEM:
%d\xDF\x43",warn_h1);
LCD_ShowString(0,0,Temp_Disp_Buff);
delay_ms(150);
}
}
elseif((DEC==0)&&(set_st==2))
{
delay_ms(10);
if((DEC==0)&&(set_st==2))
{while((DEC==0)&&(set_st==2));
LCD_Initialise();
warn_l1--;
sprintf(Temp_Disp_Buff,"TEM:
%d\xDF\x43",warn_l1);
LCD_ShowString(0,0,Temp_Disp_Buff);
delay_ms(150);
}
}
elseif((ADD==0)&&(set_st==1))
{
delay_ms(10);
if((ADD==0)&&(set_st==1))
{while((ADD==0)&&(set_st==1));
LCD_Initialise();
warn_h1++;
sprintf(Temp_Disp_Buff,"TEM:
%d\xDF\x43",warn_h1);
LCD_ShowString(0,0,Temp_Disp_Buff);
delay_ms(150);
}
}
elseif((ADD==0)&&(set_st==2))
{
delay_ms(10);
if((ADD==0)&&(set_st==2))
{while((ADD==0)&&(set_st==2));
LCD_Initialise();
warn_l1++;
sprintf(Temp_Disp_Buff,"TEM:
%d\xDF\x43",warn_l1);
LCD_ShowString(0,0,Temp_Disp_Buff);
delay_ms(150);
}
}
else
{
voidXianshi();
}
}
}
}
voiddeal(floatt)
{
if((t>=warn_h1)||(t<=warn_l1))
{
warn(40,0xFE);
}
elseif((twarn_l1))
{
beep=0;
P1=0xFD;
}
}
voidmain()
{
floattemp=0.0;//浮点温度变量
Read_Temperature();
warn_h1=Temp_Value[2];
warn_l1=Temp_Value[3];
writetoRAM(0x7f);
LCD_Initialise();//液晶初始化
LCD_ShowString(0,0,"DS18B20Test");//显示标题
LCD_ShowString(1,0,"Waiting.....");//显示等待信息
sprintf(Temp_Disp_Buff,"TEM:
%d\xDF\x43",warn_l1);
LCD_ShowString(0,0,Temp_Disp_Buff);
delay_ms(1500);
sprintf(Temp_Disp_Buff,"TEM:
%d\xDF\x43",warn_h1);
LCD_ShowString(0,0,Temp_Disp_Buff);
delay_ms(150);
copyRAMtoEE();
Read_Temperature();//预读取温度
delay_ms(1500);//长延时
while
(1)//循环读取温度并显示
{
KEY_Scan();
writetoRAM(0x7f);
copyRAMtoEE();
Xianshi();
}
}
voidXianshi()
{floattemp=0.0;
floatt=0.0;
if(Read_Temperature())
{
temp=(int)(Temp_Value[1]<<8|Temp_Value[0])*0.0625;
if(temp>-31)
{
if(temp<151)
{
deal(temp);
sprintf(Temp_Disp_Buff,"TEMP:
%5.1f\xDF\x43",te