寻迹小车控制程序简介
循迹小车三路的程序

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

#define uint unsigned int#define uchar unsigned charsbit P10=P1^0; //控制左电机前进sbit P11=P1^1;//控制左电机后退sbit LED=P0^0;//************************************************ //延时函数,在12MHz的晶振频率下//大约50us的延时//************************************************ void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}//************************************************ void qianjin()//小车前进{ P10=0;P11=1;delay_50us(25);P10=1;P11=1;delay_50us(10);}void tingzhi() //小车停止{ P10=1;P11=1;}void youguai() //小车后退{ P10=1;P11=0;delay_50us(25);P10=1;P11=1;delay_50us(10);}|||||||||#include<reg52.h> //库文件#define uchar unsigned char#define uint unsigned intsbit dula=P2^6; //申明U1锁存器的锁存端sbit wela=P2^7; //申明U2锁存器的锁存端sbit RX=P1^0;sbit TX=P1^1;uchar bai,shi,ge;unsigned int time=0;unsigned int timer=0;unsigned char posit=0;unsigned long S=0;bit flag =0;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);}/********************************************************/ void display(){dula=1;P0=table[bai]; //送段选数据dula=0;P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时wela=1; //原来段选数据通过位选锁存器造成混乱P0=0x7e; //送位选数据wela=0;delayms(1); //延时dula=1;P0=table[shi];dula=0;P0=0xff;wela=1;P0=0x7d;wela=0;delayms(1);dula=1;P0=table[ge];dula=0;P0=0xff;wela=1;P0=0x7b;wela=0;delayms(1);}/********************************************************/ void Conut(){time=TH0;time=((time<<8)|TL0);TH0=0;TL0=0;S=(time*1.7)/100; //算出来是CMif((S>=700)||flag==1) //超出测量范围显示“-”{flag=0;bai=0;shi=0;ge=0;}else{bai=S%1000/100; //分出百,十,和个位shi=S%1000%100/10;ge=S%1000%10 %10;}}/********************************************************/ void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围{flag=1; //中断溢出标志}/********************************************************/void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块{TH1=0xf8;//TL1=0x30;//display();timer++;if(timer>=10){timer=0;TX=1; //800MS 启动一次模块_nop_();_nop_();_nop_();_nop_();TX=0;}}/*********************************************************/void main( void ){TMOD=0x11; //设T0为方式1,GA TE=1;TH0=0;TL0=0;TH1=0xf8; //2MS定时TL1=0x30;ET0=1; //允许T0中断ET1=1; //允许T1中断TR1=1; //开启定时器EA=1; //开启总中断while(1){while(!RX); //当RX为零时等待TR0=1; //开启计数while(RX); //当RX为1计数并等待TR0=0; //关闭计数Conut();//计算}}。
智能循迹避障小车完整程序(亲测好使)

智能循迹避障小车完整程序(亲测好使)/*******************************************//利用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;}}。
单片机小车黑线循迹程序

单片机小车黑线循迹程序一、前言单片机小车是一种常见的电子制作项目,它可以通过编程控制小车的运动,实现多种功能。
其中,黑线循迹程序是单片机小车中常见的一个程序,它可以让小车自动沿着黑线行驶。
本文将详细介绍单片机小车黑线循迹程序的实现方法。
二、硬件准备在编写黑线循迹程序之前,需要先准备好相应的硬件设备。
下面是所需材料:1. 单片机板:可以使用STC89C52、AT89S52等型号。
2. 直流电机:需要两个。
3. 驱动电路:可以使用L298N等型号。
4. 红外传感器模块:需要三个,用于检测黑线位置。
5. 电源:需要12V直流电源。
三、软件准备在硬件准备完成之后,需要将相应的软件安装到计算机上。
下面是所需软件:1. Keil C51编译器:用于编写和调试单片机程序。
2. Proteus仿真软件:用于模拟单片机板和其他硬件设备的工作情况。
四、程序实现1. 程序框架首先,在Keil C51中新建一个工程,并创建一个空白的C文件。
然后,可以按照以下框架编写程序:#include <reg52.h>sbit IN1 = P1^0;sbit IN2 = P1^1;sbit IN3 = P1^2;sbit IN4 = P1^3;void delay(unsigned int i){while(i--);}void main(){while(1){// 循迹程序// 控制电机运动}}2. 循迹程序在程序框架中,需要编写循迹程序,用于检测黑线位置并控制小车的运动。
循迹程序的实现方法如下:// 定义红外传感器引脚sbit LEFT_SENSOR = P2^0;sbit MIDDLE_SENSOR = P2^1;sbit RIGHT_SENSOR = P2^2;void track(){if(LEFT_SENSOR == 0 && MIDDLE_SENSOR == 0 && RIGHT_SENSOR == 0) // 直行{IN1 = 1;IN2 = 0;IN3 = 1;IN4 = 0;}else if(LEFT_SENSOR == 0 && MIDDLE_SENSOR == 0 && RIGHT_SENSOR == 1) // 左偏{IN1 = 0;IN2 = 0;IN3 = 1;IN4 = 0;}else if(LEFT_SENSOR == 0 && MIDDLE_SENSOR == 1 && RIGHT_SENSOR == 0) // 直行{IN1 = 1;IN2 = 0;IN3 = 1;IN4 = 0;}else if(LEFT_SENSOR == 0 && MIDDLE_SENSOR == 1 && RIGHT_SENSOR == 1) // 直行{IN1 = 1;IN2 = 0;IN3 = 1;IN4 = 0;}else if(LEFT_SENSOR == 1 && MIDDLE_SENSOR == 0 && RIGHT_SENSOR == 0) // 右偏{IN1 = 1;IN2 = 0;IN3 = 0;IN4 = 0;}else if(LEFT_SENSOR == 1 && MIDDLE_SENSOR == 0 &&RIGHT_SENSOR == 1) // 右偏{IN1 = 1;IN2 = 0;IN3 = 0;IN4 = 0;}}循迹程序中,通过读取红外传感器的状态来判断黑线位置,并控制电机的运动。
循迹小车原理图和部分程序

