资源简介
本程序参加过电子设计比赛,适用于四路红外收发传感器循迹小车。此程序的思路与网上我搜到的思路完全不同,是我自创的独特的,比那些程序更稳定精确并且我的小车行进速度要快得多,非常适合大一大二学生参考学习。
代码片段和文件信息
/*从小车后面观察,从左向右的红外检测分别为DD1DD2DD3DD4
DD1---P0^3
DD2---P0^2
DD3---P0^1
DD4---P0^0
*/
#include
#define uchar unsigned char
#define uint unsigned int
extern void Motor_Left(bit ReverOrCoro uchar DutyCycle); //左边电机控制函数
extern void Motor_Right(bit ReverOrCoro uchar DutyCycle); //右边电机控制函数
void Timer0Config(); // 配置定时器0
void zhizou();
void dazhuan1();
void dazhuan2();
void weitiao1();
void weitiao2();
void zhuanwan1();
void zhuanwan2();
void shizi();
void delay(uint ms);
sbit ENA = P1^5; //定义电机使能端
sbit ENB = P1^0;
uchar a;
uchar Infrared; //检测P0低四位的值
void main()
{
Timer0Config();
ENA = 1; ENB = 1;
Infrared = P0 & 0x0F; //取出P0口低四位
while(1)
{
switch(Infrared)
{
case 0x00:
zhizou(); break; //未检测到黑线,直行
case 0x08:
dazhuan1(); break; //左边第一个检测到黑线,2级左转
case 0x04:
weitiao1(); break; //左边第二个检测到黑线,1级左转
case 0x02:
weitiao2(); break; //右边第一个检测到黑线,1级右转
case 0x01:
dazhuan2(); break; //右边第二个检测到黑线,2级右转
case 0x0C:
zhuanwan1(); break; //左边两个同时检测到黑线,左转进入
case 0x0E:
zhizou(); break; //左边三个同时检测到黑线,左转
case 0x03:
zhuanwan2(); break; //右边两个同时检测到黑线,右转进入
case 0x07:
zhizou(); break; //右边三个同时检测到黑线,右转
case 0x0f:
zhizou(); break; //全黑,智能左转
case 0x06:
dazhuan2(); break; //中间两个检测到,右转
case 0x09:
dazhuan2(); break; //旁边两个检测到,右转
case 0x0A:
weitiao1(); break; //左一右一检测到,左微调
case 0x05:
weitiao2(); break; //左二右二检测到,右微调
case 0x0b:
weitiao2(); break; //左二未检测到,直行
case 0x0d:
weitiao1(); break; //右一未检测到,直行
default:
zhizou(); break;
}
}
}
void delay(uint ms)
{
uint ij;
for(i=0; i {
for(j=0; j<110; j++);
}
}
void Timer0Config()
{
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 0xFF;
TL0 = 0x7E;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void zhizou()
{
Motor_Left(1 100); Motor_Right(1 100);
Infrared = P0 & 0x0F;
}
void dazhuan1()
{
a=1;
while(a)
{
Motor_Left(0 100); Motor_Right(1 100);
Infrared = P0 & 0x0F;
if(Infrared==0x02)
{
Motor_Left(1 100); Motor_Right(0 100); break;
}
else if(Infrared==0x04)
{
Motor_Left(1 100); Motor_Right(0 100); break;
}
}
Infrared = P0 & 0x0F;
}
void dazhuan2()
{
while(1)
{
Motor_Left(1 100); Motor_Right(0 100);
Infrared = P0 & 0x0F;
if(Infrared==0x04)
{
Motor_Left(0 100); Motor_Right(1 100); break;
}
else if(Infrared==0x02)
{
Motor_Left(0 100); Motor_Right(1 100); break;
}
}
Infrared = P0 & 0x0F;
}
void weitiao1()
{
a=1;
while(a)
{
Motor_Left(0 60); Motor_Right(1 100);
Infrared = P0 & 0x0F;
switch(Infrared)
{
case 0x04:
a=1; break;
default:
a=0; break;
}
}
Infrared = P0 & 0x0F;
}
void weitiao2()
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-09-11 22:30 循迹小车决赛程序\
文件 5265 2017-05-18 13:45 循迹小车决赛程序\main.c
文件 10570 2017-05-18 13:45 循迹小车决赛程序\main.LST
文件 11550 2017-05-18 13:45 循迹小车决赛程序\main.OBJ
文件 1111 2017-05-14 20:53 循迹小车决赛程序\Motor.c
文件 3156 2017-05-18 13:45 循迹小车决赛程序\Motor.LST
文件 3128 2017-05-18 13:45 循迹小车决赛程序\Motor.OBJ
文件 6376 2009-05-07 14:37 循迹小车决赛程序\STARTUP.A51
文件 14049 2017-05-18 13:45 循迹小车决赛程序\STARTUP.LST
文件 758 2017-05-18 13:45 循迹小车决赛程序\STARTUP.OBJ
文件 12394 2017-05-18 13:45 循迹小车决赛程序\循迹小车
文件 2826 2017-05-18 13:45 循迹小车决赛程序\循迹小车.hex
文件 74 2017-05-18 13:45 循迹小车决赛程序\循迹小车.lnp
文件 20074 2017-05-18 13:45 循迹小车决赛程序\循迹小车.M51
文件 183 2017-09-11 22:29 循迹小车决赛程序\循迹小车.plg
文件 139423 2017-09-11 22:30 循迹小车决赛程序\循迹小车.uvgui.Administrator
文件 139428 2017-08-04 16:49 循迹小车决赛程序\循迹小车.uvgui_Administrator.bak
文件 6367 2017-09-11 22:30 循迹小车决赛程序\循迹小车.uvopt
文件 13744 2017-04-10 18:09 循迹小车决赛程序\循迹小车.uvproj
文件 56272 2017-04-08 16:19 循迹小车决赛程序\循迹小车_uvopt.bak
文件 13554 2017-04-08 11:32 循迹小车决赛程序\循迹小车_uvproj.bak
评论
共有 条评论