传感器课程设计.docx
《传感器课程设计.docx》由会员分享,可在线阅读,更多相关《传感器课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
传感器课程设计
火灾探测及报警系统的设计
一、系统方案设计
1、课题设计的目的和意义
本课程设计要求利用单片机结合传感器技术而开发设计的智能火灾报警系统,从而可以对生活中有火灾隐患的地方进行监测与防范,并且当火灾发生时能及时发出警报,让人们可以迅速赶到现场熄灭火灾,以此可以减少财务损失与人员的伤亡。
设计目的是设计和实现一种分布式智能火灾报警控制系统,实现系统软硬件的组成和实现。
为了全面有效地反映被监视环境的各种细微变化,故智能系统采用了设有专用芯片的模拟量探测器设计,从而可以对烟雾和灰尘等影响实施自动补偿,同时有数字量的探测器,直接将采集的信号信息送入控制器进行自动处理,以此而实现各种智能特性、无灾误报和准确报警。
为了解决不同工程的适应性,同时提高运行的可靠性,故系统采用主从式网络结构设计。
为了完成总线报警,又实现总线联动控制,故系统采用全总线计算机通信技术设计。
为了能准确无误的产生报警,故采用了感烟效果好、灵敏度高的MQ-2烟雾传感器和DS18B20数字温度传感器。
2、系统方案框图
二、工作原理
1、检测原理
本课程设计的智能火灾报警系统的工作,由DS18B20数字温度传感器采集周围环境中的温度,经过信息处理,转化为C51单片机能够处理的数字量。
在AT89S52单片机中,采集并经过处理的数据要与系统所规定的相关上限值进行比较(上限值是保证系统正常工作同时周围环境处于良好状态时的上限),如果超过了上限值,则说明周围环境异常,要报警,以便人们的正常生活和工作。
把信息综合处理,根据实际的需要以及现场的环境,来发现和识别警报,构成智能化的监控系统,提高了系统工作的可靠性。
2、元器件的选择
2.1、单片机的选择
单片机是本方案的关键,本方案中选用AT89S52,其结构和主要参数如下:
功能特性描述:
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在线系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
引脚结构
2.2、A/D转换器的选择
A/D转换器的种类很多,就位数来分,有8位、10位、12位、16位等。
位数越高,其分辨率也越高,但价格也越贵。
而就其结构而言,有单一的A/D转换器,有内含多路开关的A/D转换器。
根据本设计的需要,我选择的A/D转换器是ADC0809芯片。
ADC0809是美国AnalogDevice公司生产的8位逐次逼近式模数转换器,转换速率高,自带三态输出缓冲电路,可直接与各种典型的8位或16位的微处理器相连而无需附加逻辑接口电路,且能与CMOS及TTL兼容,是目前我国应用最广泛,价格便宜的A/D转换器。
加之内部含有三态输入缓冲电路,可直接与各种微处理器连接,且无须附加逻辑接口电路,内部设置的高精参考电压源和时钟电路,使它不需要任何外部电路和时钟信号,就能完成A/D转换功能,应用非常方便。
2.3、温度传感器的选择
温度传感器,使用范围广,数量多,居各种传感器之首。
温度传感器的发展大致经历了以下3个阶段。
2.3.1、传统的分立式温度传感器
主要是能够进行非电量和电量之间转换。
传统的分立式温度传感器如热电偶传感器。
热电偶传感器是工业测量中应用最广泛的一种温度传感器,它与被测对象直接接触,不受中间介质的影响,具有较高的精度;测量范围广,可从-50~1600℃进行连续测量,特殊的热电偶如金铁——镍铬,最低可测到-269℃,钨——铼最高可达2800℃。
2.3.2、模拟集成温度传感器/控制器
它的主要特点是功能单一(仅测量温度)、测温误差小、价格低、响应速度快、传输距离远、体积小、微功耗等,适合远距离测温,不需要进行非线性校准,外围电路简单。
2.3.3、智能温度传感器
目前,国际上新型温度传感器正从模拟式想数字式、集成化向智能化及网络化的方向发展。
温度传感器按传感器与被测介质的接触方式可分为两大类:
一类是接触式温度传感器,一类是非接触式温度传感器。
接触式温度传感器的测温元件与被测对象要有良好的热接触,通过热传导及对流原理达到热平衡,这是的示值即为被测对象的温度。
这种测温方法精度比较高,并可测量物体内部的温度分布。
但对于运动的、热容量比较小的及对感温元件有腐蚀作用的对象,这种方法将会产生很大的误差。
非接触测温的测温元件与被测对象互不接触。
常用的是辐射热交换原理。
此种测稳方法的主要特点是可测量运动状态的小目标及热容量小或变化迅速的对象,也可测量温度场的温度分布,但受环境的影响比较大。
综合以上,我选择数字温度传感器DS18B20。
该产品采用美国DALLAS公司生产的DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
DS18B20一线总线数字式传感器,独特的单线接口仅需一个端口引脚进行通讯,用户可定义的非易失性温度报警设置。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
3、测量电路(软件)介绍
硬件电路和软件程序是组成一个系统不可缺少的两部分,二者的正确与否将直接影响整个程序的可实现性。
在上面已经将整个系统的硬件部分作了介绍,在此将就系统的软件部分加以分析说明。
本次设计的软件要实现的功能是:
当传感器在有火灾信息时,采集信息,用单片机实现对火灾信号处理,并在LED和蜂鸣器上显示结果。
3.1、系统软件流程图
三、系统仿真测试与验证
系统仿真图如下:
经过软件仿真验证,所设计的系统基本符合设计要求。
仿真中通过调节上、下按钮可以设定温度上限(预警温度),用红色数码管显示,调节温度传感器可以在绿色数码管中显示当前温度。
若当前温度高于预警温度,报警灯(红色二极管)亮,蜂鸣器开始报警;若当前温度低于预警温度则正常灯(绿色二极管)亮,蜂鸣器不报警。
四、课程设计体会与总结
经过一周的课程设计,加深了我所学知识的理解,锻炼了我在有限的时间里处理相应任务的能力。
另外,本课程设计是我们专业课程知识综合应用的实践训练,通过这次课程设计,我深深体会到与人合作的重要性,我在做课程设计是,一直都是与小组人员合作,大家共同讨论遇到的难题,在解决了一个个问题后,虽然我们的设计没有达到预期的效果,但是经过画图,编程之后,对本专业的知识我们也有了更新的认识。
设计中,我们更主要的是在查找资料的过程中了解了AT89S52单片机及几种传感器的一些使用方法和适用场合。
从而对其有了更深入的认识;同时在课程设计中也让我把一些平时学习中的知识巩固了一下,并能自己稍微尝试着应用一些自己所学的知识去判断自己所设计的内容是否正确。
运用proteus仿真的过程中,因为存在电脑配置、系统要求等各方面的因素,我们组做出来的成果没能实现预期功能,经过总结原因,我们发现,就算运行、仿真显示没有任何错误,如果内部调整不完善,照样无法实现功能。
五、附录:
1、参考文献
[1]徐维祥,刘旭敏.单片微型机原理及应用.大连:
大连理工大学出版社,2003.
[2]李华,孙晓民等.MCS-51系列单片机实用接口技术.北京:
北京航空航天大学出版社,2003.
[3]李贵山,杨建平,周征等。
微型计算机测控技术。
北京:
机械工业出版社,2002.
[4]黄贤武等.传感器实用电路设计.成都:
电子科技大学出版社,1998.
[5]李贵山,周征,黄晓峰.检测与控制技术.西安:
西安电子科技大学出版社,2006.
[6]李华.MCS-51系列单片机实用接口技术.北京:
北京航空航天大学出版社,1993.
[7]蔡美琴等.MCS-51单片机系统及其应用.北京:
高等教育出版社,1992.
[8]张学峰.基于单片机控制的太阳能热水器全自动电路[J].现代电子技术,2005,28(4):
24-26.
2、元器件表
元件清单
元件名称
单位(只)
型号
参数
备注
温度传感器
1
DS18B20
-55~100度5V
单片机
1
AT89S52
C1,C2
2
30P
C3,C6
2
22UF/25V
C4
1
220UF/25V
C5
1
2.2UF/25
R1~R6
7
100欧姆
1/8W
R7~R9
3
510欧姆
1/8W
R10
1
10K
1/8W
R11~R15
5
4.7K
1/8W
R16,R17,R18
3
510欧姆
1/8W
D0
1
发光二极管
白发红
D1
1
发光二极管
白发蓝
D2,D3,D5
3
发光二极管
红发红
Y1
1
晶震
11.0592HZ
S1~S3
3
按键
Q1~Q3
4
8550
NPN
3、程序清单
#include
#include
#include
codeunsignedcharseg7code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x40};//显示段码
sbitTMDAT=P3^1;//DS18B20的数据输入/输出脚DQ,根据情况设定
sbitjia=P2^1;
sbitjian=P2^0;
sbithong=P1^0;//红色警告灯
sbitsheng=P1^1;//蜂鸣器
sbitlan=P1^2;//兰色灯
bitwrite=0;//写24C08的标志;
j=30;
unsignedintsdata;//测量到的温度的整数部分
unsignedcharxiaoshu1;//小数第一位
unsignedcharxiaoshu2;//小数第二位
unsignedcharxiaoshu;//两位小数
bitfg=1;//温度正负标志
////////24C08读写驱动程序////////////////////
sbitscl=P3^4;//24c08SCL
sbitsda=P3^5;//24c08SDA
voiddelay1(unsignedcharx)
{unsignedinti;
for(i=0;i;}
voidflash()
{;;}
voidx24c08_init()//24c08初始化子程序
{scl=1;flash();sda=1;flash();}
voidstart()//启动(I方C)总线
{sda=1;flash();scl=1;flash();sda=0;flash();scl=0;flash();}
voidstop()//停止(I方C)总线
{sda=0;flash();scl=1;flash();sda=1;flash();}
voidwritex(unsignedcharj)//写一个字节
{unsignedchari,temp;
temp=j;
for(i=0;i<8;i++)
{temp=temp<<1;scl=0;
flash();
sda=CY;
flash();
scl=1;
flash();
}
scl=0;flash();sda=1;flash();
}
unsignedcharreadx()//读一个字节
{
unsignedchari,j,k=0;
scl=0;flash();sda=1;
for(i=0;i<8;i++)
{
flash();
scl=1;
flash();
if(sda==1)j=1;
elsej=0;
k=(k<<1)|j;
scl=0;}
flash();
return(k);
}
voidclock()//(I方C)线时钟
{
unsignedchari=0;
scl=1;flash();
while((sda==1)&&(i<255))i++;
scl=0;flash();
}
////////从24c02的地址address中读取一个字节数据/////
unsignedcharx24c08_read(unsignedcharaddress)
{
unsignedchari;
start();writex(0xa0);
clock();writex(address);
clock();start();
writex(0xa1);clock();
i=readx();stop();
delay1(10);
return(i);
}
//////向24c02的address地址中写入一字节数据info/////
voidx24c08_write(unsignedcharaddress,unsignedcharinfo)
{
EA=0;
start();writex(0xa0);
clock();writex(address);
clock();writex(info);
clock();stop();
EA=1;
delay1(50);
}
/*////////////24C08读写驱动程序完/////////////////////
voidDelay2(unsignedinttc)//延时程序
{
while(tc!
=0)
{unsignedinti;
for(i=0;i<100;i++);
tc--;}
}
*/
//////////*显示延时程序*///////////////
voidDelay(unsignedinttc)
{while(tc!
=0)
{unsignedinti;
for(i=0;i<80;i++);
tc--;}
}
////////////延时部分///////////////
voidyanshi(unsignedintcount)
{
unsignedchari;
while(count--)
{for(i=0;i<115;i++);}
}
/////////////发送复位///////////////
voidfashong(void)
{
unsignedchari;
TMDAT=0;for(i=0;i<103;i++);
TMDAT=1;for(i=0;i<4;i++);
}
bittmrbit(void)//读一位//
{
unsignedinti;
bitdat;
TMDAT=0;
i++;
TMDAT=1;
i++;i++;//微量延时//
dat=TMDAT;
for(i=0;i<8;i++);
return(dat);
}
unsignedchartmrbyte(void)//读一个字节
{
unsignedchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{j=tmrbit();dat=(j<<7)|(dat>>1);}
return(dat);
}
voidtmwbyte(unsignedchardat)//写一个字节
{
unsignedcharj,i;
bittestb;
for(j=1;j<=8;j++)
{testb=dat&0x01;
dat=dat>>1;
if(testb)
{TMDAT=0;//写0
i++;i++;
TMDAT=1;
for(i=0;i<8;i++);}
else
{TMDAT=0;//写0
for(i=0;i<8;i++);
TMDAT=1;
i++;i++;}
}
}
voidtmstart(void)//发送ds1820开始转换
{
fashong();//复位
yanshi
(1);//延时
tmwbyte(0xcc);//跳过序列号命令
tmwbyte(0x44);//发转换命令44H,
}
voidtmrtemp(void)//读取温度
{
unsignedchara,b;
fashong();//复位
yanshi
(1);//延时
tmwbyte(0xcc);//跳过序列号命令
tmwbyte(0xbe);//发送读取命令
a=tmrbyte();//读取低位温度
b=tmrbyte();//读取高位温度
if(b>0x7f)//最高位为1时温度是负
{a=~a;b=~b+1;//补码转换,取反加一
fg=0;//读取温度为负时fg=0
}
sdata=a/16+b*16;//整数部分
xiaoshu1=(a&0x0f)*10/16;//小数第一位
xiaoshu2=(a&0x0f)*100/16%10;//小数
xiaoshu=xiaoshu1*10+xiaoshu2;//小数
}
voidDS18B20PRO(void)
{
tmstart();
//yanshi(5);//如果是不断地读取的话可以不延
tmrtemp();//读取温度,执行完毕温度将存于
}
voidLed()
{
if(fg==1)//温度为正时显示的数据
{
P2=P2&0xef;
P0=seg7code[sdata/10];//输
Delay
(2);P2=P2|0xf0;P2=P2&0xdf;
P0=seg7code[sdata%10]|0x80;//输出个
Delay
(2);P2=P2|0xf0;P2=P2&0xbf;
P0=seg7code[xiaoshu1];//输出小数点
Delay
(2);P2=P2|0xf0;P2=P2&0x7f;
P0=seg7code[xiaoshu2];//输出小
Delay
(1);P2=P2|0xf0;
Delay
(2);P2=P2|0xf0;P2=P2&0xf7;
P0=seg7code[j/10];//输出十位
Delay
(2);P2=P2|0x0f;P2=P2&0xfb;
P0=seg7code[j%10]|0x80;//输出个位
Delay
(1);P2=P2|0x0f;
P2=P2&0x7f;
P0=seg7code[sdata/10];//输出十位
Delay(8);P2=P2|0xf0;P2=P2&0xbf;
P0=seg7code[sdata%10]|0x80;//输出个位
Delay(8);P2=P2|0xf0;P2=P2&0xf7;
P0=seg7code[xiaoshu1];//输出小数点
Delay(8);P2=P2|0xf0;P2=P2&0xfb;
P0=seg7code[xiaoshu2];//输出小
Delay(4);P2=P2|0xf0;
Delay(8);P2=P2|0xf0;P2=P2&0xdf;
P0=seg7code[j/10];//输出十位
Delay(8);P2=P2|0xf0;P2=P2&0xef;
P0=seg7code[j%10]|0x80;//输出个位
Delay(4);P2=P2|0xf0;
if(sdata<=j)
{
lan=0;
hong=1;
sheng=1;
};
if(sdata>=j)
{
lan=1;
hong=0;
sheng=0;
};
}
if(fg==0)//温度为负时显示的数据
{P2=P2&0xef;
P0=seg7code[11];//负号
Delay(8);P2=P2|0xf0;P2=P2&0xdf;
P0=seg7code[sdata/10]|0x80;//输出十位
Delay(8);P2=P2|0xf0;P2=P2&0xbf;
P0=seg7code[sdata%10];//输出个位
Delay(8);P2=P2|0xf0;P2=P2&0x7f;
P0=seg7code[xiaoshu1];//输出小
Delay(4);P2=P2|0xf0;
}
}
main()
{fg=1;
x24c08_init();//初始化24C08
j=x24c08_read
(2);//读出保存的数据
while
(1)
{
DS18B20PRO();
Led();
if(jia==0)
{Delay(200);j++;}
if(jian==0)
{Delay(200);j--;}
x24c08_write(2,j);
}
}