1、将程序录入小车并运行,旋转车轮旁的旋钮直至车轮停转便达到了调零的目的。接下来,我们便要完成实训要求的第一个程序:控制小车LED灯的亮灭。通过参考指导书的已有程序,我们比较顺利的完成了该任务,任务程序如下:(在试验中需要注意LED灯的正负极) while(1) P1_0=0; P1_1=1; delay_nms(500); P1_0=1; P1_1=0;任务二:机器人触觉导航该任务要求机器人碰到障碍物时,接触开关会有所察觉,通过编程让机器人避开障碍物。在安装胡须时,需要注意胡须距传感立柱既不能太远也不能太近,太远会导致机器人碰到障碍物后反应过慢,太近则会使机器人在前方没有障碍物的情况下进行避障操
2、作,影响小车正常行进。胡须机器人避障程序如下:int P1_4state(void)/获取P1_4的状态,右胡须 return (P1&0x10)?1:0;int P2_3state(void)/获取P2_3的状态,左胡须 return (P2&0x08)?void Forward(void) P1_1=1; delay_nus(1700); P1_1=0; delay_nus(1300); delay_nms(20);void Left_Turn(void) int i; for(i=1;i#define LeftIR P1_2 /左边红外接收连接到P1_2#define RightIR P
3、3_5 /右边红外接收连接到P3_5#define LeftLaunch P1_3 /左边红外发射连接到P1_3#define RightLaunch P3_6 /右边红外发射连接到P3_6void IRLaunch(unsigned char IR) int counter; if(IR=L) for(counter=0;counter38;counter+) LeftLaunch=1; _nop_(); _nop_(); LeftLaunch=0;R for(counter=0;counter+)/右边发射 RightLaunch=1; RightLaunch=0;void Forward
4、(void)/向前行走子程序void Left_Turn(void)/左转子程序 int i; for( i=1; P1_1=1; delay_nus(1300); P1_1=0; P1_0=1; delay_nms(20);void Right_Turn(void)/右转子程序 delay_nus(1700); P1_0=0;void Backward(void)/向后行走子程序 int irDetectLeft,irDetectRight; uart_Init(); printf( while(1) IRLaunch( /右边发射 irDetectRight = RightIR;/右边接收
5、 /左边发射 irDetectLeft = LeftIR;/左边接收 if(irDetectLeft=0)&(irDetectRight=0)/两边同时接收到红外线 else if(irDetectLeft=0)/只有左边接收到红外线 else if(irDetectRight=0)/只有右边接收到红外线任务四:尾随小车该任务的设计线路与任务三相同,故完成较为简单,试验程序如下:#define LeftIR P1_2 /左边红外接收连接到P1_2#define RightIR P3_5 /右边红外接收连接到P3_5#define LeftLaunch P1_3 /左边红外发射连接到P1_3#d
6、efine RightLaunch P3_6 /右边红外发射连接到P3_6 int counter; if(IR=)/左边发射 LeftLaunch=1; LeftLaunch=0;)/右边发射 RightLaunch=1; RightLaunch=0; int pulseLeft,pulseRight; do IRLaunch( irDetectRight = RightIR; irDetectLeft = LeftIR; if(irDetectLeft=0)&(irDetectRight=0)/向后退 pulseLeft=1300; pulseRight=1700; else if(irD
7、etectLeft=0)&(irDetectRight=1)/右转 pulseLeft=1700; else if(irDetectLeft=1)&(irDetectRight=0)/左转 pulseRight=1300; else /前进 delay_nus(pulseLeft); delay_nus(pulseRight); 任务五:机器人的距离检测用同样的IR LED/探测电路检测距离,高灵敏度的频率可以探测远距离的物体,低灵敏度的频率可以探测距离较近的物体。这使得距离探测就简单了。选择5个不同频率,从最低灵敏度到最高灵敏度进行测试,依赖于探测器不能再检测到物体的红外线频率,就可以推断物
8、体的大概位置。测试扫描频率程序如下:#include #define LeftIR P1_2 /左边红外接受连接到P1_2 /#define RightIR P3_5 /右边红外接收连接到P3_5#define LeftLaunch P1_3 /左边红外发射连接到P1_3/#define RightLaunch P3_6 /右边红外发射连接到P3_6unsigned int time;int leftdistance;/左边的距离/int rightdistance;/右边的距离int distanceLeft, irDetectLeft;/int distanceRight,irDetect
9、Right;unsigned int frequency5=29370,31230,33050,35700,38460;void timer_init(void) IE=0x82; /开总中断EA,允许定时器0中断ET0 TMOD |= 0X01; /定时器0工作在模式1:16位定时器模式void FreqOut(unsigned int Freq) time = 256 - (500000/Freq); /根据频率计算初值 TH0 = 0XFF; /高八位设FF TL0 = time; /低八位根据公式计算 TR0 = 1; /启动定时器 delay_nus(800); /延时 TR0 =
10、0; /停止定时器void Timer0_Interrupt(void) interrupt 1 LeftLaunch = LeftLaunch; /取反 /RightLaunch= RightLaunch; /重新设值void Get_lr_Distances() unsigned int count; leftdistance = 0; /初始化左边的距离 /rightdistance = 0; /初始化右边的距离 for(count = 0;countstdio.h#define uint unsigned int #define uchar unsigned char uchar QT
11、IState ;void Time1_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;void Pivot_Left(void)/左转子程序 delay_nus(1500); delay_nus(1350);void Pivot_Right(void)/右转子程序 delay_nus(1650);void Rotate_righ
12、t(void)void Rotate_Left(void) delay_nus(1350);void Backward(void) /向后行走子程序P1_1=1;delay_nus(1300);P1_1=0;P1_0=1;delay_nus(1700);P1_0=0;delay_nms(20);void Get_QTI_State(void) QTIState = P2&0x0e ;void Follow_Line(void) Get_QTI_State(); switch(QTIState) case 0x04 : Forward(); break; case 0x06 : Pivot_Right(); brea
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2