循迹小车编程.docx_第1页
循迹小车编程.docx_第2页
循迹小车编程.docx_第3页
循迹小车编程.docx_第4页
循迹小车编程.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/*-小车运行主程序-1.假定:IN1=1,IN3=1时电机正向转动,必须保证本条件2.假定:遇到白线输出0,遇到黑线输出1; 如果实际电路是:遇到白线输出1,遇到黑线输出0, 这种情况下只需要将第四,第五句改成: #define m0 1 #define m1 0 即可。3.说明1:直行,转弯,调头时,速度full_speed_left和full_speed_right微小校正时,高速轮full_speed,低速轮correct_speed 可以通过调节第六,七,八条程序,改变各个状态 下的占空比(Duty cycle ),以求达到合适的转弯,直行速度4.lenth5.width6.mid3作为判断中心位置是否进入黑线的标志,由于运行的粗糙性,取left2|mid3|right4中的任意一个去检测黑线即可-*/#include#define uchar unsigned char#define uint unsigned int#define m0 1/如果实际电路是:遇到白线输出1,遇到黑线输出0,#define m1 0/这种情况下只需要改成:m0=1;m1=0;即可/#define judge_left left1 /本来应该用mid3判断是否遇到黑线停止转动/#define judge_right right5 /但考虑到惯性,用最边缘的作判断#define full_speed_left 50/方便调节各个状态的占空比 ,/左轮 /可用参数组:(30,35,6,25,30,68000,27000,500);(30,35)#define full_speed_right 50 /右轮/ #define correct_speed 35/校正时的低速端的占空比 /#define turn_speed_left 20#define turn_speed_right 20 /(25,30)-(10,15)-(18,23)/定义反应时间#definelenth 40000/length检测到黑线到启动转动的时间间隔10000-100-500-2000-80000-76000-68000#define width 300/mid3在黑线上到脱离黑线的时间差 500-10-2000-60000-30000-27000#define check_right 500 /check_right若先检测到左边黑线,并且左边已出黑线,判断右端是否压黑线时间拖延2000-20-200-500/#define flag left2|mid3|right4uchar Duty_left,Duty_right,i=0,j=0; /左右占空比标志,取1-100 uchar ENA=0,ENB=0; /A为左,B为右 sbit IN1=P20; /左电机 0正转 右拐sbit IN2=P21; sbit IN3=P22; /右电机 0 正转 左拐sbit IN4=P23; /sbit ENA=P10; /sbit ENB=P11; /循迹口 五个红外传感器sbit left1 =P10; /白 sbit left2 =P11; /白sbit mid3 =P12; /黑线位置,遇到白线输出0,遇到黑线输出1;sbit right4=P13; /白sbit right5=P14; /白void delay(long int Delay_time)/延时函数 uint t=Delay_time; while(t-); void init() /定时器初始化 TMOD|=0x01; TH0=(65536-66)/256; TL0=(65536-66)%256; EA=1; ET0=1; TR0=1; void time0(void)interrupt 1 /中断程序 i+;/调速在中断中执行 j+; if(i100) /完成了一个周期 ENA=1;i=0; if(j100) ENB=1;j=0; TH0=(65536-66)/256; TL0=(65536-66)%256; void correct_left()/向左校正,赋值 Duty_left =correct_speed;/ 调节对应占空比 左轮慢转 Duty_right=full_speed_right; /右轮快速旋转 if(ENA=1) IN1=0;IN2=1;/左轮 else IN1=1;IN2=1; if (ENB=1) /右轮正转 IN3=0;IN4=1; else IN3=1;IN4=1; void correct_right()/向右校正,赋值 Duty_left =full_speed_left; /左轮快速 右拐 Duty_right=correct_speed; /右边慢速 if(ENA=1) IN1=0; IN2=1; else IN1=1; IN2=1; if (ENB=1) IN3=0; IN4=1; else IN3=1; IN4=1; void turn_left()/左转,赋值 Duty_left =turn_speed_left; Duty_right=turn_speed_right; if(ENA=1) IN1=1; IN2=0; /右轮 正转 else IN1=1; IN2=1; /右轮 正转 if(ENB=1) IN3=0; IN4=1; else IN3=1; IN4=1; void turn_right()/右转,赋值 Duty_left =turn_speed_left; Duty_right=turn_speed_right; if(ENA=1) IN1=0; IN2=1; /左正 else IN1=1; IN2=1; /左正 if(ENB=1) IN3=1; IN4=0;/ 一个反转 else IN3=1; IN4=1; void straight()/直走,赋值 Duty_left =full_speed_left;/左右电机占空比初始化,调节直线运动速度 Duty_right=full_speed_right; if(ENA=1) IN1=0; IN2=1; elseIN1=1; IN2=1; if(ENB=1) IN3=0; IN4=1; else IN3=1; IN4=1; /上面是对占空比即小车速度的调节 /下面是逻辑判断void line_straight()reentrant /可以递归调用,/一直走黑直线时/-lenth-/11111111111111111111 straight();/首先直走 if(left2=m1) /如果左2为黑线 while(left2=m1)correct_left(); /一直左微调至脱离黑线 else if(right4=m1)/如果右2为黑线 while(right4=m1)correct_right();/一直右微调至脱离黑线 else/如果没有检测到黑线 if(left1=m0)&(left2=m0)&(mid3=m0)&(right4=m0)&(right5=m0) straight();/ 直行一段时间 while(mid3=m0) /本来应该是用mid3,但是为了提高灵敏度,选择right5 turn_right(); if(mid3=m1) line_straight();void line_right() /右边有黑线时 /-width-/222222222222222222222222222straight();/这里的直走是在不管红外检测结果的直行delay(lenth); /直走一段时间if(mid3=m1)/如果中间是黑线 turn_right();/执行向右转的赋值 delay(width);/由width值决定转弯时mid3经过黑线宽度时所需要的时间 if(mid3=m0) /如果中间为白线 while(mid3=m0) /右拐一直到变成黑线 turn_right(); / else if(mid3=m1) /如果中间是黑线 line_straight(); /转弯完成,调用line_straight()函数,而不是单单用straight()函数赋值 elseif(mid3=m0) /如果中间是白线 while(mid3=m0) /右拐一直到变成黑线 turn_right(); if(mid3=m1) line_straight(); void line_left() /左边出现黑线时 /-temp-/333333333333333333333333333 static uint temp=check_right;/检查右转 while(left1=m1)/循环条件是左边是黑线 if(right5=m1) line_right(); /右优先:如果此时右边为黑线则右转else turn_left(); if(left1=m0) /如果左边为白线(已出黑线) while(left1=m0)&(temp-) /循环条件是左边为白线,check_right若先检测到左边黑线,并且左边已出黑线,判断右端是否压黑线时间拖延 if(right5=m1) /如果右边为黑线 line_right();break; /直行 temp=check_right;/恢复初值,以便下一个弯口时,继续使用temp值 if(mid3=m1)line_straight(); else while(mid3=m0) turn_left(); if(mid3=m1) line_straight(); void detect_infrared() /循迹,红外检测 if(right5=m1)line_right(); e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论