基于单片机的智能火灾报警系统设计源程序代码#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...
>=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();//初始化18b20write_18b20(0xcc);//跳过64位ROMwrite_18b20(0x44);//启动一次温度转换命令delay_uint(50);//500usinit_18b20();//初始化18b20write_18b20(0xcc);//跳过64位ROMwrite_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)//与校验数据比较,正确就返回数据,否则返回0returnvalue;return0;}/*************定时器0初始化程序***************/voidtime_init(){EA=1;//开总中断TMOD|=0X01;//定时器0、定时器1工作方式1ET0=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);}}elsekey_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;i99)s_temp=99;}if(key_can==13){s_temp--;//高温报警值减1if(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++;//烟物报警值加1if(s_yanwu>=99)s_yanwu=99;}if(key_can==13){s_yanwu--;//烟物报警值减1if(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);}beep=1;//关闭蜂鸣器value1=1;if(phone1_i==11)//只有号码输入正确才可以发短信send_PUD_hzbj();//发送报警信息请注意!火灾报警!for(i=0;i<10;i++){beep=~beep;//蜂鸣器叫3声delay_1ms(300);}beep=1;//关闭蜂鸣器if(phone2_i==11)//只有号码输入正确才可以发短信send_PUD_hzbj();//发送报警信息请注意!火灾报警!}}}else{if((yanwu =99)temperature=99;write_sfm2(1,8,temperature);//显示温度write_sfm2(2,8,yanwu);//显示烟物等级}}}}/*************定时器0中断服务程序***************/voidtime0_int()interrupt1{staticucharvalue;TH0=0x3c;TL0=0xb0;//50msvalue++;if(value%6==0){flag_300ms=1;//300msvalue=0;}}