红外线火灾报警器 详细设计说明书 V1

来源:互联网 发布:哪个旅行软件好用 编辑:程序博客网 时间:2024/06/11 20:01

目录

1 引言... 1

1.1 编写目的... 1

1.2 参考资料... 1

2 硬件设计... 1

2.1 电路模块概述... 1

2.2.1 单片机模块... 2

2.2.2 蜂鸣器模块... 2

2.2.3 红外线接收模块... 2

2.2.4 红外线发射模块... 3

2.2.5 555定时器模块... 3

2.2 各个模块之间的关系... 4

2.3 完整电路图... 5

3 软件设计... 5

3.1 需求概述... 5

3.2 软件结构... 6

4 程序描述... 6

4.1 红外线发射模块... 7

4.2 红外线接收模块... 7

4.3 蜂鸣器驱动模块... 8

4.4 完整程序代码... 9

详细设计说明书 v1.0

红外线火灾报警器

1 引言

1.1 编写目的

本文适用的读者是使用本红外线火灾报警器的用户以及对设备进行维护的工作人员.

在本设计说明书中,读者可以了解以下内容:

本产品硬件构成.

本产品所用到的程序的代码及其相互架构关系.

本产品程序代码的详细解释,以及所选取的实现的方式的解释.

1.2 参考资料

<用8051单片机接收红外遥控的实现>

<利用红外线检测的火灾报警器>

IR333 MC145012 NE555 IRM 2638相应芯片的DATASHEET

2 硬件设计

2.1 电路模块概述

2.2.1 单片机模块

clip_image002

2.2.2 蜂鸣器模块

clip_image004

2.2.3 红外线接收模块

clip_image006

2.2.4 红外线发射模块

clip_image008

2.2.5 555定时器模块

clip_image010

2.2 各个模块之间的关系

clip_image011

2.3 完整电路图

clip_image013

3 软件设计

3.1 需求概述

由硬件构成可知,我们的程序需要对蜂鸣器和定时器模块进行驱动,分别完成危险情况下的报警和调制555定时器使其产生我们需要的波形的功能.

红外线通信广泛采用的方式是利用38KHZ的红外线作为传输数据的载波,然后通过对这个38KHZ的载波进行调制来达到传输数据的功能.因此市面上能够购买到的红外线接收头都是对38KHZ来进行解调的.因此本设计的通信频段设定为38KHZ.

产生38KHZ载波有两个方案,第一个方案是利用单片机的定时器中断,第二个方案是利用555定时器.利用单片机的话就不需要额外的外围电路,但是随之而来的问题是占空比调节相对繁琐.经过试验证明,红外线接收头是对一定占空比的38KHZ载波敏感,所以本产品采用了555定时器相对稳妥的方法.

555定时器的4号脚为其使能信号脚,因此可以利用这个脚对发射的38KHZ载波进行调制,4号脚低电平时不发射载波,高电平时发射载波.通过这种方式实现了发射38KHZ载波,调制了相应信号的红外线.

同时,为了实现对接收到的红外线信号的解调,本产品利用了一个定时器通过外部中断脚在下降沿触发的模式对接收到的红外线信号进行解调.

最后,在检测到危险时,需要驱动蜂鸣器报警,所以我们需要一个蜂鸣器驱动模块.

综上,软件的设计需要三个模块完成全部功能.

3.2 软件结构

clip_image014

4 程序描述

下面对各个模块的代码进行尽可能详细的解释:

4.1 红外线发射模块

void timer0(void) interrupt 1 using 1 //定时器0

{

inttime++; //利用inttime的计数,完成对载波的调制

IREncode(); //编码函数

if(flag) //flag值根据inttime值改变而改变

P1_0=1;

else

P1_0=0;

TH0=0xEA; //重置计数器初值

TL0=0x60;

}

void IREncode(void) //编码函数

{

codelocation=inttime%10;

if(codelocation==1||codelocation==3||codelocation==5)

flag=1;

else

flag=0;

}

4.2 红外线接收模块

void timer1(void) interrupt 0 using 0 //计数器1

{

EX1=0; //关闭中断

TR1=0; //关计时器

INTInterval=TH1; //读出寄存器计数值用来解调

IRDecode(); //运行解调函数

TH1=0; //计数值重置

TL1=0;

TR1=1; //计数器开始运行

EX1=1; //开中断

}

void IRDecode(void) //解码函数

{

if((INTInterval>0x70)&&(INTInterval<0x90))//利用INTIterval数值算出脉冲间隔

{

output=0;

startflag=1;

}

else if((INTInterval>0x20)&&(INTInterval<0x2F)&&startflag)

{

output=(output<<1)+1;

}

else if(INTInterval==0)

startflag=0;

}

4.3 蜂鸣器驱动模块

void delay(unsigned int i) //延时程序

{

while(i--);

}

void play_hz(unsigned int u) //演奏音调

{

unsigned int i=u;

while(i--)

{

buz=0;

buz=1;

delay(18432/u-24);

}

}

void play_sound(int i)

{

if(i<28)

play_hz(hzs[i-1]);

else

delay(500);

}

void play_alarm(void) //播放报警音

{

while(1)

{

int i=0;

while(dots[i]!='#')

play_sound(dots[i++]);

delay(20000);

}

}

4.4 完整程序代码

#include

sbit P1_0=P1^0;

sbit buz=P1^1;

int inttime=0;

int pulsetime=0;

int codelocation=0;

int flag=0;

int INTInterval=0;

int output=0;

int startflag=0;

unsigned int hzs[]={131,147,165,175,196,220,247,262,294,330,349,392,440,494,523,587,659,698,784,880,988,1047,1175,1319,1397,1568,1760,1976};

char dots[]={8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,'#'};

void play_hz(unsigned int);

void play_sound(int);

void play_alarm(void);

void delay(unsigned int);

void IREncode(void);

void IREncode(void)

{

codelocation=inttime%10;

if(codelocation==1||codelocation==3||codelocation==5)

flag=1;

else

flag=0;

}

void IRDecode(void)

{

if((INTInterval>0x70)&&(INTInterval<0x90))

{

output=0;

startflag=1;

}

else if((INTInterval>0x20)&&(INTInterval<0x2F)&&startflag)

{

output=(output<<1)+1;

}

else if(INTInterval==0)

startflag=0;

}

void delay(unsigned int i)

{

while(i--);

}

void play_hz(unsigned int u)

{

unsigned int i=u;

while(i--)

{

buz=0;

buz=1;

delay(18432/u-24);

}

}

void play_sound(int i)

{

if(i<28)

play_hz(hzs[i-1]);

else

delay(500);

}

void play_alarm(void)

{

while(1)

{

int i=0;

while(dots[i]!='#')

play_sound(dots[i++]);

delay(20000);

}

}

void timer0(void) interrupt 1 using 1

{

inttime++;

IREncode();

if(flag)

P1_0=!P1_0;

else

P1_0=0;

TH0=0xEA;

TL0=0x60;

}

void timer1(void) interrupt 0 using 0

{

EX1=0;

TR1=0;

INTInterval=TH1;

IRDecode();

TH1=0;

TL1=0;

TR1=1;

pulsetime++;

EX1=1;

}

void main()

{

TMOD=0x11;

ET0=1;

TR0=1;

TR1=1;

IE0=1;

IT0=1;

EX0=1;

EA=1;

TH1=0;

TL1=0;

TH0=0xEA;

TL0=0x60;

while(1)

{

if(ouput=3)

{

EA=0;

break;

}

}

play_alarm();

}

原创粉丝点击