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

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语言程序(带注释)

/************ ******** *
第二部分 电机控制子函数 ************* ******** ******* /
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);//使直流电机(左)逆时针转
循迹小车程序

//大约50ms的延时
//************************************************
void delay_50ms(uint t)
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
void qianjin()//小车前进
P12=1;P13=1;
delay_50us(10);
P10=1;P11=1;
delay_50us(10);
}
void zhuanwan()//小车转弯
{
P10=1;P11=0;P12=0;P13=1;
delay_50ms(15);
{P10=1;P11=1;P12=1;P13=1;}
delay_50ms(100);
{ P10=0;P11=1;
delay_50us(25);
P10=1;P11=1;
delay_50us(10);
P12=0;P13=1;
delay_50us(25);
P12=1;P13=1;
delay_50us(10);
}
void tingzhi()//小车停止
{ P10=1;P11=1;P12=1;P13=1;}
sbit P13=P1^3;//控制右电机后退
sbit LED=P0^0;
sbit zuobian=P3^2; //左边传感器
sbit youbian=P3^3; //右边传感器
//************************************************
//延时函数,在12MHz的晶振频率下
循迹小车

这是我做的两路循迹小车的程序#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit PWM1=P1^0;//电机驱动和单片机连接引脚定义sbit IN1=P1^1;sbit IN2=P1^2;sbit IN3=P1^3;sbit IN4=P1^4;sbit PWM2=P1^5;sbit zuo=P1^6;//小车前方左传感器定义sbit you=P1^7;//小车前方右传感器定义uchar count1,count2;//小车PWM调速变量定义void delay(unsigned char z) //毫秒延时{int i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}void forwardzuo(){IN1=1;IN2=0;}void forwardyou(){IN3=1;IN4=0;}void speed(int cnt1,int sd1,int cnt2, int sd2) // PWM 调速{if(cnt1<sd1)PWM1=1;elsePWM1=0;if(cnt2<sd2)PWM2=1;elsePWM2=0;}void turn(cnt1,sd1,cnt2,sd2)//电机的前进,左转,右转控制{forwardzuo();forwardyou();speed(cnt1,sd1,cnt2,sd2);}main(){TMOD=0x01;EA=1;TH0=(65536-200)/256;TL0=(65536-200)%256;ET0=1;TR0=1;while(1){if(zuo==0&&you==0) {turn(count1,5,count2,5);}//左右都未检测黑线,前进if(zuo==1&&you==1) {turn(count1,5,count2,5);}//左右都检测黑线,前进if(zuo==1&&you==0) {turn(count1,5,count2,0);}//左检测黑线,左转if(zuo==0&&you==1) {turn(count1,0,count2,5);}//右检测黑线,右转}}void time0() interrupt 1{TH0=(65536-200)/256;TL0=(65536-200)%256;count1++;count2++;if(count1>=10) //周期500mscount1=0;if(count2>=10)count2=0;}。
循迹小车程序 C语言

#define Left_moto_go {P1_0=1,P1_1=0,P1_2=1,P1_3=0;} //左边两个电机向前走
#define Left_moto_back {P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //左边两个电机向后转
#define Left_moto_Stop {P1_0=0,P1_1=0,P1_2=0,P1_3=0;} //左边两个电机停转
bit Right_moto_stop=1;
bit Left_moto_stop =1;
/************************************************************************/
//延时函数
void delay(unsigned int k)
P1_4 P1_5 接IN5 IN6 当 P1_4=0,P1_5=1; 时右上电机反转
P1_4 P1_5 接IN5 IN6 当 P1_4=0,P1_5=0; 时右上电机停转
P1_6 P1_7 接IN7 IN8 当 P1_6=1,P1_7=0; 时右下电机正转 右下电机接驱动板子输出端(蓝色端子OUT7 OUT8)
P1_2 P1_3 接IN3 IN4 当 P1_2=0,P1_3=1; 时左下电机反转
P1_2 P1_3 接IN3 IN4 当 P1_2=0,P1_3=0; 时左下电机停转
P1_4 P1_5 接IN5 IN6 当 P1_4=1,P1_5=0; 时右上电机正转 右上电机接驱动板子输出端(蓝色端子OUT5 OUT6)
P1_0 P1_1 接IN1 IN2 当 P1_0=0,P1_1=1; 时左上电机反转
P1_0 P1_1 接IN1 IN2 当 P1_0=0,P1_1=0; 时左上电机停转
循迹小车Arduino 程序

