摘要

由于火灾的频繁发生,人们不仅在物质上有巨大的损失,同时在精神上也饱受折磨,最让人痛心惋惜的还是那些为了国家无私奉献生命的消防人员。为了解决火灾给人们带来的巨大损害,本项目设计了一款基于单片机的灭火机器人。
本次设计利用STC89C52RC单片机为核心控制器;采用红外循迹传感器控制灭火机器人的行走轨迹,通过接收管接收到红外线的数量判定路况信息;采用火焰传感器探测火焰,通过检测的火焰判定其火焰的位置;采用L293D电机驱动芯片,通过一个芯片控制两个电机的转动;灭火主要是通过马达提供动力驱动四叶风扇旋转。
结果表明,本项目设计的成本较低、性能较好,整体设计较为合理且易于操作。同时对灭火机器人软件与硬件方面进行了调试,实现了全部预期的功能。人们可以使用灭火机器人来灭火,这样能够减少一些火灾带来的损失。灭火机器人还可以代替人员闯入火场进行灭火作业,灭火人员的人身安全得到更大保证,同时灭火也可达到预期效果。

设计内容

在灭火机器人开始运行,寻找并发现火源过程中,首先需要提前调节电位器,让火源与灭火机器人保持安全距离,然后单片机通过火焰探测模块发现火源,并快速、准确的识别火源的具体位置,为准确扑灭火源做好准备;单片机接收到火源信号反馈后,灭火模块控制风扇转动完成灭火处理,当检测到无火焰的时候风扇会继续转动一段时间,然后停下,并开始继续探测下处火焰位置。本系统大体上分为6个基本模块,分别为控制模、循迹模块、火焰探测模块、电源模块、小车驱动模块和灭火模块[6]。系统模块总设计如图1.1所示。
在这里插入图片描述

图1.1系统模块总设计图

系统总程序设计

系统总程序设计
主程序为一个系统的设计主干,它可决定灭火机器人的主要工作内容。每个功能的实现还需要调用具体的子程序来运行[15]。智能灭火机器人主要工作过程为:电源给电系统初始化,灭火机器人开始根据黑色轨迹线路进行行走,火焰传感器感应到火焰的位置,一定距离开始后,风扇开始旋转,直到将火焰扑灭,火焰扑灭后,风扇将持续一段时间转动后再停止,然后小车再开始继续前进寻找下一处火焰。系统主程序流程图如图3.2所示。
在这里插入图片描述

图3.2 系统主程序流程图

实物图

在这里插入图片描述

在这里插入图片描述

程序清单

#include<AT89X52.H>		  //包含51单片机头文件,内部有各种寄存器定义
#include<HJ-2WD_PWM_FK.H>		  //HJ-2WD智能车专用头文件

#define uchar unsigned char
#define uint  unsigned int

unsigned char n,count,angle;//距离标志位,0.5ms次数,角度标识

uchar i;
void DelayUs2x(uchar t)
{   
	while(--t);
}
void DelayMs(uchar t)
{
	while(t--)
	{
	    //大致延时1mS	
		DelayUs2x(245);
	    DelayUs2x(245);
	}
}

/*------------------------------------------------
                    定时器01初始化
//定时器1工作方式1 (舵机 ),定时器0 电机PWM调速控制信号
------------------------------------------------*/
void Time1_Int() interrupt 3//舵机
{
	TH1=0xff;
	TL1=0xa3;
	if(count<angle)//判断0.5ms次数是否小于角度标识
    pwm=1;//确实小于,pwm输出高电平
    else
    pwm=0;//大于则输出低电平
	count=(count+1);//0.5ms次数加1
	count=count%40;//次数始终保持为40即保持周期为20ms
}

