寻迹小车报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“寻迹小车实验报告”。
智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
寻迹小车设计报告
指导教师:
2011年6月12日13:30
小组成员:智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
C8051F单片机的智能寻迹小车
本课题是基于C8051F单片机的智能小车的设计与应用,小车完成的主要功能是能够自主识别黑色引导线并根据黑色引线能快速自主稳定的寻线行驶。小车系统以单片机为系统控制处理器,对整个控制软件进行程序的设计和程序的调试,并最终完成软硬件的结合,完成小车的预期功能。
一、实验目的:
通过设计能进一步掌握单片机的原理、以及能刚好的运用编程实现对小车的控制。
使小车能自主寻找路线,并且能够合理设计单片机的外围电路,并使之与单片机能构成整个 系统。
二、设计方案:
本组小车以单片机为控制处理器、以298为驱动器结合程序,通过芯片发出驱动命令,控制电机的驱动以实现对小车的控制。
三、技术方案概要说明
本模块车的电路系统包括电源管理模块、单片机模块、传感器模块、电机驱动模块、人机界面。
四、工作原理
1、利用红外采集块中的红外发射接收对关检测路面上的轨迹
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
2、将轨迹信号传给单片机
3、单片机采用模糊推理求出转向角度和行走速度,然后去控制行走部分
4、最终完成智能小车可以按照路面上的轨迹运行
五、报告内容安排
第一部分为对整个报告的概括说明,第二部分为整个电路硬件的介绍和说明,第三部分为整个设计的软件程序设计的说明。
硬件电路的设计
一、寻迹模块
寻迹共有8路,前后各4路,它通过TCRT5000是否接受到红外反射光来改变电压大小,从而使单片机发出指令,使小车进行前进、后退、停止、走正等一系列动作。
1、寻迹电路图
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
焊接时,可用一个电位器来代替四个电位器,这样即省材料,也使电路板更加精巧。甚至还能将除TCRT5000以外的部件全部安放到车体板上面。
TCRT5000实物图与内部结构(与地面距离0.2mm~0.8mm之间)
LM393引脚图
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
2、检测
将5V电源连接好,万用表与各组寻迹的GND与输出端相连,用白纸来使红外灯反射,当TCRT5000接收到反射红外光时输出低电平,未接收时输出高电平,最后通过改变电位器阻值来调节寻迹灵敏度。
二、驱动模块
驱动的核心部件是L298N,它通过单片机指令直接控制小车电机电机转速,从而来使小车行驶。
驱动电路图
5,7,10,12与P2.1,P2.2,P2.5,P2.6相连,使能1,2与P0.0,2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
P0.1相连,2,3,13,14与小车电机相连,驱动要加散热片,防止过热烧坏。
L298n引脚分辨
电机驱动的检测:
连接好电源,将使能1,2都与电源5V相连,5,10与7,12两组,一组与5V相连,另一组与GND相连,用万用表分别测量2,3与13,14两组引脚,有12V电源输出,则驱动正常。
三、电源模块
电源主要是将12V电压降为5V,输给小车的各部分模块。
电源电路图
电源最好需由两组并联而成,以免7805过载而烧坏。J2与外电源12V
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
相连,需要两个引脚,5V引脚与GND引脚都需要多个,以满足对各模块的供电需求。
LM7805
电源模块的检测:
将12V与GND连接好,输出端有稳定的5V电源输出,则电源正常。
四、1602显示屏(主要用于显示小车运动时间)
1602电路图
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
五、语音模块
当小车完成所有指令动作到达终点时,蜂鸣器发出响声。
蜂鸣器的电路图
六、C8051F020单片机
它是由Cygnal出的一种混合信号系统级单片机。片内含CIP-51的CPU内核,它的指令系统与MCS-51完全兼容。其中的C8051F020单片机含有64kB片内Flash程序存储器,4352B的RAM、8个I/O端口共64根I/O口线、一个12位A/D转换器和一个8位A/D转换器以及一个双12位D/A转换器、2个比较器、5个16位通用定时器、5个捕捉/比较模块的可编程计数/定时器阵列、看门狗定时器、VDD监视器和温度传感器等部分。C8051F020单片机支持双时钟,其工作电压范围为2.7~3.6V(端口I/O,RST和JTAG引脚的耐压为5V)。与以前的51系列单片机相比,C8051F020增添了许多功能,同时其可靠性和速度也有了很大提高。
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
五、组装小车
用适当大小的单孔电路板作为小车底板,在适当位置打上小孔,将各个模块安在上面,使小车质量分布均匀,以免小车走歪。
六、焊接的注意事项
1.呈圆焊接顺序,元器件装焊顺序依次为:电阻器、电容器、二极管、三极管、集成电路、大功率管,其它元器件为先小后大。
2.芯片与底座都是有方向的,焊接时,要严格按照PCB板上的缺口所指的方向,使芯片,底座与PCB三者的缺口都对应。
3.焊接时,要使焊点周围都有锡,将其牢牢焊住,防止虚焊。
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
4.在焊接圆形的极性电容器时(一般电容值都是比较大的),其电容器的引脚是分长短的,以长脚对应“+”号所在的孔。
5.芯片在安装前最好先两边的针脚稍稍弯曲,使其有利于插入底座对应的插口中。
6.电位器也是有方向的,其旋钮要与PCB板上凸出方向相对应。7.取电阻时,找到所需电阻后,拿剪刀剪下所需数目电阻,并写上电阻,以便查找。
8.装完同一种规格后再装另一种规格,尽量使电阻器的高低一致。焊完后将露在印制电路板表面多余引脚齐根剪去。
9.焊接集成电路时,先检查所用型号,引脚位置是否符合要求。焊接时先焊边沿对脚的二只引脚,以使其定位,然后再从左到右自上而下逐个焊接。
10.对引脚过长的电器元件(如电容器,电阻等),焊接完后,要将其剪短。
11.焊接后用放大镜查看焊点,检查是否有虚焊以及短路的情况的发生。
12.当有连线接入时,要注意不要使连线深入过长,以至于将其旋在电线的橡胶皮上,出现断路的情况。
13.当电路连接完后,最好用清洗剂对电路的表面进行清洗,以防电路板表面附着的铁屑使电路短路。
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
14.在多台仪器老化的时候,要注意电线的连接,零线对零线,火线对火线。
15.当最后组转时,应将连线扎起,以防线路混乱交叉。16.要进行老化工艺,可发现很多问题,连线要接紧,螺丝要旋紧,当反复插拔多次后,要注意连线接头是否有破损。
17.焊接上锡时,锡不宜过多,当焊点焊锡锥形时,即为最好。
软件系统设计
若小车偏左的时候,左轮将向右偏转;若小车偏右,车轮将向左偏转;若没有偏移,小车将继续向前;若完全偏离黑色轨迹,小车后退以寻找黑色轨迹。
一、程序设计方法
1、确定程序功能。根据机电硬件中的人机界面、电力电子器件和传感器件的物理特点和运行方式确定外围部件软件功能,根据控制系统设计方案确定控制软件功能,根据系统的功能结构确定前面没有提到的其他软件功能。
2、划分任务。将各类软件功能划分成具体的任务。
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
3、确定任务的组合方式。通过分析任务的优先级和相互关系来确定组合方式。因为这个组合方式通常并不是唯一的,可以采取如前文所介绍的概念设计方法的方案排列和方案选择方法。
4、确定编程方法。根据任务划分、任务的组合方式、软件开发能力和软件开发环境可以确定具体程序编制方法。在确定过程中,也可以采用如前文所介绍的概念设计方法的方案排列和方案选择方法。
5、编程与调试。
二、资源分配
P0^0----电机1用的PWM输出信号(左轮)P0^1----电机2用的PWM输出信号(右轮)L_DIR1A=P3^6----左轮电机方向控制 L_DIR1B=P3^7----左轮电机方向控制 R_DIR1A=P3^4----右轮电机方向控制 R_DIR1B=P3^5----右轮电机方向控制 P3^1----蜂鸣器控制
PCA0CPM0----电机1PWM输出,工作在8位定时器模式,允许比较器匹配中断,每次中断加载新的比较值,实现电机输出的脉宽、周期控制。
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
PCA0CPM1----电机2PWM输出,工作在8位定时器模式,允许比较器匹配中断,每次中断加载新的比较值,实现电机输出的脉宽、周期控制。
P5.0-P5.7;传感器接口 lcdrw=P3^2;----读写控制5 lcdcs=P3^0;----E使能6 lcdrs=P3^3;命令数据选择控制4
三、小车程序
#include #include #include //包含头文件
typedef unsigned char uchar;typedef unsigned long ulong;typedef unsigned int uint;
//变量定义#define L_MOTO_BREAK L_DIR1A=L_DIR1B #define L_MOTO_BACK L_DIR1A=0;L_DIR1B=1 #define L_MOTO_FORD L_DIR1A=1;L_DIR1B=0
2011年6月12日13:30
智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
#define R_MOTO_BREAK R_DIR1A=R_DIR1B #define R_MOTO_BACK R_DIR1A=0;R_DIR1B=1 #define R_MOTO_FORD R_DIR1A=1;R_DIR1B=0 //前走与后走的定义 sbit L_DIR1A=P3^6;sbit L_DIR1B=P3^7;sbit R_DIR1A=P3^4;sbit R_DIR1B=P3^5;sbit P3_1=P3^1;
sbit lcdrw=P3^2;//5 sbit lcdcs=P3^0;//6 sbit lcdrs=P3^3;//4
int a=0;//定时器计数用 uchar minute=0,second=0,sign=0;uchar fb=0;//控制前后方向
//全局变量的声明
//1602液晶的管脚定义
//I/O管脚的定义
/********************************************/ /* 名称:config
*/ /* 用途:初始化配置, 以保证单片机控制功能工作 */ /********************************************/ void config(void)
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
{
WDTCN = 0x07;
//看门狗禁止
WDTCN = 0xde;
WDTCN = 0xad;
XBR0 = 0x50;
XBR1 = 0x00;XBR2 = 0x40;
//配置交叉开关,//交叉开关允许
P0MDOUT=0x00;
P1MDOUT=0x00;
P2MDOUT=0x00;
P3MDOUT=0xfd;//I/O口的推挽与漏极输出 P74OUT=0x00;
//p4--p6 I/O口的推挽与漏极输出
P5=0xff;
OSCXCN = 0x00;
OSCICN = 0x16;//采用内部晶振,频率为 8MHZ }
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
/********************************************/ /* 名称: delay1ms
*/ /* 用途: 延时
*/ /********************************************/ void delay(uint z){ uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);
}
void delay1(uint time){ uint ii;uint jj;for(ii=0;ii
}
//两个延迟子程序
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
/********************************************/ /* 名称: PCA_Init
*/ /* 用途: PCA初始化
*/ /********************************************/ void PCA_Init(){
PCA0MD=0x08;
//PCA采用系统时钟,且PCA溢出中断禁止
PCA0CN=0x40;
//启动PCA计数器
} void PCA0_Init(){
PCA0CPM0=0x42;//CEX0为8位PWM输出模式
PCA0CPM1=0x42;//CEX1为8bit PWM输出模式
}
/********************************************/ /* 名称: PWM_Init
/* */ /********************************************/ void PWM0_set(uchar val){ PCA0CPH0=~val+1;
2011年6月12日13:30
产
*/ 生
PWM
脉
宽
调
制
用途:
//高电平占空比为val/256 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
} void PWM1_set(uchar val){
}
/********************************************/ /* 名称: L_Operation R_Operation
/* */ /********************************************/ void L_FORD(uchar L_spe_ford){
L_MOTO_FORD;
PWM0_set(L_spe_ford);} void R_FORD(uchar R_spe_ford){
R_MOTO_FORD;
PWM1_set(R_spe_ford);} void L_BACK(uint L_spe_back){
L_MOTO_BACK;
PWM0_set(L_spe_back);
}
2011年6月12日13:30
//高电平占空比为val/256 PCA0CPH1=~val+1;
*/ 用途:
电机正反转及速度的控制
//电机速度 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
void R_BACK(uint R_spe_back){
R_MOTO_BACK;
PWM1_set(R_spe_back);
} void L_BREAK(){
L_MOTO_BREAK;
} void R_BREAK(){
R_MOTO_BREAK;
}
/********************************************/ /* 名称: 定时器_Init
*/ /* 用途: 定时器初始化
*/ /********************************************/ void time_init()
{ CKCON=0X08;
//12分频与原分频的选择。把定时器1选为系统时钟 TMOD=0X01;//定时器1的方式选择为,把定时器1选为16位定时功能
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
TH0=0X00;TL0=0X00;//定时器1重装初值 ET0=1;//使能定时器1 TR0=1;//开定时器1 } /********************************************/ /* 名称:lcddisplay显示函数
*/ /* 用途:初始化
*/ /********************************************/
void sendc(uchar c)//给1602的lcd送命令 {
} void sendd(uchar c)//给1602的lcd送数据
2011年6月12日13:30 lcdrs=0;lcdrw=0;lcdcs=1;//E的高脉冲 P7=c;delay(10);lcdcs=0;//E的高脉冲
智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
{ lcdrs=1;lcdrw=0;lcdcs=1;P7=c;delay(10);lcdcs=0;}
void lcd_pos(uchar pos){ sendc(pos|0x80);}
//发送地址定位函数
void lcd_init(void)
//lcd初始化函数 { sendc(0x38);//8位,2行,5*7字体
sendc(0x08);//显示开,光标关;不闪
sendc(0x01);//清屏
sendc(0x06);delay1(1);
2011年6月12日13:30
智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
sendc(0x0C);}
/********************************************/ /* 名称:lcddisplay1
*/ /* 用途:第一次显示
*/ /********************************************/ void lcddisplay1(void)
//显示主函数 {
line1[5]=table[sign%10];line1[4]=table[sign/10];line1[11]=table[second%10];line1[10]=table[second/10];line1[8]=table[minute%10];line1[7]=table[minute/10];sendc(0x01);lcd_pos(0x00);
2011年6月12日13:30 uchar table[]={“0123456789”};uchar line1[]={“time00/00:00”};uchar i=0;sign++;智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
for(i=0;i
{
sendd(line1[i]);
delay(1);
} }
//时间显示
void display()
//最后的显示子函数,显示总时间,与结束标志。{ uchar table[]={“0123456789”};uchar i=0;uchar table1[]={“all_time:00:00”};uchar table2[]={“finish”};table1[13]=table[second%10];table1[12]=table[second/10];table1[10]=table[minute%10];table1[9]=table[minute/10];sendc(0x01);lcd_pos(0x00);while(table1[i]!=' '){ sendd(table1[i++]);delay(10);
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
} lcd_pos(0x40);i=0;while(table2[i]!=' ')
}
/********************************************/ /* 名称: Founding_Line
*/ { sendd(table2[i++]);delay(10);}
/* 用途: p6八路寻迹
*/ /********************************************/
void xun1()
//循迹函数,实现小车的寻线行走,与遇黑线停止
{ if(P5==0x00)
{ PWM0_set(230);PWM1_set(245);}
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
if(P5&0x04)//右
{
PWM0_set(170);
PWM1_set(250);
} if(P5&0x02)//左
{
PWM0_set(250);
PWM1_set(170);
} if(P5&0x08)//右
{
PWM0_set(1);
PWM1_set(245);
} if(P5&0x01)//左
{
PWM0_set(245);
PWM1_set(1);
}
if(P5&0x01&&P5&0x02){
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
PWM0_set(255);
PWM1_set(160);
} if(P5&0x04&&P5&0x08)
{
PWM0_set(255);
PWM1_set(160);
} }
void xun2(){ if(P5==0x00)
{
PWM0_set(230);
PWM1_set(245);
} if(P5&0x40)//右
{
PWM0_set(220);
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
PWM1_set(245);
} if(P5&0x20)//左
{
PWM0_set(245);
PWM1_set(180);
} if(P5&0x80)//右
{
PWM0_set(1);
PWM1_set(245);
} if(P5&0x10)//左
{
PWM0_set(245);
PWM1_set(1);
} if(P5&0x10&&P5&0x20)
{
PWM0_set(255);
PWM1_set(160);}
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
if(P5&0x40&&P5&0x80)
{
PWM0_set(160);
PWM1_set(255);
} }
void Founding_Line(){ if(fb
{
R_BREAK();
L_BREAK();
fb++;
if(fb==1 ||fb==2)
{
lcddisplay1();
delay1(380);//延时4s R_FORD(230);
2011年6月12日13:30
智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
L_FORD(245);
delay1(50);//延时0.5s
}
if(fb==3||fb==4)
{
lcddisplay1();
delay1(380);//延时4s
R_FORD(185);
L_FORD(245);
delay1(80);//延时0.5s
}
if(fb==5)
{
lcddisplay1();
delay1(380);//延时4s
R_FORD(185);
L_FORD(245);
delay1(80);//延时0.5s }
if(fb==6)
{
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
lcddisplay1();
delay1(380);//延时4s
R_FORD(230);
L_FORD(245);
delay(1800);
R_BACK(235);
L_FORD(245);
delay(6000);
R_BREAK();
L_BREAK();
//前直角拐弯
fb++;
}
if(fb==7)
{
R_FORD(230);
L_FORD(245);
delay1(50);//延时0.5s
}
if(fb==8){
P3_1=0;
2011年6月12日13:30
智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
lcddisplay1();
fb++;delay1(350);//延时4s
P3_1=1;
} } else xun1();
}
if(fb>=9){ if((P5&0xf0)==0xf0)//终点停
{
R_BREAK();
L_BREAK();
fb++;
if(fb==10)
{
lcddisplay1();
2011年6月12日13:30
智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
delay1(350);//延时4s
L_BACK(245);
R_BACK(230);
delay(1000);
R_FORD(200);
L_BACK(250);
delay(6300);
R_BREAK();
L_BREAK();
//后直角拐弯
fb++;
}
if(fb==11)
{
L_BACK(245);
R_BACK(230);
}
if(fb==13)
{
lcddisplay1();
L_BACK(245);
R_BACK(185);
delay1(80);
2011年6月12日13:30
智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
}
}
}
if(fb==12||fb==14||fb==15)
{
lcddisplay1();
L_BACK(245);R_BACK(230);delay1(50);}
else
{ xun2();} }
/********************************************/ /* 名称:main
*/ /* 用途:主程序,调用子程序进行电机控制和寻迹 */ /********************************************/ void main(){ config();
//初始化函数
2011年6月12日13:30
//主函数 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
lcd_init();PCA_Init();
//1602的初始化
//PCA的初始化
//PCA0和1的初始化
//定时器的初始化
//总中断打开,定时器开始计时,PCA开始PCA0_Init();time_init();EA=1;
PWM输出
P3_1=1;
while(1){ if(fb==0){
R_FORD(230);
L_FORD(245);}
if(fb==9){
L_BACK(245);
R_BACK(230);}
2011年6月12日13:30
智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
if(fb==16){
P3_1=0;
display();
EA=0;
PCON=0x02;
while(1);} Founding_Line();} } void timer0()interrupt 1
时钟提供定时。{ a++;TH0=0X00;TL0=0X00;if(a==145){ a=0;second++;if(second==60)
//中断函数,实现定时器功能。为
2011年6月12日13:30
智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
} { second=0;minute++;if(minute==60)
} {
minute=0;} }
结论
测试结果表明:本小组的智能小车能够很好的完成循迹功能,小车能够沿着如图所示的黑色路线行走。
2011年6月12日13:30 智能寻迹小车
组员:赵一鹏 艾博文 董羽曦
在这次的制作过程中,虽然条件艰苦,但是经过我们的不懈努力终于把课题完成。在这个过程中,我们不仅学习了单片机的工作原理和使用方法,而且还增强了动手能力。本次课题的设计,一方面是对我们所学课本知识的考验,另一方面更是对我们自学能力和收集资料能力以及动手能力的考验。通过软硬件的结合让我们充分认识到硬件制作和软件结合的困难,以及C语言对我们课题编译的重要性。我们以后一定会更加努力的。
2011年6月12日13:30