单片机课程设计温度测量系统教材Word文档格式.docx
《单片机课程设计温度测量系统教材Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机课程设计温度测量系统教材Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
摘要1
2.总体设计框图4
附源代码:
12
一·
引言
在传统的模拟信号远距离温度测量系统中,需要很好的解决引线误差补偿问题、多点测量切换误差问题和放大电路零点漂移误差问题等技术问题,才能够达到较高的测量精度。
另外一般监控现场的电磁环境都非常恶劣,各种干扰信号较强,模拟温度信号容易受到干扰而产生测量误差,影响测量精度。
因此,在温度测量系统中,采用抗干扰能力强的新型数字温度传感器是解决这些问题的最有效方案,新型数字温度传感器DS18B20具有体积更小、精度更高、适用电压更宽、采用一线总线、可组网等优点,在实际应用中取得了良好的测温效果。
美国Dallas半导体公司的数字化温度传感器DS1820是世界上第一片支持"
一线总线"
接口的温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。
全部传感元件及转换电路集成在形如一只三极管的集成电路内。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
现在,新一代的DS18B20体积更小、更经济、更灵活。
使你可以充分发挥“一线总线”的优点。
二.总体方案设计
本设计是一款简单实用的小型数字温度计,所采用的主要元件有传感器DS18B20,单片机AT89C52,,四位共阴极数码管一个,电容电阻若干。
DS18B20支持“一线总线”接口,测量温度范围-55°
C~+125°
C。
在-10~+85°
C范围内,精度为±
0.5°
18B20的精度较差为±
2°
C。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:
环境控制、设备或过程控制、测温类消费电子产品等。
本次数字温度计的设计共分为五部分,主控制器,LED显示部分,传感器部分,复位部分,时钟电路。
主控制器即单片机部分,用于存储程序和控制电路;
LED显示部分是指四位共阳极数码管,用来显示温度;
传感器部分,即温度传感器,用来采集温度,进行温度转换;
复位部分,即复位电路。
测量的总过程是,传感器采集到外部环境的温度,并进行转换后传到单片机,经过单片机处理判断后将温度传递到数码管显示。
本设计能完成的温度测量范围是-55°
C~+128°
1.方案论证
方案一:
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
方案设计框图如下:
方案二:
考虑到在单片机属于数字系统,容易想到数字温度传感器,可选用DS18B20数字温度传感器,此传感器为单总线数字温度传感器,起体积小、构成的系统结构简单,它可直接将温度转化成串行数字信号给单片机处理,即可实现温度显示。
另外DS18B20具有3引脚的小体积封装,测温范围为-55~+125摄氏度,测温分辨率可达0.0625摄氏度,其测量范围与精度都能符合设计要求。
以上两种方案相比较,第二种方案的电路、软件设计更简单,此方案设计的系统在功耗、测量精度、范围等方面都能很好地达到要求,故本设计采用方案二。
2.总体设计框
显示电路
驱动电路
测温电路
时钟复位电路
单
片
机
图
三.硬件设计
1.时钟电路
电路中晶振和电容构成了一个稳定的自激振荡器,微调电容通常选择为30pF左右,该电容的大小会影响到振荡器频率的高低、振荡器的稳定性和起振的快速性。
晶体的振荡频率为12MHz。
2.复位电路
单片机系统的复位电路在这里采用的是上电+按钮复位电路形式,其中电阻R采用10KΩ的阻值,电容采用电容值为10μf的电解电容。
电路图如下:
3.温度传感器电路
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
4.显示电路
显示电路采用4位共阴极LED数码管,P0口由上拉电阻提高驱动能力,作为段码输出,并作为数码管的驱动。
P2口的低四位作为数码管的位选端。
采用动态扫描的方式显示。
5.系统总电路图如下:
四.系统软件设计
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,报警子程序和显示数据刷新子程序等。
1.主程序
主程序的主要功能是负责温度的实时显示,读出并处理DS18B20的测量温度值。
温度测量每1s进行一次。
2.读出温度子程序
读出温度子程的主要功能是读出RAM中的9字节。
在读出时须进行CRC校验,校验有错时不能进行温度数据的改写。
3.温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令。
当采用12位分辨率时,转换时间约为750ms。
在本程序设计中,采用1s显示程序延时法等待转换的完成。
4.计算温度子程序
计算温度子程序将RAM中读取的值进行BCD码的抓换运算,并进行温度值正负的判断。
5.显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高数据显示位为0时,将符号显示位移入下一位。
6.主程序流程图
五.实验仿真
进入proteus后,连接好电路,并将程序下载进去。
将DS18B20的调节键跳到指定的温度,则,数码管显示的温度与传感器的温度相同。
六.总结与体会
本设计是以AT89C52为核心,利用软硬件相结合的典型例子。
在单片机自动控制已经广泛的应用于人们的生产和生活的今天,传统用模拟电路来控制温度的做法,已经逐渐被淘汰。
这个系统的实现,改变了传统的温度控制方法,为温度的控制开辟了一条新的道路。
根据我国的科技和工业水平,这个系统的设计是符合工业生产的需要。
实现我国的工业化,自动控制是其中的一个重要目标,自动控制系统正广泛的应用于工业生产和人们的日常生活。
本系统的设计成功知识实现自动控制的“冰山一角”,但它为以后更加智能化、人性化的自动控制系统的设计,作了铺垫。
因此这种系统的设计具有比较好的社会效益。
经过三周多的的方案论证、系统的硬件和软件的设计、系统的调试,系统的仿真。
查阅了大量的关于传感器、单片机及其接口电路、以及电路方面的理论。
经过了一番特殊的体验后,经历了失败的痛苦,也尝到了成功的喜悦。
第一次靠用所学的专业知识来解决问题。
检查了自己的知识水平,使我对自己有一个全新的认识。
通过这次课程设计,不仅锻炼自己分析问题、处理问题的能力,还提高了自己的动手能力。
这些培养和锻炼对于我们这些即将走向工作岗位的大学生来说,是很重要的。
这次课程设计基本的完成了任务书的要求,实现了温度的测量。
通过测试表明系统的设计是正确的,可行的。
但是由于设计者的设计经验和知识水平有限,系统还存在许多不足和缺陷。
参考文献
[1]于永.51单片机C语言常用模块与综合系统设计实例精讲[M].北京:
电子工业出版社,2008
[2] 戴永成等.基于DS18B20的数字温度测量仪[J].北华航天工业学院学报,2008
[3] 廖常初.现场总线概述[J].电工技术,1999
[4] 张越等.基于DS18B20温度传感器的数字温度计[J].微电子学,2007
[5] 李朝青.单片机原理及接口技术(简明修订版).杭州:
北京航空航天大学出版社,1998
[6] 黄河.基于DS18B20的单总线数字温度计[J].湘潭师范学院学报,2008
[7] 李广弟.单片机基础[M].北京:
北京航空航天大学出版社,1994
[8]王建强等.基于DSP控制器与DS18B20的温度测量方法[J].仪器仪表与检测技术,2009
附:
源程序代码
#include<
reg51.h>
intrins.h>
//_nop_();
延时函数用
#defineDisdataP0//段码输出口
#definediscanP2//扫描口
#defineucharunsignedchar
#defineuintunsignedint
uinth;
uinttemp;
sbitDQ=P3^7;
//共阴数码管
ucharditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,
0x06,0x06,0x07,0x08,0x08,0x09,0x09};
ucharxianshi1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//不带小数点的0-9编码
ucharscan_con[4]={0xf7,0xfB,0xfD,0xfe};
//列扫描控制字
uchartemp_data[2]={0x00,0x00};
//读出温度暂放
uchardisplay[5]={0x00,0x00,0x00,0x00,0x00};
//显示单元数据,共4个数据和一个运算暂用
voiddelay(uintt)
{
for(;
t>
0;
t--);
}
voidscan(void)
chark;
for(k=0;
k<
4;
k++)//4位LED扫描控制
{
Disdata=xianshi1[display[k]];
//数据显示
if(k==1)
Disdata=xianshi1[display[k]]|0x80;
//小数点显示
discan=scan_con[k];
//位选
delay(90);
discan=0xff;
/****************DS18B20复位函数************************/
voidow_reset(void)
charpresence=1;
while(presence)
while(presence)
{
DQ=1;
_nop_();
//从高拉倒低
DQ=0;
delay(50);
//550us
delay(6);
//66us
presence=DQ;
//presence=0复位成功,继续下一步
}
delay(45);
//延时500us
presence=~DQ;
//拉高电平
/*向DS18B20写入一个字节*/
voidwrite_byte(ucharval)
uchari;
for(i=8;
i>
i--)
//从高拉倒低
//5us
DQ=val&
0x01;
//最低位移出
val=val/2;
//右移1位
}
delay
(1);
/*从DS18B20读出一个字节*/
ucharread_byte(void)
uchari;
ucharvalue=0;
for(i=8;
value>
>
=1;
//4us
if(DQ)value|=0x80;
return(value);
uintread_temp(void)
ow_reset();
//总线复位
delay(200);
write_byte(0xcc);
//发命令
write_byte(0x44);
//发转换命令
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;
//返回温度值
voidwork_temp(uinttem)
ucharn=0;
if(tem>
6348)//温度值正负判断
{tem=65536-tem;
n=1;
}//负温度求补码,标志位置1
display[4]=tem&
0x0f;
//取小数部分的值
display[0]=ditab[display[4]];
//存入小数部分显示值
display[4]=tem>
//取中间八位,即整数部分的值
display[3]=display[4]/100;
//取百位数据暂存
display[1]=display[4]%100;
//取后两位数据暂存
display[2]=display[1]/10;
//取十位数据暂存
display[1]=display[1]%10;
if(!
display[3])
display[3]=0x00;
//最高位为0时不显示
display[2])
display[2]=0x3f;
//次高位为0时不显示
if(n=1){display[3]=0x40;
}//负温度时最高位显示"
-"
voidmain(void)
Disdata=0x00;
//初始化端口
discan=0x00;
for(h=0;
h<
h++)//开机显示"
0000"
{display[h]=0;
}
//开机先转换一次
//SkipROM
100;
{scan();
while
(1)
work_temp(read_temp());
//处理温度数据
scan();
//显示温度值