循迹小车程序

合集下载

循迹小车三路的程序

循迹小车三路的程序
{
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();

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

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

#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;}。

循迹小车程序代码

循迹小车程序代码

//(在MAIN中接受铁片颜色判断传感器的信号来赋值) unsigned char Light_Flag=0;//进入光引导区的标志(1) unsigned int cntTime_5Min=0;//时间周期数,用于 T0 精确定时 unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数 /*============================全局变量定义区 ============================*/ /*------------------------------------------------*/ /*-----------------通用延迟程序-------------------*/ /*------------------------------------------------*/ void delay(unsigned int time) { unsigned int i,j; for(j=0;j<time;j++) { for(i=0;i<60;i++) {;} } } /*-----------------------------------------------*/ /*-------------------显示控制模块----------------*/ /*-----------------------------------------------*/ /*数码管显示,显示铁片的数目(设接在P0,共阴)*/ void Display(unsigned char n) { char Numb[12]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}; P0=Numb[n]; } // time*0.5ms延时

自动循迹小车(附有程序)

自动循迹小车(附有程序)

大学生电子设计竞赛自动循迹小车目录摘要 (1)1.方案论证 (2)1.1方案描述 (2)1.2单片机方案的比较与论证 (2)1.3编码器选择与论证 (2)1.4 LDC1000与LDC1314选择与论证 (3)1.5 OLED显示方案 (3)1.6蜂鸣器发声方案 (3)2.理论分析与计算 (3)2.1速度增量式PID计算 (3)2.2舵机位置式PID算法 (3)3.电路与程序设计 (4)3.1系统组成 (4)3.2系统流程图 (5)4.测试方案与测试结果 (5)4.1测试方案 (5)4.1.1舵机测试方案 (6)4.1.2电机测试方案 (6)4.2系统测试结果分析 (6)5.结论 (6)6.参考文献 (7)摘要本循迹小车以单片机XS128为控制核心,主要由LDC1314感应模块、稳压模块、液晶显示模块、驱动控制模块、蜂鸣器模块、编码器、舵机以及小车组成。

跑道的标识为一根直径0.6~0.9mm的细铁丝,小车在规定的平面跑道自动按顺时针方向循迹前进。

在任意直线段铁丝上放置4个直径约19mm的镀镍钢芯硬币(第五套人民币的1角硬币),硬币边缘紧贴铁丝。

实验结果表明,在直线区任意指定一起点(终点),小车都能够依据跑道上设置的铁丝标识,能够自动绕跑道跑完一圈,而且时间不超过10分钟,小车运行时始终保持轨迹铁丝位于小车垂直投影之下,小车路过硬币时能够发现并发出声音提示,显示屏上能够实时显示小车行驶的距离和运行时间。

关键词:自动循迹 LDC1314 实时显示自动循迹小车1.方案论证1.1方案描述自动循迹小车依据电磁感应原理,由单片机XS128控制,控制系统是由XS128控制模块、LDC1314感应模块、稳压模块、液晶显示模块、驱动控制模块、蜂鸣器模块、编码器、舵机以及电动小车组成的闭环控制系统。

LDC1314感应模块采集小车在跑道上位置与角度信息,利用XS128单片机处理位置与角度数据后调节舵机打角并通过PID精确算法调整后轮速度。

循迹小车的C语言程序(带注释)

循迹小车的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; }

循迹小车(程序)

循迹小车(程序)

附录程序目录一、前言------------------------------------------------------------二、小车功能------------------------------------------------------三、元器件选择--------------------------------------------------四、I/O分配及硬件连接简图---------------------------------五、相关模块、算法---------------------------------------------六、系统框图------------------------------------------------------七、调试过程------------------------------------------------------八、小车图片资料---------------------------------------------------九、讲座所感------------------------------------------------------十、实习总结------------------------------------------------------一、前言感谢生产实习能给我们这次实现自己想法的机会,虽然实验条件异常简陋、资金投入非常有限,总体感觉我的队友们灰常灰常给力啊,我感觉我是抱到大腿了--王威,夏青、峰哥,团队气氛非常好,大家一起讨论,一起分工研究模块,最后一起解决问题调试程序,而且是不同的组合在不同阶段解决了不同的问题,大家精诚合作,各显身手,在奋战中给大三学年画上了圆满的句号。

之前我们本来商量是不是可以拿往年电子设计大赛的题目过来做,如果难度太大就算只实现一部分功能也算是成功完成了,结果研究一天后发现电子设计大赛的题目需要很长时间的知识积累啊,基本上都是准备一个月以上然后开工的,后来王威提议要不我们做个小车吧,超声波测距实现自动物体追踪,控制核心采用单片机,传感器采用广泛用于避障和测距的超声波传感器,前进和后退用普通伺服电机和电机驱动模块实现。

循迹小车程序代码(带解释说明)

循迹小车程序代码(带解释说明)

