光电子设计报告_第1页
光电子设计报告_第2页
光电子设计报告_第3页
光电子设计报告_第4页
光电子设计报告_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、摘 要本文介绍一种基于单片机的声光报警系统设计实例。分别说明了系统的硬件电路设计、软件设计、系统的通讯方式及软件的设计思想。该系统具有误报率低、性能稳定、传输距离远、实用性强等特点。同国外相比,国内在智能型火灾报警系统的研究上还是有一定的差距的。我国的智能型火灾报警系统还是存在诸如可靠性、稳定性差:探测器信号处理方法单一,智能化程度低:未能很好解决探测器灵敏度和误报率之间矛盾等问题。基于火灾报警系统在国内外的的发展状况,这是一项迫切而有意义的设计。关键词:STC89C52、DS18B20、HS0038B、数码管、蜂鸣器、报警系统目 录1、设计要求12、设计方案13、元器件简介13.1、单片机S

2、TC89C52简介13.2、温度传感器DS18B2023.3、红外接收头HS0038B34、设计电路及原理34.1、温度接收模块34.2、红外发射模块44.3、红外接收模块54.4、数码管显示模块54.5、蜂鸣器报警模块64.6、LED报警模块75、 设计总结8参考文献9附录101、设计要求 1)包括电信号转化成数字信号系统,数字显示系统,报警系统2)测量系统的性能特点等3)利用光电传感器进行信号的采集及控制。2、设计方案 本设计通过温度传感器DS18B20进行数据采集,采集到的信号经过单片机(STC89C52)处理及进行信号调制后,经红外发射管将将信号发出,再由红外接收头HS0038B接收红

3、外信号。当温度超过某一特定温度时,经单片机处理最终来实现声光报警系统的功能。红外发送编码参考了nec协议并稍作修改。定义了起始码为9ms低电平和4ms的高电平。低电平0定义为1ms的低电平和1ms的高电平,高电平1定义为1ms的低电平和3ms的高电平。38k载波采用定时器0的8位自动重装模式,初值0xf4。在设计过程中,使用示波器测量发送接收的波形,基本一样,没有误差。收发有效距离为1米,超过1米数据显示错误,本方案还有很大的提高空间。3、元器件简介3.1、单片机STC89C52简介 图3-1 单片机STC89C52STC89C52是一种带8K字节闪烁可编程可檫除只读存储器(FPEROM-Fl

4、ash Programable and Erasable Read Only Memory )的低电压,高性能COMOS8的微处理器,俗称单片机。该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。STC89C52具体介绍如下:  主电源引脚(2根) VCC(Pin40):电源输入,接5V电源 GND(Pin20):接地线 外接晶振引脚(2根) XTAL1(Pin19):片内振荡电路的输入端 XTAL2(Pi

5、n20):片内振荡电路的输出端 控制引脚(4根) RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。 ALE/PROG(Pin30):地址锁存允许信号 PSEN(Pin29):外部存储器读选通信号 EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。 可编程输入/输出引脚(32根) STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。 PO口(Pi

6、n39Pin32):8位双向I/O口线,名称为P0.0P0.7 P1口(Pin1Pin8):8位准双向I/O口线,名称为P1.0P1.7  P2口(Pin21Pin28):8位准双向I/O口线,名称为P2.0P2.7  P3口(Pin10Pin17):8位准双向I/O口线,名称为P3.0P3.7 3.2、温度传感器DS18B20图3-2 温度传感器DS18B20 DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。(1) DS1

7、8B20的主要特性1、适应电压范围更宽,电压范围:3.05.5V,在寄生电源方式下可由数 据线供电2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯3、 DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温4、DS18B20在使用中不需要任何外围元件,全部 传感元件及转换电路集成在形如一只三极管的集成电路内5、温范围55+125,在-10+85时精度为±0.56、可编程 的分辨率为912位,对应的可分辨温度分别为0.5、0.25、0.125和0.0625,可实现高精度测温7、在9位分辨

