数字温度显示设计Word格式文档下载.docx
《数字温度显示设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数字温度显示设计Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
3.2显示部分12
第4章程序设计14
第5章数据测试15
5.1Proteus仿真软件介绍15
5.2仿真结果15
5.2.1用Keil进行程序编译15
5.2.2在中仿真15
5.3实物演示17
总 结18
参考文献19
附 录20
引 言
温度是工业控制中主要的被控参数之一,特别是在冶金、化工、建材、食品、机械、石油等工业中,具有举足轻重的作用。
对于不同场所、不同工艺、所需温度高低范围不同、精度不同、则采用的测温元件、测温方法以及对温度的控制方法也将不同;
产品工艺不同、控制温度的精度不同、时效不同,则对数据采集的精度和采用的控制算法也不同,因而,对温度的测控方法多种多样。
随着电子技术和微型计算机的迅速发展,微机测量和控制技术也得到了迅速的发展和广泛的应用。
利用微机对温度进行测控的技术也随之而生,并得到日益发展和完善,越来越显示出其优越性。
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人们带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计即用单片机对温度进行实时检测与控制,本文所介绍的数字温度计与传统的温度计相比,读数更方便范围更广,测温也更准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机AT89S52,数字温度传感器DS18B20,用LED数码管实现温度显示,能准确达到设计要求。
第1章设计要求
1.1选择合适的温度传感器芯片和单片机芯片。
1.2设计单片机和温度传感器的接口电路
1.3控制温度传感器实现温度信息采集及数据传输软件设计。
1.4通过数码管显示。
1.5供电直流稳压电源的各项技术指标:
①
输入电压:
50Hz②
输出电压:
5V③
输出电流:
≥1A④
电压调整率:
≤7mV(测试条件I=500mA)
⑤
电流调整率:
≤25mV(测试条件10mA≤I≤1.5A)
1.6数字温度显示器的基本技术指标:
①
测量范围:
-40~125℃。
②
数码管显示温度。
第2章设计方案
2.1总体设计框图
DS18B20的最大转换精度为0.0625摄氏度且测试范围为-55摄氏度到128摄氏度,所以能够满足设计要求,并且DS18B20与单片机的通信方式为单总线方式,从而使得它与单片机的接口电路变得很简单。
单片机从传感器读取数据后将进行处理,然后将温度通过数码管显示出来。
如果温度超过报警限值就驱动蜂鸣器报警。
2.2单片机简介
AT89S52单片机是一个低功耗,高性能CMOS8位单片机,片内含8kBytesISP(In—systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,片上Flash允许程序存储器在系统可编程,亦适于常规编程器,在功能强大的微型计算机的AT89S52单芯片上,扔有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89S52引脚结构图如
图2.2所示。
图2.2 单片机AT89S52结构图
2.3数字温度传感器DS18B20简介
●适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下可由数据线供电
●独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
●DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
●DS18B20在使用中不需要任何外围元件,全部传感元件及转换 电路集成在形如一只三极管的集成电路内
●温范围-55℃~+125℃,在-10~+85℃时精度为±
0.5℃
●可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
●在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快
●测量结果直接输出数字温度信号,以"
一线总线"
串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
●负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
2.3.2DS18B20外形和内部结构
DS18B20它有64位ROM的结构,开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。
温度报警触发器TH和TL,可通过软件写入报警上下限。
另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作按协议进行。
操作协议为:
初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令处理数据。
其外形及管脚排列如图2.3所示:
图2.3DS18B20封装图
DS18B20引脚定义:
(1)DQ为数字信号输入/输出端;
(2)GND为电源地;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
其结构框图如图2.4所示
图2.4DS18B20内部结构图
2.3.3DS18B20工作原理
DS18B20的读写时序和测温原理与DS18B20相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。
DS18B20测温原理如图2.5所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
图2.5DS18B20测温原理图
2.4数码管简介
数码管是一种半导体发光器件,其基本单元是发光二极管。
2.4.1数码管的分类
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示)。
按能显示多少个“8”可分为1位、2位、4位等等数码管;
按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平,相应字段就点亮;
当某一字段的阴极为高电平时,相应字段就不亮。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮;
当某一字段的阳极为低电平时,相应的字段就不亮。
2.4.2数码管驱动方式
数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
●静态显示驱动
静态驱动也称直流驱动。
静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。
静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×
8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:
),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
●动态显示驱动
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划“a,b,c,d,e,f,g,dp”的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
第3章硬件设计
3.1测温部分
3.1.1测温原理图
数字温度传感器DS18B20采集温度并处理,然后通过单片机AT89S52的P2口传入单片机中进行处理,然后再通过P1口传入LED数码管中显示。
其测温原理图如图3.1所示。
图3.1测温系统整体原理图
3.1.2单片机最小系统
●电源电路
电源电路是由1个插座,2个104pf滤波电容,1个阻值为1K的限流电阻,1个LED组成。
如图3.2所示,其中2个电容主要是起到滤波稳压的作用,LED指示灯作为电源指示灯。
图3.2电源原理图
●复位电路
RC电路,上电时对电容充电,电阻上的电压经过一段时间才降,可以保持一段高电位时间,然后就可以复位单片机。
如图3.3所示
图3.3复位电路
●外部晶振电路
CPU工作要有严格的步调,没时钟没法工作的,外部晶振电路(如图3.4)为单片机提供时钟信号。
图3.4外部晶振电路
3.1.3温度传感器系统
DS18B20采用单总线数据传输,外接1个10K的上拉电阻与单片机P2口相连,进行双向数据传输。
如图3.5所示。
图3.5DS18B20数字温度传感器系统
3.1.4报警系统
报警电路中加1个PNP三极管驱动,基极接单片机P3.0口,当端口变成低电平时,三极管会导通,使蜂鸣器发声、报警如图3.6所示。
图3.6报警系统
3.2显示部分
图3.7数码管显示部分原理图
如图3.7数码管显示部分是由3位7段共阴数码管、一个74HC573锁存器、两个插座和8个1K的限流电阻组成.由于单片机的输出电流一般不能直接驱动数码管,所以用了一片74HC573来驱动数码管显示,它的输入端直接与单片P1口相连,输出分别接到数码管的各个段。
而数码管的位选通过插座与单片机的P2.5-P2.7相连,当单片的某一位端口输出低电平时就选中了该位,循环输出低电平就实现了扫描显示。
第4章程序设计
主程序的主要功能是读出并处理DS18B20的测量的当前温度值,温度的实时显示,并根据设置上下限判断是否报警。
系统开始运行时,温度传感器测量并计算温度值传输进单片机里进行处理,经过处理后的数据再通过P1口传输到数码管进行显示。
当超过报警界限时单片机将相应的数据通过P3.0口传输进行报警。
其程度流程图如图4.1所示。
图4.1主程序流程图
第5章数据测试
5.1Proteus仿真软件介绍
Proteus可仿真各种电路和IC,并支持单片机,元件库齐全,使用方便,是不可多得的专业的单片机软件仿真系统。
5.2仿真结果
5.2.1用Keil进行程序编译
运用Keil软件编译C语言程序在结果栏显示“CX”—0Error(s),0warning(s).说明程序在软件编译上无语法等错误。
将些程序生成*.hex文件调入硬件中用Proteus进行调试仿真。
5.2.2在中仿真
图5.1Proteus仿真初始界面
程序初始后,当DS18B20上电复位后,温度寄存器的默认值为85摄氏度,说明单片与DS18B20接口是正确的。
如图5.1所示。
图5.2程序正常运行结果
温度超过设定值后,继续采集温度到合适的值才会停止报警,,其结果如图5.2所示。
5.3实物演示
测试现象:
当用手或其它温度高于室温的物体接触DS18B20一定时间后温度会上升,松手后过一段时间温度又会回到之前测试的温度值。
同样用低于室温的物体接触DS18B20也能观察到正确的测试现象。
因数码管只设计了三位,因此能显示的温度变化只能以1度为间隔,但实际测得的温度精度应高于0.1摄氏度。
总 结
在本次专题设计过程中,无论是驱动程序设计,还是实物制作过程都遇到了很多困难,但经过老师的细心指导以及同学之间相互合作,最终将实物调试成功,完成了这次设计。
通过这次的专题设计,我们对大学三年所学习的相关电子知识又有了更深一层的学习和理解,对所学知识又有了更深层次的掌握。
也让我们明白做一个设计首先应该有明确的整体设计思想,然后再通过分析选择合适的单元电路,计算,设定电路的相关参数值,从小模块设计起,再到整个模块。
而且这次是用单片机C语言来写程序,和我们以前用的汇编有所不同。
不过通过不断学习,不断的编写,调试程序,对单片机C语言也有了一定的掌握。
总之,这次专题设计不仅锻炼了我们的动手能力和综合分析能力,也锻炼了我们团队协作能力。
另外,这次所学到知识为我们以后做毕业设计以及写毕业论文奠定的基础。
至谢
在这次专题设计过程中,我们小组遇到许多大大小小的问题和困难。
但经过指导老师的细心指导和同学之间的相互帮助与配合,最终完成了这次专题设计。
所以在此真诚感谢指导老师和小组的各个成员。
参考文献
[1] 谭浩强.C语言程序设计.第三版,清华大学出版社,2005;
[2] 华成英.模拟电子技术基本教程.清华大学出版社,2006;
[3] 阎石.数字电子技术基础.第五版.高等教育出版社,2006;
[4] 张毅刚、彭喜元.单片机原理及接口技术.人民邮电出版社,2008;
[5] 何希才.传感器及应用电路.北京工业出版社,2001;
[6] 彭虎,周佩玲,傅忠谦.微机原理与接口技术.第二版.电子工业出版,2010;
[7]靳达.单片机典型模块设计实例导航.人民邮电出版社,2003;
[8]王松武、于鑫、武思军.电子创新设计与实践.国防工业出版社,2005;
[9]王树勋.MCS-51单片微型计算机原理与开发.机械工业出版社,1995;
[10] 刘迎春、叶汀滨.传感器原理设计与应用.第三版.国防科技大学出版社,1997
附 录
/*********************************************************************************************
程序功能:
用数字温度传感器DS18B20进行环境温度检测并显示到数码管上且具有报警功能当温度超出
温度上下限时将使蜂鸣器响应
*********************************************************************************************/
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineHIGH_LIMIT56//温度上限
#defineLOW_LIMIT10//温度下限负数的绝对值表示负10度
sbitdq=P2^2;
sbitwei1=P2^5;
sbitwei2=P2^6;
sbitwei3=P2^7;
sbitdula=P2^0;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x27,
0x7f,0x6f};
ucharcodetable_1[]={0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0xa7,
0xff,0xef,0xf7,0xfc,
0xb9,0xce,0xf9,0xf1};
uchartable_d[6]={0};
bitflag;
//正负值标志位
voidreset();
voidwrite_bit(bita);
bitread_bit();
voidwrite(uchartemp);
ucharread();
voiddisplay(ucharaa,uintbb);
voiddelay(ucharx);
voiddelayus();
//voiddelayms(intx);
voidmain()
{uchartemp0,temp1,value,i;
uinttempre_v,tempre_not;
while
(1)
{dq=1;
//总线处于空闲状态
reset();
write(0xcc);
//跳过ROM指令
write(0x44);
//温度转换指令
for(i=0;
i<
200;
i++)//延时750ms转换时间约为750ms等待时间时调入显示函数
display(value,tempre_v);
//value=0;
//数据显示后小数部分寄存器清0
//tempre_v=0;
//数据显示后整数部分寄存器清0
flag=0;
//正负数标志位清0
while(!
dq);
//叛忙
reset();
//
write(0xbe);
//读暂存器指令
temp0=read();
temp1=read();
//数据处理部分:
数据读取后如果为正数,直接将整数和小数部分提取出来分别显示
//如果是负数需处理再将整数和小数部分提取出来显示
flag=temp1&
0x80;
if(flag==1)
{tempre_not=~(((((temp1<
<
4)&
0xf0)<
4)|temp0)-1);
tempre_v=(tempre_not&
0x000f)*625;
value=(uchar)(tempre_not>
>
4);
}
else
{tempre_v=(temp0&
0x0f)*625;
value=((temp1<
0xf0)|((temp0>
0x0f);
}/*if(value>
HIGH_LIMIT||(((tempre_not>
0x00ff)>
LOW_LIMIT))//报警设置
P1_1=0;
P1_1=1;
*/
voidreset()//复位子函数
{dq=0;
delay(15);
//延时约500us(480us-960us)
dq=1;
delay
(1);
//延时约15us-60us
while(dq);
//检测存在脉冲
//从主机释放总线开始延时至少约480us
}
voidwrite_bit(bita)//向DS18B20写入一个位子函数
{uchari;
dq=0;
i++;
//delayus();
//延时1us-15us15us后DS18B20开始采样
//dq=1;
if(a)
else
delay
(2);
//延时60us写周期60us-120us
bitread_bit()//从DS18B20读一个位子函数
{bita;
delayus();
//延时1us-15us
//释放总线
a=dq;
//延时60us-120us
returna;
}
voidwrite(uchartemp)//向DS18B20写入一个字节数据子函数
{bitb;
uchari;
for(i=0;
8;
i++)
{b=temp&
0x01;
write_bit(b);
temp=temp>
1;
ucharread()//从DS18B20读一个字节数据子函数
{uchartemp1,i;
{temp1=temp1>
if(read_bit())
temp1=temp1|0x80;
//如读到的数据为1则送到temp1的高位
returntemp1;
voiddisplay(ucharaa,uintbb)//显示函数
{uchari,num;
table_d[0]=aa/100;
table_d[1]=aa%100/10;
table_d[2]=aa%10;
3;
{wei1=1;
wei2=1;
wei3=1;
P1=0x00;
dula=1;
if(i==0&
&
flag==1)
P1=0x40;
{num=table_d[i];
P1=table[num];
dula=0;
if