h〉
#defineLeftIRP1_2//左边红外接受连接到P1_2
//#defineRightIRP3_5//右边红外接收连接到P3_5
#defineLeftLaunchP1_3//左边红外发射连接到P1_3
//#defineRightLaunchP3_6//右边红外发射连接到P3_6
unsignedinttime;
intleftdistance;//左边的距离
//intrightdistance;//右边的距离
intdistanceLeft,irDetectLeft;
//intdistanceRight,irDetectRight;
unsignedintfrequency[5]={29370,31230,33050,35700,38460};
voidtimer_init(void)
{
IE=0x82;//开总中断EA,允许定时器0中断ET0
TMOD|=0X01;//定时器0工作在模式1:
16位定时器模式
}
voidFreqOut(unsignedintFreq)
{
time=256-(500000/Freq);//根据频率计算初值
TH0=0XFF;//高八位设FF
TL0=time;//低八位根据公式计算
TR0=1;//启动定时器
delay_nus(800);//延时
TR0=0;//停止定时器
}
voidTimer0_Interrupt(void)interrupt1
{
LeftLaunch=~LeftLaunch;//取反
//RightLaunch=~RightLaunch;
TH0=0XFF;//重新设值
TL0=time;
}
voidGet_lr_Distances()
{
unsignedintcount;
leftdistance=0;//初始化左边的距离
//rightdistance=0;//初始化右边的距离
for(count=0;count〈5;count++)
{
FreqOut(frequency[count]);
irDetectLeft=LeftIR;//左边接收
//irDetectRight=RightIR;//右边接收
//printf(”f=%d\n”,time);
printf("irDetectLeft=%d\n",irDetectLeft);
//printf(”irDetectRight=%d\n",irDetectRight);
if(irDetectLeft==1)
leftdistance++;
//if(irDetectRight==1)
//rightdistance++;
}
}
intmain(void)
{
uart_Init();
timer_init();
printf("ProgamRunning!
\n”);
printf(”FREQENCYETECTED\n”);
while
(1)
{
Get_lr_Distances();
printf(”distanceLeft=%d\n",leftdistance);
//printf("distanceRight=%d\n”,rightdistance);
printf(”———-——-——--—--———\n");
delay_nms(1000);
}
}
在进行串口调试时,应注意串口的接线位置,安装符合自己电脑的串口调试助手。
任务六:
寻线搬运机器人
可能是前几个任务完成太轻松的原因,是我们对实训产生了懈怠的想法,但最后的任务再一次提醒了我需要学习的东西还有很多,永远都不能骄傲自满.
经过一天多的调试,在机器人的运行和编程中,出现了以下几方面的问题:
一、转弯出现问题。
在一些路口中转弯出现了问题。
所以提倡用自定义转弯,提高成功率。
二、在运行机器人前要检查螺丝,检查机器人的性能是否良好,以免在运行过程中发生意外。
三、遇到错误时,要耐心,细心检查问题,分析问题,要互相讨论出解决方案。
四、电池的电量对小车运行影响极大最好选用质量较好的电池。
五、伺服电机的角度没有调好,导致机器人在运行过程中影响程序的运行。
六、熟悉自己的机器人,了解一些运行、编程的小技巧。
寻线搬运机器人编程如下:
#include〈AT89X52。
h>
#include〈stdio.h〉
#include〈BoeBot。
h〉
#defineuintunsignedint
#defineucharunsignedchar
ucharQTIState;
voidTime1_init(void)
{
EA=1;//硬件串口使用定时器1,供AT89S52与PC机通信使用
TMOD|=0x20;//定时器1方式2。
8位自动重装模式
SCON=0x50;//模式1,8位数据
TH1=0xFD;//波特率为9600
TL1=0xFD;
TR1=1;//起动定时器
TI=1;
}
voidForward(void)//向前行走子程序
{
P1_1=1;
delay_nus(1700);
P1_1=0;
P1_0=1;
delay_nus(1300);
P1_0=0;
delay_nms(20);
}
voidPivot_Left(void)//左转子程序
{
P1_1=1;
delay_nus(1500);
P1_1=0;
P1_0=1;
delay_nus(1350);
P1_0=0;
delay_nms(20);
}
voidPivot_Right(void)//右转子程序
{
P1_1=1;
delay_nus(1650);
P1_1=0;
P1_0=1;
delay_nus(1500);
P1_0=0;
delay_nms(20);
}
voidRotate_right(void)
{
P1_1=1;
delay_nus(1650);
P1_1=0;
P1_0=1;
delay_nus(1650);
P1_0=0;
delay_nms(20);
}
voidRotate_Left(void)
{
P1_1=1;
delay_nus(1350);
P1_1=0;
P1_0=1;
delay_nus(1350);
P1_0=0;
delay_nms(20);
}
voidBackward(void)//向后行走子程序
{
P1_1=1;
delay_nus(1300);
P1_1=0;
P1_0=1;
delay_nus(1700);
P1_0=0;
delay_nms(20);
}
voidGet_QTI_State(void)
{
QTIState=P2&0x0e;
}
voidFollow_Line(void)
{
Get_QTI_State();
switch(QTIState)
{
case0x04:
Forward();
break;
case0x06:
Pivot_Right();
brea