循迹小车原理图和部分程序其实循迹原理很简单,如下图,就是红外反射照到黑线上方时光都被黑线吸收了(注意要调节好反射管到地面的距离),接着反入射模块就输出一个低电平给控制器(单片机),然后单片机就根据这个低电平执行动作(左转或者右转)#include <iom16v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned intuchar front;void delayus(uint us){while(us)us--;}/*一毫秒的延时*/void delay(uint i){unsigned int a, b;for (a = 1; a < i; a++){for (b = 1; b<1141; b++){;}}}/******************* 一毫秒的延时**********************/void delayms(uintms){uinti,j;for(i=0;i<ms;i++)for(j=0;j<1141;j++);}/**********************小车停车函数***************************/void stop(){OCR1A=0;OCR1B=0;PORTD&=~BIT(PD0);PORTD&=~BIT(PD1);PORTD&=~BIT(PD2);PORTD&=~BIT(PD3); }/*****************小车向前向后函数*****************/void go(uchar speed){OCR1A=speed;OCR1B=speed;if(front==1){PORTD&=~BIT(PD0);PORTD&=~BIT(PD1);PORTD|=BIT(PD2);PORTD|=BIT(PD3 );}else{OCR1A=200;OCR1B=200;PORTD&=~BIT(PD0);PORTD&=~BIT(PD1);PORTD|=BIT(PD2);PORTD|=BIT(PD3);}}/**************小车向左向右的函数*******************/void l_r(uchar p){switch(p){case 'r' :{PORTD&=~BIT(PD0);PORTD&=~BIT(PD6);PORTD|=BIT(PD1);PORTD|=BIT( PD7);OCR1A=200;OCR1B=0;break;}case 'l' :{PORTD&=~BIT(PD0);PORTD&=~BIT(PD6);PORTD|=BIT(PD1);PORTD|=BIT( PD7);OCR1A=0;OCR1B=200;break;}}}void main(){uchartemp,active;DDRA=0X00;DDRB=0X00;PORTB = 0xFF;DDRC = 0xFF;PORTC = 0x03;DDRD = 0xFF;PORTD = 0xFF;/*端口设置*/TCCR1A=0xA1;TCCR1B=0x03;/*8位相位修正PWM,64分频*/TCNT1H=0xFF;TCNT1L=0XFF;delay(300);while(1){front=1;temp=PINB&0XFF;if(temp!=0XFF){switch(temp)//////这就是根据反射模块传给单片机的信号进行各动作 {case 0b11111110:{l_r('r');break;}case 0b11111101:{l_r('l');break;}case 0b11111011:{l_r('r');break;}case 0b11110111:{l_r('l');break;}case 0b11101111:{l_r('r');break;}case 0b11011111:{l_r('l');break;}case 0b10111111:{stop();delay(1000);break;} default: go(80);}}}。
自动循迹小车(附有程序)

