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

下载本文档

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

文档简介

1、 课程设计报告 课程名称: 光电子技术课程设计 设计题目: 基于单片机的声光报警系统的设计 专 业: 电子科学与技术 班 级: 电科121 姓 名: 学 号: 起止日期: 2015.6.8 - 2015.6.19 指导教师: 王如刚 摘 要近年来,随着我国经济的迅速发展,城乡居民的生活水平有了显著提高,尤其是城镇居民的居住条件不断改善,人们在解决了居住问题后,日益关心的是居住是否安全。火灾时有发生,对人们的各个方面造成巨大的损失。我们设计了这个声光报警器,可以在火灾发生时及时报警通知居民安全逃生。另外,此报警器亦可以安装于对温度要求较高的其他场合。关键词:STC89C52、DS18B20、HS

2、0038B、数码管、蜂鸣器目 录1、设计要求12、设计方案13、元器件简介13.1、单片机STC89C52简介13.2、温度传感器DS18B2033.3、红外接收头HS0038B43.4、数码管64、设计电路及原理64.1、温度接收模块64.2、红外发射模块64.3、红外接收模块74.4、数码管显示模块84.5、蜂鸣器报警模块84.6、LED报警模块9参考文献10设计总结10附录111、设计要求 1)包括电信号转化成数字信号系统,数字显示系统,报警系统2)测量系统的性能特点等3)利用光电传感器进行信号的采集及控制。2、设计方案 本设计通过温度传感器DS18B20进行数据采集,采集到的信号经过单

3、片机(STC89C52)处理及进行信号调制后,经红外发射管将将信号发出,再由红外接收头HS0038B接收红外信号。当温度超过某一特定温度时,经单片机处理最终来实现声光报警系统的功能。红外发送编码参考了nec协议并稍作修改。定义了起始码为9ms低电平和4ms的高电平。低电平0定义为1ms的低电平和1ms的高电平,高电平1定义为1ms的低电平和3ms的高电平。38k载波采用定时器0的8位自动重装模式,初值0xf4。在设计过程中,使用示波器测量发送接收的波形,基本一样,没有误差。收发有效距离为1米,超过1米数据显示错误,本方案还有很大的提高空间。3、元器件简介3.1、单片机STC89C52简介 图3

4、-1 单片机电路80C52是INTEL公司MCS-51系列单片机中基本的产品,它采用INTEL公司可靠的CHMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。它结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于80C51增强型单片机版本,集成了时钟输出和向上或向下计数器等更多的功能,适合于类似马达控制等应用场合。80C52内置8位中央处理单元、256字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时

5、钟振荡电路。· 标准MCS-51内核和指令系统· 片内8kROM(可扩充64kB外部存储器) · 32个双向I/O口· 256x8bit内部RAM(可扩充64kB外部存储器)· 3个16位可编程定时/计数器· 时钟频率3.5-12/24/33MHz· 向上或向下定时计数器 · 改进型快速编程脉冲算法· 6个中断源· 5.0V工作电压· 全双工串行通信口· 布尔处理器帧错误侦测· 4层优先级中断结构自动地址识别· 兼容TTL和CMOS逻辑

6、电平· 空闲和掉电节省模式· PDIP(40)和PLCC(44)封装形式3.2、温度传感器DS18B20图3-2 温度传感器电路DS18B20是常用的温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。· 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。· 测温范围 55+125,固有测温误差(注意,不是分辨率,这里之前是错误的)1。· 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成

7、信号传输的不稳定。· 工作电源: 3.05.5V/DC (可以数据线寄生电源)· 在使用中不需要任何外围元件· 测量结果以912位数字量方式串行传送· 不锈钢保护管直径 6· 适用于DN1525, DN40DN250各种介质工业管道和狭小空间设备测温· 标准安装螺纹 M10X1, M12X1.5, G1/2”任选· PVC电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接DS18B20温度数据格式DS18B20温度值指令约定代码操作说明:温度转换 44H 启动DS18B20进行温度转换读暂存器 BEH 读暂存器9字节二

8、进制数字写暂存器 4EH 将数据写入暂存器的TH、TL字节复制暂存器 48H 把暂存器的TH、TL字节写到E2PROM中重新调E2PROM B8H 把E2PROM中的TH、TL字节写到暂存器TH、TL字节读电源供电方式 B4H 启动DS18B20发送电源供电方式的信号给主CPU3.3、红外接收头HS0038B图3-3 HS0038B封装图红外接收探头,接收红外信号频率为38kHz,周期约26s。 红外接收电路一体化的红外接收装置将遥控信号的接收、放大、检波、整形集于一身,并且输出可以让单片机识别的TTL 信号,这样大大简化了接收电路的复杂程度和电路的设计工作,方便使用。在本系统中我们

