程序编译器:keil4 / 5
编程语言:C语言
设计编号:C0056
功能介绍
小车通过三个红外探头进行线路识别,两个红外传感器识别停止的地点,手机连接WIFI后通过APP传输相关的送货信息,小车行驶到相关对应的送货地点就停止卸货。
1、装置上具有红外线感应寻迹的功能,在指定轨道布线之内,小车能遵循路线的范围行走,不跑偏、不失控,若未在指定的轨道上不做出任何反应原地待命。
2、派送的地址通过手机APP进行信息传输,即具有APP地点配送功能,在APP设置配送的地点,小车走到相应的地点后进行停止卸货,若不小心走到的地点为非配送地点,则继续行走到轨道外,等待人工重新操作。
3、机器人的电池供电具有方便的替换性,当供电电池没电时,工作人员只需将备用电池进行更换即可,省去充电的麻烦。
以下为本设计资料展示图:
51单片机最小系统相对简单,除了主控芯片和电源供电外,只需要在外围搭建一个晶振、和两个起振电容即可,该系统中的晶振由单片机可支持的最大频率有关,一般在12MHZ左右,起振电容在15P到30P之间。系统的供电在5V左右,而系统的起振只需大于3V即可,系统中通常会加入一个复位按键,该按键的作用在于当系统运行着繁琐的程序中,若该程序驱动的外围器件初始化是一个相对较久的传感器,而程序运行过程出现BUG如法继续运行的情况下,手动按下复位按钮即可完成系统的重启,无需断电。如下图所示为该单片机最小系统。
原理图
PCB
程序
main函数
#include<reg52.h> //头文件
#include<LCD1602.h>
#include<ESP8266.h>
#include<EEPROM.h>
/*****************灯、蜂鸣器、按键引脚定义*******************/
sbit red1 = P2^0;
sbit red2 = P2^1;
sbit red3 = P2^2;
sbit red4 = P2^3;
sbit red5 = P2^4;
sbit moto1 = P3^4; //
sbit moto2 = P3^5; //
sbit moto3 = P3^6; //
sbit moto4 = P3^7; //
/************************变量定义***********************/
uchar temp_f=0,diqu_f=0,diqu_f2=0;
uchar T0_num=100; //计数变量
/********************************************************
函数名称:void delayms(uint ms)
函数作用:毫毛延时函数
参数说明:ms为延时的毫秒数
********************************************************/
void delayms(uint ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
void delay (unsigned int a) //这是一个延时函数
{
unsigned char i;
while( --a != 0)
{
for(i = 0; i < 8; i++);
}
}
/********************************************************
函数名称:void display()
函数作用:正常显示
参数说明:
********************************************************/
void display()
{
if(ESP8266_f==1)//接收到WIFI控制指令
{
if(Hand("+IPD,0,1:A"))
{
temp_f=1;
}
else
if(Hand("+IPD,0,1:B"))
{
temp_f=2; diqu_f=0;
}
else
if(Hand("+IPD,0,1:C"))
{
temp_f=3;
}
else
if(Hand("+IPD,0,1:D"))
{
temp_f=4;
}
clearBuff(); //清除缓存
}
if(temp_f==0)
{
moto1=0;moto2=0;moto3=0;moto4=0;
lcd1602_write_character(0,2," Waiting status ");
}
else
{
if(temp_f==1)
{
lcd1602_write_character(0,2," Location one ");
if(red4==1&&red5==1)//第一个地点识别到
{
temp_f=0;
lcd1602_write_character(0,1," one finish ");
}
else
{
lcd1602_write_character(0,1," one working ");
if((red1==1&&red2==1&&red3==1)||(red1==0&&red2==0&&red3==0))//三个都检测到黑线或者白线停止
{
moto1=0;moto2=0;moto3=0;moto4=0;
}
if((red1==1&&red2==0&&red3==0)||(red1==1&&red2==1&&red3==0))//右边检测到
{
moto1=0;moto2=1;moto3=1;moto4=0;delay(50); moto3=0;delay(100-50);
}
if((red1==0&&red2==0&&red3==1)||(red1==0&&red2==1&&red3==1))//左边检测到
{
moto1=1;moto2=0;moto3=0;moto4=1;delay(50); moto1=0;delay(100-50);
}
if((red1==0&&red2==1&&red3==0))//中间
{
moto1=0;moto3=0;
moto2=moto4=1;
delay(50);
moto2=moto4=0;
delay(100-50);
}
}
}
if(temp_f==2)
{
lcd1602_write_character(0,2," Location two ");
if(diqu_f<2)
{
lcd1602_write_character(0,1," two working ");
if((red1==1&&red2==1&&red3==1)||(red1==0&&red2==0&&red3==0))//三个都检测到黑线或者白线停止
{
moto1=0;moto2=0;moto3=0;moto4=0;
}
if((red1==1&&red2==0&&red3==0)||(red1==1&&red2==1&&red3==0))//右边检测到
{
moto1=0;moto2=1;moto3=1;moto4=0;delay(50); moto3=0;delay(100-50);
}
if((red1==0&&red2==0&&red3==1)||(red1==0&&red2==1&&red3==1))//左边检测到
{
moto1=1;moto2=0;moto3=0;moto4=1;delay(50); moto1=0;delay(100-50);
}
if((red1==0&&red2==1&&red3==0))//中间
{
moto1=0;moto3=0;
moto2=moto4=1;
delay(50);
moto2=moto4=0;
delay(100-50);
}
if(red4==0&&red5==0) diqu_f2=0;
if(red4==1&&red5==1&&diqu_f2==0)
{
diqu_f++;
diqu_f2=1;
lcd1602_write_character(0,1," two working 1 ");
}
}
else
{
temp_f=0;
diqu_f=0;diqu_f2=0;
lcd1602_write_character(0,1," two finish ");
}
}
if(temp_f==3)
{
lcd1602_write_character(0,2," Location three ");
if(diqu_f<3)
{
lcd1602_write_character(0,1," three working ");
if((red1==1&&red2==1&&red3==1)||(red1==0&&red2==0&&red3==0))//三个都检测到黑线或者白线停止
{
moto1=0;moto2=0;moto3=0;moto4=0;
}
if((red1==1&&red2==0&&red3==0)||(red1==1&&red2==1&&red3==0))//右边检测到
{
moto1=0;moto2=1;moto3=1;moto4=0;delay(50); moto3=0;delay(100-50);
}
if((red1==0&&red2==0&&red3==1)||(red1==0&&red2==1&&red3==1))//左边检测到
{
moto1=1;moto2=0;moto3=0;moto4=1;delay(50); moto1=0;delay(100-50);
}
if((red1==0&&red2==1&&red3==0))//中间
{
moto1=0;moto3=0;
moto2=moto4=1;
delay(50);
moto2=moto4=0;
delay(100-50);
}
if(red4==0&&red5==0) diqu_f2=0;
if(red4==1&&red5==1&&diqu_f2==0)
{
diqu_f++;
diqu_f2=1;
}
}
else
{
temp_f=0;
diqu_f=0;diqu_f2=0;
lcd1602_write_character(0,1," three finish ");
}
}
if(temp_f==4)
{
if((red1==1&&red2==1&&red3==1)||(red1==0&&red2==0&&red3==0))//三个都检测到黑线或者白线停止
{
moto1=0;moto2=0;moto3=0;moto4=0;
}
if((red1==1&&red2==0&&red3==0)||(red1==1&&red2==1&&red3==0))//右边检测到
{
moto1=0;moto2=1;moto3=1;moto4=0;delay(50); moto3=0;delay(100-50);
}
if((red1==0&&red2==0&&red3==1)||(red1==0&&red2==1&&red3==1))//左边检测到
{
moto1=1;moto2=0;moto3=0;moto4=1;delay(50); moto1=0;delay(100-50);
}
if((red1==0&&red2==1&&red3==0))//中间
{
moto1=0;moto3=0;
moto2=moto4=1;
delay(50);
moto2=moto4=0;
delay(100-50);
}
}
}
}
/********************************************************
函数名称:void main()
函数作用:主函数
参数说明:
********************************************************/
void main()
{
LCD_init(); //LCD1602初始化
lcd1602_write_pic(0x00,pic);//将自定义字符“°”写入到LCD1602中
ESP8266_uart();//ESP8266配置参数
ESP8266_init(); //ESP8266初始化
while(1) //死循环
{
display(); //显示当状态
}
}
设计说明书
设计背景
机器人赋予人的概念是替代人工做一些高效率或者难以完成的事,随着物联网时代的发展,目前市场上出现的相关机器人越来越多,比如送餐机器人,洗碗机器人,无人机监控交通机器人等,不管是否具有人的外观形态,能帮助人工完成繁琐而复杂的工作,具有人的替代性,就统称机器人。
但随着目前互联网的发达,各种电商平台的崛起,物流行业也跟着兴旺起来,不管是从小公司还是知名上市大公司,物流分炼的分配大部分都是依靠人工,不仅效率慢而且还会随着外部因素的增加导致分炼错误的事件发生,因为物流的人工运输成本较高,工作质量也随着不同物流公司的管理制度出现不同的服务。尤其是购物节期间,物流物件的增多给人工的工作量带来了很大的压力,尤其是在总部公司的物件地方分炼,要保证精准高效率的分炼配送是相当的有难度,若有一款智能分配物件派送地址并且制定的送货区卸货拉货,岂不是方便快捷高效率很大,于是快递机器人的想法就表现的非常具有意义性,本文的设计理念就是基于该现象提出的做法,相信在今后的市场肯定有广阔应用场景和一席之地。
主要完成的工作
要整体的实现快递机器人的实验,不仅仅要从理论的分析,还需要实际的设计,包括软件和硬件的设计,将三者结合才能实现本次装置设计的需求,所需要的研究内容如下:
1、对快递机器人的工作原理、结构概念进行深入的研究和设计,提出多种可实行的方案,包括单片机以及相关传感器的选型,分析这几个选型方案的优缺点,选出最佳的设计方案。
2、对选定的传感器和单片机进行理论上的资源分析,包括该器件的控制方式、资源利用以及精度换算等,为后期的硬件设计和软件编写做铺垫。
3、采用相关的原理图绘制工具,对整体电路进行线路绘制,并导入PCB布线布局,再利用外围器件将绘制的原理图进行焊接实物利。
4、对硬件结构焊接完成后,勾勒整体的程序流程图,再采用相关的程序编写软件对主程序、各个子程序进行程序的编写和调试。
设计文件
开发资料下载