循迹小车程序(三路循迹)
循迹小车三路的程序

if(ct<=sd)
PWM2=1;
else
PWM2=0;
}
//*********************第二部分 子函数定义 End*********************
//**********第三部分 小车直线前进,左转,右转函数定义 Start********
void advance(int ct1,int sd1,int ct2,int sd2)//小车直线前进函数
TMOD=0x11;//中断模式设置
TH0=(65536-1000)/256;//定时器1 初始化
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
TH1=(65536-1000)/256;//定时器2 初始化
TL1=(65536-1000)%256;
EA=1;
speed1(ct1,sd1);
speed2(ct2,sd2);
}
//**********第三部分 小车直线前进,左转,右转函数定义 End********
//**********第4 部分 主函数 Start********************************
main()
{
#include<reg52.h>
//*********************第一部分 Start***************************************
sbit IN1=P2^2;//以下是点击驱动芯片L298 管脚位声明
{
forward_turn1();
智能循迹避障小车完整程序(亲测好使)

智能循迹避障小车完整程序(亲测好使)/*******************************************//利用51定时器产生PWM波来调节电机速度//速度变化范围从0-100可调//使用三路做寻迹使用,哪一路检测在黑线哪一路为//高电平//没检测到黑线表示有反射对应输出低电平信号*********************************************/#include<>#define uint unsigned int#define uchar unsigned char/*电机四个接口定义*/sbit in1=P0^0;sbit in2=P0^1;sbit in3=P0^2;sbit in4=P0^3;/*计时器*/uchar j,k,i,a,A1,A2,second,minge,minshi;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};void delay(uchar i){for(j=i;j>0;j--)for(k=110;k>0;k--);}void display(uchar sh_c,uchar g_c,uchar min_ge,uchar min_shi) {dula=1;P0=table[sh_c];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(5);dula=1;P0=table[g_c];dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(5);dula=1;P0=table[min_shi];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(5);dula=1;P0=table2[min_ge];dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delay(5);}/*左、中、右三路循迹传感器接口定义*/ sbit zuo=P1^0; sbit zhong=P1^1;sbit you=P1^2;/*避障接口定义*/sbit bz_zuo=P1^3;sbit bz_zhong=P1^4;sbit bz_you=P1^5;uchar count = 0;/*利用定时器0定时中断,产生PWM波*/ void Init_timer() {TH0 = (65535-10)/256;TL0 = (65535-10)%256;TMOD = 0x01;TR0 = 1;ET0 = 1;EA = 1;}/*左轮速度调节程序*/void zuolun(uchar speed){if(count <= speed) //count计数变量{in1 = 1;in2 = 0;}else{in1 = 0;in2 = 1;}}void youlun(uchar speed) //同上{if(count<= speed){in3 = 1;in4 = 0;}else{in3 = 0;in4 = 1;}}void Inline() //检测黑线信号{uchar temp;temp =P1;switch(temp){case 0x01:zuolun(0); youlun(90);break; //左侧循迹传感器压线,小车向左前修正case 0x02:zuolun(100);youlun(100);break; //中间循迹传感器压线,保持直走此处两值使电机速度保持相同case 0x04:zuolun(90); youlun(0);break; //右侧循迹传感器压线,小车向右前修正case 0x08:zuolun(90); youlun(0);break; //左侧避障传感器有信号小车右转case 0x10:zuolun(90); youlun(0);break; //中间避障传感器有信号小车左转case 0x20:zuolun(90); youlun(0);break; //右侧避障传感器有信号小车左转}/*if(zuo==1){zuolun(10);youlun(50);}else if(zhong==1){zuolun(99);youlun(99);}else if(you==1){zuolun(50);youlun(10);} */}void main() //主函数{Init_timer(); //调用函数while(1){Inline();minge=0;minshi=0;second++;if(second==60)second=0,minge++;A1=second/10;A2=second%10;if(minge==10)minge=0,minshi++;for(a=200;a>0;a--){display(A1,A2,minge,minshi);};}}void Timer0_int()interrupt 1 //定时器中断计数{TH0 = (65535-10)/256;TL0 = (65535-10)%256;count ++;if(count >= 100){count = 0;}}。
)智能小车循迹要点

河北联合大学
电气工程学院
生产实习报告
专业自动化
姓名张桂平
学号************ 指导教师沈小伟
2013年7月1日
单片机最小系统
2. 电源模块:
模型车通过自身系统,采集赛道信息,获取自身速度信息,加以处理,由芯片给出指令控制其前进转向等动作,各部分都需要由电路支持,电源管理尤为重要。
在本设计中,51单片机使用5V电源,电机及舵机使用6V电源。
考虑到电源为充电电池组,额定电压为7.2V,实际充满电后电压则为6.5-6.8V,所以单片机及传感器模块采用7805稳压后的5V电源供电,电机直接由电池供电。
3.路面检测电路:
路面检测电路由5对光电发送与接收管组成。
由于路面存在黑色引导线,落在黑线区域内的光电接收管接收到反射的光线的强度与白色的路面不同,进而在光电接收管两端产生不同的电压值,由此判断路线的走向。
传感器模块将当前采集到的一组电压值传递给单片机,进而根据一定的算法对电机进行控制,使小车自动寻线行走。
下图是路面检测电路图:。
2012循迹小车规则

2012循迹小车规则
1,比赛分三轮,按我们安排的顺序,每一队参赛小车有三次比赛机会。
2,小车赛跑场地,由比赛当天公布。
必须按照路线跑。
跑出线外3次,立刻结束这一轮比赛。
3,如果没有成功跑完全程,成绩按照所跑长度记录;如果成功跑完,按照跑完的时间记录成绩。
如图,若小车在第7区跑到线外则成绩记录为7。
4,最终成绩有三部分组成。
1)电路板元件布局合理,线条美观;占权重10%(评分总分为10)
2)车体设计美观;占权重20%(评分总分为20)
3)赛跑成绩;占权重70%,按照全部排名,总分71;若第一名,则该部分得分为71-1=70;
三部分分数加起来,然后进行总排名。
5,不使用协会提供的原理图,只要实现相同功能的车可以参赛。
但必须无人操作,杜绝遥控等场外控制小车。
6,
奖项设置:
一等奖(1名):奖状+高端单片机开发板一套(自选C51或STM32系列)
二等奖(2名):奖状+中端单片机开发板一套(自选C51或STM32系列)
三等奖(3名):奖状+单片机最小系统板(自选C51或STM32系列)
优胜奖(成功参赛):奖状+精美礼品
附图:黑实线为实际跑道,细实线区为积分区。
前点
终点
5
1
2
3 4。
循迹小车三路的程序

