机器人大赛程序设计.doc
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
#include<BoeBot.h> #include<uart.h> #include<intrins.h> #define LeftIR P1_2 //左边红外接收连接到P1_2 #define RightIR P3_5 //右边红外接收连接到P3_5 #define LeftLaunch P1_3 //左边红外发射连接到P1_3 #define RightLaunch P3_6 //右边红外发射连接到P3_6 #define Kpl 70 #define Kpr -70 #define SetPoint 3 #define CenterPulse 1500 unsigned int time; int leftdistance,rightdistance;//左边和右边的距离 int delayCount,distanceLeft,distanceRight,irDetectLeft,irDetectRight; unsigned int frequency[5]={29370,31230,33050,35700,38460}; int P1_4state(void)//获取P1_4的状态,右胡须 { return (P1&0x10)?1:0; } int P2_3state(void)//获取P2_3的状态,左胡须 { return (P2&0x08)?1:0; } void timer_init(void) { IE=0x82; //开总中断EA,允许定时器0中断ET0 TMOD "= 0X01; //定时器0工作在模式1:16位定时器模式 } void FreqOut(unsigned int Freq) { time = 256 - (50000/Freq); TH0 = 0XFF ; TL0 = time ; TR0 = 1; delay_nus(800); TR0 = 0; } void Timer0_Interrupt(void) interrupt 1 { LeftLaunch = ~LeftLaunch; RightLaunch= ~ RightLaunch; TH0 = 0XFF; TL0 = time; } void Get_lr_Distances() { unsigned char count; leftdistance = 0; //初始化左边的距离 rightdistance = 0; //初始化右边的距离 for(count = 0;count<5;count++) { FreqOut(frequency[count]); irDetectRight = RightIR; irDetectLeft = LeftIR; if (irDetectLeft == 1) leftdistance++; if (irDetectRight == 1) rightdistance++; } } void Send_Pulse(unsigned int pulseLeft,unsigned int pulseRight) { P1_1=1; delay_nus(pulseLeft); P1_1=0; P1_0=1; delay_nus(pulseRight); P1_0=0; delay_nms(18); } void Forward(void) { P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20); } void bForward(void) { int i; for(i=1;i<=150;i++) {P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20); } } void Left_Turn(void) { int i; for(i=1;i<=41;i++) { P1_1=1; delay_nus(1300); P1_1=0; P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20); } } void Right_Turn(void) { int i; for(i=1;i<=41;i++) { P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus(1700); P1_0=0; delay_nms(20); } } void Backward(void) { int i; for(i=1;i<=65;i++) { P1_1=1; delay_nus(1300); P1_1=0; P1_0=1; delay 该文档涉及的是一个机器人大赛中的程序设计,主要利用了微控制器进行机器人导航与避障。以下是关键知识点的详细说明: 1. **红外传感器(Infrared Sensor)**:机器人使用红外传感器来检测障碍物。左红外接收器连接到P1_2,右红外接收器连接到P3_5,而红外发射器分别连接到P1_3和P3_6。通过改变发送的红外频率,可以实现不同的检测功能。 2. **定时器配置(Timer)**:使用定时器0(Timer0)进行脉冲控制和中断处理。定时器初始化函数`timer_init()`开启了总中断EA和定时器0中断ET0,并将TMOD设置为模式1,即16位定时器模式。 3. **频率输出(Frequency Output)**:`FreqOut()`函数用于设置红外发射器的频率,以进行距离测量。频率数组`frequency[]`包含多个可能的值,这些值被用来发送不同频率的红外信号。 4. **中断服务子程序(Interrupt Service Routine)**:`Timer0_Interrupt()`是定时器0中断服务程序,当定时器溢出时,会切换左右红外发射器的状态,实现发射红外脉冲。 5. **距离测量(Distance Measurement)**:`Get_lr_Distances()`函数通过轮询红外传感器,计算出机器人左右两侧障碍物的距离。根据接收到的红外信号判断是否有障碍物存在,累计计数后得到距离。 6. **脉冲发送(Pulse Sending)**:`Send_Pulse()`函数用于发送控制电机转动的脉冲,通过设置P1_1和P1_0引脚的高低电平,控制电机的正反转和停止。 7. **机器人动作控制(Robot Motion Control)**:定义了一系列函数如`Forward()`、`bForward()`、`Left_Turn()`和`Right_Turn()`来控制机器人的前进、倒退、左转和右转。这些函数通过延时函数`delay_nus()`和`delay_nms()`控制电机转动的时间,实现精确的动作控制。 8. **变量定义(Variable Declaration)**:包括时间变量`time`、左右距离变量`leftdistance`和`rightdistance`以及辅助计算用的变量,如`delayCount`、`distanceLeft`、`distanceRight`、`irDetectLeft`和`irDetectRight`。 这个程序的设计是基于某种微控制器,如8051系列,用于处理机器人在比赛中的导航任务。通过红外传感器进行避障,并通过特定的脉冲控制实现机器人的移动。程序结构清晰,每个功能模块划分明确,便于理解和调试。
- 粉丝: 195
- 资源: 3万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助