//循迹小车Arduino 程序:// R是右(right),L是左(left) 小车对着自己看时分的左右int MotorRight1=14; //A0 IN1int MotorRight2=15; //A1 IN2int MotorLeft1=16; //A2 IN3int MotorLeft2=17; //A3 IN4int MotorRPWM=5; //PWM 5int MotorLPWM=3; //PWM 3const int SensorLeft = 2; //左感測器輸入腳const int SensorRight = 6; //右感測器輸入腳int SL; //左感測器狀態int SR; //右感測器狀態void setup(){Serial.begin(9600);pinMode(MotorRight1, OUTPUT); // 腳位 14 (PWM)pinMode(MotorRight2, OUTPUT); // 腳位 15 (PWM)pinMode(MotorLeft1, OUTPUT); // 腳位 16 (PWM)pinMode(MotorLeft2, OUTPUT); // 腳位 17 (PWM)pinMode(MotorLPWM, OUTPUT); // 腳位 3 (PWM)pinMode(MotorRPWM, OUTPUT); // 腳位 5 (PWM)pinMode(SensorLeft, INPUT); //定義左感測器pinMode(SensorRight, INPUT); //定義右感測器}void loop(){SL = digitalRead(SensorLeft);SR = digitalRead(SensorRight);if (SL == LOW&&SR==LOW)// 前進{digitalWrite(MotorRight1,LOW);//IN1 右电机高电平反转 digitalWrite(MotorRight2,HIGH);//IN2 右电机高电平正转 analogWrite(MotorRPWM,130); //0---100--250digitalWrite(MotorLeft1,LOW);//IN3 左电机高电平正转 digitalWrite(MotorLeft2,HIGH);//IN4 左电机高电平反转 analogWrite(MotorLPWM,130);}else // R是右(right),L是左(left) 小车对着自己看时分的左右 {if (SL == HIGH & SR == LOW)// 左白右黑, 快速左轉{delay(1);digitalWrite(MotorRight1,HIGH);//IN1 右电机高电平反转digitalWrite(MotorRight2,LOW);//IN2 右电机高电平正转analogWrite(MotorRPWM,130);digitalWrite(MotorLeft1,LOW);//IN3 左电机高电平正转digitalWrite(MotorLeft2,HIGH);//IN4 左电机高电平反转analogWrite(MotorLPWM,130);}else if (SR == HIGH & SL == LOW) // 右白左黑, 快速右轉{delay(1);digitalWrite(MotorRight1,LOW);//IN1 右电机高电平反转digitalWrite(MotorRight2,HIGH);//IN2 右电机高电平正转analogWrite(MotorRPWM,130);digitalWrite(MotorLeft1,HIGH);//IN3 左电机高电平正转digitalWrite(MotorLeft2,LOW);//IN4 左电机高电平反转analogWrite(MotorLPWM,130);}else // 都是白色, 停止{digitalWrite(MotorRight1,LOW);digitalWrite(MotorRight2,LOW);analogWrite(MotorRPWM,0);digitalWrite(MotorLeft1,LOW);digitalWrite(MotorLeft2,LOW);;analogWrite(MotorLPWM,0);}}}欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习资料等等打造全网一站式需求。
51循迹小车程序实验报告

