温度报警器传感器课程设计报告.docx
《温度报警器传感器课程设计报告.docx》由会员分享,可在线阅读,更多相关《温度报警器传感器课程设计报告.docx(27页珍藏版)》请在冰豆网上搜索。
![温度报警器传感器课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-2/25/d6c6cf64-f70b-4d23-8dca-fcabb31f536a/d6c6cf64-f70b-4d23-8dca-fcabb31f536a1.gif)
温度报警器传感器课程设计报告
摘要
随着时代的进步与发展,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术,本文主要介绍了一个基于89S51单片机的测温系统,详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,特别就是数字温度传感器DS18B20的数据采集过程。
对各部分的电路也一一进行了介绍,该系统可以方便的实现实现温度采集与显示,并可根据需要任意设定上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活与工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其她主系统的辅助扩展。
DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。
关键词:
单片机报警系统
DS18B20温度传感器数字温度计AT89S52
1、概述、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、1
1、1课程设计的意义、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、1
1、2设计的任务与要求、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、1
2、系统总体方案及硬件设计、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、2
2、1数字温度计设计方案论证、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、2
2、1、1方案一、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、2
2、1、2方案二、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、2
2、2系统总体设计、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、3
2、3系统模块、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、4
2、3、1主控制器、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、4
2、3、2显示电路、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、5
2、3、3温度传感器、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、5
2、3、4报警温度调整按键、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、6
3、系统软件算法分析、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、7
3、1主程序流程图、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、7
3、2读出温度子程序、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、7
3、3温度转换命令子程序、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、8
3、4计算温度子程序、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、8
3、5显示数据刷新子程序、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、8
3、6按键扫描处理子程序、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、9
4、实验仿真、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、10
5、总结与体会、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、11
查考文献、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、12
附1源程序代码、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、13
2实物图、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、20
1概述
1、1课程设计的意义
本次课程设计就是对于我们所学的传感器原理知识所进行的一次实际运用,通过自主的课程设计与实际操作,可增加我们自身的动手能力。
特别就是对温度传感这方面的知识有了实质性的了解,对进一步学习传感器课程起到很大的作用。
本课程设计通过查阅相关资料,在老师与同学的帮助下完成,在锻炼了自我的同时也增强了自己的团队意识与团队协作精神。
1、2设计的任务与要求
1、基本范围-50℃-110℃
2、精度误差小于0、5℃
3、LED数码直读显示
4、可以任意设定温度的上下限报警功能
2系统总体方案及硬件设计
2、1数字温度计设计方案论证
2、1、1方案一2、1、1
由于本设计就是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,其中还涉及到电阻与温度的对应值的计算,感温电路比较麻烦。
而且在对采集的信号进行放大时容易受温度的影响出现较大的偏差。
2、1、2方案二
进而考虑到用温度传感器,在单片机电路设计中,大多都就是使用传感器,所以这就是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,电路简单,精度高,软硬件都以实现,而且使用单片机的接口便于系统的再扩展,满足设计要求。
从以上两种方案,很容易瞧出,采用方案二,电路比较简单,费用较低,可靠性高,软件设计也比较简单,故采用了方案二。
2、2系统总体设计
温度计电路设计总体设计方框图如图1所示,控制器采用单片机AT89S51,温度传感器采用DS18B20,用3位LED数码管以串口传送数据实现温度显示。
LED显示
单片机复位
蜂鸣器,指示灯
AT89S51
报警温度调整键
DS18B20
时钟振荡
温度传感器
图2、2—1
总体设计方框图
图2、2—2系统仿真图
2、3系统模块
系统由单片机最小系统、显示电路、按键、温度传感器等组成。
2、3、1主控制器2、3、1
单片机AT89S51具有低电压供电与体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
晶振采用12MHZ。
复位电路采用上电加按钮复位。
图2、3、1—1晶振电路
图2、3、1—2复位电路
2、3、2显示电路2、3、2
显示电路采用4位共阴极LED数码管,P0口由上拉电阻提高驱动能力,作为段码输出并作为数码管的驱动。
P2口的低四位作为数码管的位选端。
采用动态扫描的方式显示。
图2、3、2数码管显示电路
2、3、3温度传感器2、3、3
DS18B20温度传感器就是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:
1、独特的单线接口仅需要一个端口引脚进行通信;2、多个DS18B20可以并联在惟一的三线上,实现多点组网功能;3、无须外部器件;4、可通过数据线供电,电压范围为3、0~5、5V;5、零待机功耗;6、温度以9或12位数字;
7、用户可定义报警设置;8、报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;9、负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;DS18B20可以采用两种方式供电,一种就是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。
另一种就是寄生电源供电方式,如图4所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
当DS18B20处于写存储器操作与温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。
采用寄生电源供电方式时VDD端接地。
由于单线制只有一根线,因此发送接口必须就是三态的。
图2、3、3温度传感器与单片机的连接
2、3、4报警温度调整按键
本系统设计三个按键,采用查询方式,一个用于选择切换设置报警温度与当前温度,另外两个分别用于设置报警温度的加与减。
均采用软件消抖
3系统软件算法分析
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序,按键扫描处理子程序等。
3、1主程序流程图
主程序的主要功能就是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图3、1所示。
初始化
读取温度
读出温度值温度
计算处理显示数
据刷新
发温度转换开始命令
调用显示子程序
N
SET键就是
否按下
Y
设置报警温度
图3、1主程序流程图
3、2读出温度子程序
读出温度子程序的主要功能就是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如图3、2示
3、3温度转换命令子程序
温度转换命令子程序主要就是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如上图,图3、3所示
发DS18B20复位命令
发DS18B20复位命令
发跳过ROM命令
发跳过ROM命令
发温度转换开始命令
发读取温度命令
结束
读取操作,CRC校验
图3、3温度转换流程图
Y
N
9字节完?
Y
CRC校验正?
N
移入温度暂存器
结束
图3、2读温度流程图
3、4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图3、4所示。
3、5显示数据刷新子程序
显示数据刷新子程序主要就是对分离后的温度显示数据进行刷新操作,当标志位位为1时将符号显示位移入第一位。
程序流程图如图3、5。
开始
N
温度零下?
Y
温度值取补码置“1”标志
置“0”标志
温度数据移入显示寄存器
分离显示温度
Y
标志位为1?
N
Y
计算小数位温度BCD值
最高位显示“—”
计算整数位温度BCD值
最高为显示分理
出的数据
结束
结束
图3、4
计算温度流程图
图3、5
显示数据刷新流程图
3、6按键扫描处理子程序
按键采用扫描查询方式,设置标志位,当标志位为1时,显示设置温度,否则显示当前温度。
如下图3、6示。
SET键按下
ADD键就是
否按下
N
DEC键就是
否按下
N
Y
报警温度加1
Y
报警温度减1
N
显示切换标志
位就是否为“0”
Y
调用显示子程序
图3、6按键扫描处理子程序
4实验仿真
进入protuse后,连接好电路,并将程序下载进去。
将DS18B20的改为0、1,数码管显示温度与传感器的温度相同。
图4—1温度显示仿真
当按下SET键一次时,进入温度报警上线调节,此时显示软件设置的温度报警上线,ADD按或DEC分别对报警温度进行加一或减一。
当再次按下SET键时,进入温度报警下线调节,此时显示软件设置的温度报警下线,ADD按或DEC分别对报警温度进行加一或减一。
图4—2温度调试仿真
当第三次按下SET键时,退出温度报警线设置。
显示当前温度。
5总结与体会
本次基于“ds18b20数字温度报警器”的传感器课程设计大致可以分为:
资料收集→程序编辑→电路设计→模拟仿真→电板焊接。
每个过程相辅相成,却又相互独立。
通过这次对数字温度计的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才实际接线的。
但就是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。
而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。
所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。
通过一个一个步骤的跟进,让我对很多电子元器件的结构与基本特性有了一定的了解,对电路的实际操作让我对电路有了深刻的理解。
焊接过程就是一个很有趣的过程,通过小心翼翼的一个个引脚的焊接,最终成就我们的温度传感器,每一步都那么的谨慎以防与相邻的电路短接。
在很大的程度上锻炼了我的耐心,同时也能够对整个电路设计及走向有一个深刻的了解、理解。
当然,由于种种原因:
元器件缺失、系统本身及电路的影响等导致所得的结果不够精确,无法达到预想的理想状态,让人很就是遗憾。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习传感器更就是如此,任何元件、程序等只有在反复的学习与使用过程中才能在运用过程中得心应手,这就就是我在这次课程设计中的最大收获。
人民邮电出版社2003
【6】杨恢先黄辉先单片机原理及应用
参考文献
【5】赵云曹经稳赵春强常用电子元器件及应用电路
电子工业出版社2011
【4】刘迎春叶湘滨传感器原理设计与应用
国防科技大学出版社1998
【3】廖常初、现场总线概述[J]、电工技术,
北京航天航空大学出版社2000
【2】薛庆军,张秀娟,单片机原理实验教程
北京航空航天大学出版社1999
【1】马忠梅,张凯单片机的C语言应用程序设计(第四版)人民出版社
附1源程序代码
//DS18B20的读写程序,数据脚P2、7
//温度传感器18B20汇编程序,采用器件默认的12位转化
//为0、1度,显示采用4位LED共阳显示测温值
//P0口为段码输入,P34~P37为位选
//
//
//最大转化时间750微秒,显示温度-55到+125度,显示精度//
//
//
/***************************************************/
#include"reg51、h"
#include"intrins、h"
#definedmP0
#defineucharunsignedchar
#defineuint
sbitDQ=P2^7;
sbitw0=P2^0;
sbitw1=P2^1;
sbitw2=P2^2;
sbitw3=P2^3;
sbitbeep=P1^7;
sbitset=P2^6;
sbitadd=P2^4;
sbitdec=P2^5;
inttemp1=0;
uinth;
uinttemp;
ucharr;
ucharhigh=35,low=20;
ucharsign;
ucharq=0;
uchartt=0;
ucharscale;
//**************温度小数部分用查表法***********//
ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//小数断码表
ucharcodetable_dm[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
//共阴LED段码表
"0"
"1"
"2"
"3"
"4"
"5"
"6"
"7"
"8"
"9""不亮""-"
unsignedint
//温度输入口
//数码管4
//数码管3
//数码管2
//数码管1
//蜂鸣器与指示灯
//温度设置切换键
//温度加
//温度减
//显示当前温度与设置温度的标志位为0时显示当前温度
//_nop_();延时函数用
//段码输出口
uchartable_dm1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
//个位带小数点的断码表
uchardatatemp_data[2]={0x00,0x00};
uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};
//读出温度暂放
//显示单元数据,共4个数据与一个运算暂用
/*****************11us延时函数*************************/
voiddelay(uintt)
{
for(;t>0;t--);
}
voidscan()
{
intj;
for(j=0;j<4;j++)
{
switch(j)
{
case0:
dm=table_dm[display[0]];w0=0;delay(50);w0=1;//xiaoshu
case1:
dm=table_dm1[display[1]];w1=0;delay(50);w1=1;//gewei
case2:
dm=table_dm[display[2]];w2=0;delay(50);w2=1;//shiwei
case3:
dm=table_dm[display[3]];w3=0;delay(50);w3=1;//baiwei
//
}
}
}
//***************DS18B20复位函数************************/
ow_reset(void)
{
charpresence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();//从高拉倒低
DQ=0;
delay(50);
DQ=1;
delay(6);
presence=DQ;
}
delay(45);
presence=~DQ;
}
DQ=1;
}
/****************DS18B20写命令函数************************/
//向1-WIRE总线上写1个字节
//拉高电平
//延时500us
//66us
//presence=0复位成功,继续下一步
//550us
else{dm=table_dm[b3];w3=0;delay(50);w3=1;}
voidwrite_byte(ucharval)
{
uchari;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();
DQ=val&0x01;
delay(6);
val=val/2;
}
DQ=1;
delay
(1);
}
/****************DS18B20读1字节函数************************/
//从总线上取1个字节
ucharread_byte(void)
{
uchari;
ucharvalue=0;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ=0;_nop_();_nop_();_nop_();_nop_();
DQ=1;_nop_();_nop_();_nop_();_nop_();
if(DQ)value|=0x80;
delay(6);
}
DQ=1;
return(value);
}
/*****************读出温度函数************************/
read_temp()
{
ow_reset();
delay(200);
write_byte(0xcc);
write_byte(0x44);
ow_reset();
delay
(1);
write_byte(0xcc);
write_byte(0xbe);
//发命令
//发命令
//发转换命令
//总线复位
//66us
//4us
//4us
//从高拉倒低
//5us
//最低位移出
//66us
//右移1位
temp_data[0]=read_byte();
temp_data[1]=read_byte();
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0];
returntemp;
}
//读温度值的第字节
//读温度值的高字节
//两字节合成一个整型变量。
//返回