找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2836|回复: 0
打印 上一主题 下一主题
收起左侧

家居分布式温度监测报警系统-传感器课程设计报告 带程序及仿真全套资料

[复制链接]
跳转到指定楼层
楼主
资料包:




传感器课程设计报告
课    题: 家居分布式温度监测报警系统
班    级: 自152
姓    名:

目录
一、设计目的            
二、总体设计            
2.1设计方法            
2.2 设计中所用器件介绍            
三、硬件设计            
3.1 原理图电路            
3.2复位电路            
3.3时钟电路
3.4 DS18B20传感器电路            
3.5显示电路            
四、系统软件设计            
4.1 系统设计的整体思想              
4.2 系统总流程图              
4.3系统程序设计            
五、 系统仿真            
六、 调试过程            
七、 总结            

一、设计目的

设计一个家居分布式温度监测报警系统,因此要求该系统必须有较好的实时温度显示以及温度过高或过低的报警功能,以便能够及时发现火灾等安全隐患,保障人身安全和家庭财产。

二、总体设计

2.1设计方法

本次设计为了突出经济、可靠、耐用的特点,决定采用以单片机系统设计代替常规模拟电路系统设计。本系统在硬件设计上采用STC89C51单片机和DS18B20数字温度传感器组成下行机硬件系统,具有即时温度采集,可实现温度自动记录,分析,持续运行,使系统有良好的可靠性、扩展、人性化设计和较低的生产成本性能。

本系统的电路设计方框图如图1所示,它由三部分组成:①控制部分主芯片采用单片机89C51;②显示部分采用ED数码管以动态扫描方式实现温度显示;③温度采集部分采用DS18B20温度传感器。

图1(详见附件)

2.2 设计中所用器件介绍

1.DS18B20温度传感器

(1)管脚图如图2,有以下几点特点:

①独特的单线总线接口方式:DS18B20与上位机连接时可通过一条传输线路实现双向数据传输。

②可通过数据线供电,供电电压容许范围大,为+3.0~+5.5V,也可选用外部+5V供电。

③实际工作过程中,不需要添加外围器件。

④用户可自行设定温度报警上下限值,其值是非易失性的。

⑤可测温度范围为-55~+125℃,测温分辨率为0.5℃(-10℃—+85℃),2℃(-55~+125℃)。

⑥负压特性,电源反接时能够自动保护DS18B20不会被烧毁,此时的芯片无法正常工作。

⑦转换速度快,效率高,可在93.75ms内完成9位温度转换。 ⑧可实现多点测温,多个DS18B20温度传感器可并联在唯一的三线上。 ⑨适用于各种微处理器和上位机系统。

⑩内含64位的只读存储ROM,每片DS18B20出厂前就有唯一的产品序号。大型测温系统,单线上可挂接多片DS18B20传感器。

图2

1脚—GND:接地。

2脚—I/O:数据输入/输出端(即单线总线),属于漏极开路输出。外接上拉电阻后,常态下成高电平。

3脚—VCC:电源端,为可供选用的外部+5V电源端,不用时接地。

(2)DS18B20的工作原理

根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:

(1) 每一次读写之前都必须要对DS18B20进行复位; (2) 复位成功后发送一条ROM指令;

(3) 最后发送RAM指令,这样才能对DS18B20进行预定的操作。

复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待15~60微秒左右后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。其工作时序包括初始化时序、写时序和读时序。

2.74LS245芯片

74LS245是常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。其引脚图如图3。

片选端/CE低电平有效,当DIR="0"时,信号由 B 向 A 传输;(接收)DIR="1",信号由 A 向 B 传输;(发送)当CE为高电平时,A、B均为高阻态。由于P2口始终输出地址的高8位,接口时74LS245的三态控制端1G和2G接地,P2口与驱动器输入线对应相连。P0口与74LS245输入端相连,E端接地,保证数据线畅通。8051的/RD和/PSEN相与后接DIR,使得RD和PSEN有效时,74LS245输入(P0.1←D1),其它时间处于输出(P0.1→D1)。