//主函数
	void main(void)
{	

    count=0;
    P0=0XF0;   //关电机	

		 	TMOD=0X11;
        	TH0= 0XFc;		  //1ms定时
         	TL0= 0X18;
           	TR0= 1;
        	ET0= 1;
	        EA = 1;			   //开总中断

			TH1=0xff;
	        TL1=0xa3;
			ET1=1;
			TR1= 1;
			

	while(1)	//无限循环
	{ 
	 
			 //有火焰信号S=0   没有火焰信号S=1 

              if(S==0)	 //检测到有火焰时

			  {
  				    stop();		//调用电机停止函数
					F=0;	   //打开风扇灭火
					delay(200);		//
					F=1;	   //关掉灭火风扇
				    stop();		//调用电机停止函数
				    delay(100);		//??毫秒

			  }


               //巡黑线 有信号为0 白线  没有信号为1 黑线

              if(Left_1_led==0&&Right_1_led==0&&S==1)

			  {
			  F=1;   //关风扇
			  run();   //调用前进函数
			  }

				  if(Left_1_led==1&&Right_1_led==1)

			  {
			  stop();   //调用停止函数
			  }
			 			  
			  if(Left_1_led==1&&Right_1_led==0)	    //左边检测到黑线
			 	 
			  {	 	 
			 	  leftrun();		  //调用小车左转  函数
			   }
			   
			   if(Right_1_led==1&&Left_1_led==0)		//右边检测到黑线
				  
			  {	        
				rightrun();		   //调用小车右转	函数
			   }			 			  
				 
	 }
}
//循迹
#ifndef _LED_H_
#define _LED_H_



    //定义小车驱动模块输入IO口 
	sbit IN1=P1^0;
	sbit IN2=P1^1;
	sbit IN3=P1^2;
	sbit IN4=P1^3;
	sbit EN1=P1^4;
	sbit EN2=P1^5;

    #define Left_1_led        P3_6	 // 左传感器 
    #define M_0_led           P1_7	 // 火焰传感器       
	#define Right_1_led       P3_5	 //右传感器 

   	 
	#define Left_moto_pwm	  P1_5	 //PWM信号端
	#define Right_moto_pwm	  P1_4	  //PWM信号端


	#define Left_moto_go      {IN1=0,IN2=1;}  //左电机向前走
	#define Left_moto_back    {IN1=1,IN2=0;} 	//左边电机向后转
	#define Left_moto_Stop    {EN2=0;}  //左边电机停转                     
	#define Right_moto_go     {IN3=0,IN4=1;}	//右边电机向前走
	#define Right_moto_back   {IN3=1,IN4=0;}	//右边电机向后走
	#define Right_moto_Stop   {EN1=0;}	//右边电机停转  

	unsigned char pwm_val_left  =0;//变量定义
	unsigned char push_val_left =0;// 左电机占空比N/20
	unsigned char pwm_val_right =0;
	unsigned char push_val_right=0;// 右电机占空比N/20
	bit Right_moto_stop=1;
	bit Left_moto_stop =1;
	unsigned  int  time=0;
   
/************************************************************************/	
//延时函数	
   void delay(unsigned int k)
{    
     unsigned int x,y;
	 for(x=0;x<k;x++) 
	   for(y=0;y<2000;y++);
}
/************************************************************************/
//前速前进
     void  run(void)
{
     push_val_left=5;	 //速度调节变量 0-20。。。0最小,20最大
	 push_val_right=5;
	 Left_moto_go ;   //左电机往前走
	 Right_moto_go ;  //右电机往前走
}

//后退函数 

     void  backrun(void)
{
     push_val_left=5;	 //速度调节变量 0-20。。。0最小,20最大
	 push_val_right=5;
	 Left_moto_back;   //左电机往前走
	 Right_moto_back;  //右电机往前走
}

//左转函数
     void  leftrun(void)
{	 
     push_val_left=8;
	 push_val_right=8;
	 Right_moto_go ;  //右电机往前走
     Left_moto_back   ;  //左电机后走
}

//右转函数
     void  rightrun(void)
{ 
	 push_val_left=8;
	 push_val_right=8;
     Left_moto_go  ;   //左电机往前走
	 Right_moto_back    ;  //右电机往后走	
}

//停止函数
     void  stop(void)
{ 	 
     push_val_left=0;
	 push_val_right=0;
	 Right_moto_Stop   ;  //右电机
	 Left_moto_Stop ;  //左电机停止	
}

/************************************************************************/
/*                    PWM调制电机转速                                   */
/************************************************************************/
/*                    左电机调速                                        */
/*调节push_val_left的值改变电机转速,占空比            */
		void pwm_out_left_moto(void)
{  
   if(Left_moto_stop)
   {
    if(pwm_val_left<=push_val_left)
	       {
		     Left_moto_pwm=1; 
//		     Left_moto_pwm1=1; 
		   }
	else 
	       {
	         Left_moto_pwm=0;
//		     Left_moto_pwm1=0; 
		   }
	if(pwm_val_left>=20)
	       pwm_val_left=0;
   }
   else    
          {
           Left_moto_pwm=0;
//           Left_moto_pwm1=0; 
		  }
}
/******************************************************************/
/*                    右电机调速                                  */  
   void pwm_out_right_moto(void)
{ 
  if(Right_moto_stop)
   { 
    if(pwm_val_right<=push_val_right)
	      {
	       Right_moto_pwm=1; 
//		   Right_moto_pwm1=1; 
		   }
	else 
	      {
		   Right_moto_pwm=0;
//		   Right_moto_pwm1=0; 
		  }
	if(pwm_val_right>=20)
	       pwm_val_right=0;
   }
   else    
          {
           Right_moto_pwm=0;
//           Right_moto_pwm1=0; 
	      }
}
       
/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
 	void timer0()interrupt 1   using 2
{
     TH0=0XFc;	  //1Ms定时
	 TL0=0X18;
	 time++;
	 pwm_val_left++;
	 pwm_val_right++;
	 pwm_out_left_moto();
	 pwm_out_right_moto();
 }	

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