8、率时最多在 93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快8、测量结果直接输出数字温度信号,以"一 线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力9、负压特性:电源极性接反时,芯片不会因发热而烧毁, 但不能正常工作。(2)DS18B20引脚定义:1、DQ为数字信号输入/输出端;2、GND为电源地;3、VDD为外接供电电源输入端(在寄生电源接线方式时接地)。3.3、红外接收头HS0038B图3-3 红外接收头HS0038B 红外接收电路一体化的红外接收装置将遥控信号的接收、放大、检波、整形集于一身,并

9、且输出可以让单片机识别的TTL 信号,这样大大简化了接收电路的复杂程度和电路的设计工作。4、设计电路及原理4.1、温度接收模块图4-1 温度接收原理图4.2、红外发射模块信号调制原理:基带信号:从信号源发出没有经过调制的原始信号,特点是频率较低,信号频率从0开始,频谱较宽。调制:就是用待传送信号去控制某个高频信号的幅度、相位、频率等参量变化的过程,即用一个信号去装载另一个信号。图4-2 信号调制原理图图4-3 红外发射原理图4.3、红外接收模块图4-4 红外接收原理图4.4、数码管显示模块图4-5 数码管显示原理图4.5、蜂鸣器报警模块图4-6 蜂鸣器报警模块原理图4.6、LED报警模块图4-

10、7 LED报警模块原理图5、设计总结刚开始知道题目时自己没什么思路和头绪,就只是一味的查资料,在网上确实是找了一大把的相关资料,可问题也相继而来,按照网上的电路做出的板子根本不能成功,感觉涉及范围也越来越大了,后经组员商讨,才突然明白由于太过仓促,将原本定好的思路打乱了,做的事情完全没按照所想好的提纲来。所以不管做什么事,首先要明确的是自己要做什么,该怎么做,而不是盲目想达到某种目的,急于求成往往达不到效果的。在这次光电子设计中,我学到了很多专业方面的知识,加强了动手能力并掌握了许多实际性的东西心与各部属电路相结合组成一个电路原理图。同时还学到了很多课内学不到的东西,比如独立思考解决问题,出现

11、差错的随机应变,和与人合作共同提高,都受益非浅,今后的制作应该更轻松,自己也都能扛的起并高质量的完成项目。参考文献1金发庆.传感器技术与应用.北京:机械工业出版社,20042 安毓英,刘继芳,李庆辉,冯喆珺,等. 光电子技术(第3版). 北京:电子工业出版社,2011 3 陈益飞,沈兆军,孙干超,等. 单片机原理及技术应用. 北京:国防工业出版社,20114何利明.单片机高级教程. 北京:航空航天大学出版社,2000 5 阎石. 数字电子技术基础(第五版). 北京:高等教育出版社,20066 康华光. 电子技术基础模拟部分(第五版). 北京:高等教育出版社,20067 孙宏国,周云龙. 电子系

12、统设计与实践. 北京:清华大学出版社,20128李朝青.单片机原理与接口技术. 北京:航空航天大学出版社,1999附录1、元件清单:单片机STC89C52 (2个)、温度传感器DS18B20 (1个)、红外发射二极管 (1个)、红外接收头HS0038B (1个)、数码管 (3个)、蜂鸣器 (1个)、发光二极管 (8个)。2、程序清单:1)红外发送模块程序:main.c:#include<reg52.h> sbit CarryWave = P17;sbit ir_send = P16; void TransData(unsigned char _data);void CarrierW

13、aveInit(void);void delay_ms(unsigned int t);void ConfigTimer0(unsigned int ms);void TransData2(unsigned char _data2);extern bit Start18B20();extern bit Get18B20Temp(int *temp);bit flag1s=0;bit res=0; int temp; /读取到的当前温度值unsigned char T0RH = 0; /T0重载值的高字节unsigned char T0RL = 0; /T0重载值的低字节unsigned cha

14、r intT,decT; void main() EA=1; PT1=1; ConfigTimer0(1); CarrierWaveInit(); Start18B20(); /启动DS18B20 while(1) TransData(intT); TransData2(decT); if (flag1s) /每秒更新一次温度 flag1s = 0; res = Get18B20Temp(&temp); /读取当前温度 if (res) /读取成功时,刷新当前温度显示 intT = temp >> 4;/intT=intT/16+intT%16; /分离出温度值整数部分 d