int Left_motor_go=6; //左电机前进(IN1)int Left_motor_back=7; //左电机后退(IN2)int Right_motor_go=9; // 右电机前进(IN3)int Right_motor_back=10; // 右电机后退(IN4)const int SensorRight = 3; //右循迹红外传感器(P3.2 OUT1)const int SensorLeft = 4; //左循迹红外传感器(P3.3 OUT2)int SL; //左循迹红外传感器状态int SR; //右循迹红外传感器状态void setup(){//初始化电机驱动IO为输出方式pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM)pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)pinMode(SensorRight, INPUT); //定义右循迹红外传感器为输入pinMode(SensorLeft, INPUT); //定义左循迹红外传感器为输入}//=======================智能小车的基本动作========================= //void run(int time) // 前进void run(){digitalWrite(Right_motor_go,HIGH); // 右电机前进digitalWrite(Right_motor_back,LOW);analogWrite(Right_motor_go,20);//PWM比例0~255调速,左右轮差异略增减analogWrite(Right_motor_back,0);digitalWrite(Left_motor_go,LOW); // 左电机前进digitalWrite(Left_motor_back,HIGH);analogWrite(Left_motor_go,0);//PWM比例0~255调速,左右轮差异略增减analogWrite(Left_motor_back,127 );//delay(time * 100); //执行时间,可以调整}//void brake(int time) //刹车,停车void brake(){digitalWrite(Right_motor_go,LOW);digitalWrite(Right_motor_back,LOW);digitalWrite(Left_motor_go,LOW);digitalWrite(Left_motor_back,LOW);//delay(time * 100);//执行时间,可以调整}//void left(int time) //左转(左轮不动,右轮前进) void left(){digitalWrite(Right_motor_go,HIGH);// 右电机前进digitalWrite(Right_motor_back,LOW);analogWrite(Right_motor_go,1);analogWrite(Right_motor_back,0);//PWM比例0~255调速digitalWrite(Left_motor_go,LOW); //左轮后退digitalWrite(Left_motor_back,LOW);analogWrite(Left_motor_go,0);analogWrite(Left_motor_back,0);//PWM比例0~255调速//delay(time * 100);//执行时间,可以调整}void right(){digitalWrite(Right_motor_go,LOW); //右电机后退digitalWrite(Right_motor_back,LOW);analogWrite(Right_motor_back,0);//PWM比例0~255调速digitalWrite(Left_motor_go,LOW);//左电机前进digitalWrite(Left_motor_back,HIGH);analogWrite(Left_motor_go,0);analogWrite(Left_motor_back,127);//delay(time * 100);//执行时间,可以调整}void back(int time){digitalWrite(Right_motor_go,LOW); //右轮后退digitalWrite(Right_motor_back,HIGH);analogWrite(Right_motor_go,0);analogWrite(Right_motor_back,60);//PWM比例0~255调速digitalWrite(Left_motor_go,HIGH); //左轮后退digitalWrite(Left_motor_back,LOW);analogWrite(Left_motor_go,60);analogWrite(Left_motor_back,0);//PWM比例0~255调速delay(time * 100); //执行时间,可以调整}//==========================================================void loop(){//有信号为LOW 没有信号为HIGH 检测到黑线输出高检测到白色区域输出低SR = digitalRead(SensorRight);//有信号表明在白色区域,车子底板上L1亮;没信号表明压在黑线上,车子底板上L1灭SL = digitalRead(SensorLeft);//有信号表明在白色区域,车子底板上L2亮;没信号表明压在黑线上,车子底板上L2灭if (SL == LOW&&SR==LOW)run(); //调用前进函数else if (SL == HIGH & SR == LOW)// 左循迹红外传感器,检测到信号,车子向右偏离轨道,向左转left();else if (SR == HIGH & SL == LOW) // 右循迹红外传感器,检测到信号,车子向左偏离轨道,向右转right();else // 都是黑色, 停止brake();}。

循迹小车课程设计报告

循迹小车课程设计报告

循迹小车课程设计报告
一、概述
本课程是针对中小学电子爱好者,设计一款基于Arduino开发
板的循迹小车。

课程分为两部分,理论学习和实战操作。

二、理论学习
1. 基础知识学习
学习Arduino开发板的基本用法,了解循迹传感器的原理和应用。

2. 循迹算法学习
介绍循迹控制算法,如PID控制,模糊控制等。

3. 电路原理图学习
通过示例电路,学习循迹小车的电路原理,理解各个组件的作
用与连接方式。

三、实战操作
1. 简单循迹小车搭建
学生通过教师提供的视频教程,自行搭建一个简单的循迹小车。

2. 电路焊接操作
学生进行电路焊接操作,提高电路实际操作能力。

3. 循迹小车控制程序编写
学生通过Arduino开发板,编写循迹小车控制程序,实现小车的运动。

四、实施效果
本课程的实施效果如下:
1. 学生提高Arduino开发板的使用能力。

2. 学生通过理论学习,了解循迹控制算法的原理。

3. 学生通过实战操作,提高电路焊接和程序编写能力。

4. 学生通过小车的装配,加深对电子学原理的理解能力。

