智能循迹小车C程序(完美,详尽)_第1页
智能循迹小车C程序(完美,详尽)_第2页
智能循迹小车C程序(完美,详尽)_第3页
智能循迹小车C程序(完美,详尽)_第4页
智能循迹小车C程序(完美,详尽)_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、/*小车运行主程序简介: 模块组成:红外对管检测模块 五组对管,五个信号采集端口直流电机驱动模块 驱动两个直流电机,另一个轮子用万向轮单片机最小系统 用于烧写程序,控制智能小车运动 功能简介:在白色地面或皮质上用黑色胶带粘贴出路线路径宽度微大于相邻检测管间 距。这样小车便可在其上循迹运行。 补充说明:该程序采取“右优先”的原则: 即右边有黑线向右转, 若无,前方有黑线,向前走, 若无,左边有黑线,向左转, 若全无,从右方向后转。程序开头定义的变量的取值是根据我的小车所调试选择好的, 如果采用本程序,请自行调试适合自己小车的合适参数值。编者:陈尧,黄永刚(江苏大学电气学院二年级,三年级)1. 假

2、定:IN仁1,IN3=1时电机正向转动,必须保证本条件2. 假定: 遇到白线输出 0,遇到黑线输出 1;如果实际电路是:遇到白线输出1,遇到黑线输出 0,这种情况下只需要将第四,第五句改成:#define m0 1#define m1 0即可。3. 说明 1:直行 速度 full_speed_left,full_speed_right.转弯 , 调头速度 correct_speed_left,correct_speed_right.微小校正时 高速轮 full_speed_left,full_speed_right;低速轮 correct_speed.可以通过调节第六,七,八,九,十条程序,改

3、变各个状态 下的占空比( Duty cycle ) , 以求达到合适的转弯,直行速度4.lenthlength检测到黑线到启动转动的时间间隔5. widthmid3 在黑线上到脱离黑线的时间差6. mid3 作为判断中心位置是否进入黑线的标志,由于运行的粗糙性和惯性,常取其他对管的输出信号作为判断条件7. check_right 若先检测到左边黑线, 并且左边已出黑线, 判断右端是否压黑线时间拖延*/#include<reg52.h>#define uchar unsigned char #define uint unsigned int#define m0 1 黑线 ml,白线

4、m0#define m1 0#define full_speed_left 40 / 方 便 调 节 各 个 状 态 的 占 空 比 , 可 用 参 数 组 : (30,35,6,25,30,68000,27000,500 );#define full_speed_right 45 /(40,45,6,25,30,68000,27000,500);#define correct_speed 6 / 校正时的低速轮的占空比#define turn_speed_left 25#define turn_speed_right 30#define lenth 68000/ 测试数据:10000- 10

5、0- 500- 2000-80000-76000-68000#define width 27000/500- 10->2000- 60000-30000- 27000#define check_right 500 /2000-#define midl left1 20- 200- 500#define midr right5uchar Duty_left,Duty_right,i=0,j=0; /左右占空比标志,取 1-100sbit IN仁 P2A0; sbit IN2=P2A1; sbit IN3=P2A2; sbit IN4=P2A3; sbit ENA=P1A0; sbit EN

6、B=P1A1;/ 循迹口 五组红外对管,依次对应从左往右第 1,2,3,4,5 五组 sbit left1 =P1A6;sbit left2 =P1A5;sbit mid3 =P1A4;sbit right4=P1A3;sbit right5=P1A2;void line_left();void line_right();void line_straight()reentrant;/void delay(long int Delay_time)/延时函数uint t=Delay_time;while(t-);/void init() / 定时器初始化left1=m0; / 初始化left2=m

7、0; / 白线位置mid3 =m1; / 黑线位置right4=m0;right5=m0;TMOD|=0x01;TH0=(65536-66)/256;TL0=(65536-66)%256;EA=1;ET0=1;TR0=1;ENA=1; / 使能端口,初始化ENB=1;/void time0(void)interrupt 1 /中断程序i+; / 调速在中断中执行j+;if(i<=Duty_left)ENA=1;else ENA=0;if(i>100)ENA=1;i=0;if(j<=Duty_right)ENB=1;else ENB=0;if(j>100)ENB=1;j=

8、0;TH0=(65536-66)/256; /取约 150HZ,12M 晶振,每次定时 66us, 分 100 次,这样开头定义的变量正好直接表示占空比的数值TL0=(65536-66)%256;/void correct_left()/ 向左校正,赋值Duty_left =correct_speed;Duty_right=full_speed_right;IN1=1;IN2=0;IN3=1;IN4=0;/void correct_right()/向右校正,赋值Duty_left =full_speed_left;Duty_right=correct_speed;IN1=1;IN2=0;IN3

9、=1;IN4=0;/void turn_left()/ 左转,赋值Duty_left =turn_speed_left;Duty_right=turn_speed_right;IN1=0; / 转弯时一个正转,一个反转,IN2=1;IN3=1;IN4=0;/void turn_right()/ 右转,赋值Duty_left =turn_speed_left;Duty_right=turn_speed_right;IN1=1; / 转弯时一个正转,一个反转,IN2=0;IN3=0;IN4=1;/void straight() / 直走,赋值Duty_left =full_speed_left;/

10、 左右电机占空比初始化,调节直线运动速度Duty_right=full_speed_right;/ 鉴于左右轮电机内部阻力不同,故占空比取不同值,这组值需要单独写程序取值IN1=1;IN2=0;IN3=1;IN4=0;/void line_straight()reentrant / 函数名后加 reentrant 可以递归调用, / 一直走黑直线 时straight();if(right5=m1)line_right();elseif(left1=m1)line_left();elseif(left2=m1) / 防止校正时,小车冲出过大,导致 2,4 号检测管屏蔽了 两端检测管的检测,避免其

11、走直线时出轨while(left2=m1)correct_left();if(right5=m1)line_right();goto label3;else if(left1=m1)line_left();goto label3;elseif(right4=m1) / 防止校正时, 小车冲出过大, 导致 2,4 号检测管屏蔽了 两端检测管的检测,避免其走直线时出轨while(right4=m1)correct_right();if(right5=m1) line_right(); goto label3;else if(left1=m1)line_left();goto label3;else

12、 if(left1=m0)&&(left2=m0)&&(mid3=m0)&&(right4=m0)&&(right5=m0)straight();/delay(lenth);while(right4=m0) /本来应该是用 mid3, 但是为了提高灵敏度,选择 right4 ;向左时,可取 left2 对管turn_right(); if(mid3=m1)line_straight();label3: ; /什么都不做/void line_right() / 右边有黑线时straight();/ 这里的直走是在不管红外检测结果的直

13、行 delay(lenth);if(mid3=m1)turn_right();/ 执行向右转的赋值label:delay(width); / 由 width 值决定转弯时 mid3 经过黑线宽度时所需要的时间 if(mid3=m0)while(right4=m0)elsegoto label;else if(mid3=m0)turn_right();while(right4=m0)if(midr=m1)line_straight();/void line_left() /左边出现黑线时while(left1=m1)if(right5=m1)line_right();goto label2;delay(check_right);/ 左边遇到黑线时,左边出了黑线之后,继续延时一段时间,判断 右边是否遇到黑线,/ 若遇到黑线,执行 line_right() 函数if(right5=m1)line_right();goto label2;if(mid3=m1)|(left2=m1)|(right4=m1)line_straight();elsewhile(left2=m0)turn_left();if(midl=m1) line_straight();label2: ;/void detect_infrared() /

温馨提示

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

评论

0/150

提交评论