9、采用红外一体化接收头HS0038B。HS0038B 黑色环氧树脂封装,不受日光、荧光灯等光源干扰,内附磁屏蔽,功耗低,灵敏度高。在用小功率发射管发射信号情况下,其接收距离可达35m。它能与TTL、COMS 电路兼容。HS0038B 为直立侧面收光型。它接收红外信号频率为38 kHz,周期约26 s,同时能对信号进行放大、检波、整形,得到TTL 电平的编码信号。三个管脚分别是地、5 V 电源、解调信号输出端。图3-4 HS0038B内部结构图3-5 HS0038B接法参考图3.4、数码管图3-6 共阳极数码管4、设计电路及原理4.1、温度接收模块图4-1 温度接收原理图4.2、红外发射模块信号调

10、制原理:基带信号:从信号源发出没有经过调制的原始信号,特点是频率较低,信号频率从0开始,频谱较宽。调制:就是用待传送信号去控制某个高频信号的幅度、相位、频率等参量变化的过程,即用一个信号去装载另一个信号。图4-2 信号调制原理图图4-3 红外发射原理图4.3、红外接收模块图4-4 红外接收原理图4.4、数码管显示模块图4-5 数码管显示原理图4.5、蜂鸣器报警模块图4-6 蜂鸣器报警模块原理图4.6、LED报警模块图4-7 LED报警模块原理图参考文献1 安毓英,刘继芳,李庆辉,冯喆珺,等. 光电子技术(第3版). 北京:电子工业出版社,20112 陈益飞,沈兆军,孙干超,等. 单片机原理及技

11、术应用. 北京:国防工业出版社,20113 阎石. 数字电子技术基础(第五版). 北京:高等教育出版社,20064 康华光. 电子技术基础模拟部分(第五版). 北京:高等教育出版社,20065 孙宏国,周云龙. 电子系统设计与实践. 北京:清华大学出版社,2012设计总结在设计过程中,经常会遇到这样那样的情况,就是心里想老着这样的接法可以行得通,但实际接上电路,总是实现不了,因此耗费在这上面的时间用去很多。我觉得做课程设计同时也是对课本知识的巩固和加强,由于课本上的知识太多,平时课间的学习并不能很好的理解和运用各个元件的功能,而且考试内容有限,所以在这次课程设计过程中,我们了解了很多元件的功能

12、,并且对于其在电路中的使用有了更多的认识。此次课程设计,学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,和与人合作共同提高,都受益非浅,今后的制作应该更轻松,自己也都能扛的起并高质量的完成项目。实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。在此,感谢王老师的细心指导,也同样谢谢其他各组同学的无私帮助!附录1、元件清单:单片机STC89C52 (2个)、温度传感器DS18B20 (1个)、红外发射二极管 (1个)、红外接收头HS0038B (1个)、数码管 (

13、3个)、蜂鸣器 (1个)、发光二极管 (8个)。2、程序清单:1)红外发送模块程序:main.c:#include<reg52.h> sbit CarryWave = P17;sbit ir_send = P16; void TransData(unsigned char _data);void CarrierWaveInit(void);void delay_ms(unsigned int t);void ConfigTimer0(unsigned int ms);void TransData2(unsigned char _data2);extern bit Start18B2