sbit PWM2=P2^1;
sbit IN4=P2^5;
sbit ZUO=P1^0;
sbit ZHONG=P1^1//此处是传感器YOU20 管脚位声明
sbit YOU=P1^2;
int count1=0;//用于定时计数的两个全局变量位声明
int count2=0;
TL0=(65536-1000)%256;
count1++;
if(count1>=1000)//周期是1s
count1=0;
}
void time1()interrupt 3
{
TH0=(65536-1000)/256;//定时1ms
TL0=(65536-1000)%256;
count2++;
{
right_turn1(count1,500,count2,200);
}
if(ZUO==1&&YOU==1)/*左右轮均检测黑线,小车继续前进*/
/*(此处用来处理"8"字型路线交叉处小车如何前进的问题)*/
{
advance(count1,500,count2,500);
}
}
}
{
forward_turn1();
forward_turn2();
speed1(ct1,sd1);
speed2(ct2,sd2);
}
void right_turn1(int ct1,int sd1,int ct2,int sd2)//小车右转
{
forward_turn1();
循迹小车的C语言程序(带注释)

/************ ******** *
第二部分 电机控制子函数 ************* ******** ******* /
void forward1()// { IN1=0; IN2=1; }
电机
1
前进
void forward2()// { IN3=0; IN4=1; }
电机
2
前进
void back1()// { IN1=1; IN2=0; }
当第一、二个 LED 检测到黑线时,小车左转
if(RP1==0&&RP2==0&&RP3==0&&RP4==1) turn(count1,0,coun t2,200); // 0001
当第一、二、三个 LED 检测到黑线时, 小车
左大转
/************ ******** ***
小车右转*******************************/
当最右边的 LED 检测到黑线时,小车左转
if(RP1==1&&RP2==0&&RP3==1&&RP4==1)
turn(count1,80,coun t2,150); // 1011
当第二个 LED 检测到黑线时,小车偏左转
if(RP1==0&&RP2==0&&RP3==1&&RP4==1) turn(count1,0,coun t2,100); // 0011
void time0()interrupt 1 { TH0=(65536-1000)/256;// TL0=(65536-1000)%256; count1++; count2++; if(count1>=500)// count1=0; if(count2>=500)// count2=0; }
循迹小车程序 带注释

left_qian;
//左边电机前进
right_hou;
//右边电机后退
}
else if((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==0)) //右转弯 幅度大
{
zkb_l=100;
//左边占空比100%
zkb_r=100;
//右边占空比100%
left_qian;
/*********************************************************************/
void timer0() interrupt 1
{
TH0=0xff;
//定时器0高8位初值(65536-100)/256;
TL0=0x9c;
//定时器0低8位初值(65536-100)%256;
//右边占空比20%
left_qian;
//左边电机前进
right_qian;
//右边电机前进
}
else if((left_2==1)&&(left_1==1)&&(righ_1==0)&&(righ_2==0)) //右转弯 幅度中
{
zkb_l=100;
//左边占空比100%
zkb_r=40;
//右边占空比40%
//左转弯 幅度大
{
zkb_l=100;
//左边占空比100%
zkb_r=100;
//右边占空比100%
left_hou;
//左边电机后退
right_qian;
//右边电机前进
三路红外循迹小车 arduino程序

digitalWrite(pinI2,HIGH);
}
void left()//左转
{
analogWrite(speedpin,60);//输入模拟值进行设定速度
analogWrite(speedpin1,60);
digitalWrite(pinI4,LOW);//使直流电机(右)逆时针转
pinMode(pinI3,OUTPUT);
pinMode(pinI4,OUTPUT);
pinMode(speedpin1,OUTPUT);
pinMode(IRR,INPUT);
pinMode(IRM,INPUT);
pinMode(IRL,INPUT);
m=digitalRead(IRM);
l=digitalRead(IRL);
if(l==LOW &&m==HIGH && r==LOW)
advance();
else if(l==LOW &&m==HIGH && r==HIGH)
advance();
int IRR=3;//定义右侧寻线传感器接口
int IRM=4;//定义中间寻线传感器接口
int IRL=5;//定义左侧寻线传感器接口
void setup()
{
pinMode(pinI1,OUTPUT);
pinMode(pinI2,OUTPUT);
pinMode(speedpin,OUTPUT);
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,HIGH);//使直流电机(左)逆时针转
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "reg51.h"
typedef unsigned int uint;
typedef unsigned char uchar;
sbit p2_0 = P2^0; //开关
sbit p2_1 = P2^1; //红外检测
sbit p2_2 = P2^2;
sbit p2_3 = P2^3;
sbit p1_0 = P1^0; //电机驱动
sbit p1_1 = P1^1;
sbit p1_2 = P1^2;
sbit p1_3 = P1^3;
sbit pwm1 = P1^4; //pwm调速
sbit pwm2 = P1^5;
unsigned char timer1;
/******************************************************************** ***********
* 函数名 : Time1Config
* 函数功能 : 设置定时器
* 输入 : 无
* 输出 : 无
********************************************************************* **********/
void Time1Config()
{
TMOD|= 0x10; //设置定时计数器工作方式1为定时器
//--定时器赋初始值,12MHZ下定时0.5ms--//
TH1 = 0xFE;
TL1 = 0x0C;
ET1 = 1; //开启定时器1中断
EA = 1;
TR1 = 1; //开启定时器
}
/************************************************ 延时函数
总共延时
1ms
乘以
count
************************************************/ void DelayX1ms(uint count)
{
uint j;
while(count--!=0)
{
for(j=0;j<72;j++);
}
}
/************************************************ 电机转动函数定义
************************************************/ void ZhiXing( )
{
p1_0=0;
p1_1=0;
p1_2=0;
p1_3=0;
DelayX1ms(10);
p1_0=0;
p1_1=1;
p1_2=0;
p1_3=1;
DelayX1ms(15);
}
void ZuoZhuan( )
{
pwm1=0;
pwm2=0;
DelayX1ms(10); p1_0=0;
p1_1=1;
p1_2=1;
p1_3=0;
DelayX1ms(20); }
void YouZhuan( )
{
pwm1=0;
pwm2=0;
DelayX1ms(10);
p1_0=1;
p1_1=0;
p1_2=0;
p1_3=1;
DelayX1ms(20); }
void HouTui( )
{
p1_0=0;
p1_1=0;
p1_2=0;
p1_3=0;
DelayX1ms(6); p1_0=1;
p1_1=0;
p1_2=1;
p1_3=0;
DelayX1ms(20);
}
/************************************************ 主函数
************************************************/ void main( )
{
Time1Config();
while(1)
{
if( p2_1==0 && p2_2==0 && p2_3==1)
{
YouZhuan( );
}
else if(p2_1==1 && p2_2==0 && p2_3==0)
{
ZuoZhuan( );
}
else
{
ZhiXing( );
}
}
}
/******************************************************************** ***********
* 函数名 : Time1
* 函数功能 : 定时器1的中断函数
* 输入 : 无
* 输出 : 无
********************************************************************* **********/
void Time1(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断
{
timer1++;
if(timer1>100) //PWM周期为100*0.5ms
{
timer1=0;
}
if(timer1 < 85) //改变30这个值可以改变直流电机的速度
{
pwm1=1;
pwm2=1;
}
else
{
pwm1=0;
pwm2=0;
}
TH1 = 0xFE; //重新赋初值
TL1 = 0x0C;
}。