竭诚为您提供优质文档/双击可除51循迹小车程序实验报告篇一:智能循迹小车实验报告摘要本设计主要有单片机模块、传感器模块、电机驱动模块以及电源模块组成,小车具有自主寻迹的功能。
本次设计采用sTc公司的89c52单片机作为控制芯片,传感器模块采用红外光电对管和比较器实现,能够轻松识别黑白两色路面,同时具有抗环境干扰能力,电机模块由L298n芯片和两个直流电机构成,组成了智能车的动力系统,电源采用7.2V的直流电池,经过系统组装,从而实现了小车的自动循迹的功能。
关键词智能小车单片机红外光对管sTc89c52L298n1绪论随着科学技术的发展,机器人的设计越来越精细,功能越来越复杂,智能小车作为其的一个分支,也在不断发展。
在近几年的电子设计大赛中,关于小车的智能化功能的实现也多种多样,因此本次我们也打算设计一智能小车,使其能自动识别预制道路,按照设计的道路自行寻迹。
2设计任务与要求采用mcs-51单片机为控制芯片(也可采用其他的芯片),红外对管为识别器件、步进电机为行进部件,设计出一个能够识别以白底为道路色,宽度10mm左右的黑色胶带制作的不规则的封闭曲线为引导轨迹并能沿该轨迹行进的智能寻迹机器小车。
3方案设计与方案选择3.1硬件部分可分为四个模块:单片机模块、传感器模块、电机驱动模块以及电源模块。
3.1.1单片机模块为小车运行的核心部件,起控制小车的所有运行状态的作用。
由于以前自己开发板使用的是ATmeL公司的sTc89c52,所以让然选择这个芯片作为控制核心部件。
sTc89c52是一种低损耗、高性能、cmos八位微处理器,片内有4k字节的在线可重复编程、快速擦除快速写入程序的存储器,能重复写入/擦除1000次,数据保存时间为十年。
其程序和数据存储是分开的。
3.1.2传感器模块方案一:使用光敏电阻组成光敏探测器采集路面信息。
阻值经过比较器输出高低电平进行分析,但是光照影响很大,不能稳定工作。
方案二:使用光电传感器来采集路面信息。
51循迹小车程序实验报告

竭诚为您提供优质文档/双击可除51循迹小车程序实验报告篇一:智能循迹小车实验报告摘要本设计主要有单片机模块、传感器模块、电机驱动模块以及电源模块组成,小车具有自主寻迹的功能。
本次设计采用sTc公司的89c52单片机作为控制芯片,传感器模块采用红外光电对管和比较器实现,能够轻松识别黑白两色路面,同时具有抗环境干扰能力,电机模块由L298n芯片和两个直流电机构成,组成了智能车的动力系统,电源采用7.2V的直流电池,经过系统组装,从而实现了小车的自动循迹的功能。
关键词智能小车单片机红外光对管sTc89c52L298n1绪论随着科学技术的发展,机器人的设计越来越精细,功能越来越复杂,智能小车作为其的一个分支,也在不断发展。
在近几年的电子设计大赛中,关于小车的智能化功能的实现也多种多样,因此本次我们也打算设计一智能小车,使其能自动识别预制道路,按照设计的道路自行寻迹。
2设计任务与要求采用mcs-51单片机为控制芯片(也可采用其他的芯片),红外对管为识别器件、步进电机为行进部件,设计出一个能够识别以白底为道路色,宽度10mm左右的黑色胶带制作的不规则的封闭曲线为引导轨迹并能沿该轨迹行进的智能寻迹机器小车。
3方案设计与方案选择3.1硬件部分可分为四个模块:单片机模块、传感器模块、电机驱动模块以及电源模块。
3.1.1单片机模块为小车运行的核心部件,起控制小车的所有运行状态的作用。
由于以前自己开发板使用的是ATmeL公司的sTc89c52,所以让然选择这个芯片作为控制核心部件。
sTc89c52是一种低损耗、高性能、cmos八位微处理器,片内有4k字节的在线可重复编程、快速擦除快速写入程序的存储器,能重复写入/擦除1000次,数据保存时间为十年。
其程序和数据存储是分开的。
3.1.2传感器模块方案一:使用光敏电阻组成光敏探测器采集路面信息。
阻值经过比较器输出高低电平进行分析,但是光照影响很大,不能稳定工作。
方案二:使用光电传感器来采集路面信息。
循迹小车(程序)

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

设计一个循迹小车进行直角转弯的程序,需要考虑到几个关键因素:传感器的读取、电机控制、逻辑判断和转向机制。
以下是一个基本的程序思路:
初始化:首先,确保小车的基本功能正常,如电机控制、传感器读取等。
传感器读取:使用传感器(如红外或超声波传感器)检测小车前方的路径或障碍物。
这通常涉及到将传感器的原始信号转换为小车能理解的方向或距离信息。
电机控制:根据需要,使用适当的算法(如PID控制)来控制电机的速度。
这允许小车前进、后退或停止。
逻辑判断:这是程序的核心部分,决定小车的行动逻辑。
例如,当小车检测到右边的路径(或障碍物)消失,而左边的路径存在时,可以认为小车需要进行直角转弯。
转向机制:根据逻辑判断的结果,控制小车的转向电机。
这通常涉及到改变电机的方向或速度,使小车向左或向右转向。
循环检测:不断重复上述步骤,使小车能够实时检测路径和障碍物,并作出相应的反应。
错误处理:在程序中加入适当的错误处理机制,以确保当小车遇到意外情况(如传感器故障、电机控制失败等)时,能够作出适当的反应。
调试和优化:在实际环境中测试小车,根据结果调整和优化程序,
使其能够更有效地完成直角转弯等任务。
请注意,以上只是一个大致的思路,具体的实现可能会因循迹小车的硬件配置、编程语言和开发环境而有所不同。
在实际开发过程中,还需要考虑如何将各个部分整合在一起,形成一个稳定、高效的整体系统。
循迹小车_完整程序

