您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 汽车理论 > 基于单片机的智能火灾报警系统设计源程序代码
#includereg52.h//调用单片机头文件#defineucharunsignedchar//无符号字符型宏定义变量范围0~255#defineuintunsignedint//无符号整型宏定义变量范围0~65535#includeintrins.h#includelcd1602.h#includeeeprom52.hsbitCS=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;iq;i++)for(j=0;j120;j++);}#includegsm.h/***************把数组清空**********************/voidclear_shuzu(uchar*p,ucharnum){for(i=0;inum;i++)p[i]='';}/******************把数据保存到单片机内部eeprom中**写电话号码****************/voidwrite_eeprom()//数据保存{SectorErase(0x2000);for(i=0;i11;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;i11;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;i11;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);//15usdq=0;//给复位脉冲delay_uint(80);//750usdq=1;//把总线拿高等待delay_uint(10);//110usq=dq;//读取18b20初始化信号delay_uint(20);//200usdq=1;//把总线拿高释放总线}/*************写18b20内的数据***************/voidwrite_18b20(uchardat){uchari;for(i=0;i8;i++){//写数据是低位开始dq=0;//把总线拿低写时间隙开始dq=dat&0x01;//向18b20总线写数据了delay_uint(5);//60usdq=1;//释放总线dat=1;}}/*************读取18b20内的数据***************/ucharread_18b20(){uchari,value;for(i=0;i8;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;i8;i++){SCL=1;SCL=0;//开始从第四个下降沿接收数据value=1;if(DO)value++;}for(i=0;i8;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;}/****************按键处理数码管显示函数
本文标题:基于单片机的智能火灾报警系统设计源程序代码
链接地址:https://www.777doc.com/doc-3329489 .html