基于单片机的配电室监控系统的设计与实现_第1页
基于单片机的配电室监控系统的设计与实现_第2页
基于单片机的配电室监控系统的设计与实现_第3页
基于单片机的配电室监控系统的设计与实现_第4页
基于单片机的配电室监控系统的设计与实现_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

科技学院2021届本科毕业设计(论文)摘要AbstractⅡⅡ摘要附录B程序#include<reg52.h>#include<intrins.h>#include"sim800.h" #defineucharunsignedchar //以后unsignedchar就可以用uchar代替#defineuintunsignedint //以后unsignedint就可以用uint代替/*******************************定义全局变量********************************/unsignedchar*content2="Smoke_warning\r\n";unsignedchar*content3="Fire_warning\r\n";unsignedchar*content4="Body_warning\r\n";intAlarmTH=30; //可燃气体上限报警值intAlarmHH=50; intAlarmGL=200; //烟雾浓度上限报警值ucharU8FLAG,k; //温湿度检测过程中用到的变量ucharU8count,U8temp;ucharU8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;ucharU8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;ucharU8comdata;unsignedcharmoshi=0;//工作模式unsignedchardat,dat1;longValue,Value1; unsignedcharstr_yw[6];//浓度显示缓存bitc1,c2,c3,c4;//短信已发送过标志uintsum;bitrt_flag;bitsf_flag_buff=0;//启动设防标志bitsf_flag=0;//设防标志bitflag1s=0;//定时标志/******************引脚定义********************/sbitsf_led=P1^3;//布放灯sbithuoyan=P1^5;//火焰sbitfengshan=P1^4;//风扇sbitBuzzer_P=P1^7;//蜂鸣器sbitCS=P1^0;sbitClk=P1^1;sbitDATI=P1^2;sbitDATO=P1^2;sbitP2_0=P3^2; //温湿度传感器DHT11数据引脚sbitrenti=P3^3;//人体sbitshezhi=P3^7; //按键1,“设置”sbitjia=P3^6; //按键2,“减”sbitjian=P3^5; //按键3,“加”sbitshefang=P3^4; //按键4,“设防”/*******************************函数声明********************************/externvoidInitLcd1602(); //液晶初始化函数externvoidLcdWriteDat(unsignedchardat);//液晶写命令函数externvoidLcdWriteCmd(unsignedcharcmd);//液晶写命令函数externvoidLcdShowStr(unsignedcharx,unsignedchary,unsignedchar*str);//液晶显示字符串函数externvoidLcdSetCursor(unsignedcharx,unsignedchary); //液晶设置坐标位置函数/*****液晶输出2位数字(x,y)-对应屏幕上的起始坐标,num-两位数字*****************/voidLcdShow_2Num(unsignedcharx,unsignedchary,unsignedcharnum){ LcdSetCursor(x,y);//设置起始地址 LcdWriteDat(num/10+0x30); //十位 LcdWriteDat(num%10+0x30); //个位}/****液晶输出3位数字(x,y)-对应屏幕上的起始坐标,num-两位数字**********/voidLcdShow_3Num(unsignedcharx,unsignedchary,unsignedintnum){ LcdSetCursor(x,y);//设置起始地址 LcdWriteDat(num/100+0x30); //百位 LcdWriteDat(num/10%10+0x30);//十位LcdWriteDat(num%10+0x30); //个位}/****************延时函数******************************/voidDelay(uintj){uchari; for(;j>0;j--) { for(i=0;i<27;i++); }}voidDelay_10us(void){uchari;i--;i--;i--;i--;i--;i--;}/*********温湿度传感器驱动函数**************************/ voidCOM(void){ uchari;for(i=0;i<8;i++) { U8FLAG=2; while((!P2_0)&&U8FLAG++); Delay_10us();Delay_10us(); Delay_10us(); U8temp=0; if(P2_0)U8temp=1; U8FLAG=2; while((P2_0)&&U8FLAG++); //超时则跳出for循环 if(U8FLAG==1)break; //判断数据位是0还是1 //如果高电平高过预定0高电平值则数据位为1 U8comdata<<=1; U8comdata|=U8temp;//0 } }/*********湿度读取子程序***********************************************/ voidRH(void) { //主机拉低18msP2_0=0; Delay(180); P2_0=1; //总线由上拉电阻拉高主机延时20us Delay_10us(); Delay_10us();Delay_10us(); Delay_10us(); //主机设为输入判断从机响应信号 P2_0=1; //判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行 if(!P2_0) //T! { U8FLAG=2; //判断从机是否发出80us的低电平响应信号是否结束 while((!P2_0)&&U8FLAG++); U8FLAG=2; //判断从机是否发出80us的高电平,如发出则进入数据接收状态 while((P2_0)&&U8FLAG++); //数据接收状态 COM(); U8RH_data_H_temp=U8comdata; COM(); U8RH_data_L_temp=U8comdata; COM(); U8T_data_H_temp=U8comdata; COM(); U8T_data_L_temp=U8comdata; COM(); U8checkdata_temp=U8comdata; P2_0=1; //数据校验 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); if(U8temp==U8checkdata_temp) { U8RH_data_H=U8RH_data_H_temp; U8RH_data_L=U8RH_data_L_temp; U8T_data_H=U8T_data_H_temp; U8T_data_L=U8T_data_L_temp; U8checkdata=U8checkdata_temp; }//fi }//fi}/*****温湿度显示和报警判断子程序********************************************/voidxianshi(void){LcdShow_2Num(2,0,U8T_data_H);//显示温度 LcdShow_2Num(10,0,U8RH_data_H);//显示湿度 if((U8T_data_H>AlarmTH)||(Value1>AlarmGL)||(rt_flag==1)||(huoyan==0))//只要有1个超标 Buzzer_P=0;//蜂鸣器响 else//全部无异常 Buzzer_P=1; //蜂鸣器不响 if(U8RH_data_H>AlarmHH)fengshan=0;elsefengshan=1; if(Value1>AlarmGL)//烟雾大于报警值 { //烟雾报警指示灯亮 if(c2==0) //没有发送过短信 { Send_message_gsm(content2); //向卡发烟雾报警短信 c2=1; //已发短信,标志置1 } } if(huoyan==0)//有火焰 { if(c3==0) { Send_message_gsm(content3); c3=1; } } if(rt_flag==1) //人体报警 { if(c4==0) { Send_message_gsm(content4); c4=1; } } }/*********按键扫描并处理********************************/voidKey_set_scan(void){ if(shezhi==0) //设置键 { Delay_Ms(10); //延时消抖 if(shezhi==0) //再次判断按键按下 { while(!shezhi);//等待按键松开 LcdWriteCmd(0x01);//清屏 moshi++; //模式切换 if(moshi>=4)moshi=0; if(moshi==0) //检测模式 { LcdShowStr(0,0,"T:CH:%RH");//液晶切换显示界面 LcdShowStr(0,1,"Smoke:ppm");//显示到液晶屏上 LcdSetCursor(4,0);//设置起始地址 LcdWriteDat(0xdf); //显示温度小圆点 } elseif(moshi==1) //设置温度报警值模式 { LcdShowStr(3,0,"Set_Temp_H"); LcdShow_2Num(7,1,AlarmTH); } elseif(moshi==2) //设置湿度报警值模式 { LcdShowStr(3,0,"Set_Humi_H"); LcdShow_2Num(7,1,AlarmHH);// } elseif(moshi==3)//设置烟雾报警值模式 { LcdShowStr(3,0,"Set_Somke_H"); LcdShow_3Num(7,1,AlarmGL);//显示烟雾上限报警值 } } } if(jia==0)//加键按下 { Delay_Ms(80);//延时 if(jia==0) { //while(!jia); if(moshi==1) { AlarmTH++; if(AlarmTH>=99)AlarmTH=99; //最大为99 LcdShow_2Num(7,1,AlarmTH); } if(moshi==2) { AlarmHH++; if(AlarmHH>=99)AlarmHH=99; //最大为99 LcdShow_2Num(7,1,AlarmHH); } if(moshi==3)//设置烟雾报警值模式下 { AlarmGL++;//烟雾报警值加1 if(AlarmGL>=999)AlarmGL=999;//最大为999 LcdShow_3Num(7,1,AlarmGL);//显示烟雾报警值 } } } if(jian==0) //减键按下 { Delay_Ms(80);//延时 if(jian==0) { //while(!jian); if(moshi==1)// { AlarmTH--; if(AlarmTH<=1)AlarmTH=1;//最小为1 LcdShow_2Num(7,1,AlarmTH); } if(moshi==2)// { AlarmHH--; if(AlarmHH<=1)AlarmHH=1;//最小为1 LcdShow_2Num(7,1,AlarmHH); } if(moshi==3)//设置烟雾报警值模式下 { AlarmGL--;//烟雾报警值减1 if(AlarmGL<=1)AlarmGL=1;//最小为1 LcdShow_3Num(7,1,AlarmGL);//显示烟雾报警值 } } } if(shefang==0)//设防键 { Delay_Ms(10); if(shefang==0) { while(!shefang); if(sf_flag==0)//如果没有设防,进入设防 { sf_flag_buff=1; sf_led=0; } else //否则,关闭设防 { sf_flag=0; sf_flag_buff=0; sf_led=1; rt_flag=0; } } }}/****************************************************************************函数功能:AD转换子程序入口参数:CH出口参数:dat****************************************************************************/unsignedcharadc0832(unsignedcharCH){unsignedchari,test,adval;adval=0x00;test=0x00;Clk=0;//初始化DATI=1;_nop_();CS=0;_nop_();Clk=1;_nop_();if(CH==0x00)//通道选择{Clk=0;DATI=1;//通道0的第一位_nop_();Clk=1;_nop_();Clk=0;DATI=0;//通道0的第二位_nop_();Clk=1;_nop_();}else{Clk=0;DATI=1;//通道1的第一位_nop_();Clk=1;_nop_();Clk=0;DATI=1;//通道1的第二位_nop_();Clk=1;_nop_();}Clk=0;DATI=1;for(i=0;i<8;i++)//读取前8位的值{_nop_();adval<<=1;Clk=1;_nop_();Clk=0;if(DATO)adval|=0x01;elseadval|=0x00;}for(i=0;i<8;i++)//读取后8位的值{test>>=1;if(DATO)test|=0x80;elsetest|=0x00;_nop_();Clk=1;_nop_();Clk=0;}if(adval==test)//比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉dat=test;nop_();CS=1;//释放ADC0832DATO=1;Clk=1; if(dat!=128) { dat1=dat; }returndat1;}/*定时器初始化子程序*/voidInit_Timer0(void){TMOD|=0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TH0=(65536-1000)/256; //重新赋值1msTL0=(65536-1000)%256;EA=1;//总中断打开ET0=1;//定时器中断打开TR0=1;//定时器开关打开PT0=1;//优先级打开}/*************************系统主程序*****************************/voidmain(){ unsignedchari,m;//循环变量Init_Timer0(); //定时器初始化 Uart_Init(); //串口初始化 InitLcd1602();//液晶初始化 LcdShowStr(0,0,"Systeminit"); //液晶显示初始界面LcdShowStr(0,1,"pleasewait"); for(i=0;i<6;i++)//延时等待网络稳定 { Delay_Ms(800); } LcdWriteCmd(0x01);//清屏 LcdShowStr(0,0,"T:CH:%RH");//液晶切换显示界面 LcdShowStr(0,1,"Smoke:ppm");//显示到液晶屏上 LcdSetCursor(4,0);//设置起始地址 LcdWriteDat(0xdf); //显示温度小圆点 while(1)//主循环 { Key_set_scan();//按键扫描 if(moshi==0)//当在检测模式时{ RH(); //调用温湿度读取子程序 Value1=adc0832(0);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论