#endif
//灭火
#ifndef _LED_H_
#define _LED_H_

    //定义小车驱动模块输入IO口 
	sbit IN1=P1^0;
	sbit IN2=P1^1;
	sbit IN3=P1^2;
	sbit IN4=P1^3;
	sbit EN1=P1^4;
	sbit EN2=P1^5;

	//定义火焰传感器IO口
	sbit S=P1^7;
	//定义风扇驱动IO口
	sbit F=P1^6;
	//定义转向舵机IO口
    sbit pwm=P2^7;//PWM信号输出口  舵机信号输出口
	
	sbit TRIG=P2^5;
    sbit ECHO=P2^4;  

    #define Left_1_led        P3_6	 // 左传感器       
	#define Right_1_led       P3_5	 //右传感器  
	
	#define PWMSD            10	 ////速度调节变量 0-20。。。0最小,20最大  如果小于8电机可能不动
   	 
	#define Left_moto_pwm	  P1_4	 //PWM信号端
	#define Right_moto_pwm	  P1_5	  //PWM信号端


	#define Left_moto_go      {P1_0=0,P1_1=1;}  //左电机向前走
	#define Left_moto_back    {P1_0=1,P1_1=0;} 	//左边电机向后转
	#define Left_moto_Stop    {P1_4=0;}  //左边电机停转  
                   
	#define Right_moto_go     {P1_2=1,P1_3=0;}	//右边电机向前走
	#define Right_moto_back   {P1_2=0,P1_3=1;}	//右边电机向后走
	#define Right_moto_Stop   {P1_5=0;}	//右边电机停转  

	unsigned char pwm_val_left  =0;//变量定义
	unsigned char push_val_left =0;// 左电机占空比N/20
	unsigned char pwm_val_right =0;
	unsigned char push_val_right=0;// 右电机占空比N/20

	bit Right_moto_stop=1;
	bit Left_moto_stop =1;
	unsigned  int  time=0;
   
/************************************************************************/	
//延时函数	
   void delay(unsigned int k)
{    
     unsigned int x,y;
	 for(x=0;x<k;x++) 
	   for(y=0;y<2000;y++);
}
/************************************************************************/

//前速前进
     void  run(void)
{
     push_val_left=8;	 //速度调节变量 0-20。。。0最小,20最大
	 push_val_right=8;

	 Left_moto_go ;   //左电机往前走
	 Right_moto_go ;  //右电机往前走
}
 

    //后退
     void  Rearrun(void)
{ 
	 push_val_left=PWMSD;
	 push_val_right=PWMSD;

     Left_moto_back  ;   //左电机后退
	 Right_moto_back    ;  //右电机后退	
}


//左转函数
     void  leftrun(void)
{	 
     push_val_left=8;
	 push_val_right=8;

	 Right_moto_go ;  //右电机往前走
     Left_moto_back   ;  //左电机后走
}

//右转函数
     void  rightrun(void)
{ 
	 push_val_left=8;
	 push_val_right=8;

     Left_moto_go  ;   //左电机往前走
	 Right_moto_back    ;  //右电机往后走	
}

//停止函数
     void  stop(void)
{ 
	 push_val_left=0;
	 push_val_right=0;

     Left_moto_Stop  ;   //
	 Right_moto_Stop    ;  //	
}

/************************************************************************/
/*                    PWM调制电机转速                                   */
/************************************************************************/
/*                    左电机调速                                        */
/*调节push_val_left的值改变电机转速,占空比            */
		void pwm_out_left_moto(void)
{  
   if(Left_moto_stop)
   {
    if(pwm_val_left<=push_val_left)
	       {
		     Left_moto_pwm=1; 

		   }
	else 
	       {
	         Left_moto_pwm=0;

		   }
	if(pwm_val_left>=20)
	       pwm_val_left=0;
   }
   else    
          {
           Left_moto_pwm=0;

		  }
}
/******************************************************************/
/*                    右电机调速                                  */  
   void pwm_out_right_moto(void)
{ 

  if(Right_moto_stop)
   { 

    if(pwm_val_right<=push_val_right)
	      {

	       Right_moto_pwm=1; 

		   }
	else 
	      {
		   Right_moto_pwm=0;

		  }
	if(pwm_val_right>=20)
	       pwm_val_right=0;
   }
   else    
          {
           Right_moto_pwm=0;

	      }
}
       

/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
 	void timer0()interrupt 1   using 2
{
     TH0=0XFc;	  //1Ms定时
	 TL0=0X18;
	 time++;
	 pwm_val_left++;
	 pwm_val_right++;
	 pwm_out_left_moto();
	 pwm_out_right_moto();
 }	

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

#endif

资源获取

下方名片联系我即可!!


博主联系方式:点击我获取资料->->进我个人主页–>获取博主联系方式



大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