14、0();extern bit Get18B20Temp(int *temp);bit flag1s=0;bit res=0; int temp; /读取到的当前温度值unsigned char T0RH = 0; /T0重载值的高字节unsigned char T0RL = 0; /T0重载值的低字节unsigned char intT,decT; void main() EA=1; PT1=1; ConfigTimer0(1); CarrierWaveInit(); Start18B20(); /启动DS18B20 while(1) TransData(intT); TransData2(d

15、ecT); if (flag1s) /每秒更新一次温度 flag1s = 0; res = Get18B20Temp(&temp); /读取当前温度 if (res) /读取成功时,刷新当前温度显示 intT = temp >> 4;/intT=intT/16+intT%16; /分离出温度值整数部分 decT = temp & 0xF; /分离出温度值小数部分 decT = decT*10/16;/a=intT/10; /整数部分数据处理/b=intT%10; Start18B20(); /重新启动下一次转换 void TransData(unsigned cha

16、r _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<<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

17、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位 ,先发低位 /如果发送1 则高低电平比为1:1 else ir_send=1; delay_ms(1); /如果发送0 则高低电平比为1:3 ir_send=1;/*定时器1初始化函数*函数名 :CarrierWaveInit()*参 数 :无*功 能 :38K载波信号定时器初始化*返回

18、值 :无*/void CarrierWaveInit(void) EA=1; TMOD &= 0x0f; /清零T0的控制位 TMOD |= 0x20; /八位自动重装模式TH1 = 0XF4; /38k载波信号TL1 = 0XF4;ET1 = 1; /打开TR1 = 1;/*定时器1中断函数载波发生*/*函数名 :CarrierWave()*参 数 :无*功 能 :定时器中断产生38KHZ载波信号*返回值 :无*/void CarrierWave(void) interrupt 3 CarryWave = CarryWave; void delay_ms(unsigned int t

19、) /误差 -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 = 11059200 / 12; /定时器计数频率 tmp = (tmp * ms) / 1000; /计算所需的计数值 tmp = 65536 - tmp; /计算定时器重载值 tmp = tmp + 12; /补偿中断响应延时造成的误差 T0RH = (unsigned c

20、har)(tmp>>8); /定时器重载值拆分为高低字节 T0RL = (unsigned char)tmp; TMOD &= 0xf0; /清零T0的控制位 TMOD |= 0x01; /配置T0为模式1 TH0 = T0RH; /加载T0重载值 TL0 = T0RL; ET0 = 1; /使能T0中断 TR0 = 1; /启动T0/* T0中断服务函数,完成1秒定时 */void InterruptTimer0() interrupt 1 static unsigned int tmr1s = 0; TH0 = T0RH; /重新加载重载值 TL0 = T0RL; tm

21、r1s+; if (tmr1s >=700) /定时1s tmr1s = 0; flag1s = 1; DS18B20.c:#include <reg52.h>#include <intrins.h>sbit IO_18B20 = P32; /DS18B20通信引脚/* 软件延时函数,延时时间(t*10)us */void DelayX10us(unsigned char t) do _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); while (-t);bit Get1

22、8B20Ack()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)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_1

23、8B20 = 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;_nop_();_nop_();IO_18B20 = 1;_nop_();_nop_();if(!IO_18B20)dat &= mask;elsedat |= mask;DelayX10us(6);EA = 1;return dat;bit Start18B20

24、()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();if(ack = 0)Write18B20(0xCC);Write18B20(0xBE);LSB = Read18B20();MSB = Read18B20();*temp = (int)MSB<<8) + LSB;return ack;2) 红外接收模块程序

25、: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 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

26、, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E;unsigned char LedBuff6 = /数码管显示缓冲区 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF;unsigned char T0RH = 0; /T0重载值的高字节unsigned char T0RL = 0; /T0重载值的低字节unsigned char intT=0;extern bit irflag;extern unsigned char ircode4;extern void InitInfrared(void);void Con

27、figTimer0(unsigned int ms);void main() EA = 1; /开总中断 ENLED = 0; ADDR3 = 1; InitInfrared(); /初始化红外功能 ConfigTimer0(1); /配置T0定时1ms PT0 = 1; /配置T0中断为高优先级,启用本行可消除接收时的闪烁 while (1) if (irflag=1) /接收到红外数据时刷新显示 irflag = 0;intT=ircode0&0x0f+(ircode0>>4)*16 ; LedBuff2 = LedCharintT/10; /用户码显示 LedBuff

28、1 = LedCharintT%10 & 0x7f; ;/ LedBuff1 = LedChar5; /键码显示 LedBuff0 = LedCharircode1; /* 配置并启动T0,ms-T0定时时间 */void ConfigTimer0(unsigned int ms) unsigned long tmp; /临时变量 tmp = 11059200 / 12; /定时器计数频率 tmp = (tmp * ms) / 1000; /计算所需的计数值 tmp = 65536 - tmp; /计算定时器重载值 tmp = tmp + 10; /补偿中断响应延时造成的误差 T0RH

29、 = (unsigned char)(tmp>>8); /定时器重载值拆分为高低字节 T0RL = (unsigned char)tmp; TMOD &= 0xF0; /清零T0的控制位 TMOD |= 0x01; /配置T0为模式1 TH0 = T0RH; /加载T0重载值 TL0 = T0RL; ET0 = 1; /使能T0中断 TR0 = 1; /启动T0/* 数码管动态扫描刷新函数,需在定时中断中调用 */void LedScan() static unsigned char i = 0; /动态扫描索引P0=0xff; switch(i)case 0: ADDR2

30、=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 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

31、; 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) BU

温馨提示

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

评论

0/150

提交评论