15、ecT = temp & 0xF; /分离出温度值小数部分 decT = decT*10/16;/a=intT/10; /整数部分数据处理/b=intT%10; Start18B20(); /重新启动下一次转换 void TransData(unsigned char _data) unsigned char i; ir_send = 0; delay_ms(9); ir_send= 1; /输出0 delay_ms(4); /4ms的启动低电平 for(i=0;i<8;i+) ir_send= 0; /输出1delay_ms(1); if(_data&(1<<

16、;i) ir_send=1;delay_ms(3); /1左移i位 ,先发低位 /如果发送1 则高低电平比为1:1 else ir_send=1; delay_ms(1); /如果发送0 则高低电平比为1:3 ir_send = 1;/delay_ms(300);void TransData2(unsigned char _data2) unsigned char j; for(j=0;j<8;j+) ir_send= 0; /输出1 delay_ms(1); if(_data2&(1<<j) ir_send=1;delay_ms(3); /1左移i位 ,先发低位 /

17、如果发送1 则高低电平比为1:1 else ir_send=1; delay_ms(1); /如果发送0 则高低电平比为1:3 ir_send=1;/*定时器1初始化函数*函数名 :CarrierWaveInit()*参 数 :无*功 能 :38K载波信号定时器初始化*返回值 :无*/void CarrierWaveInit(void) EA=1; TMOD &= 0x0f; /清零T0的控制位 TMOD |= 0x20; /八位自动重装模式TH1 = 0XF4; /38k载波信号TL1 = 0XF4;ET1 = 1; /打开TR1 = 1;/*定时器1中断函数载波发生*/*函数名 :

18、CarrierWave()*参 数 :无*功 能 :定时器中断产生38KHZ载波信号*返回值 :无*/void CarrierWave(void) interrupt 3 CarryWave = CarryWave; void delay_ms(unsigned int t) /误差 -0.651041666667us unsigned char a,b;for(;t>0;t-) for(b=4;b>0;b-) for(a=43;a>0;a-);void ConfigTimer0(unsigned int ms) unsigned long tmp; /临时变量 tmp =

19、11059200 / 12; /定时器计数频率 tmp = (tmp * ms) / 1000; /计算所需的计数值 tmp = 65536 - tmp; /计算定时器重载值 tmp = tmp + 12; /补偿中断响应延时造成的误差 T0RH = (unsigned char)(tmp>>8); /定时器重载值拆分为高低字节 T0RL = (unsigned char)tmp; TMOD &= 0xf0; /清零T0的控制位 TMOD |= 0x01; /配置T0为模式1 TH0 = T0RH; /加载T0重载值 TL0 = T0RL; ET0 = 1; /使能T0中断

20、 TR0 = 1; /启动T0/* T0中断服务函数,完成1秒定时 */void InterruptTimer0() interrupt 1 static unsigned int tmr1s = 0; TH0 = T0RH; /重新加载重载值 TL0 = T0RL; tmr1s+; if (tmr1s >=700) /定时1s tmr1s = 0; flag1s = 1; DS18B20.c:#include <reg52.h>#include <intrins.h>sbit IO_18B20 = P32; /DS18B20通信引脚/* 软件延时函数,延时时间(

21、t*10)us */void DelayX10us(unsigned char t) do _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); while (-t);bit Get18B20Ack()bit ack;EA = 0;IO_18B20 = 0;DelayX10us(50);IO_18B20 = 1;DelayX10us(6);ack = IO_18B20;while(!IO_18B20);EA = 1;return ack;void Write18B20(unsigned char dat)

22、unsigned char mask;EA = 0;for(mask=0x01; mask!= 0; mask<<=1)IO_18B20 = 0;_nop_();_nop_();if(mask&dat) = 0)IO_18B20 = 0;elseIO_18B20 = 1;DelayX10us(6);IO_18B20 = 1;EA = 1;unsigned char Read18B20()unsigned char dat;unsigned char mask;EA = 0;for(mask=0x01; mask!=0; mask<<=1)IO_18B20 = 0

