资源描述
室内温度设计系统课设论文
———————————————————————————————— 作者:
———————————————————————————————— 日期:
3
个人收集整理 勿做商业用途
目 录
0 前言 1
1 总体方案设计 1
1。1设计方案论证 1
1.2 硬件构成 2
2 硬件电路设计 5
2.1 主控制器 5
2。2 显示电路 6
2.3 数据采集电路 6
3 软件设计 7
3。1 主程序设计 7
3。2 温度转换程序 7
3.3 温度显示程序 8
4 调试分析 9
5 结论及进一步设想 10
参考文献 10
课设体会 11
附录1 电路原理图 12
附录2 元件清单 13
附录3 程序源 14
室内温度检测系统设计
刘野 沈阳航空航天大学自动化学院
摘要:本文设计了一种基于单片机控制的室内温度检测系统,具有读数方便,测温范围广,输出温度采用数字显示。该设计控制器使用单片机AT89S51,测温传感器使用DS18B20,用共阴极LED数码管显示,能够准确达到要求.
温度计电路设计控制器采用单片机AT89S51,具有低电压供电和体积小等特点,温度传感器采用DS18B20,DS18B20温度传感器是美国最新推出的一种温度传感器,它能直接读出被测温度,采用单总线协议,即与微机接口仅需占用一个端口,DS18B20的信息仅需一根总线读写,提高了系统的干扰性并且可根据实际要求通过简单的编程实现读数方式,显示电路采用LED动态显示方式。
关键词:单片机 ;DS18B20 ;LED显示;
0 前言
在信息高速发展的今天,科学技术日新月异,科技的进步带来了测量技术的发展,现代控制设备发生了翻天覆地的变化。随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中室内温度检测就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
温度是一个永恒的话题和人们生活环境有着密切关系的物理量,是国际单位制的七个基本单位之一,作为各种信息的感知、采集、转换的功能器件温度传感器的作用日显突出,温度的检测与控制是日常生活中比较典型的应用。如在日常生活中测量并记录室内的温度,可以了解室内温度变化情况
1 总体方案设计
1.1设计方案论证
针对本课题的设计任务,进行分析得到:本次设计用温度传感器进行温度的测量,转化了的温度信号由传感器直接得到了数字信号.该数字温度计的设计,在总体上大致可分为以下几个部分组成:1。单片机控制电路;2.温度传感器;3。 LED显示电路。
方案一
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
方案二
进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。
系统原理框图如图1所示。
单片机
LED数码管显示
DS18B20温传感器数据采集
图1 系统原理框图
1.2 硬件构成
1.21 主控制器
AT89C51作为温度测试系统设计的核心器件,该器件是INTEL公司生产的系列单片机的基础产品,采用了可靠的COMS工艺制造技术,具有高性能的8位单片机,不仅结合了HMOS的高速和高密度技术及低功耗特征,而且继承和扩展了MCS—48单片机的体系结构和指令系统.
AT89C51具有以下标准功能:
8K字节FLASH,256字节RAM,32位I/O总线,看门狗定时器2个数据指针,3个16位定时器、计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
P0口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0也被作为低8位地址/数据使用.在这种模式下,P0具有内部上拉电阻。在FLASH编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节.程序校验时,需要外部上拉电阻。
P1口:P1口是一个具有内部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入口使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。
P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2口输出缓冲器驱动4个TTL逻辑电平。对P2端口写1时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入口使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。
1.22 LED数码管
LED数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。LED数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数位,因此根据LED数码管的驱动方式的不同,可以分为静态式和动态式两类。
1。23 温度传感器
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。DS18B20的性能特点如下:
a.独特的单线接口仅需要一个端口引脚进行通信;
b.多个DS18B20可以并联在惟一的三线上,实现多点组网功能;
c.无须外部器件;
d.可通过数据线供电,电压范围为3.0~5。5V;
e.零待机功耗;
f.温度以9或12位数字;
g.用户可定义报警设置;
h.报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
i.负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;
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
图2 DS18B20字节定义
DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长.因此,在实际应用中要将分辨率和转换时间权衡考虑。
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1.第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性.
当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制温度数据.
DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索.
在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确.
DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。
2 硬件电路设计
2.1 主控制器
单片机AT89S51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
AT89C51是一种低功耗,高性能的8位微控制器,具有8K在系统可编程FLASH存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上FLASH允许程序存储器在系统可编程,亦适于常规编程器.在单芯片上,拥有灵巧的8位CPU和在系统可编程FLASH,使得AT89S52为众多嵌入式控制应用系统提供高灵活,超有效的解决方案。
图3 主控制器电路
2。2 显示电路
显示电路采用集成的数码管,为共阴极结构,采用动态显示,P0口作为输出编码端,P2。0和P2。1作为位选控制端,通过设置不同的段码可以显示温度,可以对温度进行实时检测。
图4 显示电路
2。3 数据采集电路
DS18B20的内部结构主要包括:寄生电源,温度传感器,64位激光ROM和单总线接口,存放中间数据的高速暂存器RAM,用于存储用户设定温度上下限值得TH和TL触发器,存储和逻辑控制,8位循环冗余码发生器等七部分。
DS18B20测量温度时使用特有的温度测量技术,将被测温度转换成数值信号,测量结果将存入温度寄存器中.
图5 数据采集电路
3 软件设计
3.1 主程序设计
系统的主程序主要用来初始化一些参数,对DS18B20的配置数据进行一系列的设定.另外对DS18B20的状态不断的查询,以读取当前的温度值,并对温度进行处理,温度值的BCD码处理后,将其段码送显示缓冲区,以备定时扫描服务程序处理.
调用显示子程序
DS18B20
读取温度
初始化
转换温度
温度显示
检测返回
图6 主程序流程图
3。2 温度转换程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如下所示。
发DS18B20复位命令
发跳过ROM命令
发温度转换开始命令
结束
图7 温度转换流程图
3.3 温度显示程序
此程序是将采集到得数据用LED数码管显示,然后将实际温度与设置的报警上下限进行比较,决定是否发出报警信号。由于T为实际温度的绝对值,TH,TL也是温度的绝对值,因此判断大小关系时,要通过正负号来确定.
开始
数据采集
接收数据
温度转换
LED显示
图8 温度显示流程图
4 调试分析
4。1 软件调试
本次设计采用的是keil仿真器进行软件调试,此系统可以开发应用软件,以及对硬件电路进行诊断、调试等。它的具体功能是可以进行CPU仿真,可以单步、跟踪、断点和全速运行,而且,程序的编译过程中,可以对设计软件进行自诊断,并自动给出故障原因。同时用户调试程序时,可以通过窗口观察寄存器的工作状况,以便及时发现和排除编程中可能出现的错误。
软件的调试是利用keil软件,模块化调试,通过观察存储单元数据的变化,查找并解决程序的语法和逻辑错误,具体的调试步骤如下:
1。 把系统的各个模块在仿真软件中逐个调试,如数据采集模块、显示模块等。
2. 对各个需要赋值模块调试时,赋入初值,单步调试,观察数据窗口,看输出结果是否为设计时想要的结果。
3。 把各个模块组合起来,全速运行,看程序是否能流畅的,是否能实现设计的系统的所有功能。
4.2 软硬联调
本设计是采用Proteus软件实现电路图设计和仿真的,Proteus软件与Keil软件联合使用,实现设计要求。
在Keil软件中创建新文件,输入所编写的c语言程序并保存,在编译源程序无误后,会产出相应的".HEX"文件;将所生成的"。HEX”文件加载到已绘制好的Proteus原理图中,使Proteus与Keil真正连接起来,实现联合调试.调试结果下11所示。
图9 仿真测试图
5 结论及进一步设想
根据实验结果,本设计基本完成了设计要求。本课程设计的主要任务是设计一个89C51单片机为室内温度检测系统。从确定课设题目,到查阅质料确定总体方案设计,硬件电路仿真的设计,硬件电路的优化,软件的设计,软件的优化,检验仿真电路,调试软件程序,到最后的软硬件联调,都是我努力去完成的。在最后的仿真电路图中达到了我想要的结果,并且对DS18B20有了更一步的认识,对单片机也有了更加深刻的了解,对以后很好的应用单片机打下了深刻的基础。
参考文献
[1] 刘复华。单片机及其应用系统。北京:清华大学出版社,1992
[2] 韩志军。单片机系统设计与应用实例。北京:机械工业出版社,2010
[3] 余永全。ATMEL89系列单片机应用技术。北京:北京航空航天大学出版社,2002
[4] 马中梅。单片机的C语言程序设计.北京:北京航空航天大学出版社,1999
[5] 胡汗才。单片机原理及系统设计。北京:清华大学出版社,2002
[6] 李华。MCS-51单片机实用接口技术。北京:北京航空航天出版社大学,1999
[7] 方彦军,孙建。智能仪器技术及其应用。北京:化学工业出版社,2003
[8] 孙传友。测控系统原理与设计。北京:北京航空航天大学出版社,2002
[9] 刘守义等.单片机应用技术.西安:西安电子科技大学出版社,2002
[10] 何立民.单片机高级教程.北京:北京航空航天大学出版社,2000
课设体会
经过了两个星期的课设,让我对以前学的理论知识有了较深的体会,要用理论指导实践,在实践中发现自己的不足之处,不断完善自己。这一周的课程设计让我体会到很多东西,不仅仅是知识本身的,更多的是自己动手能力和逻辑思维能力的锻炼,同时,也知道自己还有许多要学的东西。
在社会实践中,单片机是一个热门的话题,所以我要认真学习单片机的知识,这对我们找工作是很有帮组的,遇到问题并不可怕关键是我们要找到方法去解决问题,一定要勤于动手,这样自己才会有提高。当然在这次宝贵的课程设计活动中,经验才是对于我们最大的收获,而且还增强了自身对未知问题以及对知识的深化认识的能力,用受益匪浅这个词语来概括这次难忘的活动我觉得再合适不过了。但是,光是完成了作品还是不可以自我满足的,在从一开始的时候就怀着将作品制作得更加人性化,更加令人满意,更加地使功能完美又方便地被应用领域这个最终目的下,随着对单片机这门学科的认识加深,到达了拓展的程度,我想这个目的将在不远的时期内被实现。
最后感谢老师及同学在这两个星期对我的帮助。
、
附录1 电路原理图
附录2 元件清单
元件名称
型号
数量
单片机
AT89C51
1
温度传感器
DS18B20
1
数码管
7SEG—MPX1-CC
2
译码器
74HC138
1
锁存器
74HC573
1
排阻
RESPACK
1
晶振
Crystal
1
电容
C(22PF)
2
附录3 程序源
#include〈REG52.H>
#include〈math。h〉
#include<INTRINS.H〉
#define uchar unsigned char
#define uint unsigned int;
/***********************************************************************/
sbit seg1=P2^0;
sbit seg2=P2^1;
sbit seg3=P2^2;
sbit DQ=P1^7;//ds18b20 端口
sfr dataled=0x80;//显示数据端口
/**********************************************************************/
uchar temp;
uchar flag_get,count,num,minute,second;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数码管段码表共阳
uchar str[3];
/***********************************************************************/
void delay1(uchar MS);
unsigned char ReadTemperature(void);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delay(unsigned int i);
/***********************************************************************/
main()
{
TMOD|=0x01;//定时器设置
TH0=0xef;
TL0=0xf0;
IE=0x82;
TR0=1;
P2=0x00;
count=0;
while(1)
{
str[2]=0x39;//显示C符号
str[0]=tab[temp/10]; //十位温度
str[1]=tab[temp%10]; //个位温度
if(flag_get==1) //定时读取当前温度
{
temp=ReadTemperature();
flag_get=0;
}
}
}
void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔
{
TH0=0xef;//定时器重装值
TL0=0xf0;
num++;
if (num==50)
{num=0;
flag_get=1;//标志位有效
second++;
if(second〉=60)
{second=0;
minute++;
}
}
count++;
if(count==1)
{P2=0;
dataled=str[0];}//数码管扫描
if(count==2)
{P2=1;
dataled=str[1];}
if(count==3)
{ P2=2;
dataled=str[2];
count=0;}
}
/***********************************************************************/
void delay(unsigned int i)//延时函数
{
while(i—-);
}
/**********************************************************************/
//18b20初始化函数
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(10);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(5);
}
//读一个字节
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i—-)
{
DQ = 0; // 给脉冲信号
dat〉〉=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}
//写一个字节
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
delay(5);
}
//读取温度
unsigned char ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
//float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
b〈〈=4;
b+=(a&0xf0)〉〉4;
t=b;
//tt=t*0.0625;
//t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
2012年1月 11日完成
第19页
展开阅读全文