基于单片机的智能火灾报警系统设计源程序代码.docx

上传人:b****5 文档编号:6565947 上传时间:2023-01-07 格式:DOCX 页数:18 大小:19.51KB
下载 相关 举报
基于单片机的智能火灾报警系统设计源程序代码.docx_第1页
第1页 / 共18页
基于单片机的智能火灾报警系统设计源程序代码.docx_第2页
第2页 / 共18页
基于单片机的智能火灾报警系统设计源程序代码.docx_第3页
第3页 / 共18页
基于单片机的智能火灾报警系统设计源程序代码.docx_第4页
第4页 / 共18页
基于单片机的智能火灾报警系统设计源程序代码.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

基于单片机的智能火灾报警系统设计源程序代码.docx

《基于单片机的智能火灾报警系统设计源程序代码.docx》由会员分享,可在线阅读,更多相关《基于单片机的智能火灾报警系统设计源程序代码.docx(18页珍藏版)》请在冰豆网上搜索。

基于单片机的智能火灾报警系统设计源程序代码.docx

基于单片机的智能火灾报警系统设计源程序代码

#include//调用单片机头文件

#defineucharunsignedchar//无符号字符型宏定义变量范围0~255

#defineuintunsignedint//无符号整型宏定义变量范围0~65535

#include

#include"lcd1602.h"

#include"eeprom52.h"

sbitCS=P2^4;//CS定义为P2口的第4位脚,连接ADC0832CS脚

sbitSCL=P2^3;//SCL定义为P2口的第3位脚,连接ADC0832SCL脚

sbitDO=P2^2;//DO定义为P2口的第2位脚,连接ADC0832DO脚

sbitdq=P2^0;//18b20IO口的定义

sbitbeep=P3^2;//蜂鸣器IO口定义

uinttemperature,s_temp;//温度的变量

ucharyanwu,s_yanwu;//烟物等级

ucharshoudong;//手动报警键

 

bitflag_300ms;

ucharkey_can;//按键值的变量

ucharmenu_1;//菜单设计的变量

bitkey_500ms;

ucharphone1_i=0;//电话号码是多少位

ucharphone2_i=0;//电话号码是多少位

ucharphone1_call[11]={""};

ucharphone2_call[11]={""};

uchardis_smg[11];

 

/***********************1ms延时函数*****************************/

voiddelay_1ms(uintq)