程序# include <reg51.h>//********驱动芯片L298管脚位声明*****sbit IN1= P1^0;sbit PWM1= P1^1;sbit IN2= P1^2;sbit IN3= P1^3;sbit PWM2= P1^4;sbit IN4= P1^5;//********传感器TCRT5000管脚位声明****sbit XL= P1^6; //左侧第一个传感器sbit XR= P1^7; //右侧第一个传感器sbit YL= P2^0; //左侧第二个传感器sbit YR= P2^1; //右侧第二个传感器//********用于定时计数的两个全局变量位声明****** int count1=0;int count2=0;//********左边电机前进*******void forward_turn1(){IN1=0;IN2=0;}//*********左边电机后退******void reverse_tuen1(){IN1=1;IN2=0;}//*********右边电机前进*******void forward_turn2(){IN3=0;IN4=1;}//**********右边电机后退********void reverse_turn2(){IN3=1;IN4=0;}//***********左边电机速度控制函数******void speed1(int ct,int sd){if(ct<=sd)PWM1=1;elsePWM1=0;}//************右边电机速度控制函数******viod speed2(int ct,int sd){if (ct<=sd)PWM2=1;elsePWM2=0;//*************小车直线前进函数*********void advance (int ct1,int sd1,int ct2,int sd2); {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//**********小车左转********void left_turn1(int ct1,int sd1,int ct2,int sd2); {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//************小车右转*********viod riht_ turn1(int ct1,int sd1,int ct2,int sd2); {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//**************主函数**********main(){TMOD=ox11;TH0=(65536-1000)/256;TL0=(65536-1000)%256;EA=1;ET0=1;TR0=1;TH1=(65536-1000)/256;TL1=(65536-1000)%256;EA=1;ET1=1;TR1=1;while(1){if(XL==0&&XR==0&&YL==0&&YR==0) //传感器未检测到直线,小车直行{advance(count1,500,count2,500);}if(XL==1&&XR==0&&YL==0&&YR==0) //左边内侧传感器检测到黑线,小左转 {Left_turn1(count1,200,count2,500);}if(XL==0&&XR==0&&YL==1&&YR==0) //左边外侧传感器检测到黑线,大左转{Left_turn1(count1,200,count2,700);}if(XL==0&&XR==1&&YL==0&&YR==0) //右边内侧传感器检测到黑线,小右转{right_turn1(count1,500,count2,200);}if(XL==0&&XR==0&&YL==0&&YR=1) //右边外侧传感器检测到黑线,大右转{right_turn1(count1,700,count2,200);}if(XL==1&&XR==0&&YL==1&&YR=0) //左侧两个传感器均检测到黑线,中左转{Left_turn1(count1,200,count2,600);}if(XL==0&&XR==1&&YL==0&&YR=1) //右侧两个传感器均检测到黑线,中右转{right_turn1(count1,600,count2,200);}}}//******中断服务程序*******viod time0() interrupt1;{TH0=(65536-1000)/256;TL0=(65536-1000)%256;count1++;if (count1>=1000)count1=0}viod time1() interrupt1;{TH0=(65536-1000)/256;TL0=(65536-1000)%256;count2++;if (count2>=1000)count2=0}#include<reg52.h>//驱动芯片L298管脚声明sbit IN1=P2^1;sbit IN2=P2^2;sbit IN3=P2^4;sbit IN4=P2^5;sbit PWM1=P2^0;sbit PWM2=P2^3;//传感器管脚位声明sbit L1=P3^0;//左侧第一个对管sbit L2=P3^1;//左侧第二个对管sbit R1=P3^3;//右侧第一个对管sbit R2=P2^2;//右侧第二个对管//定时器全局变量int count1=0;int count2=0;//左电机前进void forward_turn1(){IN1=1;IN2=0;}//左电机后退void back_turn1(){IN1=0;IN2=1;}//右电机前进void forward_turn2(){IN3=0;IN4=1;}//右电机后退void back_turn2(){IN3=1;IN4=0;}//左电机速度控制void speed1(int ct,int sd) {if(ct<=sd)PWM1=1;elsePWM1=0;}//右电机速度控制void speed2(int ct,int sd){if(ct<=sd)PWM2=1;elsePWM2=0;}//小车直线前进void advance(int ct1,int sd1,int ct2,int sd2) {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//小车左转void left_turn(int ct1,int sd1,int ct2,int sd2) {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//小车右转void right_turn(int ct1,int sd1,int ct2,int sd2) {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//主函数main(){TMOD=0X11;TH0=(65536-1000)/256;TL0=(65536-1000)%256;EA=1;ET0=1;TR0=1;TMOD=0X11;TH0=(65536-1000)/256;TL0=(65536-1000)%256;EA=1;ET0=1;TR0=1;while(1){if(L1==0&&R1==0&&L2==0&&R2==0)//小车未检测到黑线{advande(count1,500,count2,500)}if(L1==1&&R1==0&&L2==0&&R2==0)//左边内侧检测到黑线,小左转{left_turn(count1,200,count2,500)}if(L1==0&&R1==0&&L2=1&&R2==0)//左边外侧检测到黑线,大左转{left_turn(count1,200,count2,700)}if(L1==0&&R1==1&&L2=0&&R2==0)//右边内侧检测到黑线,小右转{right_turn(count1,500,count2,200)}if(L1==0&&R1==0&&L2=0&&R2==1)//右边外侧检测到黑线,大右转{right_turn(count1,700,count2,200)}if(L1==1&&R1==0&&L2=1&&R2==0)//左边两侧检测到黑线,中左转{left_turn(count1,200,count2,600)}if(L1==0&&R1==1&&L2=0&&R2==0)//右边两侧检测到黑线,中右转{left_turn(count1,600,count2,200)}if(L1==1&&R1==1&&L2=1&&R2==1)//右边外侧检测到黑线,小右转{IN1=0;IN2=0;IN3=0;IN4=0;}}}//中断服务程序void time0() interrrupt1; {TH0=(65536-1000)/256;TL0=(65536-1000)%256;count1++;if(count1>=1000)count1=0;}void time1() interrrupt1; {TH0=(65536-1000)/256;TL0=(65536-1000)%256;count2++;if(count2>=1000)count2=0;}。
智能循迹小车详细源代码程序(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 {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
附录程序目录一、前言------------------------------------------------------------二、小车功能------------------------------------------------------三、元器件选择--------------------------------------------------四、I/O分配及硬件连接简图---------------------------------五、相关模块、算法---------------------------------------------六、系统框图------------------------------------------------------七、调试过程------------------------------------------------------八、小车图片资料---------------------------------------------------九、讲座所感------------------------------------------------------十、实习总结------------------------------------------------------一、前言感谢生产实习能给我们这次实现自己想法的机会,虽然实验条件异常简陋、资金投入非常有限,总体感觉我的队友们灰常灰常给力啊,我感觉我是抱到大腿了--王威,夏青、峰哥,团队气氛非常好,大家一起讨论,一起分工研究模块,最后一起解决问题调试程序,而且是不同的组合在不同阶段解决了不同的问题,大家精诚合作,各显身手,在奋战中给大三学年画上了圆满的句号。
之前我们本来商量是不是可以拿往年电子设计大赛的题目过来做,如果难度太大就算只实现一部分功能也算是成功完成了,结果研究一天后发现电子设计大赛的题目需要很长时间的知识积累啊,基本上都是准备一个月以上然后开工的,后来王威提议要不我们做个小车吧,超声波测距实现自动物体追踪,控制核心采用单片机,传感器采用广泛用于避障和测距的超声波传感器,前进和后退用普通伺服电机和电机驱动模块实现。
在网上选购单片机最小系统的时候,发现有一家商铺的最小系统上集成了红外模块,就想着不要浪费了,就萌生了做遥控车的想法,这样系统可以实现两个功能一个是类似于“光影魔术手”一样的物体追踪功能,一个是遥控运行功能。
组队之后,我们一起讨论,从原理上进行可行性分析,最后一致讨论通过,然后就分组从网上搜集相关的资料,最后周一在淘宝上确定并购买了相关的器件,周三上午收到元器件,下午我们从零开始熟悉开发环境keil uvision3、翻看器件的技术文档、搞懂模块原理及使用方法、模块的编程调试、系统功能编程调试、系统程序整合、装车、系统功能优化。
这是一个发现问题和解决问题的过程,乐趣也正在于此,我们相信一切问题皆有解决的方法,我们队员四个克服种种困难最终实现了既定的系统的功能,并且在找到带有舵机新车后添加了转弯功能,实在是意外之喜。
二、小车具体功能1、小车系统功能简述接通电源后,按下开机键,小车进入模式选择状态,按左三角键进入(超声波)物体追踪模式,小车可以与物体始终保持设定的距离,实现与手(或其它物体)同步运动,即小车随物体一起前进后退、加速减速,同时显示当下距离值。
按右三角键进入红外遥控模式,可以遥控小车前进、后退、左转、右转、剎停。
在两个模式下按关机键,可以终止当前模式,重新选择功能,终止当前模式后按关机键,彻底关机,必须按开机键系统才能重新工作。
控制系统方框图:超声波测距追踪:三、元器件选择我们做的小车所用到的器件模块除了7805芯片稳压和一些基本的开关电路,主要的模块如单片机最小系统(含红外、数码管、LED电路)、超声波模块、电机驱动模块均是从网上购买。
主要原因是我们电路设计能力还不足,现在还不是拥有设计电路能力的那个人,那如果是找到别人设计好的电路图然后自己买元件焊接,那么硬件电路其实就是一个体力活,失去了创新的意义。
尽管硬件的焊接、调试其实也是一个比较有意思的过程,但是围着一个已经验证过功能电路团团转没有太大价值,而且我们这次生产实习的时间只有一个周多些,而且实验条件太有限,没有固定的实验室,甚至连示波器、直流电源、万用表、焊枪、螺丝刀等基本的实验条件都不能保证。
我们要在短时间内实现更高的功能,就必须向硬件电路“借力”,把主要的经历放在软件调试上,硬件是“死”的,而可以把更多的想法诸如到软件中让单片机执行,以实现我们所要的功能,享受其中的乐趣。
从经济方面考虑,最后算起来反而是购买比较便宜,量产的PCB电路有时是相当实惠的。
如果单买单片机、面包板、LED、数码管、和一些诸如RS232 电平转换芯片、红外发射器、接收管等等。
在按照电路图焊接的过程中相当费时费力费神,购置上述器件的花费也在30块钱以上,有些器件如电阻电容很便宜,不能单个购买,但是买多了又很浪费。
而网购的最小系统板花费40元(虽然我们原来只想要最简单的有下载口的最小系统,发现了这个之后觉得划算就买了),上面已经将单片机(可插拔)、LED、数码管、红外模块集成,而且做好了USB下载口,并赠送了开发环境和相关例程、下载线。
电机驱动模块更给力。
我们本打算用两片7960芯片自己焊接驱动模块,然后用2576给单片机和超声波模块做稳压电源,这样的花费是相当大的,一片7960就要15块钱,2576的价格也在5元左右,这样整个下来就得50块钱左右,我们在网上发现了这个用L298N制作的电机驱动模块,它不但可以同时驱动两个伺服电机,还拥有一个5v稳压输出,还有PWM和全整流两种工作模式,价格是35元,所以我们果断买下了。
超声波模块就没有疑问了,就算知道硬件电路图,买了器件其实在缺少相关设备的情况下调试起来也是非常困难的,我们经过货比三家,选了一个实用又比较实惠的模块。
这样硬件电路置备妥当购置完备了,最小系统板、超声波模块、电机驱动模块、7805稳压芯片、4节干电池盒、由于资金限制,我们向智能汽车实验室借用了一个废旧电池(7v左右,与干电池串联使用)、电子设计留下的废旧车底盘。
最小系统板可以兼容MCS-51系列单片机里的多种型号,我们没用自带的52RC而是采用了其中比较高端的STC12C5A60S2,(其实也就10块钱)它的指令执行周期更短,有AD、PCA模块(可以工作在PWM 方式)、而且定时器、中断等与传统的8051基本兼容,非常容易掌握,也很适合小车的实时控制。
小车本来我们想用三楼智能小车实验室废弃的小车底座,就是一个小车底座加上电机,只能简单的实现车的直线前进后退。
后来偶然在创新实验室发现了另外一个小车,一试之下,发现这个小车底盘非常好用,本来我们都没打算在遥控的时候能实现转弯功能,因为用PWM 控制的舵机太贵了,后来车上竟然发现了小的转向电机,我们眼前一亮,正好电机驱动可以驱动两路电机,就把ENB 输入与5v 短路,在用两个I/0直接控制这个简陋的“舵机”,阴差阳错的实现了遥控模式下的转弯功能。
但是由于电机驱动要求输入电压在7.2v-12v 之间,我们的旧电池很明显力不从心,导致出现了很多意外问题,耽误了不少进度,后来用旧电池与干电池串联供电,单片机采用7805单独稳压供电,虽然问题有点缓解,还是显得不够给力,新电池又比较贵,我们及将就着用了,这也是系统设计的一大遗憾。
另一个遗憾就是没有实现物体的全方位追踪,只能实现前后方向的直线追踪,因为要实现转弯,超声波传感器就要求有多个,而且要求有能精确控制角度的PWM 舵机,所借的小车转向角度不能控制,如果购置躲个超声波传感器和一个PWM 舵机,花费就在300以上,所以我们考虑了一下就放弃了。
四、I/O 分配及硬件连接简图1、 I/O 分配如下: IO功能 头文件定义 IO 功能 头文件定义 P1^1 超声波发送使能端口TXP0^0 电机正反转控制 In1 P1^2 超声波接收检测端口RXP0^1 电机正反转控制 In2 P1^3 PWM 输出无 P0^2 转向控制 In3 P1^0 正转标志位zheng P0^3 转向控制 In4 P1^7反转标志位 Fan P1^4 剎停标志位 Ting P0 数码管数据端口无P1^5 左右转向标志位、系统开关标志位 无 P2^0-3 数码管驱动 无 P1^6同上 无 (注:最小系统板上P1口连接了LED )2、系统硬件连接简图:五、相关模块、算法1.单片机最小系统:型号STC12C5A60S2,选用此型号的重要原因是它自带PWM功能,不同占空比的方波给L298N驱动芯片后能对电机实现调速。
本系统使用的STC12C5A60S2功能模块有:定时器0红外解码用定时器1超声波测距用PWM 电机调速用P0口数码管数据位P2_0 P2_1 P2_2 P2_3 数码管使能P1口连接LED ,显示小车的不同状态外部中断1红外解码用2、PCA模块及其在系统中的应用STC12C5A60S2内部集成了两路可编程计数器阵列(PCA),每个模块均有软件定时器、外部脉冲捕捉、高速脉冲输出和PWM模块,也就是说这款单片机有两路PWM输出,分别在P1.3和P1.4。
(我们只用了一路,P1^3).3、定时器模块及其在系统当中的应用STC12C5A60S2拥有4个定时器模块,其中定时器0和1与传统的8051完全兼容(意思就是不光用法,连相关寄存器的地址也一样,这样开发环境中的52RC的头文件还是可以使用的),每个模块均可工作在定时器和计数器模式(通过P3^4,P3^5输入脉冲),定时器有四种工作方式:16位定时计数、13位定时计数、8位自动重装、两个8位计数。
与之相关的特殊功能寄存器有:控制寄存器TCON(其中比较重要的是TF和TR分别是中断标志和计数开关,很奇怪的外部中断的设置IE IT也在该寄存器中)。
工作模式设置寄存器TMOD(可以设置定时器还是计数器,工作于哪个方式?)TL,TH中装着当前计数值,非常重要。
AUXR可以设置定时器方式下计数频率是等于系统时钟还是等于1/12系统时钟。
系统中用到了定时器0和1,定时器0用于红外模块,通过外部中断测定信号周期(TL0/TH0)以确定其携带的信息是0还是1。
定时器1用于超声波模块,测定从发出超声波到超声波返回之间经过的时间,乘以声速除以2来得到距离值。
4、中断模块及其在系统中的应用中断是CPU处理外界紧急事件的机制,STC12C5A60S2拥有10个中断源,它们有规定好的优先级,有中断嵌套机制,可以对中断进行允许和屏蔽。
中断采用两级控制模式,有总开关EA和寄存器中IE单独的开关(默认是0,即禁止)。