图3

三、硬件设计

  • 原理图电路

如下图4所示,该图主要由单片机控制电路、显示电路、晶振电路、继电器电路和复位电路组成。

图4

2.复位电路

电路图如图5

复位电路作用:

一是在给电路通电时马上进行复位操作

二是在必要时可以由手动操作

三是根据程序或者电路运行的需要自动地进行。

图5

3.时钟电路

电路图如图6

时钟模块主要起作用的是晶振,每个单片机系统里都有晶振,全称叫晶体振荡器,在单片机系统里晶振的作用非常大,它结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,单片机的运行速度也就越快。晶振用一种能把电能和机械能相互转化的晶体,在共振的状态下工作,以提供稳定,精确的单频振荡。

图6


4.DS18B20传感器电路

该电路传感器采用更稳定,测量更为准确的外部供电的方式VCC端口上接5V的电源,如图7

图7

5.显示电路

显示电路采用了7段共阴数码管扫描电路,节约了单片机的输出端口,便于程序的编写,如图8

图8

四、系统软件设计

4.1 系统设计的整体思想

一个应用系统要完成各项功能,首先必须有较完善的硬件作保证。同时还必须得到相应设计合理的软件的支持,尤其是微机应用高速发展的今天,许多由硬件完成的工作,都可通过软件编程而代替。甚至有些必须采用很复杂的硬件电路才能完成的工作,用软件编程有时会变得很简单,如数字滤波,信号处理等。因此充分利用其内部丰富的硬件资源和软件资源,采用与S51系列单片机相对应的51汇编语言和结构化程序设计方法进行软件编程。

程序设计语言有三种:机器语言、汇编语言和高级语言。机器语言是机器唯一能“懂”的语言,用汇编语言或高级语言编写的程序(称为

源程序)最终都必须翻译成机器语言的程序(成为目标程序),计算机才能“看懂”,然后逐一执行。

高级语言是面向问题和计算过程的语言,它可通过于各种不同的计算机,用户编程时不必仔细了解所用的计算机的具体性能与指令系统,而且语句的功能强,常常一个语句已相当于很多条计算机指令,于是用高级语言编制程序的速度比较快,也便于学习和交流,所以本系统采用C语言来编写程序。

本装置的软件包括主程序、读出温度子程序、复位应答子程序、写入子程序、以及有关DS18B20的程序(初始化子程序、写程序和读程序)等。

主程序的功能是:启动DS18B20测量温度,将测量值与给定值进行比较,若测得温度小于设定值,置P1.5为低电平。当测得温度大于设定值,则置P1.4为低电平。

4.2 系统总流程图

如下图9

图9 系统总体流程图(详见附件)

4.3系统程序设计


  • 系统仿真

如下图,用开关来控制多个传感器,先打开一个开关,若传感器检测到温度为71.5显示到数码管上,因为大于所设定最高温度70,扬声器发出报警并且高温指示灯亮。

如下图,若传感器检测到温度低于-20,将-24.50显示到数码管中,且扬声器报警,低温指示灯亮。


如下图,传感器检测到温度为28.5在所设温度上下限之间,扬声器不报警且指示灯不亮。


  • 调试过程

在keil5中对程序进行编译,调试成功,调试结果如下图

  • 总结

紧紧张张的传感器课设就将要结束了,首先给我的感觉就是有好多东西都不懂。但这未必是一件坏事,越是不懂就说明我要学的东西很多,我的提升空间也就越大。

我利用自己课余时在自习室里学习单片机,查阅传感器方面相关文献,以此提升自己。当东西做不完时,我都有一种冲动,呆在自习教室晚上不回了。正是因为这种执着拼搏的精神使我收获很多,多数天我都会感觉脑子里都是满满的,不管是懂得的收获还是不懂得烦恼。

