您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 汽车理论 > 智能火灾报警系统仿真源程序
智能火灾报警系统仿真源程序#includereg52.h#includeeepom52.h#defineucharunsignedchar#defineuintunsignedint#includeintrins.h//数码管段选定义0123456789ucharcodesmg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};//断码//数码管位选定义ucharcodesmg_we[]={0x7f,0xbf,0xdf,0xef};//ucharcodesmg_we[]={0xfe,0xfd,0xfb,0xf7};uchardis_smg[8]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};ucharsmg_i=3;//显示数码管的个位数sbitSCL=P3^4;//SCL定义为P1口的第3位脚,连接ADC0832SCL脚sbitDO=P3^3;//DO定义为P1口的第4位脚,连接ADC0832DO脚sbitCS=P3^2;//CS定义为P1口的第4位脚,连接ADC0832CS脚sbitdq=P3^5;//18b20IO口的定义sbitbeep=P3^6;//蜂鸣器IO口定义uinttemperature,s_temp;//温度的变量uchardengji,s_dengji;//烟物等级ucharshoudong;//手动报警键uinthuoyan;bitflag_300ms;ucharkey_can;//按键值的变量ucharmenu_1;//菜单设计的变量bitflag_lj_en;//按键连加使能bitflag_lj_3_en;//按键连3次连加后使能加的数就越大了ucharkey_time,flag_value;//用做连加的中间变量bitkey_500ms;ucharflag_clock;ucharzd_break_en,zd_break_value;//自动退出设置界面uchara_a;/***********************1ms延时函数*****************************/voiddelay_1ms(uintq){uinti,j;for(i=0;iq;i++)for(j=0;j120;j++);}/***********************小延时函数*****************************/voiddelay_uint(uintq){while(q..);}/******************把数据保存到单片机内部eepom中******************/voidwrite_eepom(){SectorErase(0x2000);byte_write(0x2000,s_temp);byte_write(0x2001,s_dengji);byte_write(0x2060,a_a);}/******************把数据从单片机内部eepom中读出来*****************/voidread_eepom(){s_temp=byte_read(0x2000);s_dengji=byte_read(0x2001);a_a=byte_read(0x2060);}/**************开机自检eepom初始化*****************/voidinit_eepom(){read_eepom();//先读if(a_a!=1)//新的单片机初始单片机内问EEPOM{s_temp=50;s_dengji=5;a_a=1;write_eepom();}}/***********************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;//第三个上升沿SCL=0;//第三个下降沿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;}/***********************数码显示函数*****************************/voiddisplay(){uchari;for(i=0;ismg_i;i++){P2=smg_we[i];//位选P1=dis_smg[i];//段选delay_1ms(1);P1=0xff;//消隐P2=0xff;//位选}}/*************定时器0初始化程序***************/voidtime_init(){EA=1;//开总中断TMOD=0X01;//定时器0、定时器1工作方式1ET0=1;//开定时器0中断TR0=1;//允许定时器0定时}/****************按键处理数码管显示函数***************/voidkey_with(){if(key_can==4)//紧急报警键手动报警{if(menu_1==0)shoudong=1;}if(key_can==1)//设置键{menu_1++;if(menu_1=3){menu_1=0;}if(menu_1==0){dis_smg[0]=smg_du[temperature%10];//取温度的个位数显示dis_smg[1]=smg_du[temperature/10%10];//取温度的十位显示smg_i=3;}if(menu_1==1){dis_smg[0]=smg_du[s_temp%10];//取个位显示dis_smg[1]=smg_du[s_temp/10%10];//取十位显示dis_smg[2]=0xbf;dis_smg[3]=smg_du[10];//显示Asmg_i=4;}if(menu_1==2){dis_smg[0]=smg_du[s_dengji%10];//取个位显示dis_smg[1]=0xbf;dis_smg[2]=0xbf;dis_smg[3]=smg_du[11];//显示Bsmg_i=4;}}if(menu_1==0){if((key_can==2)||(key_can==3))shoudong=0;//取消手动报警}if(menu_1==1)//设置高温报警{if(key_can==2){if(flag_lj_3_en==0)s_temp++;//按键按下未松开自动加三次elses_temp+=10;//按键按下未松开自动加三次之后每次自动加10if(s_temp99)s_temp=99;dis_smg[0]=smg_du[s_temp%10];//取个位显示dis_smg[1]=smg_du[s_temp/10%10];//取十位显示dis_smg[2]=0xbf;dis_smg[3]=smg_du[10];//显示A}if(key_can==3){if(flag_lj_3_en==0)s_temp..;//按键按下未松开自动加三次elses_temp.=10;//按键按下未松开自动减三次之后每次自动减10if(s_temp=10)s_temp=10;dis_smg[0]=smg_du[s_temp%10];//取个位显示dis_smg[1]=smg_du[s_temp/10%10];//取十位显示dis_smg[2]=0xbf;dis_smg[3]=smg_du[10];//显示A}}if(menu_1==2)//设置低温报警{if(key_can==2){if(flag_lj_3_en==0)s_dengji++;elses_dengji++;if(s_dengji=9)s_dengji=9;dis_smg[0]=smg_du[s_dengji%10];//取个位显示dis_smg[1]=0xbf;dis_smg[2]=0xbf;dis_smg[3]=smg_du[11];//显示B}if(key_can==3){if(flag_lj_3_en==0)s_dengji..;elses_dengji..;if(s_dengji=1)s_dengji=1;dis_smg[0]=smg_du[s_dengji%10];//取个位显示dis_smg[1]=0xbf;d
本文标题:智能火灾报警系统仿真源程序
链接地址:https://www.777doc.com/doc-5165860 .html