{

uinti,j;

for(i=0;i

for(j=0;j<120;j++);

}

#include"gsm.h"

 

/***************把数组清空**********************/

voidclear_shuzu(uchar*p,ucharnum)

{

for(i=0;i

p[i]='';

}

 

/******************把数据保存到单片机内部eeprom中**写电话号码****************/

voidwrite_eeprom()//数据保存

{

SectorErase(0x2000);

for(i=0;i<11;i++)

byte_write(0x2000+i,phone1_call[i]);

byte_write(0x2012,phone1_i);

byte_write(0x2013,phone2_i);

byte_write(0x2014,s_temp);

byte_write(0x2015,s_yanwu);

byte_write(0x2016,a_a);

byte_write(0x2020,phone2_call[0]);

byte_write(0x2021,phone2_call[1]);

byte_write(0x2022,phone2_call[2]);

byte_write(0x2023,phone2_call[3]);

byte_write(0x2024,phone2_call[4]);

byte_write(0x2025,phone2_call[5]);

byte_write(0x2026,phone2_call[6]);

byte_write(0x2027,phone2_call[7]);

byte_write(0x2028,phone2_call[8]);

byte_write(0x2029,phone2_call[9]);

byte_write(0x2030,phone2_call[10]);

}

/******************把数据从单片机内部eeprom中读出来**读电话号码***************/

voidread_eeprom()

{

for(i=0;i<11;i++)

phone1_call[i]=byte_read(0x2000+i);

phone1_i=byte_read(0x2012);

phone2_i=byte_read(0x2013);

s_temp=byte_read(0x2014);

s_yanwu=byte_read(0x2015);

a_a=byte_read(0x2016);

phone2_call[0]=byte_read(0x2020);

phone2_call[1]=byte_read(0x2021);

phone2_call[2]=byte_read(0x2022);

phone2_call[3]=byte_read(0x2023);

phone2_call[4]=byte_read(0x2024);

phone2_call[5]=byte_read(0x2025);

phone2_call[6]=byte_read(0x2026);

phone2_call[7]=byte_read(0x2027);

phone2_call[8]=byte_read(0x2028);

phone2_call[9]=byte_read(0x2029);

phone2_call[10]=byte_read(0x2030);

}

/**************开机自检eeprom初始化*****************/

voidinit_eeprom()

{

read_eeprom();//读电话号码

if(a_a!

=22)

{

a_a=22;

for(i=0;i<11;i++)

{

phone1_call[i]='';

phone2_call[i]='';

}

phone1_i=0;

phone2_i=0;

s_temp=50;

s_yanwu=60;

write_eeprom();//保存数据

}

}

/***********************18b20初始化函数*****************************/

voidinit_18b20()

{

bitq;

dq=1;//把总线拿高

delay_uint

(1);//15us

dq=0;//给复位脉冲

delay_uint(80);//750us

dq=1;//把总线拿高等待

delay_uint(10);//110us

q=dq;//读取18b20初始化信号

delay_uint(20);//200us

dq=1;//把总线拿高释放总线

}

/*************写18b20内的数据***************/

voidwrite_18b20(uchardat)

{

uchari;

for(i=0;i<8;i++)

{//写数据是低位开始

dq=0;//把总线拿低写时间隙开始

dq=dat&0x01;//向18b20总线写数据了

delay_uint(5);//60us

dq=1;//释放总线

dat>>=1;

}

}

/*************读取18b20内的数据***************/

ucharread_18b20()

{

uchari,value;

for(i=0;i<8;i++)

{

dq=0;//把总线拿低读时间隙开始

value>>=1;//读数据是低位开始

dq=1;//释放总线

if(dq==1)//开始读写数据

value|=0x80;

delay_uint(5);//60us读一个时间隙最少要保持60us的时间

}

returnvalue;//返回数据

}

/*************读取温度的值读出来的是小数***************/

uintread_temp()

{

uintvalue;

ucharlow;//在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序

init_18b20();//初始化18b20

write_18b20(0xcc);//跳过64位ROM

write_18b20(0x44);//启动一次温度转换命令

delay_uint(50);//500us

init_18b20();//初始化18b20

write_18b20(0xcc);//跳过64位ROM

write_18b20(0xbe);//发出读取暂存器命令

EA=0;

low=read_18b20();//读温度低字节

value=read_18b20();//读温度高字节

EA=1;

value<<=8;//把温度的高位左移8位

value|=low;//把读出的温度低位放到value的低八位中

value*=0.0625;//转换到温度值

returnvalue;//返回读出的温度

}

 

/***********读数模转换数据********************************************************/

//请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的

//100通道

//111通道

unsignedcharad0832read(bitSGL,bitODD)

{

unsignedchari=0,value=0,value1=0;

SCL=0;

DO=1;

CS=0;//开始

SCL=1;//第一个上升沿

SCL=0;

DO=SGL;

SCL=1;//第二个上升沿

SCL=0;

DO=ODD;

SCL=1;//第三个上升沿

DO=1;

for(i=0;i<8;i++)

{

SCL=1;

SCL=0;//开始从第四个下降沿接收数据

value<<=1;

if(DO)

value++;

}

for(i=0;i<8;i++)

{//接收校验数据

value1>>=1;

if(DO)

value1+=0x80;

SCL=1;

SCL=0;

}

CS=1;

SCL=1;

if(value==value1)//与校验数据比较,正确就返回数据,否则返回0

returnvalue;

return0;

}

 

/*************定时器0初始化程序***************/

voidtime_init()

{

EA=1;//开总中断

TMOD|=0X01;//定时器0、定时器1工作方式1

ET0=1;//开定时器0中断

TR0=1;//允许定时器0定时

}

 

/********************独立按键程序*****************/

ucharkey_can;//按键值

voidkey()//独立按键程序

{

staticucharkey_new=0,key_l;

key_can=20;//按键值还原

P1=0x0f;

if((P1&0x0f)!

=0x0f)//按键按下

{

delay_1ms

(1);//按键消抖动

if(((P1&0x0f)!

=0x0f)&&(key_new==1))

{//确认是按键按下

key_new=0;

key_l=(P1|0xf0);//矩阵键盘扫描

P1=key_l;

switch(P1)

{

case0xee:

key_can=1;break;//得到按键值

case0xde:

key_can=4;break;//得到按键值

case0xbe:

key_can=7;break;//得到按键值

case0x7e:

key_can=10;break;//得到按键值

case0xed:

key_can=2;break;//得到按键值

case0xdd:

key_can=5;break;//得到按键值

case0xbd:

key_can=8;break;//得到按键值

case0x7d:

key_can=0;break;//得到按键值

case0xeb:

key_can=3;break;//得到按键值

case0xdb:

key_can=6;break;//得到按键值

case0xbb:

key_can=9;break;//得到按键值

case0x7b:

key_can=11;break;//得到按键值

case0xe7:

key_can=15;break;//得到按键值

case0xd7:

key_can=14;break;//得到按键值

case0xb7:

key_can=13;break;//得到按键值

case0x77:

key_can=12;break;//得到按键值

}

//write_sfm2(1,0,key_can);

}

}

else

key_new=1;

}

/****************按键处理数码管显示函数***************/

voidkey_with()

{

if(key_can==1)//紧急报警键手动报警

{

if(menu_1==0)

shoudong=1;

}

if(key_can==12)//退出设置键

{

menu_1=0;

init_1602();//初始化显示

}

if(key_can==15)//设置键

{

menu_1++;

if(menu_1>=5)

{

menu_1=0;

init_1602();//初始化显示

}

if(menu_1==3)//输入第一个人的手机号码

{

write_string(1,0,"InputPhone1");

write_string(2,0,"");

clear_shuzu(dis_smg,11);

for(i=0;i

dis_smg[i]=0x30+phone1_call[i];

write_string_num(2,0,dis_smg,phone1_i);//显示号码

lcd1602_guanbiao(1,phone1_i+0x40);//开光标

}

if(menu_1==4)//输入第二个人的手机号码

{

write_string(1,0,"InputPhone2");

write_string(2,0,"");

clear_shuzu(dis_smg,11);

for(i=0;i

dis_smg[i]=0x30+phone2_call[i];

write_string_num(2,0,dis_smg,phone2_i);//显示号码

lcd1602_guanbiao(1,phone2_i+0x40);//开光标

}

}

if(menu_1==0)

{

if((key_can==2)||(key_can==3))

shoudong=0;//取消手动报警

}

if(menu_1==1)//设置高温报警

{

if(key_can==14)

{

s_temp++;//高温报警值加1

if(s_temp>99)

s_temp=99;

}

if(key_can==13)

{

s_temp--;//高温报警值减1

if(s_temp<=10)

s_temp=10;

}

write_sfm2(1,8,s_temp);//显示温度

write_sfm2(2,8,s_yanwu);//显示烟物等级

write_com(0x80+7);//将光标移动到第2行第到3位

write_com(0x0f);//显示光标并且闪烁

write_eeprom();//保存数据

}

if(menu_1==2)//设置烟物报警

{

if(key_can==14)

{

s_yanwu++;//烟物报警值加1

if(s_yanwu>=99)

s_yanwu=99;

}

if(key_can==13)

{

s_yanwu--;//烟物报警值减1

if(s_yanwu<=1)

s_yanwu=1;

}

write_sfm2(1,8,s_temp);//显示温度

write_sfm2(2,8,s_yanwu);//显示烟物等级

write_com(0x80+0x40+7);//将光标移动到第2行第到3位

write_com(0x0f);//显示光标并且闪烁

write_eeprom();//保存数据

}

if(menu_1==3)//设置第一个人短信号码

{

if(key_can<10)//只有数字键

{

if(phone1_i<11)

{

phone1_call[phone1_i]=key_can;

dis_smg[phone1_i]=0x30+key_can;

phone1_i++;

if(phone1_i>11)

phone1_i=11;

write_string_num(2,0,dis_smg,phone1_i);//显示号码

lcd1602_guanbiao(1,0+phone1_i+0x40);//开光标

}

}

if(key_can==11)//删除键

{

if(phone1_i!

=0)

{

phone1_i--;

phone1_call[phone1_i]='';

dis_smg[phone1_i]='';

write_string(2,0,"");

write_string_num(2,0,dis_smg,phone1_i);//显示号码

lcd1602_guanbiao(1,0+phone1_i+0x40);//开光标

}

}

write_eeprom();//保存数据

}

if(menu_1==4)//设置第二个人短信号码

{

if(key_can<10)//只有数字键

{

if(phone2_i<11)

{

phone2_call[phone2_i]=key_can;

dis_smg[phone2_i]=0x30+key_can;

phone2_i++;

if(phone2_i>11)

phone2_i=11;

write_string_num(2,0,dis_smg,phone2_i);//显示号码

lcd1602_guanbiao(1,0+phone2_i+0x40);//开光标

}

}

if(key_can==11)//删除键

{

if(phone2_i!

=0)

{

phone2_i--;

phone2_call[phone2_i]='';

dis_smg[phone2_i]='';

write_string(2,0,"");

write_string_num(2,0,dis_smg,phone2_i);//显示号码

lcd1602_guanbiao(1,0+phone2_i+0x40);//开光标

}

}

write_eeprom();//保存数据

}

}

/****************报警函数***************/

voidclock_h_l()

{

staticucharvalue,value1;

if((yanwu>=s_yanwu)||(temperature>=s_temp)||(shoudong==1))//报警

{

value++;

if(value>=2)

{

value=10;

beep=~beep;//蜂鸣器报警

if(value1==0)

{

for(i=0;i<6;i++)

{

beep=~beep;//蜂鸣器叫3声

delay_1ms(100);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1