从刚开始的什么也不懂到现在的Proteus仿真、程序编写、调试等一些东西基本上动能很好的掌握了,可以说这是一个巨大的进步,调试是一个复杂而漫长的过程,需要我不断地去做。

有一次我程序也做出来了,但是在仿真上就是不行,结果总是不对,经过一上午的检查调试,终于知道了是我在Proteus上的一根线接错了,从这可以看出这是一个看似简单而最容易出错的过程,需要严谨的工作态度。

现在我的家居分布式温度监控报警系统已经做出来了,当检测到的环境温度值大于最小上线温度时,蜂鸣器会做频率较低的报警;当环境温度大于较大上线温度值时,蜂鸣器会做频率较高的报警。除此之外,它还可以用于仓库、实验室、机房等设备上,具有一定实用价值。

该系统的整体设计还是有很大的提升空间的,比如该系统只是报警这是不够的,最终还是需要人去做出反应,我们可以让它自动切断电源,从而保护设备,这样使其更具有自动化,从而会有更大的推广应用范围。


单片机源程序如下:
  1. #include <REG52.H>
  2. #include <INTRINS.H>
  3. #include <ds18b20.h>
  4. void delayms(unsigned char xms)
  5. {unsigned char i=200;while(--xms)while(--i);}
  6. unsigned char table[]={
  7. 0x3f,0x06,0x5b,0x4f,
  8. 0x66,0x6d,0x7d,0x07,
  9. 0x7f,0x6f,0x40,0x00};
  10. unsigned char shu[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  11. //************数码管扫描程序***********************************************************//
  12. void display(unsigned char z,x)
  13. {
  14.               P2=0xfe;
  15.               if(Tflag)P0=table[10];
  16.               else P0=0x00;
  17.               delayms(2);
  18.               P0=0x00;
  19.               P2=_crol_(P2,1);
  20.               P0=table[z/100];
  21.               delayms(2);
  22.               P0=0x00;
  23.               P2=_crol_(P2,1);
  24.               P0=table[z%100/10];
  25.               delayms(2);
  26.               P0=0x00;
  27.               P2=_crol_(P2,1);
  28.               P0=table[z%10]|0x80;
  29.               delayms(2);
  30.               P0=0x00;
  31.               P2=_crol_(P2,1);
  32.               P0=table[x/10];
  33.               delayms(2);
  34.               P0=0x00;
  35.               P2=_crol_(P2,1);
  36.               P0=table[x%10];
  37.               delayms(2);
  38.               P0=0x00;
  39.               P2=_crol_(P2,1);
  40. }
  41. sbit SOUND=P3^7;
  42. void T_init()
  43. {
  44.     TMOD = 0x11;
  45.               TH1 = (65536-500)/256;
  46.               TL1 = (65536-500)%256;
  47.               TH0 = (65536-50000)/256;
  48.               TL0 = (65536-50000)%256;
  49.               EA = 1;
  50.               ET1 = 1;
  51.               TR1 = 0;
  52.               ET0 = 1;
  53.               TR0 = 1;
  54. }
  55. //主函数
  56. void main()
  57. {
  58.               T_init();
  59.               P2=0xff;
  60.               delayms(250);
  61.               while(1)
  62.               {
  63.                             if((Tflag==1&tmpZ>=20)|(Tflag==0&tmpZ>=70))
  64.                             {
  65.                                           TR1=1;
  66.                                           if(tmpZ>=70)P1=0xef;
  67.                                           else              P1=0xdf;
  68.                             }
  69.                             else {P1=0xff;TR1=0;}
  70.                             display(tmpZ,tmpX);                            //动态显示数码
  71.               }
  72. }
  73. void timeint(void) interrupt 3
  74. {
  75.               TR1=0;
  76.     TH1 = (65536-200)/256;
  77. ……………………

  78. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载(word格式课设论文+仿真+源代码):
http://www.51hei.com/bbs/dpj-104141-1.html



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表