23、;_nop_();_nop_();IO_18B20 = 1;_nop_();_nop_();if(!IO_18B20)dat &= mask;elsedat |= mask;DelayX10us(6);EA = 1;return dat;bit Start18B20()bit ack;ack = Get18B20Ack();if(ack = 0)Write18B20(0xCC);Write18B20(0x44);return ack;bit Get18B20Temp(int *temp)bit ack;unsigned char LSB, MSB;ack = Get18B20Ack()

24、;if(ack = 0)Write18B20(0xCC);Write18B20(0xBE);LSB = Read18B20();MSB = Read18B20();*temp = (int)MSB<<8) + LSB;return ack;2) 红外接收模块程序:main.c:#include <reg52.h>sbit ADDR0 = P10;sbit ADDR1 = P11;sbit ADDR2 = P12;sbit ADDR3 = P13;sbit ENLED = P14;sbit LED0=P00;sbit LED1=P03;sbit LED2=P04;sbit

25、 LED3=P07;sbit BUZZ=P16;bit led0=1,led1=1,led2=1,led3=1;unsigned char code LedChar = /数码管显示字符转换表 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E;unsigned char LedBuff6 = /数码管显示缓冲区 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF;unsigned char T0RH = 0; /T0重载值的高字节unsi

26、gned char T0RL = 0; /T0重载值的低字节unsigned char intT=0;extern bit irflag;extern unsigned char ircode4;extern void InitInfrared(void);void ConfigTimer0(unsigned int ms);void main() EA = 1; /开总中断 ENLED = 0; ADDR3 = 1; InitInfrared(); /初始化红外功能 ConfigTimer0(1); /配置T0定时1ms PT0 = 1; /配置T0中断为高优先级,启用本行可消除接收时的闪烁

27、 while (1) if (irflag=1) /接收到红外数据时刷新显示 irflag = 0;intT=ircode0&0x0f+(ircode0>>4)*16 ; LedBuff2 = LedCharintT/10; /用户码显示 LedBuff1 = LedCharintT%10 & 0x7f; ;/ LedBuff1 = LedChar5; /键码显示 LedBuff0 = LedCharircode1; /* 配置并启动T0,ms-T0定时时间 */void ConfigTimer0(unsigned int ms) unsigned long tmp

28、; /临时变量 tmp = 11059200 / 12; /定时器计数频率 tmp = (tmp * ms) / 1000; /计算所需的计数值 tmp = 65536 - tmp; /计算定时器重载值 tmp = tmp + 10; /补偿中断响应延时造成的误差 T0RH = (unsigned char)(tmp>>8); /定时器重载值拆分为高低字节 T0RL = (unsigned char)tmp; TMOD &= 0xF0; /清零T0的控制位 TMOD |= 0x01; /配置T0为模式1 TH0 = T0RH; /加载T0重载值 TL0 = T0RL; ET

29、0 = 1; /使能T0中断 TR0 = 1; /启动T0/* 数码管动态扫描刷新函数,需在定时中断中调用 */void LedScan() static unsigned char i = 0; /动态扫描索引P0=0xff; switch(i)case 0: ADDR2=0; ADDR1=0; ADDR0=0; i+; P0=LedBuff0;break;case 1: ADDR2=0; ADDR1=0; ADDR0=1; i+; P0=LedBuff1;break;case 2: ADDR2=0; ADDR1=1; ADDR0=0; i+; P0=LedBuff2;break;case

30、3: ADDR2=1; ADDR1=1; ADDR0=0; i+; LED0=led0;break;case 4: ADDR2=1; ADDR1=1; ADDR0=0;i+; LED1=led1;break;case 5: ADDR2=1; ADDR1=1; ADDR0=0; i+; LED2=led2;break;case 6: ADDR2=1; ADDR1=1; ADDR0=0; i=0; LED3=led3;break;default:break;/* T0中断服务函数,执行数码管扫描显示 */void InterruptTimer0() interrupt 1 static unsigned char i; TH0 = T0RH; /重新加载重载值 TL0 = T0RL; LedScan(); /数码管扫描显示 i+;if(i>=100) i=0; if(intT>=32) led0=led0; led1=led1; led2=led2; led3=led3; else led0=1; led1=1; led2=1; led3=1; if(intT>=32) BUZZ=BUZZ;ir_rec

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论