大学生电子设计竞赛自动循迹小车目录摘要 (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精确算法调整后轮速度。
循迹小车三路的程序

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

附录程序目录一、前言------------------------------------------------------------二、小车功能------------------------------------------------------三、元器件选择--------------------------------------------------四、I/O分配及硬件连接简图---------------------------------五、相关模块、算法---------------------------------------------六、系统框图------------------------------------------------------七、调试过程------------------------------------------------------八、小车图片资料---------------------------------------------------九、讲座所感------------------------------------------------------十、实习总结------------------------------------------------------一、前言感谢生产实习能给我们这次实现自己想法的机会,虽然实验条件异常简陋、资金投入非常有限,总体感觉我的队友们灰常灰常给力啊,我感觉我是抱到大腿了--王威,夏青、峰哥,团队气氛非常好,大家一起讨论,一起分工研究模块,最后一起解决问题调试程序,而且是不同的组合在不同阶段解决了不同的问题,大家精诚合作,各显身手,在奋战中给大三学年画上了圆满的句号。
之前我们本来商量是不是可以拿往年电子设计大赛的题目过来做,如果难度太大就算只实现一部分功能也算是成功完成了,结果研究一天后发现电子设计大赛的题目需要很长时间的知识积累啊,基本上都是准备一个月以上然后开工的,后来王威提议要不我们做个小车吧,超声波测距实现自动物体追踪,控制核心采用单片机,传感器采用广泛用于避障和测距的超声波传感器,前进和后退用普通伺服电机和电机驱动模块实现。
小车循迹的pid算法

小车循迹的pid算法小车循迹的PID算法引言:小车循迹是指通过感知地面上的黑线或者白线,使小车能够沿着线路行驶。
为了实现精确的循迹,PID算法被广泛应用于小车循迹控制中。
本文将介绍PID算法的原理和应用于小车循迹的具体实现。
一、PID算法原理PID算法是一种基于反馈控制的算法,其全称为比例-积分-微分控制算法。
其基本原理是通过不断调整输出信号,使系统的输出值尽量接近给定的目标值。
1. 比例控制(Proportional Control):比例控制是根据当前误差的大小来调整输出信号。
当误差较大时,输出信号也会相应增大;当误差较小时,输出信号也会相应减小。
这样可以实现系统的快速响应。
2. 积分控制(Integral Control):积分控制是根据误差的累积值来调整输出信号。
当误差持续存在时,积分项会逐渐增大,从而加大输出信号,以消除积累误差。
积分控制可以解决系统静差的问题。
3. 微分控制(Derivative Control):微分控制是根据误差的变化率来调整输出信号。
当误差的变化率较大时,输出信号也会相应增大;当误差的变化率较小时,输出信号也会相应减小。
微分控制可以提高系统的稳定性和抑制振荡。
二、PID算法在小车循迹中的应用小车循迹是指通过感知地面上的黑线或者白线,使小车能够沿着线路行驶。
PID算法可以根据当前的线路位置误差来调整小车的转向角度,从而实现循迹控制。
1. 感知线路:小车循迹需要通过感知地面上的黑线或者白线来判断当前的位置误差。
通常使用光敏电阻或红外传感器来感知地面的亮度,并将其转换为电信号。
2. 计算误差:根据感知到的线路信息,可以计算出当前的位置误差。
位置误差可以定义为小车当前位置与目标位置之间的距离差。
3. 调整转向角度:根据计算得到的位置误差,可以使用PID算法来调整小车的转向角度。
比例控制项可以根据位置误差的大小来调整转向角度;积分控制项可以消除积累误差,使小车能够更好地沿着线路行驶;微分控制项可以提高系统的稳定性,防止小车出现过大的震荡。
循迹小车原理

循迹小车原理循迹小车(LineTrackingCar)是一种由电机驱动的机器人的智能小车,用来完成自动驾驶任务。
它的基本原理是通过传感器检测光线反射强度,再通过算法来控制电机运转,从而实现无人自动导航。
因此,其主要技术要素为,传感器、光强度检测框架、运动控制算法和运动系统组件等。
循迹小车的传感器循迹小车使用的传感器主要有光敏电阻、红外传感器、超声波传感器、电眼传感器等,其中光敏电阻是最常用的一种传感器。
它能够感知反射光强度的变化,从而实现循迹小车的运动。
它的信号线由电路芯片组成,并且能够将电压转换为电信号,并由电路板传递到主控单元,最终由控制系统进行处理。
循迹小车的光强度检测框架光强度检测框架是循迹小车机器人运动控制中很重要的一个环节,它将传感器探测到的光强度变化转换为特定的数值,用于控制小车的行走方向和方式。
在做光强度检测框架时,可以根据小车设计的参数,确定路径中的若干个固定点,可以将这些点进行编号,再按照特定的顺序进行检测,如:采用从底部到顶部的方式,进行依次检测,可以有效地完成小车的路径规划。
循迹小车的运动控制算法运动控制算法是循迹小车中重要组成部分,它是控制小车机器人运动的核心算法,用于确定小车运动的方向和动作,从而实现跟随路径的行走。
常见的循迹小车控制算法有老鼠算法,动态规划算法,RANSAC算法,模糊控制算法,改进的蚁群算法等。
老鼠算法,是一种使用机器人的最简单的算法,基本思想是通过不断的前行,然后再根据所遇到的环境做出右转或左转的决策。
动态规划算法,是一种贪心算法,它计算每一步直接决策,以实现最优解。
RANSAC算法,是一种基于概率的算法,它基于模型快速迭代采样,以找出有效数据并通过迭代重新估计参数。
模糊控制算法,是一种数学分析技术,它将概率和关联度结合起来,以实现模糊决策。
改进的蚁群算法,是一种基于智能的算法,它基于人类的行为,以实现小车路径的优化。
循迹小车的运动系统组件运动系统组件是循迹小车机器人的控制系统的重要组成部分,它包括:电机控制器、电机驱动器、轮胎组件和电源组件等。
单片机的智能循迹小车

调试方法
A
总之,基于 51单片机的 智能循迹小 车是一种简 单实用的智 能控制系统
B
通过合理的 硬件设计和 软件编程, 可以实现小 车的自动循
迹功能
C
在调试过程中, 需要逐步排查 问题,不断优 化程序,以提 高系统的性能
和稳定性
感/谢/聆/听
以及调试方法
1
原理
原理
1Байду номын сангаас
基于51单片机的智能循迹小车通过传感器检测小车与路径之间的距 离,将检测到的信号转换为电平信号,然后通过单片机进行处理
单片机根据接收到的信号控制电机驱动模块,从而控制小车的运动 方向和速度
2
3
通过不断调整小车的运动方向和速度,使得小车能够沿着指定的路 径进行运动
2
硬件组成
51单片机的智能 循迹小车
-
01
原理
02 硬件组成
03 软件设计 04 调试方法
51单片机的智能循迹小车
1
智能循迹小车是一种自动 控制系统,能够沿着指定
的路径进行运动
2
基于51单片机的智能循迹 小车是一种使用51单片机 作为主控制器的智能循迹
小车
3
下面将详细介绍基于51单 片机的智能循迹小车的原 理、硬件组成、软件设计
4
调试方法
调试方法
基于51单片机的智能循迹小车的调试方法主要包括以下几个步骤
硬件调试:检查硬件连接是否正确,确保电源、传感器、电机驱动模块等设备 能够正常工作
软件调试:通过调试器或仿真器对程序进行调试,检查程序是否存在语法错误 或逻辑错误
实际环境测试:将调试好的程序下载到单片机中,然后在实际环境中进行测试 。观察小车的运动情况,如果存在偏差或问题,需要对程序进行调整和优化
循迹小车

1.小车控制及驱动单元的选择此部分是整个小车的大脑,是整个小车运行的核心部件,起着控制小车所有运行状态的作用。
通常选用单片机作为小车的核心控制单元,本文以台湾凌阳公司的SPCE061A单片机为例予以介绍。
SPCE061是一款拥有2K RAM、32KFlash、32 个I/O 口,并集成了AD/DA 功能强大的16位微处理器,它还拥有丰富的语音处理功能,为小车的功能扩展提供了相当大的空间。
只要按照该单片机的要求对其编制程序就可以实现很多不同的功能。
小车驱动电机一般利用现成的玩具小车上的配套直流电机。
考虑到小车必须能够前进、倒退、停止,并能灵活转向,在左右两轮各装一个电机分别进行驱动。
当左轮电机转速高于右轮电机转速时小车向右转,反之则向左转。
为了能控制车轮的转速,可以采取PWM调速法,即由单片机的IOB8、IOB9输出一系列频率固定的方波,再通过功率放大来驱动电机,在单片机中编程改变输出方波的占空比就可以改变加到电机上的平均电压,从而可以改变电机的转速。
左右轮两个电机转速的配合就可以实现小车的前进、倒退、转弯等功能。
2.小车循迹的原理这里的循迹是指小车在白色地板上循黑线行走,通常采取的方法是红外探测法。
红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。
单片机就是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。
红外探测器探测距离有限,一般最大不应超过15cm。
对于发射和接收红外线的红外探头,可以自己制作或直接采用集成式红外探头。
(1)自制红外探头电路如图1所示,红外光的发送接收选用型号为ST168的对管。
当小车在白色地面行驶时,装在车下的红外发射管发射红外线信号,经白色反射后,被接收管接收,一旦接收管接收到信号,那么图中光敏三极管将导通,比较器输出为低电平;当小车行驶到黑色引导线时,红外线信号被黑色吸收后,光敏三极管截止,比较器输出高电平,从而实现了通过红外线检测信号的功能。
智能小车系统设计(循迹-超声波-遥控)

智能小车系统设计(循迹-超声波-遥控)智能小车系统是一种通过各种传感器来控制小车行进的系统。
本文将介绍一种基于循迹、超声波和遥控的智能小车系统设计。
系统设计硬件设计本系统采用Arduino开发板和小车底盘作为硬件,以循迹模块、超声波模块和遥控器模块作为传感器,可以实现小车的智能行驶。
1.小车底盘:本系统采用智能小车底盘,主要包括两个直流电机和两个轮子,可以控制小车行进的方向和速度。
此外,小车底盘还需配有4片AA电池进行供电。
2.循迹模块:循迹模块是通过红外线传感器检测黑色轨道上的反光点实现的。
根据反光点的位置,循迹模块会控制小车的方向,使小车始终在轨道上行驶。
3.超声波模块:超声波模块可以检测小车前方的障碍物距离和方向。
如果检测到前方有障碍物,则系统会控制小车减速或停止,避免碰撞。
4.遥控器模块:遥控器模块可以通过无线信号控制小车的方向和速度,可以让小车在没有循迹和超声波控制的情况下自由行驶。
软件设计本系统的软件设计采用Arduino的开发环境进行编写,主要包括循迹控制、超声波控制和遥控控制三个部分。
1.循迹控制:循迹控制部分主要是通过循迹模块检测反光点的位置,控制小车的方向和速度。
如果小车偏离轨道,循迹控制部分会自动调整小车的方向,使其回到轨道上行驶。
2.超声波控制:超声波控制部分主要是通过超声波模块检测前方障碍物的距离和方向,如果距离过近,则超声波控制部分会控制小车减速或停止,并发出声音提示。
3.遥控控制:遥控控制部分是通过遥控器发出信号控制小车行驶。
使用者可以通过遥控器控制小车的方向和速度,可以实现小车的自由行驶。
实现效果循迹效果本系统的循迹效果非常稳定,可以实现小车在黑色轨道上高速行驶。
在循迹模块检测到偏离轨道时,系统能够及时作出调整,使小车回到轨道上行驶。
超声波效果超声波模块能够准确地检测到前方障碍物的距离和方向。
如果距离过近,则系统能够及时控制小车减速或停止,避免碰撞。
遥控效果遥控器模块可以实现小车的自由行驶。
小车循迹的pid算法

小车循迹的pid算法小车循迹的PID算法引言:小车循迹是一种常见的机器人应用场景,它能够通过感知地面上的黑线或其他标记物,实现自动导航。
PID控制算法是循迹小车中常用的控制算法之一,它通过对误差进行反馈调节,使小车能够准确地跟随黑线运动。
本文将介绍PID算法的基本原理及其在循迹小车中的应用。
一、PID控制算法的基本原理PID控制算法是一种经典的反馈控制算法,它由比例(P)、积分(I)和微分(D)三个部分组成。
PID控制器根据当前误差的大小和变化率,计算出一个控制量,用于调节系统的输出,使得误差尽可能接近零。
具体来说,PID控制器的计算公式如下:输出 = Kp * 偏差 + Ki * 积分项 + Kd * 微分项其中,Kp、Ki和Kd分别是比例、积分和微分系数,偏差是当前误差,积分项是历史误差的累加,微分项是误差的变化率。
通过调节这三个系数,可以得到合适的控制效果。
二、PID算法在循迹小车中的应用在循迹小车中,PID算法可以用于控制小车的转向角度,以实现沿着黑线行驶。
具体来说,循迹小车通过感知地面上的黑线,将其转化为电信号输入到PID控制器中。
PID控制器根据当前偏差和偏差的变化率,计算出相应的控制量,用于调节小车的转向角度。
1. 比例控制(P):比例控制是PID控制算法的基础部分,它根据当前偏差的大小,产生一个与偏差成正比的控制量。
在循迹小车中,比例控制可以使小车快速响应偏差,但容易产生震荡。
2. 积分控制(I):积分控制是为了解决比例控制产生的静差问题而引入的,它根据历史偏差的累加,产生一个与偏差累加值成正比的控制量。
在循迹小车中,积分控制可以消除偏差,使得小车能够更加稳定地行驶。
3. 微分控制(D):微分控制是为了解决比例控制产生的震荡问题而引入的,它根据偏差的变化率,产生一个与偏差变化率成正比的控制量。
在循迹小车中,微分控制可以使小车对偏差的变化更加敏感,从而减少震荡。
综合应用:在循迹小车中,PID控制算法通常会综合应用比例、积分和微分控制,以实现更好的控制效果。
智能循迹小车

智能循迹小车⒈介绍⑴背景智能循迹小车是一种基于技术的智能,具备自主导航和循迹功能。
它能够通过使用传感器和算法,根据预定的轨迹或标记物进行自动导航。
⑵目的本文档的目的是提供关于智能循迹小车的详细功能说明和操作指南,以便用户能够更好地理解和使用该产品。
⒉功能⑴自主导航智能循迹小车可以通过内置的导航算法和传感器来自主导航。
它可以检测周围环境,并根据设定的目标点来规划最佳路径进行移动。
⑵循迹功能智能循迹小车还具备循迹功能。
它可以通过跟踪地面上的标记线或颜色来进行自动导航,以达到所定义的轨迹或目的地。
⑶避障功能为了保证安全行驶,智能循迹小车还具备避障功能。
它可以通过激光或红外线传感器来检测前方障碍物,并采取相应的措施进行规避。
⑷远程控制用户还可以通过远程控制设备(如方式或电脑)来控制智能循迹小车的移动、停止和变向等操作,以满足特定需求。
⒊硬件配置⑴主控板智能循迹小车的主控板负责控制各种传感器、执行器和通讯设备的工作。
它采用先进的处理器和存储器,并提供丰富的接口和扩展能力。
⑵传感器智能循迹小车配备多种传感器,包括但不限于红外线传感器、激光传感器、摄像头等,用于感知周围环境和实时定位。
⑶执行器智能循迹小车还配备了多种执行器,如电机、舵机等,用于控制车轮的旋转和转向。
⒋软件配置⑴导航算法智能循迹小车的导航算法通过分析传感器数据和环境信息,实现智能的路径规划和导航功能。
它基于各种算法和机器学习技术,能够适应不同的道路和环境。
⑵远程控制系统智能循迹小车配备了远程控制系统,通过与用户的设备进行通信,实现远程操作和控制。
用户可以通过方式或电脑上的应用来实现远程控制。
⒌操作指南⑴启动与连接首先,确保智能循迹小车的电源供应正常,然后将其与远程控制设备进行配对。
步骤可以参考用户手册中的说明。
⑵自主导航一旦连接成功,用户可以选择自主导航模式,并根据需要设定目标点。
智能循迹小车将使用内置的导航算法自动规划路径并行驶到目标点。
⑶循迹功能用户可以选择循迹模式,并在地面上设置标记点或线。
单片机小车黑线循迹程序

单片机小车黑线循迹程序引言单片机小车是一种通过程序控制的四轮驱动智能小车,在许多应用中具有广泛的用途。
黑线循迹程序是单片机小车的基本功能之一,它通过检测地面上的黑线来自主移动。
本文将详细讨论单片机小车黑线循迹程序的原理、实现方法和注意事项。
原理黑线循迹程序的原理是基于光电传感器的工作原理。
光电传感器是一种能够将光信号转化为电信号的设备。
当光线照射到光电传感器的表面时,光电传感器会生成电信号。
在黑线循迹程序中,光电传感器被安装在单片机小车的底部,用来检测地面上的黑线。
黑线循迹程序的实现基于以下原理:1.当光电传感器检测到黑线时,电信号的强度会发生变化。
2.单片机通过读取光电传感器的电信号,判断车辆是否偏离黑线,并做出相应的动作来保持在黑线上。
实现方法硬件准备在编写黑线循迹程序之前,我们首先需要准备以下硬件:1.单片机开发板:例如Arduino、Raspberry Pi等。
2.电机驱动模块:用于控制小车的轮子转动。
3.电源模块:为小车提供电力。
4.光电传感器模块:用于检测地面上的黑线。
5.电机:驱动小车前进、后退和转向。
接线将光电传感器模块连接到单片机开发板上,确保接线正确。
接线方法可以参考传感器模块的说明书或参考相关文档。
编写程序接下来,我们需要编写黑线循迹程序来控制单片机小车。
1.初始化程序:在程序开始时,需要对相关变量和引脚进行初始化。
2.读取传感器数据:通过读取光电传感器的电信号,获取地面上的黑线信息。
3.判断位置:根据传感器数据判断车辆的位置,判断是否偏离黑线。
4.控制动作:根据车辆位置的判断结果,控制电机驱动模块来让车辆保持在黑线上。
5.循环执行:以上步骤需要不断重复执行,以实时响应地面上的黑线变化。
注意事项在编写和使用黑线循迹程序时,需要注意以下事项:1.传感器校准:在使用光电传感器之前,需要对传感器进行校准,以确保其正常工作。
校准步骤可以参考传感器的说明书或相关文档。
2.环境适应:地面上的黑线可能会受到光照、颜色和宽度等因素的影响。
智能循迹小车详细源代码程序(MSP430,PID)

81 LEFTOUT=Period/100*speed;
82 }
83 void MotorRight(int speed,int direction)
84 {
85 if(speed>max_speed)speed=max_speed;
86
72 {
73 EnableLeftNeg;
74 UnenableLeftPos;
75 }
76 else if(direction==foreward)//正转
77 {
78 EnableLeftPos;
79 UnenableLeftNeg;
17 #define LEFTOUT TACCR1
18 #define RIGHTOUT TACCR2
19 #define SensorIn P5IN
20 #define F 5000//5000hz
21 #define Period (8000000/F)
64 {
65 LEFTOUT=0;
66 RIGHTOUT=0;
67 }
68 void MotorLeft(int speed,int direction)
69 {
70 if(speed>max_speed)speed=max_speed;
71 if(direction==backward)//反转
183 TACCTL2|=OUTMOD_7;//
184 LEFTOUT=0;
185 RIGHTOUT=0;
186 }
187
188 float abs(float a)
189 {
智能循迹小车C程序(完美_详尽)

/*小车运行主程序简介: @模块组成:红外对管检测模块---- 五组对管,五个信号采集端口直流电机驱动模块 -- 驱动两个直流电机,另一个轮子用万向轮单片机最小系统 ---- 用于烧写程序,控制智能小车运动@ 功能简介:在白色地面或皮质上用黑色胶带粘贴出路线路径宽度微大于相邻检测管间距。
这样小车便可在其上循迹运行。
@ 补充说明:该程序采取“右优先”的原则:即右边有黑线向右转,若无,前方有黑线,向前走,若无,左边有黑线,向左转,若全无,从右方向后转。
程序开头定义的变量的取值是根据我的小车所调试选择好的,如果采用本程序,请自行调试适合自己小车的合适参数值。
编者:陈尧,黄永刚(江苏大学电气学院二年级,三年级)1. 假定:IN仁1,IN3=1 时电机正向转动,必须保证本条件2. 假定: 遇到白线输出 0,遇到黑线输出 1;如果实际电路是:遇到白线输出1,遇到黑线输出 0,这种情况下只需要将第四,第五句改成:#define m0 1#define m1 0即可。
3. 说明 1:直行--------- 速度 full_speed_left,full_speed_right.转弯 , 调头速度 - c orrect_speed_left,correct_speed_right.微小校正时 ------ 高速轮 full_speed_left,full_speed_right;低速轮 correct_speed.可以通过调节第六,七,八,九,十条程序,改变各个状态下的占空比( Duty cycle ) ,以求达到合适的转弯,直行速度4.lenth ---- length 检测到黑线到启动转动的时间间隔5. width ---- mid3 在黑线上到脱离黑线的时间差6. mid3 ----- 作为判断中心位置是否进入黑线的标志,由于运行的粗糙性和惯性,常取其他对管的输出信号作为判断条件7. check_right 若先检测到左边黑线,并且左边已出黑线,判断右端是否压黑线时间拖延*/#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define m0 1〃黑线 ml,白线 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-- 》100-- 》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 midrright5ucharDuty_left,Duty_right,i=0,j=0; //左右占空比标志,取 1--100 sbit IN仁 P2A0;sbit IN2=P2A1;sbit IN3=P2A2;sbit IN4=P2A3;sbit ENA=P1A0;sbitENB=P1A1;// 循迹口五组红外对管,依次对应从左往右第 1,2,3,4,5 五组 sbitleft1 =P1A6;sbit left2 =P1A5;sbit mid3 =P1A4;sbit right4=P1A3;sbit right5=P1A2;void line_left();void line_right();voidline_straight()reentrant;// ------------------------{uint t=Delay_time;while(t--);}// -------------------------void init() // 定时器初始化{left1=m0; // 初始化left2=m0; // 白线位置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=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=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; // 左右电机占空比初始化,调节直线运动速度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 号检测管屏蔽了两端检测管的检测,避免其走直线时出轨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 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();// 这里的直走是在不管红外检测结果的直行 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();} else{while(left2==m0){turn_left();}if(midl==m1) line_straight();}label2: ;}// -------------------------------------------void detect_infrared() // 循迹,红外检测{if(right5==m1){line_right();}elseif(left1==m1){line_left();}elseif(left2==m1){correct_left();}elseif(right4==m1){correct_right();}elseline_straight();}// ------------------------void main(void)// 主程序部分{init();while(1) // 循环检测红外对管采集的电平信号{detect_infrared();}。
寻迹小车方案

寻迹小车总体方案整个电路系统分为检测、控制、驱动三个模块。
首先利用光电对管对路面信号进行检测,经过比较器处理之后,送给软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。
系统方案方框图如图1所示。
图1 智能小车寻迹系统框图一.小车循迹原理这里的循迹是指小车在黑色地板上循白线行走,通常采取的方法是红外探测法。
红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。
单片机就是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。
红外探测器探测距离有限,一般最大不应超过3cm。
该智能小车在画有黑线的白纸“路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”—黑线。
笔者在该模块中利用了简单、应用也比较普遍的检测方法——红外探测法。
红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。
在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号。
1.传感检测单元传感器的选择用RPR220型光电对管。
RPR220是一种一体化反射型光电探测器,其发射器是一个砷化镓红外发光二极管,而接收器是一个高灵敏度,硅平面光电三极管。
RPR220采用DIP4封装,其具有如下特点:塑料透镜可以提高灵敏度。
内置可见光过滤器能减小离散光的影响。
体积小,结构紧凑。
当发光二极管发出的光反射回来时,三极管导通输出低电平。
此光电对管调理电路简单,工作性能稳定。
2控制器模块AT89S51AT89S51性价比高,且用AT89S51已经够用。
3电源模块由于本系统需要电池供电,我们考虑了如下集中方案为系统供电。
循迹小车pid算法原理

循迹小车pid算法原理循迹小车是一种能够自主行驶并且能够按照指定路径行驶的智能小车。
在实现循迹功能时,PID算法被广泛应用。
PID算法是一种闭环控制算法,通过对系统的误差进行监测和调节,使系统能够快速、准确地响应外部指令,达到期望的控制效果。
PID算法的原理可以简要概括为:比例控制、积分控制和微分控制的结合。
在循迹小车中,PID算法通过不断调整电机的转速来实现循迹的功能。
循迹小车通过传感器获取当前车辆与指定路径的偏差值,也就是当前误差。
这个误差值可以通过两个循迹传感器(通常为红外线传感器)来测量得到。
当车辆偏离路径时,两个传感器所接收到的红外线强度会发生变化,进而产生不同的电压信号。
比例控制是PID算法的第一步,通过测量到的误差值和比例系数Kp的乘积来得到比例修正量。
比例系数Kp用于控制比例修正量的大小,当误差越大时,比例修正量也就越大。
比例修正量的作用是根据误差的大小来调整电机的转速,使车辆尽快回到指定路径。
然而,仅仅使用比例控制会导致循迹小车在靠近指定路径时产生超调现象,也就是车辆会来回摆动,难以稳定在路径上。
为了解决这个问题,需要引入积分控制。
积分控制是PID算法的第二步,通过将误差累加并与积分系数Ki的乘积得到积分修正量。
积分修正量的作用是消除稳态误差,即使车辆偏离路径一段时间后,积分修正量也会逐渐增大,使车辆更容易回到指定路径。
积分系数Ki用于控制积分修正量的增长速度,当误差较大或持续时间较长时,积分修正量也增大。
然而,仅仅使用积分控制会导致循迹小车在接近指定路径时产生振荡现象,也就是车辆会来回摆动,难以稳定在路径上。
为了解决这个问题,需要引入微分控制。
微分控制是PID算法的第三步,通过测量误差的变化率和微分系数Kd的乘积来得到微分修正量。
微分修正量的作用是根据误差的变化率来调整电机的转速,使车辆平稳地接近指定路径。
微分系数Kd 用于控制微分修正量的大小,当误差变化率较大时,微分修正量也就较大。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//3.3延时5s子程序
//功能:延时5s
//入口参数:无
//出口参数:无
//调用示例:delay_5s();
voiddelay_5s()
{
unsigned char Count2;
for(Count2=0;Count2<100;Count2++)
delay_50ms();
}
//3.4延时10s子程序
Right_Motor_Goahead = 1;//右轮反转
Right_Motor_Back = 0;
}
//2.3左转弯子程序
//功能:左轮停转,右轮正转,从而控制小车左转弯
//入口参数:无
//出口参数:无
//调用示例:Car_Turn_Left();
voidCar_Turn_Left()
{
Left_Motor_Goahead = 1;//左轮停转
Right_Motor_Back = 1;
}
//2.2后退子程序
//功能:左轮反转、右轮反转,从而控制小车后退
//入口参数:无
//出口参数:无
//调用示例:Car_Back();
voidCar_Back()
{
Left_Motor_Goahead = 1;//左轮反转
Left_Motor_Back = 0;
// P1.1----中间的传感器
//P1.2----右边的传感器
//入口参数:无
//出口参数:无
//调用示例:Sensor_3_Car_State_Adjustment();
voidSensor_3_Car_State_Adjustment(void)
whiБайду номын сангаасe(!TF0);
TF0=0;
TR0=0;
}
//3.2延时1s子程序
//功能:延时1s
//入口参数:无
//出口参数:无
//调用示例:delay_1s();
voiddelay_1s()
{
unsigned char Count1;
for(Count1=0;Count1<20;Count1++)
delay_50ms();
//名称:寻迹小车控制程序
//功能:控制小车绕黑线行驶
//头文件包含
#include"reg51.h"
//定义存放P1口状态的全局变量
unsigned char P1_State=0xff;
//定义存放红外遥控状态的全局变量
unsigned char IrDA_State=0xff;
//////////////////////////1.电机控制端口分配///////////////////////////
//2.1前进子程序
//功能:左轮正转、右轮正转,从而控制小车前进
//入口参数:无
//出口参数:无
//调用示例:Car_Goahead();
voidCar_Goahead()
{
Left_Motor_Goahead = 0;//左轮正转
Left_Motor_Back = 1;
Right_Motor_Goahead = 0;//右轮正转
//3.1延时50ms子程序
//功能:延时50ms
//入口参数:无
//出口参数:无
//调用示例:delay_50ms();
voiddelay_50ms()
{
TMOD=0x01;//T0,方式1,12MHz晶振
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
//功能:延时10s
//入口参数:无
//出口参数:无
//调用示例:delay_10s();
voiddelay_10s()
{
unsigned char Count3;
for(Count3=0;Count3<200;Count3++)
delay_50ms();
}
///////////////////////4.传感器信号采集与处理子程序/////////////////////
//右轮控制端口
sbitRight_Motor_Goahead = P2^2;//该端口为低电平时,小车右轮反转(后退)
sbitRight_Motor_Back = P2^3;//该端口为低电平时,小车右轮反转(前进)
///////////////////////2.小车运行状态控制子程序////////////////////////
//4.1 3路传感器信号采集与处理子程序
//功能:根据连接传感器电路的I/O口的8种状态,调用
//小车控制子程序,实现小车运行状态的调整,
//由于3路传感器不能有效识别“左T”、“右T”标志物,
//因此,若想识别“T”字标志物,需在比赛时申请传感器板,
//并调用5路传感器信号采集与处理子程序。
//端口分配:P1.0----左边的传感器
//左轮运转状态右轮运转状态
// P2.0P2.1P2.2 P2.3
//01正转01正转
//10反转10反转
// 11停止11停止
// 0 0非允许状态00非允许状态
//左轮控制端口
sbitLeft_Motor_Goahead = P2^0;//该端口为低电平时,小车左轮正转(前进)
sbitLeft_Motor_Back= P2^1; //该端口为低电平时,小车左轮反转(后退)
Left_Motor_Back = 1;
Right_Motor_Goahead = 0;//右轮正转
Right_Motor_Back = 1;
}
//2.4右转弯子程序
//功能:左轮正转,右轮停转,从而控制小车右转弯
//入口参数:无
//出口参数:无
//调用示例:Car_Turn_Right();
voidCar_Turn_Right()
{
Left_Motor_Goahead = 0;//左轮正转
Left_Motor_Back = 1;
Right_Motor_Goahead = 1;//右轮停转
Right_Motor_Back = 1;
}
//2.5停车子程序
//功能:左轮停转,右轮停转,控制小车停车
//入口参数:无
//出口参数:无
//调用示例:Car_Stop();
voidCar_Stop()
{
Left_Motor_Goahead = 1;//左轮停转
Left_Motor_Back = 1;
Right_Motor_Goahead = 1;//右轮停转
Right_Motor_Back = 1;
}
////////////////////////////3.延时子程序////////////////////////////