完整word版基于单片机的智能火灾报警系统设计源程序代码分解.docx

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

完整word版基于单片机的智能火灾报警系统设计源程序代码分解.docx

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

完整word版基于单片机的智能火灾报警系统设计源程序代码分解.docx

完整word版基于单片机的智能火灾报警系统设计源程序代码分解

#include

#defineucharunsignedchar

#defineuintunsignedint

〃调用单片机头文件

//无符号字符型宏定义变量范围0-255

〃无符号整型宏定义变量范围0-65535

#includevintrins.h>

#include"lcd1602.h"

#inelude"eeprom52.h"

sbitCS=P2人4;

sbitSCL=P2A3;

sbitDO=P2人2;

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

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

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

sbitdq=P2^0;sbitbeep=P3人2;

//18b20IO口的定义〃蜂鸣器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

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

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;

//返回数据

 

 

〃初始化18b20

〃跳过64位ROM

〃启动一次温度转换命令

//500us

/*************

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

uintread_temp()

{

uintvalue;

ucharlow;〃在读取温度的时候如果中断的太频繁了,就应该把中断给

关了,否则会影响到18b20的时序

init_18b20();

write_18b20(0xcc);

write_18b20(0x44);

delay_uint(50);

write_18b20(0xcc);write_18b20(0xbe);

〃跳过64位ROM

〃发出读取暂存器命令

EA=0;

low=read_18b20();value=read_18b20();

EA=1;

value<<=8;

value|=low;

value*=0.0625;returnvalue;

}

//读温度低字节

//读温度高字节

〃把温度的高位左移8位

〃把读出的温度低位放到value的低八位中

//转换到温度值

〃返回读出的温度

/***********

********************************************************/

〃请先了解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)

〃与校验数据比较,正确就返回数据,否则返回

returnvalue;

return0;

}

I*************定^时器^

voidtime_init()

{

0初始化程序***************/

EA=1;

TMOD|=0X01;

ET0=1;

TR0=1;

II开总中断

II定时器0、定时器1工作方式1

II开定时器0中断

II允许定时器0定时

I********************

ucharkey_can;

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

II按键值

voidkey()

{

staticucharkey_new=0,key_l;

key_can=20;

P1=0x0f;

if((P1&0x0f)!

=0x0f)

{

delay_1ms

(1);

II独立按键程序

//按键值还原

II按键按下

II按键消抖动

 

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;

//得到按键值

menu_1++;

if(menu_1>=5)

{

menu_1=0;

init_1602();II初始化显示

}

if(menu_1==3)

{

〃输入第一个人的手机号码

wnte_string(1,0,"InputPhone1write_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,"InputPhone2write_string(2,0,"clear_shuzu(dis_smg,11);

for(i=0;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++;if(s_temp>99)s_temp=99;

//设置高温报警

〃高温报警值加1

}

if(key_can==13)

{

s_temp--;

if(s_temp<=10)

s_temp=10;

II咼温报警值减1

 

}

write_sfm2(1,8,s_temp);write_sfm2(2,8,s_yanwu);write_com(0x80+7);write_com(0x0f);write_eeprom();

}

if(menu_1==2)

{

//设置烟物报警

if(key_can==14)

{

s_yanwu++:

if(s_yanwu

//烟物报警值加1

>=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);wnte_com(OxOf);

write_eeprom();

//保存数据

}

if(menu_1==3)

{

〃显示烟物等级

〃将光标移动到第2行第到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);

Icd1602_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)

{

 

}

}else

{

//取

if((yanwu

消报警

//取消报警

value=0;beep=1;value1=0;

主函*****************/

/***************

voidmain()

{

init_1602();//1602液晶初始化

temperature=read_temp();//读取温度值

beep=0;

delay_1ms(200);

P0=P1=P2=P3=0xff;

init_eeprom();

time_init();

init_uart();

delay_1ms(650);

init_1602();

init_gsm();

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

{

//开机蜂鸣器叫一声

//初始化10口

〃读eeprom数据

//初始化定时器

//串口初始化

〃1602液晶初始化

//手机模块初始化

 

beeP=-beep;delay_1ms(100);

〃蜂鸣器叫3声

}

beep=1;while

(1)

{

〃关闭蜂鸣器

key();

if(key_can<20)

{

key_with();

}

if(flag_300ms==1)

{

//独立按键程序

〃按键按下要执行的程序

flag_300ms=0;

temperature=read_temp();//读取温度值

clock_h_l();

yanwu=ad0832read(1,0);

yanwu=yanwu*99/255;

if(menu_1==0)

{

if(temperature>=99)temperature=99;

write_sfm2(1,8,temperature);write_sfm2(2,8,yanwu);

〃显示温度

//显示烟物等级

 

定时器0中断服务程序***************/

voidtime0_int()interrupt1{

/*************

staticucharvalue;

TH0=0x3c;

T

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

当前位置:首页 > 医药卫生 > 基础医学

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

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