基于单片机的灭火机器人设计
摘要
由于火灾的频繁发生,人们不仅在物质上有巨大的损失,同时在精神上也饱受折磨,最让人痛心惋惜的还是那些为了国家无私奉献生命的消防人员。为了解决火灾给人们带来的巨大损害,本项目设计了一款基于单片机的灭火机器人。
本次设计利用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
资源获取
下方名片联系我即可!!
博主联系方式:点击我获取资料->->进我个人主页–>获取博主联系方式
大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)