五、总结
本课程以实战为主,理论为辅,充分利用学生的动手能力和创造能力,锤炼学生的动手能力和团队合作精神。

在实施中,教师应注意保障学生的安全,严格要求学生的动作规范。

通过开展此
课程,旨在激发学生对电子技术的兴趣,培养学生的科学实验精神。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a,i,time_count=0, count=0,Dutycycle0=50,Dutycycle1=50,flag; uchar state;
/***定义电机控制位***/
sbit INT11=P0^0; //电机控制位,左电机左,芯片中的总开关
sbit INT22=P0^1; // 右电机控制位,高电平有效
sbit INT33=P0^2; //控制左电机,从而控制其中的车轮
sbit INT44=P0^3;
sbit funpwm0=P1^3; ///两个控制PWM的端口
sbit funpwm1=P1^4;
sbit IO1=P2^0; //ST188输出端口
sbit IO2=P2^1;
sbit IO3=P2^2;
sbit IO4=P2^3;
sfr CCON = 0xD8; // PCA控制寄存器
sbit CCF0 = CCON^0; // PCA模块0中断标志
sbit CCF1 = CCON^1; // PCA模块0中断标志
sbit CR = CCON^6; // PCA计数器阵列溢出标志位
sbit CF = CCON^7; // PCA计数器阵列运行控制位
sfr CMOD = 0xD9; // PCA工作模式寄存器
sfr CL = 0xE9; // PCA的16位计数器----低8位
sfr CH = 0xF9; // PCA的16位计数器----高8位
sfr CCAPM0 = 0xDA; // PCA模块0的输出脉冲频率
sfr CCAP0L = 0xEA; // PCA捕获、比较寄存器——低位字节sfr CCAP0H = 0xFA; // PCA捕获、比较寄存器——高位字节sfr CCAPM1 = 0xDB; // PCA模块1的输出脉冲频率
sfr CCAP1L = 0xEB; // 同上
sfr CCAP1H = 0xFB; // 同上
sfr PCAPWM0= 0xf2; // PCA模块0的PWM寄存器
sfr PCAPWM1= 0xf3; // PCA模块1的PWM寄存器
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/****************************速度设定:通过改变参数a,b 来来改变两路pwm的占空比数值越大占空比越小*******************************************/ void pwm0(unsigned int a)
{
CCAP0L=a;
CCAP0H=a;
}
void pwm1(unsigned int b) {
CCAP1L=b;
CCAP1H=b;
}
void pwm_Init()
{
CL=0;
CH=0;
CMOD=0x00;
CCAP0H=CCAP0L=0x00;
CCAPM0=0x42;
CCAP1H=CCAP1L=0x00;
CCAPM1=0x42;
CR=1;
}
delay(i)
{
int k,j;
for(j=1000;j>0;j--)
for(k=200;k>0;k--)
i--;
}
former()
{
INT11=1;
INT22=0;
INT33=1;
INT44=0;
pwm0(74);
pwm1(75);
}
turnleft0()
{
pwm0(130);
pwm1(80);
}
turnright0()
{
pwm0(80);
pwm1(130);
}
turnleft1()
{
pwm0(0Xff);
pwm1(45);
//flag=1;
while((!IO1)&&(!IO2)); }
turnright1()
{
pwm0(25);
pwm1(0Xff);
//flag=0;
while((!IO1)&&(!IO2)); }
stop()
{
INT11=1;
INT22=1;
INT33=1;
INT44=1;
}
/*************************主函数***********************************/ main()
{
pwm_Init();
DelayMs(2000);
former();
while(1)
{
if(IO3==0&&IO2==0&&IO1==0&&IO4==0) former();
if(IO3==0&&IO2==0&&IO1==0&&IO4==1) turnright1();
if(IO3==0&&IO2==0&&IO1==1&&IO4==0) turnright0();
if(IO3==0&&IO2==0&&IO1==1&&IO4==1) turnright1();
if(IO3==0&&IO2==1&&IO1==0&&IO4==0) turnleft0();
if(IO3==0&&IO2==1&&IO1==0&&IO4==1) turnright1();
if(IO3==0&&IO2==1&&IO1==1&&IO4==0) former();
if(IO3==0&&IO2==1&&IO1==1&&IO4==1) turnright1();
if(IO3==1&&IO2==0&&IO1==0&&IO4==0) turnleft1();
if(IO3==1&&IO2==0&&IO1==1&&IO4==0) turnleft0();
if(IO3==1&&IO2==0&&IO1==0&&IO4==1) former();
if(IO3==1&&IO2==0&&IO1==1&&IO4==1) turnright1();
if(IO3==1&&IO2==1&&IO1==0&&IO4==0) turnleft1();
if(IO3==1&&IO2==1&&IO1==0&&IO4==1) turnleft1();
if(IO3==1&&IO2==1&&IO1==1&&IO4==0) turnleft1();
if(IO3==1&&IO2==1&&IO1==1&&IO4==1) stop();
}
}。

相关文档
最新文档