测控系统原理与设计课程设计温度检测系统.docx
《测控系统原理与设计课程设计温度检测系统.docx》由会员分享,可在线阅读,更多相关《测控系统原理与设计课程设计温度检测系统.docx(25页珍藏版)》请在冰豆网上搜索。
测控系统原理与设计课程设计温度检测系统
《测控系统原理与设计》课程设计报告
课题:
温度检测系统
班级XXXXXXX学号XXXXXXXXX
学生姓名XXXXX
指导教师XXXXXXXX
淮阴工学院
电子与电气工程学院
2010年12月
一、概述
1.1前言
传统的温度检测以热敏电阻为温度敏感元件。
热敏电阻的成本低,但需后续信号处理电路,而且可靠性相对较差,测温准确度低,检测系统也有一定的误差。
这里设计的数字温度计具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。
本设计选用STC89C52型单片机作为主控制器件,DS18B20作为测温传感器,通过LED数码管实现温度显示。
通过DS18B20直接读取被测温度值,进行数据转换,该器件的物理化学性能稳定,线性度较好,在0℃~100℃最大线性偏差小于0.01℃。
该器件可直接向单片机传输数字信号,便于单片机处理及控制。
另外,该温度计还能直接采用测温器件测量温度,从而简化数据传输与处理过程。
1.2基本功能与参数
(1)系统基本功能
a.实现温度的实时测量与显示。
b.可手动设置监测温度范围的上限和下限。
c.超出温度监测范围,可进行声光报警或执行预定操作。
(2)参数
a.DS18B20的温度测量范围为-55°C~+125°C,在-10°C~+85°C范围内,精度为±0.5°C
b.显示温度值精确到0.1°C,监测温度精确到1°C
c.精度误差小于0.5℃
二、设计要求
本设计的温度测量报警系统以STC89C52单片机为核心部件,外加温度采集电路、键盘及显示电路、越限报警等电路。
采用数字温度芯片DS18B20测量温度,输出信号全数字化。
由数字温度计DS18B20和STC89C52单片机构成的温度测量装置,它直接输出温度的数字信号。
利用STC89S52芯片控制温度传感器DS18B20进行实时温度检测并显示,快速测量环境温度,并可以根据需要设定上下限温度。
系统框图如图1所示。
图1DS18B20温度测温系统框图
三、硬件电路总体设计
3.1单片机最小系统设计
3.1.1电源电路
图2电源电路
3.1.2振荡电路与复位电路
晶振采用12MHZ。
复位电路采用上电加按钮复位。
图3振荡电路图4复位电路
3.2DS18B20与单片机的接口电路
图5DS18B20与单片机的接口电路
3.3独立式键盘电路
图6独立式键盘电路
3.4报警模块
图7报警电路
3.5数码管显示模块
显示电路采用4位共阴极LED数码管,P0口由上拉电阻提高驱动能力,作为段码输出并作为数码管的驱动。
P2口的低四位作为数码管的位选端。
采用动态扫描的方式显示。
图8数码管显示电路
3.6proteus仿真图
图9proteus仿真图
3.7DS18B20简单介绍
DS18B20的性能特点如下
●独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
●DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
●DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
●适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下可由数据线供电
●温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
●零待机功耗
●可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
●在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快
●用户可定义报警设置
●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件
●测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的管脚排列、各种封装形式如图11所示,DQ为数据输入/输出引脚。
开漏单总线接口引脚。
当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。
当工作于寄生电源时,此引脚必须接地。
图10外部封装形式
四、软件流程框图
系统程序主要包括主程序、读取温度子程序、温度转换命令子程序、计算温度子程序、按键扫描处理子程序、显示数据子程序等。
4.1主程序流程图
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图11所示。
图11主程序流程图
4.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如图12所示。
4.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如上图,图13所示。
图13温度转换流程图
图12读温度流程图
4.4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图14所示。
图14 计算温度流程图
4.5按键扫描处理子程序
按键采用扫描查询方式,设置标志位,当标志位为1时,显示设置温度,否则显示当前温度。
图15按键扫描处理子程序
4.6源程序
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitds=P2^0;
sbitdula=P2^6;
sbitwela=P2^7;
sbitbeep=P2^1;
sbitSET1=P2^2;//定义上限显示调整键
sbitDEC=P2^3;//定义增加减少键
sbitADD=P2^4;//定义增加减少键
sbitSET2=P2^5;//定义下限显示调整键
inttemp;
floatf_temp;
intwarn_l1=50;
intwarn_l2=0;
intwarn_h1=300;
intwarn_h2=1000;
/************************xianshi*********************/
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef,
0x40
};
voiddelay(intz)
{
inta,b;
for(a=0;afor(b=0;b<120;b++);
}
voiddisplay(ucharnum,uchardat)
{
uchari;
dula=0;
wela=0;
wela=1;
i=0x00;
i=i|(~(((0x01)<<(num))));
P0=i;
wela=0;
dula=1;
P0=table[dat];
dula=0;
P0=0xff;
dula=0;
delay(3);
}
voiddis_temp(intt)
{
uchari;
i=t/100;
display(1,i);
i=t%100/10;
display(2,i+10);
i=t%100%10;
display(3,i);
delay(5);
}
/******************************ds18b20**********************/
voidds_reset()
{
uinti;
ds=0;
i=103;
while(i>0)
i--;
ds=1;
i=4;
while(i>0)
i--;
}
uchartemp_readbit(void)
{
uinti;
bitdat;
ds=0;
i++;
ds=1;
i++;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchartemp_read(void)
{
uchari,j,dat;
dat=0;
for(i=0;i<8;i++)
{
j=temp_readbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
voidtemp_write(uchardat)
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;
i++;i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
voidtemp_change(void)
{
ds_reset();
delay
(1);
temp_write(0xcc);
temp_write(0x44);
}
uintget_temp()
{
uchara,b;
EA=0;
ds_reset();
delay
(1);
temp_write(0xcc);
temp_write(0xbe);
a=temp_read();
b=temp_read();
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
f_temp=f_temp+0.05;
returntemp;
}
/****************************定时器初始化*****************/
voidinit_com(void)
{
TMOD=0X01;
PCON=0X00;
SCON=0X50;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
}
/****************报警**************************************/
voidwarn(uints,ucharled)
{
uchari;
i=s;
beep=0;
P1=~(led);
while(i--)
{
dis_temp(get_temp());
}
beep=1;
P1=0xff;
i=s;
while(i--)
{
dis_temp(get_temp());
}
}
voiddeal(intt)
{
uchari;
if((t>warn_l2)&&(t<=warn_l1))
{
warn(10,0x01);
}
elseif(t<=warn_l2)
{
warn(1,0x02);
}
elseif((t<=warn_h2)&&(t>=warn_h1))
{
warn(10,0x04);
}
elseif(t>=warn_h2)
{
warn(1,0x08);
}
else
{
i=40;
while(i--)
{
dis_temp(get_temp());
}
}
}
/********************报警监测显示********************/
voidbjxs(inta)
{intx,y,z;
x=a/100;//计算得到shi位数字
display(5,x);
y=a/10-x*10;//计算得到ge位数字
display(6,y+10);
z=a-x*100-y*10;//计算得到xiao数
display(7,z);
}
/*******************************键盘扫描*********************/
voidkey()
{
if(SET1==0)
{
delay(100);
if(SET1==0)
{
while(SET1==0)
{
bjxs(warn_h1);
if(ADD==0&&SET1==0)
{
if(ADD==0&&SET1==0)
{
while(ADD==0)
bjxs(warn_h1);
warn_h1=warn_h1+10;
if(warn_h1>1000)
warn_h1=1000;
bjxs(warn_h1);
}
}
elseif(DEC==0&&SET1==0)
{
if(DEC==0&&SET1==0)
{
while(DEC==0)
bjxs(warn_h1);
warn_h1=warn_h1-10;
if(warn_l1>warn_h1)
warn_h1=warn_l1;
bjxs(warn_h1);
}
}
}
}
}
if(SET2==0)
{
delay(100);
if(SET2==0)
{while(SET2==0)
{
bjxs(warn_l1);
if(ADD==0&&SET2==0)
{
if(ADD==0&&SET2==0)
{
while(ADD==0)
bjxs(warn_l1);
warn_l1=warn_l1+10;
if(warn_l1>warn_h1)
warn_l1=warn_h1;
bjxs(warn_l1);
}
}
elseif(DEC==0&&SET2==0)
{
if(DEC==0&&SET2==0)
{
while(DEC==0)
bjxs(warn_l1);
warn_l1=warn_l1-10;
if(warn_l1<0)
warn_l1=0;
bjxs(warn_l1);
}
}
}
}
}
}
voidscan()
{
inti;
temp_change();
deal(temp);
for(i=0;i<10;i++)
{
dis_temp(get_temp());
}
EA=1;
}
voidtimer0(void)interrupt1
{
key();
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
}
voidmain()
{
dula=0;
wela=0;
init_com();
while
(1)
{
scan();
}
}
五、调试情况及小结
5.1硬件调试
硬件调试是一件重要而细微的工作,许多硬件错误往往是在软件调试时被发现的。
通常,先排除明显的硬件故障,之后,再和测试软件结合起来调试。
硬件调试可分为静态调试和动态调试两步。
静态调试是在用户系统未工作时的一种硬件检测。
检测步骤如下:
①目测:
检查外部的各种元件或者是电路是否有断点,及焊点是否牢固,是否存在虚焊等现象;
②用万用表测试:
先用万用表复核目测中有疑问的焊接点及可能在焊接过程中烧坏的元件,再检测各种电源线与地线之间是否有短路现象;
③加电检测:
给板加电,检测所有插座或器件的电源是否符合要求;
④联机检测:
要完成对用户系统的调试,需在单片机开发系统环境下进行。
动态调试是在用户系统工作的情况下发现和排查错误的一种硬件检测。
动态调试的一般方法是由近及远、由分到合。
由分到合是指首先按逻辑功能将用户系统硬件电路分为若干块,当调试电路时,与该元件无关的器件全部从用户系统中去掉,这样可以将故障范围限定在某个局部的电路上。
当各块电路无故障后,将各电路逐块加入系统中,在对各块电路功能及各电路间可能存在的相互联系进行调试。
由分到合的调试既告完成。
由近及远是将信号流经的各器件按照距离单片机的逻辑距离进行由近及远的分层,然后分层调试。
调试时,仍采用去掉无关元件的方法,逐层调试下去,就会定位故障元件了。
5.2软件调试
软件调试是通过对程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。
5、3调试结果
可以显示流水灯,当key1键按下后可以调节电子钟的分时间,数码管显示动态的数字0~9,当key2键按下后,当key3键按下后可以显示蜂鸣器工作,当key4键按下后可以显示交通灯控制。
六、心得体会
两个星期的实践和体验对我来说学到的不仅是那些知识,更多的是团队与合作。
这项看起来不需要多少技术的工作却是非常需要耐心和精力在两个星期后的今天我已明白课程设计对我来说的意义,它不仅仅是让我们把所学的理论知识与实践相结合起来,提高自己的实际动手能力和独立思考的能力,更重要的是同学间的团结,虽然我们这次花去的时间比别人多,但我相信我们得到的也会更多!
设计过程,难免会遇到各种各样的问题。
在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
我们通过查阅大量有关资料,并在小组中互相讨论,交流经验和自学,若遇到实在搞不明白的问题就会及时请教老师,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。
通过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。
这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。
通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。
虽然自己对于这门课懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是靠着这一个多礼拜的“学习”,在小组同学的帮助和讲解下,渐渐对这门课逐渐产生了些许的兴趣,自己开始主动学习并逐步从基础慢慢开始弄懂它。
通过本次设计,我学会了很多很多。
七、参考文献
1.《测控系统原理与设计》孙传友孙晓斌北京航空航天大学出版社,2007
2.《单片机原理及应用》李全力高等教育出版社,2001
3.《数字电子技术》杨志忠高等教育出版社,2003
4.《电子线路CAD》王延才机械工业出版社,2001
5.《单片机应用技术》吴国经中国电力出版社,2004
6.《单片机及接口技术实践教程》胡健北京机械工业出版社,2002