小车实验报告

课程设计报告

(嵌入式技术实践(一))

学 院:电气工程与自动化学院

题 目:基于P89V51RB2单片机寻迹小车 专业班级:自动化122班 学 号:33号 学生姓名:常雲

指导老师:张振利,罗龙

2013年06月20日

目 录

第1章 绪论.................................................................................................................. 4

1.1 1.2

引言 ................................................................................................................................. 4 课题任务要求 ................................................................................................................. 4

1.3 本论文研究的内容

2.1 2.2 2.3

4

第2章 系统总体设计.................................................................................................. 5

小车的机械特性 ............................................................................................................. 5 智能小车寻迹基本原理 ................................................................................................. 5 智能小车超声波测距基本原理 ..................................................................................... 5

第3章 系统硬件设计.................................................................................................. 7

3.1

控制器的选择 ................................................................................................................. 7 3.1.1 3.1.2 3.2

概述 ......................................................................................................................... 7 P89V51RB2开发工具特性 ...................................................................................... 7

硬件电路设计 ................................................................................................................. 7 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6

系统电源电路 ......................................................................................................... 7 电机驱动模块 ......................................................................................................... 8 光电编码器 ............................................................................................................. 9 红外线检测电路 ..................................................................................................... 9 超声波蔽障/测距 .................................................................. 错误!未定义书签。 LCD显示设计 ...................................................................... 错误!未定义书签。

第4章 系统软件设计................................................................................................ 13

4.1 4.2

编译环境 ....................................................................................................................... 13 模块的驱动 ................................................................................................................... 13 4.2.1 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6

红外线传感器模块 ............................................................................................... 13 电机模块的驱动 ................................................................................................... 14 转速捕获 ............................................................................................................... 16 LCD1602显示模块 .............................................................................................. 17 按键模块 ............................................................................................................... 21 超声波模块模块 ................................................................................................... 23

第5章 系统调试分析................................................................................................ 26

5.1

系统设计中的注意事项 ............................................................................................... 26 5.1.1 5.1.2 5.2

外部因素 ............................................................................................................... 26 内部因素 ............................................................................................................... 26

硬软件总体调试 ........................................................................................................... 26

第6章 结束语............................................................................................................ 27

致谢.............................................................................................................................. 28 参考文献...................................................................................................................... 29 附录.............................................................................................................................. 30

第1章 绪论

1.1 引言

我们所处的这个时代是信息革命的时代,各种新技术、新思想层出不穷,纵观世界范围内智能汽车技术的发展,每一次新的进步无不是受新技术新思想的推动。

随着汽车工业的迅速发展,传统的汽车的发展逐渐趋于饱和。伴随着电子技术和嵌入式技术的迅猛发展,这使得汽车日渐走向智能化。智能汽车由原先的驾驶更加简单更加安全更加舒适,逐渐的向智能驾驶系统方向发展。智能驾驶系统相当于智能机器人,能代替人驾驶汽车。它主要是通过安装在前后保险杠及两侧的红外线摄像机,对汽车前后左右一定区 域进行不停地扫描和监视。计算机、电子地图和光化学传感器等对红外线摄像 机传来的信号进行分析计算,并根据道路交通信息管理系统传来的交通信息,代替人的大脑发出指令,指挥执行系统操作汽车。

1.2 课题任务要求

应用P89V51RB2微控制器中的端口、外部中断、定时器等基本模块,实现核心控制,再结合电源板、电机驱动板来控制电机的转向,最后加上传感检测模块,实现小车的智能寻迹。

这次课程实践要求每一同学都要动手都制作出一辆循迹小车,真正实现从听中学到做中学,提高同学们的动手能力。这次实践最基本的功能底线就是能够实现循迹,附加的有超声波测距,蜂鸣器报警及液晶屏显示。 1.3 本论文研究的内容

本论文是基于P89V51RB2单片机开发,主要是研究3轮小车的路径识别及其控制算法以及超声波测距及LCD1602显示距离。

第2章 系统总体设计

2.1 小车的机械特性

小车采用的是一辆三轮车车模。后轮控件前进或转弯,前轮根据后轮驱动左右摆动即可以实现左右转。该种车模控制简单。小车可通过PWM控制后轮电机转动的速度来控制前轮电机的转动幅度从而控制小车的转弯幅度,实现小车的前进与转弯操作。小车可通过对DIR控制后退。 2.2 寻迹小车基本原理

探测路面黑线的基本原理:光线照射到路面并反射,由于黑线和白纸对光的反射系数不同,可以根据接收到的反射光强弱来判断是否是黑线。利用这个原理,可以控制小车行走的路迹。

这里的循迹是指小车在白色地板上循黑线行走,通常采取的方法是红外探测法。

红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。处理器就根据是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。红外探测器探测距离有限,一般最大不应超过3cm。

智能小车系统以处理器为核心, 为了使智能小车能够快速行驶,处理器必须把路径的迅速判断、相应的转向电机控制以及直流驱动电机的控制精密地结合在一起。如果传感器部分的数据没有正确地采集和识别,转向电机控制的失当,都会造成模型车严重抖动甚至偏离赛道;如果直流电机的驱动控制效果不好,也会造成直线路段速度上不去,弯曲路段入弯速度过快等问题。其系统结构如所

图 2.1示。

本次红外探测采用的是反射式探测。

2.3智能小车超声波测距原理

利用超声波连续发出10us以上的高电平,就可以在接口有高电频输出,等待

接受到返回的高电频信号时,通过定时器电波对被控对象进行时间检测。就可以计算相应的时间了。

图 2.1 系统结构图

80C51处理器通过引脚读出超声波信号管脚

80C51处理器向红外线传感器供5V电压,通过采集其高低电平可以控制小车80C51处理器通过DATA引脚向键盘显示板发送要显示的数据,还可以通过的转弯。

KEY引脚读取键盘的按键,实现相应的功能。

第3章 系统硬件设计

3.1 控制器的选择

本次设计采用的是80C51单片机。

3.1.1

概述

P89V51RB2是一款由美国NXP半导体公司提供的增强型80C51微控制器,

包括16KB Flash程序存储器和1KB数据RAM,且功能上完全覆盖标准80C51单片机系列

3.1.2

P89V51RB2 开发工具特性

1.80C51内核,5V工作电压,操作频率0~40MHZ; 2.16KB片内Flash存储器,1KB片内SRAM; 3.SPI串行通信接口和增强型UART;

4.PCA(可编程计数器列阵),具有PWM和捕获、比较功能;

5.4个8位I/O口,含有三个高电流P1口(每个I/O口的电流为16mA); 6.8个中断源,4个中断优先级,3个16位定时器/计数器和可编程看门狗定时器(WDT); 7.2个DPTR寄存器; 3.2 硬件电路设计

本次项目采用的电路板从画电路原理图开始,到PCB板的布线以及电路板的焊接与检测一系列工作都是自己在大一下学期课程实践期间制作的。

3.2.1

系统电源电路

交流电经过全波电路在经过电容滤波,在经过稳压电源芯片做成稳压电路,输出电压5V、7.2V的直流电源。其电源电路原理图如图3.2所示。

图 3.2 系统电源电路原理图

小车的驱动电机的供电电压为7.2V,经过电容滤波后接7805进行稳压,稳压输出5V的电压。提供单片机所需5V电压。

3.2.2

1.

电机驱动模块

驱动实现与原理

本项目驱动两路直流电机,实现电机的正反转与测速和遥控。 输入输出逻辑表真值表3.2。

表 3.1 L298N输入输出逻辑真值表

其中“0”为低电平;“1” 为高电平;“X” 为任何状态。 驱动原理图

3.2.3 2.

光电编码器/测速

光电编码器原理

光电编码器,是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。这是目前应用最多的传感器,光电编码器是由光栅盘和光电检测装置组成。光栅盘是在一定直径的圆板上等分地开通若干个长方形孔。由于光电码盘与电动机同轴,电动机旋转时,光栅盘与电动机同速旋转,经发光二极管等电子元件组成的检测装置检测输出若干脉冲信号,通过计算每秒光电编码器输出脉冲的个数就能反映当前电动机的转速。

3.

光电编码器的实现

光电编码器的发光装置一般由发光二极管来实现。光敏元件则由光敏三极管接上了上拉电阻来完成。光电式旋转编码器是转速或转角的检测元件,旋转的编码器与电动机相连,当电机转动时,带动码盘旋转,便发出转速或转角信号。其示意图如图 3.55所示。

图 3.5 光电编码器的实现示意图

当电机旋转时,码盘随之一起转动。通过光栅的作用,使得光敏三极管随着光栅透出的光而导通。接收的频率和转速成正比。在接收端可以输出一系列的方波,80C51内核可以通过采集方波的频率从而可以计算出电机的速度。

3.2.4

红外线检测电路

红外线检测电路原理其实很简单,就是利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收,Cortex-M0内核采集到的电压就是高电平;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光,然后80C51内核采集到的电压就是低电平。其基本原理图如图3.6所示。

图3.6 红外线检测电路原理图

鉴于本项目设计需实现的功能比较简单,故只要两路红外线检测电路即可,分别位于小车中心轴的两测即可。

3.2.5

超声波蔽障/测距

3.2.5.1超声波测距模块简介

超声波检测设计小车避障是利用超声波测距,并根据测出离障碍物不同距离而做出不同反应。

检测距离:5CM-4M

分辨率:5MM

数字电平信号,可直接接单片机,无需任何辅助电路,也无需单片机产生任何信

号辅助,距离和模块输出信号脉冲长度成正比。 尺寸:43.5*20.5毫米 高度:13.8毫米

3.2.5.2超声波测距模块的引脚功能

图3.2.5.3超声波实物 3.2.5.3超声波测距原理

你只需要提供一个短期的10uS脉冲触发信号。该模块内部将发出8个40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号是一个脉冲的宽度成正比的距离对象。可通过发射信号到收到的回响信号时间间隔可以计算得到距式:uS/58=厘米或者uS/148=英寸。建议测量周期为60ms以上,以防止发射信号对回响信号的影响

3.2.5.4超声波测距时序图

3.2.5超声波测距时序图

3.2.6

LCD显示设计

加液晶显示是为了弥补在超声波蔽障及测距是,对于具体我们不知道的距离显示出来,有助于我们更好的预知路程蔽障的范围及距离障碍物的距离。通过1602的显示,让我们更加清楚小车隔障碍物的距离。

图3.2.6液晶显示实物图

3.2.7.1液晶工作原理

在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数

据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。 那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,从而通过扫描,显示在液晶屏幕上 3.2.7.1液晶显示原理

液晶显示其实就是对屏幕的每个点的扫描,带字库的液晶内部自带控制芯

片,直接对它操作就可以显示出汉子字符,需要读写命令和数据,才能达到对液晶控制器的操作,具体的如何显示,有兴趣者可以自己查阅资料,进一步理解并学会使用。

第4章 系统软件设计

4.1 编译环境

TKStudio集成开发环境(又称TKStudio IDE)是广州致远电子有限公司开发的一个微处理器软件开发平台,是一款具有强大内置编辑器的多内核编译调试环境,支持8051、ARM、AVR等多种微控制器,可以完成从工程建立和管理,编译,链接,目标代码的生成,到软件仿真,硬件仿真(挂接TKS系列仿真器等硬件)等完整的开发流程。

TKStudio集成开发环境包括工程管理器、代码编辑器、编译工具链、源码级调试器和外部工具等。 4.2 模块的驱动

4.2.1

红外线传感器模块

红外线模块只要M0处理器向其供5V电压就能工作,然后通过引脚采集其电平高低就可以根据不同情况做出相应的处理。 其具体程序控制见程序清单4.1.

程序清单 4.1读取红外传感器的高低电平

void Track(void) {

if((IN1==0&&IN2==0)||(IN1==1&&IN2==1)) {

Forward(); //调用前进函数 }

if(IN1==1&&IN2==0)

{

Lift(); //调用左转函数 }

if(IN1==0&&IN2==1) {

Right(); //调用右转函数 } }

4.2.2

电机模块的驱动

首先,通过设置L298N芯片的输入方向RIGHT_FANZHUAN,RIGHT_ZHENGZHUAN,RIGHT_STOP,LEFT_ZHENGZHUAN,LEFT_FANZHUAN,LEFT_STOP,从而控制电机的正反转。详见程序清单4.3.

程序清单 4.3直流电机驱动与路径识别

void Forward() //电机前进 {

PWM1=1; PWM2=1; }

void Lift() //电机左转 {

PWM1=0; PWM2=1; }

void Right() //电机右转 {

PWM1=1; PWM2=0 ; }

void Track(void) {

if((IN1==0&&IN2==0)||(IN1==1&&IN2==1)) { }

Forward(); //调用前进函数 }

if(IN1==1&&IN2==0) { Lift(); //调用左转函数 }

if(IN1==0&&IN2==1) { Right(); //调用右转函数 }

前轮为方向轮,只有在需要转弯的时候才需要后边电机驱动其左右转动,在常态下则由后轮的推力使前轮向前转动。具体实现是通过控制前面产生的两路

PWM波的占空比和L298N芯片的In1、In2的方向来实现小车的前进寻迹与后退寻迹,其程序流程图详见图4.1所示。

图 4.1直流电机控制流程图

根据图4.1可以看到程序一开始就进行读取红外线传感器,如果左右两边都遇到黑线则停止前进;如果左边遇到黑线而且右边没有遇到黑线,小车则左转;如果右边遇到黑线而且左边没有遇到黑线,小车则右转;如果两边都没有遇到黑线小车则直行。具体程序控制详见程序清单4.4。

4.2.3

转速捕获

本项目采用16位定时器1和32位定时器1的捕获功能来实现两直流电机的转速捕获。由于主轮与后面光码盘扇叶转速的比例是1:80,而且有两片扇叶。所以测主轮的转速公式为:转速= ((FAHBCLK/((CAP1_2-CAP1_1)/(N2-1))))*3/8/ TMR16B1PR,程序控制详见程序清单4.5.

程序清单 4.5 直流电机转速的测量

void TimeNew1()//光栅捕获并记录 { R1=R2;

//捕获左电机光栅并记录

if(R_Mcp2==0){R2=1;}

if(R_Mcp1==0){r2=1;} //捕获右电机光栅并记录 if(R_Mcp1==1){r2=0;} if(r1==1){if(r2==0){rm1++;}} if(rm1==1){rm1=0;Count1++;} if(Count1==10000){Count1=0;} if(R_Mcp2==1){R2=0;} if(R1==1){if(R2==0){rm2++;}} if(rm2==1){rm2=0;Count2++;} if(Count2==10000){Count2=0;}

r1=r2; }

m1=lucheng1/1000, //转换成路程并分解成BCD码 dm1=(lucheng1-1000*m1)/100, cm1=(lucheng1-1000*m1-100*dm1)/10, mm1=lucheng1-1000*m1-100*dm1-10*cm1, m2=lucheng2/1000,

dm2=(lucheng2-1000*m2)/100, cm2=(lucheng2-1000*m2-100*dm2)/10, mm2=lucheng2-1000*m2-100*dm2-10*cm2

if(Count3==4000)

//定时一秒 //

{lucheng1=Count2*2200/1580;lucheng2=Count1*2200/1580;Count3=0;Count1=0,Count

2=0;}//路程计算

4.2.4

LCD1602液示显示模块

1602通过超声波产生的中断进行计数,在液晶屏上显示出来。 程序清单4.2.4

#define LCM_RW P3_4 //定义LCD引脚 #define LCM_RS P3_3 #define LCM_E P3_5 #define LCM_Data P1

#define Busy 0x80 //用于检测LCM状态字中的Busy标识 void LCMInit(void);

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Delay5Ms(void); void Delay400Ms(void);

void Decode(unsigned char ScanCode);

void WriteDataLCM(unsigned char WDLCM);

void WriteCommandLCM(unsigned char WCLCM,BuysC);

unsigned char ReadDataLCM(void); unsigned char ReadStatusLCM(void);

unsigned char code mcustudio[] ={"ZDH-122ban-33hao"}; unsigned char code email[] = {"distance-display"}; unsigned char code Cls[] = {" "};

unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};

static unsigned char DisNum = 0; //显示用指针 unsigned int time=0; unsigned long S=0; bit flag =0; unsigned char disbuff[4] ={ 0,0,0,0,};

//写数据

void WriteDataLCM(unsigned char WDLCM) { ReadStatusLCM(); //检测忙 LCM_Data = WDLCM; LCM_RS = 1; LCM_RW = 0; }

LCM_E = 0; //若晶振速度太高可以在这后加小的延时 LCM_E = 0; //延时 LCM_E = 1;

//写指令

void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测 {

if (BuysC) ReadStatusLCM(); //根据需要检测忙 LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0; LCM_E = 0; LCM_E = 0; LCM_E = 1; }

//读数据

unsigned char ReadDataLCM(void) { LCM_RS = 1; LCM_RW = 1;

LCM_E = 0; LCM_E = 0; LCM_E = 1; return(LCM_Data); }

//读状态

unsigned char ReadStatusLCM(void) { LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; while (LCM_Data & Busy); //检测忙信号 return(LCM_Data); }

void LCMInit(void) //LCM初始化 { LCM_Data = 0;

WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号 Delay5Ms(); WriteCommandLCM(0x38,0); Delay5Ms(); WriteCommandLCM(0x38,0); Delay5Ms(); WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号 WriteCommandLCM(0x08,1); //关闭显示 WriteCommandLCM(0x01,1); //显示清屏 WriteCommandLCM(0x06,1); // 显示光标移动设置 WriteCommandLCM(0x0F,1); // 显示开及光标设置 }

//按指定位置显示一个字符

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) { Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40; X |= 0x80; //算出指令码 WriteCommandLCM(X, 1); //发命令字

WriteDataLCM(DData); //发数据 }

//按指定位置显示一串字符

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) { unsigned char ListLength;

ListLength = 0; Y &= 0x1; }

X &= 0xF; //限制X不能大于15,Y不能大于1

while (DData[ListLength]>0x19) //若到达字串尾则退出 {

}

if (X

//5ms延时

void Delay5Ms(void) { unsigned int TempCyc = 5552; while(TempCyc--); }

//400ms延时

void Delay400Ms(void) { unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA--) { TempCycB=7269; while(TempCycB--); }; }

/********************************************************/ void Conut(void) { time=TH0*256+TL0;

TH0=0; TL0=0;

S=(time*1.7)/100; //算出来是CM

if((S>=700)||flag==1) //超出测量范围显示“-” { flag=0;

DisplayOneChar(0, 1, 'D'); DisplayOneChar(1, 1, 'i'); DisplayOneChar(2, 1, 's'); DisplayOneChar(3, 1, 't'); DisplayOneChar(4, 1, 'a'); DisplayOneChar(5, 1, 'n'); DisplayOneChar(6, 1, 'c'); DisplayOneChar(7, 1, 'e'); DisplayOneChar(8, 1, ' '); DisplayOneChar(9, 1, ':');

DisplayOneChar(10, 1, ASCII[11]);

DisplayOneChar(11, 1, ASCII[10]); //显示点 DisplayOneChar(12, 1, ASCII[11]); DisplayOneChar(13, 1, ASCII[11]);

DisplayOneChar(14, 1, ASCII[12]); //显示M } else {

disbuff[0]=S%1000/100; disbuff[1]=S%1000%100/10; disbuff[2]=S%1000%10 %10; DisplayOneChar(0, 1, 'D'); DisplayOneChar(1, 1, 'i'); DisplayOneChar(2, 1, 's'); DisplayOneChar(3, 1, 't'); DisplayOneChar(4, 1, 'a'); DisplayOneChar(5, 1, 'n'); DisplayOneChar(6, 1, 'c'); DisplayOneChar(7, 1, 'e'); DisplayOneChar(8, 1, ' '); DisplayOneChar(9, 1, ':');

DisplayOneChar(10, 1, ASCII[disbuff[0]]);

DisplayOneChar(11, 1, ASCII[10]); //显示点 DisplayOneChar(12, 1, ASCII[disbuff[1]]); DisplayOneChar(13, 1, ASCII[disbuff[2]]);

DisplayOneChar(14, 1, ASCII[12]); //显示M }

}

/********************************************************/ void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围 {

flag=1; //中断溢出标志 }

/********************************************************/

/********************************************************/ void delayms(unsigned int ms) { unsigned char i=100,j; for(;ms;ms--) { while(--i) { j=10; while(--j); } } }

/*********************************************************/ void main(void) { unsigned char TempCyc; Delay400Ms(); //启动等待,等LCM讲入工作状态 LCMInit(); //LCM初始化

Delay5Ms(); //延时片刻(可不要) DisplayListChar(0, 0, mcustudio); DisplayListChar(0, 1, email);

ReadDataLCM();//测试用句无意义

for (TempCyc=0; TempCyc

Delay400Ms(); //延时 DisplayListChar(0, 1, Cls); while(1) {

TMOD=0x01; //设T0为方式1,GATE=1; TH0=0;

TL0=0;

ET0=1; //允许T0中断 EA=1; //开启总中断

while(1) {

StartModule(); // DisplayOneChar(0, 1, ASCII[0]); while(!RX); //当RX为零时等待 TR0=1; //开启计数 while(RX); //当RX为1计数并等待 TR0=0; //关闭计数 Conut(); //计算 delayms(80); //80MS } } }

4.2.5

按键模块

按键模块处理流程图如图4.2所示。

图 4.2 按键处理程序流程图

把89V81RB2的P3.5引脚设置为检测引脚,设置为输入,进行扫描键盘。使

用变量i作为位码设置变量,由0至7依次循环,例如当按下5号键的时候,当i变成5的时候,会在5号线上出现低电平,p3.5上出现低电平,当89V81RB2上边检测到低电平的时候,将变量i的值赋值给按键号标志变量whichkeydown,,当按键松开后,对whichkeydown的值进行处理,也就是相当于对按键的事件进行了处理,处理完成后,将whichkeydown的值赋值为8,说明没有按键按下。按键要定时检测按键是否按键,实时处理即可。这里使用的是前面设置的16位定时器0的定时2.5ms进行检测。其具体详见程序清单4.7.

程序清单 4.2.5按键检测

void Key_Proc(void) { }

uint32 key;

if(有按键) //有按键

DelayNS(30); //延时去抖

if(按键有效0) //按键有效

读取按键值

//等待释键

while()

;

switch(key) { }

case按键1:

„„; //按键1处理

break; case按键2:

„„; //按键2处理

break; case按键3:

„„; //按键3处理

break;

4.2.6 超声波模块

所谓遥控即通过电磁波的远距离传送特点进行工作,由处理器通过对接收装置的管脚的电平的读取从而作出相应工作。 程序清单4.8 超声波发送接收

void StartModule()

//启动模块

{ TX=1;

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0;

}

//启动一次模块

第5章 系统调试分析

5.1 系统设计中的注意事项

5.1.1

外部因素

外部因素主要有环境光线、赛道材质等因素。以采用光电寻迹方案的智能车为例,如果接收的信号中有很多噪声成分,或者黑白区分不清晰,就很难识别路线,从而对后续的控制过程造成很大影响。因此,合理的传感器离地间隙和反射角度、较好的滤波电路设计都是需要考虑的。

5.1.2 (1)

内部因素

重量因素

整车质量的增加,对系统动力性有较大影响。因此,除了智能车工作必须的

电路之外,应尽可能减少车重。即使是必备部件,可应该采用轻量化的设计。比如为了测量模型车的速度,需要在驱动轮上加装转速传感器,一般购买的电机编码器重量都较大,有的队伍就利用鼠标上的光电电路设计制作了一个轻量化的转速传感器,从而大大减小了重量。

(2)

过度转向的避免

由于是后轮驱动,在弯曲的路线上加速可能会出现过度转向现象,因此在车

辆弯道行驶时需要小心控制车辆的转向速度。

(3)

传感器的影响

刚开始的时候,我的传感器装的比较高,这样就不能很好的感应到路线,以

至于出现乱跑的现象。如果在以后的设计中需要的话,可以采用激光传感器进行探测,这样就会更精准的寻迹。 5.2 硬软件总体调试

硬件、软件独立调试都有效果之后,下一步就是硬软件总体调试了,在硬软件总体调试之前,应现把各个跳线接后,然后在用贴有黑胶带的白纸来回在红外线发射接收管左右移动,看小车的电机转速是否会发生变化,如果用贴有黑胶带的白纸来回在各个红外线发射接收管左右移动时,电机的转速都会发生改变,则说明总体调试初步有效,最后让小车在赛道上进行行走,在初次调试的时候,小车的速度不能太大。

第6章 结束语

历经四五天的课余时间,终于把本次嵌入式课程设计完成了,从资料的搜索到最终的调试,在整个课程过程中,感觉自己学到了许多东西,忽然间才明白,原来看起来很难的东西,其实只要努力去做,其实并没有什么。很多时候,真正阻止一个人发展的,还是自己的心。因为在很多时候,我们都被自己吓回去了。于是,这个世界,终究是属于那些敢想敢干,并坚持下去的人的。

在这之前,我也曾想做好多东西。然而真正下决心并做成的,其实并没有几个。此次的成功,无疑给予了我很大的决心。

关于此次的循迹车,从一幅幅电路图到一个个电子元件,再到一个一个成型的模块,最后到组装并成功实现功能。这其中所花费的精力,也有些让自己动容。然而我想,做每个项目本都应该如此吧!一步步的,品味到了辛酸,才会获得甘甜。十分的信心,十足的恒心。只有这样,才能成事。

在本课题的设计中,虽然把实物做出来了,而且都符合课题设计的要求并在此基础上还加了些功能,但是相比“飞思卡尔”智能汽车邀请赛上的智能小车还是存在很大的差距,最主要的问题是速度上的问题,本论文设计的智能小车的行走的速度不能太快,否则会出现寻迹不准确。还有一个问题就是红外线接收头之间存在干扰问题。由于时间的问题,没能用PWM进行调速,这实在是一大遗憾。如果时间允许的话,采用PID精准算法来控制电机的转速。我想,这才算是一个真正的智能的小车吧。

一个实验项目的成功,需要的是信心,敢于探索,不屈不挠才会获得成功。 真正的智能,我相信,还在不久之后,会在我们的制作之下,在大家面前展现。

致谢

感谢王祖麟老师。王老师是我最崇敬的师长。王老师为了我们,为了“3+1”,为了教育事业,一直默默的顽强的奉献着。并时刻影响着我们,无论是在学习上还是精神上,他独特的人格魅力都给了我极其大的影响。他是我们“3+1”班的领军者,更是我人生路上的指路明灯。使我越加相信自己,相信未来,让我明白成就梦想这并非一句空话!

感谢张振利老师,在他的鼓励与教导之下,我快对自己充满了信心。促使我迅速成长。他就像一位大哥哥一样,相信,在他的教导与帮助之下,我会更加的出色,会变得更优秀。

感谢大二的学长,每次去找他们时,他们都不惜自己的时间给我们讲解难点以及告诉我们他们当时的经验。感谢1409里面的各位同学,在1409里面,一年马上就要过去了,但是,我们在这儿留下的每一个印记,都将成为我们大学生活充实难舍的部分。

感谢我的所有老师,是他们让我在人生的道路上不断的学习与进步,。 感谢 “3+1”班所有同学。是他们陪我一起在本次实践中共同努力,共同学习,共同生活。我们从这里起航!

感谢江西理工大学给我这个学习的环境,这是让我梦想起航的地方。

参考文献

[1] 周立功等. 《项目驱动-单片机应用设计基础》. 北京:北京航空航天大学出版社,2004

[2] 周立功等. 《 新编计算机基础教程》. 北京:北京航空航天大学出版社,2004

[3] 周航慈. 《 单片机程序设计基础》. 北京:北京航空航天大学出版社,2003

附录图

小车全图 电机驱动板 电源板

LCD1602液晶显示 超声波模块

循迹模块 单片机及其外扩

课程设计报告

(嵌入式技术实践(一))

学 院:电气工程与自动化学院

题 目:基于P89V51RB2单片机寻迹小车 专业班级:自动化122班 学 号:33号 学生姓名:常雲

指导老师:张振利,罗龙

2013年06月20日

目 录

第1章 绪论.................................................................................................................. 4

1.1 1.2

引言 ................................................................................................................................. 4 课题任务要求 ................................................................................................................. 4

1.3 本论文研究的内容

2.1 2.2 2.3

4

第2章 系统总体设计.................................................................................................. 5

小车的机械特性 ............................................................................................................. 5 智能小车寻迹基本原理 ................................................................................................. 5 智能小车超声波测距基本原理 ..................................................................................... 5

第3章 系统硬件设计.................................................................................................. 7

3.1

控制器的选择 ................................................................................................................. 7 3.1.1 3.1.2 3.2

概述 ......................................................................................................................... 7 P89V51RB2开发工具特性 ...................................................................................... 7

硬件电路设计 ................................................................................................................. 7 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6

系统电源电路 ......................................................................................................... 7 电机驱动模块 ......................................................................................................... 8 光电编码器 ............................................................................................................. 9 红外线检测电路 ..................................................................................................... 9 超声波蔽障/测距 .................................................................. 错误!未定义书签。 LCD显示设计 ...................................................................... 错误!未定义书签。

第4章 系统软件设计................................................................................................ 13

4.1 4.2

编译环境 ....................................................................................................................... 13 模块的驱动 ................................................................................................................... 13 4.2.1 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6

红外线传感器模块 ............................................................................................... 13 电机模块的驱动 ................................................................................................... 14 转速捕获 ............................................................................................................... 16 LCD1602显示模块 .............................................................................................. 17 按键模块 ............................................................................................................... 21 超声波模块模块 ................................................................................................... 23

第5章 系统调试分析................................................................................................ 26

5.1

系统设计中的注意事项 ............................................................................................... 26 5.1.1 5.1.2 5.2

外部因素 ............................................................................................................... 26 内部因素 ............................................................................................................... 26

硬软件总体调试 ........................................................................................................... 26

第6章 结束语............................................................................................................ 27

致谢.............................................................................................................................. 28 参考文献...................................................................................................................... 29 附录.............................................................................................................................. 30

第1章 绪论

1.1 引言

我们所处的这个时代是信息革命的时代,各种新技术、新思想层出不穷,纵观世界范围内智能汽车技术的发展,每一次新的进步无不是受新技术新思想的推动。

随着汽车工业的迅速发展,传统的汽车的发展逐渐趋于饱和。伴随着电子技术和嵌入式技术的迅猛发展,这使得汽车日渐走向智能化。智能汽车由原先的驾驶更加简单更加安全更加舒适,逐渐的向智能驾驶系统方向发展。智能驾驶系统相当于智能机器人,能代替人驾驶汽车。它主要是通过安装在前后保险杠及两侧的红外线摄像机,对汽车前后左右一定区 域进行不停地扫描和监视。计算机、电子地图和光化学传感器等对红外线摄像 机传来的信号进行分析计算,并根据道路交通信息管理系统传来的交通信息,代替人的大脑发出指令,指挥执行系统操作汽车。

1.2 课题任务要求

应用P89V51RB2微控制器中的端口、外部中断、定时器等基本模块,实现核心控制,再结合电源板、电机驱动板来控制电机的转向,最后加上传感检测模块,实现小车的智能寻迹。

这次课程实践要求每一同学都要动手都制作出一辆循迹小车,真正实现从听中学到做中学,提高同学们的动手能力。这次实践最基本的功能底线就是能够实现循迹,附加的有超声波测距,蜂鸣器报警及液晶屏显示。 1.3 本论文研究的内容

本论文是基于P89V51RB2单片机开发,主要是研究3轮小车的路径识别及其控制算法以及超声波测距及LCD1602显示距离。

第2章 系统总体设计

2.1 小车的机械特性

小车采用的是一辆三轮车车模。后轮控件前进或转弯,前轮根据后轮驱动左右摆动即可以实现左右转。该种车模控制简单。小车可通过PWM控制后轮电机转动的速度来控制前轮电机的转动幅度从而控制小车的转弯幅度,实现小车的前进与转弯操作。小车可通过对DIR控制后退。 2.2 寻迹小车基本原理

探测路面黑线的基本原理:光线照射到路面并反射,由于黑线和白纸对光的反射系数不同,可以根据接收到的反射光强弱来判断是否是黑线。利用这个原理,可以控制小车行走的路迹。

这里的循迹是指小车在白色地板上循黑线行走,通常采取的方法是红外探测法。

红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。处理器就根据是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。红外探测器探测距离有限,一般最大不应超过3cm。

智能小车系统以处理器为核心, 为了使智能小车能够快速行驶,处理器必须把路径的迅速判断、相应的转向电机控制以及直流驱动电机的控制精密地结合在一起。如果传感器部分的数据没有正确地采集和识别,转向电机控制的失当,都会造成模型车严重抖动甚至偏离赛道;如果直流电机的驱动控制效果不好,也会造成直线路段速度上不去,弯曲路段入弯速度过快等问题。其系统结构如所

图 2.1示。

本次红外探测采用的是反射式探测。

2.3智能小车超声波测距原理

利用超声波连续发出10us以上的高电平,就可以在接口有高电频输出,等待

接受到返回的高电频信号时,通过定时器电波对被控对象进行时间检测。就可以计算相应的时间了。

图 2.1 系统结构图

80C51处理器通过引脚读出超声波信号管脚

80C51处理器向红外线传感器供5V电压,通过采集其高低电平可以控制小车80C51处理器通过DATA引脚向键盘显示板发送要显示的数据,还可以通过的转弯。

KEY引脚读取键盘的按键,实现相应的功能。

第3章 系统硬件设计

3.1 控制器的选择

本次设计采用的是80C51单片机。

3.1.1

概述

P89V51RB2是一款由美国NXP半导体公司提供的增强型80C51微控制器,

包括16KB Flash程序存储器和1KB数据RAM,且功能上完全覆盖标准80C51单片机系列

3.1.2

P89V51RB2 开发工具特性

1.80C51内核,5V工作电压,操作频率0~40MHZ; 2.16KB片内Flash存储器,1KB片内SRAM; 3.SPI串行通信接口和增强型UART;

4.PCA(可编程计数器列阵),具有PWM和捕获、比较功能;

5.4个8位I/O口,含有三个高电流P1口(每个I/O口的电流为16mA); 6.8个中断源,4个中断优先级,3个16位定时器/计数器和可编程看门狗定时器(WDT); 7.2个DPTR寄存器; 3.2 硬件电路设计

本次项目采用的电路板从画电路原理图开始,到PCB板的布线以及电路板的焊接与检测一系列工作都是自己在大一下学期课程实践期间制作的。

3.2.1

系统电源电路

交流电经过全波电路在经过电容滤波,在经过稳压电源芯片做成稳压电路,输出电压5V、7.2V的直流电源。其电源电路原理图如图3.2所示。

图 3.2 系统电源电路原理图

小车的驱动电机的供电电压为7.2V,经过电容滤波后接7805进行稳压,稳压输出5V的电压。提供单片机所需5V电压。

3.2.2

1.

电机驱动模块

驱动实现与原理

本项目驱动两路直流电机,实现电机的正反转与测速和遥控。 输入输出逻辑表真值表3.2。

表 3.1 L298N输入输出逻辑真值表

其中“0”为低电平;“1” 为高电平;“X” 为任何状态。 驱动原理图

3.2.3 2.

光电编码器/测速

光电编码器原理

光电编码器,是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。这是目前应用最多的传感器,光电编码器是由光栅盘和光电检测装置组成。光栅盘是在一定直径的圆板上等分地开通若干个长方形孔。由于光电码盘与电动机同轴,电动机旋转时,光栅盘与电动机同速旋转,经发光二极管等电子元件组成的检测装置检测输出若干脉冲信号,通过计算每秒光电编码器输出脉冲的个数就能反映当前电动机的转速。

3.

光电编码器的实现

光电编码器的发光装置一般由发光二极管来实现。光敏元件则由光敏三极管接上了上拉电阻来完成。光电式旋转编码器是转速或转角的检测元件,旋转的编码器与电动机相连,当电机转动时,带动码盘旋转,便发出转速或转角信号。其示意图如图 3.55所示。

图 3.5 光电编码器的实现示意图

当电机旋转时,码盘随之一起转动。通过光栅的作用,使得光敏三极管随着光栅透出的光而导通。接收的频率和转速成正比。在接收端可以输出一系列的方波,80C51内核可以通过采集方波的频率从而可以计算出电机的速度。

3.2.4

红外线检测电路

红外线检测电路原理其实很简单,就是利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收,Cortex-M0内核采集到的电压就是高电平;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光,然后80C51内核采集到的电压就是低电平。其基本原理图如图3.6所示。

图3.6 红外线检测电路原理图

鉴于本项目设计需实现的功能比较简单,故只要两路红外线检测电路即可,分别位于小车中心轴的两测即可。

3.2.5

超声波蔽障/测距

3.2.5.1超声波测距模块简介

超声波检测设计小车避障是利用超声波测距,并根据测出离障碍物不同距离而做出不同反应。

检测距离:5CM-4M

分辨率:5MM

数字电平信号,可直接接单片机,无需任何辅助电路,也无需单片机产生任何信

号辅助,距离和模块输出信号脉冲长度成正比。 尺寸:43.5*20.5毫米 高度:13.8毫米

3.2.5.2超声波测距模块的引脚功能

图3.2.5.3超声波实物 3.2.5.3超声波测距原理

你只需要提供一个短期的10uS脉冲触发信号。该模块内部将发出8个40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号是一个脉冲的宽度成正比的距离对象。可通过发射信号到收到的回响信号时间间隔可以计算得到距式:uS/58=厘米或者uS/148=英寸。建议测量周期为60ms以上,以防止发射信号对回响信号的影响

3.2.5.4超声波测距时序图

3.2.5超声波测距时序图

3.2.6

LCD显示设计

加液晶显示是为了弥补在超声波蔽障及测距是,对于具体我们不知道的距离显示出来,有助于我们更好的预知路程蔽障的范围及距离障碍物的距离。通过1602的显示,让我们更加清楚小车隔障碍物的距离。

图3.2.6液晶显示实物图

3.2.7.1液晶工作原理

在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数

据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。 那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,从而通过扫描,显示在液晶屏幕上 3.2.7.1液晶显示原理

液晶显示其实就是对屏幕的每个点的扫描,带字库的液晶内部自带控制芯

片,直接对它操作就可以显示出汉子字符,需要读写命令和数据,才能达到对液晶控制器的操作,具体的如何显示,有兴趣者可以自己查阅资料,进一步理解并学会使用。

第4章 系统软件设计

4.1 编译环境

TKStudio集成开发环境(又称TKStudio IDE)是广州致远电子有限公司开发的一个微处理器软件开发平台,是一款具有强大内置编辑器的多内核编译调试环境,支持8051、ARM、AVR等多种微控制器,可以完成从工程建立和管理,编译,链接,目标代码的生成,到软件仿真,硬件仿真(挂接TKS系列仿真器等硬件)等完整的开发流程。

TKStudio集成开发环境包括工程管理器、代码编辑器、编译工具链、源码级调试器和外部工具等。 4.2 模块的驱动

4.2.1

红外线传感器模块

红外线模块只要M0处理器向其供5V电压就能工作,然后通过引脚采集其电平高低就可以根据不同情况做出相应的处理。 其具体程序控制见程序清单4.1.

程序清单 4.1读取红外传感器的高低电平

void Track(void) {

if((IN1==0&&IN2==0)||(IN1==1&&IN2==1)) {

Forward(); //调用前进函数 }

if(IN1==1&&IN2==0)

{

Lift(); //调用左转函数 }

if(IN1==0&&IN2==1) {

Right(); //调用右转函数 } }

4.2.2

电机模块的驱动

首先,通过设置L298N芯片的输入方向RIGHT_FANZHUAN,RIGHT_ZHENGZHUAN,RIGHT_STOP,LEFT_ZHENGZHUAN,LEFT_FANZHUAN,LEFT_STOP,从而控制电机的正反转。详见程序清单4.3.

程序清单 4.3直流电机驱动与路径识别

void Forward() //电机前进 {

PWM1=1; PWM2=1; }

void Lift() //电机左转 {

PWM1=0; PWM2=1; }

void Right() //电机右转 {

PWM1=1; PWM2=0 ; }

void Track(void) {

if((IN1==0&&IN2==0)||(IN1==1&&IN2==1)) { }

Forward(); //调用前进函数 }

if(IN1==1&&IN2==0) { Lift(); //调用左转函数 }

if(IN1==0&&IN2==1) { Right(); //调用右转函数 }

前轮为方向轮,只有在需要转弯的时候才需要后边电机驱动其左右转动,在常态下则由后轮的推力使前轮向前转动。具体实现是通过控制前面产生的两路

PWM波的占空比和L298N芯片的In1、In2的方向来实现小车的前进寻迹与后退寻迹,其程序流程图详见图4.1所示。

图 4.1直流电机控制流程图

根据图4.1可以看到程序一开始就进行读取红外线传感器,如果左右两边都遇到黑线则停止前进;如果左边遇到黑线而且右边没有遇到黑线,小车则左转;如果右边遇到黑线而且左边没有遇到黑线,小车则右转;如果两边都没有遇到黑线小车则直行。具体程序控制详见程序清单4.4。

4.2.3

转速捕获

本项目采用16位定时器1和32位定时器1的捕获功能来实现两直流电机的转速捕获。由于主轮与后面光码盘扇叶转速的比例是1:80,而且有两片扇叶。所以测主轮的转速公式为:转速= ((FAHBCLK/((CAP1_2-CAP1_1)/(N2-1))))*3/8/ TMR16B1PR,程序控制详见程序清单4.5.

程序清单 4.5 直流电机转速的测量

void TimeNew1()//光栅捕获并记录 { R1=R2;

//捕获左电机光栅并记录

if(R_Mcp2==0){R2=1;}

if(R_Mcp1==0){r2=1;} //捕获右电机光栅并记录 if(R_Mcp1==1){r2=0;} if(r1==1){if(r2==0){rm1++;}} if(rm1==1){rm1=0;Count1++;} if(Count1==10000){Count1=0;} if(R_Mcp2==1){R2=0;} if(R1==1){if(R2==0){rm2++;}} if(rm2==1){rm2=0;Count2++;} if(Count2==10000){Count2=0;}

r1=r2; }

m1=lucheng1/1000, //转换成路程并分解成BCD码 dm1=(lucheng1-1000*m1)/100, cm1=(lucheng1-1000*m1-100*dm1)/10, mm1=lucheng1-1000*m1-100*dm1-10*cm1, m2=lucheng2/1000,

dm2=(lucheng2-1000*m2)/100, cm2=(lucheng2-1000*m2-100*dm2)/10, mm2=lucheng2-1000*m2-100*dm2-10*cm2

if(Count3==4000)

//定时一秒 //

{lucheng1=Count2*2200/1580;lucheng2=Count1*2200/1580;Count3=0;Count1=0,Count

2=0;}//路程计算

4.2.4

LCD1602液示显示模块

1602通过超声波产生的中断进行计数,在液晶屏上显示出来。 程序清单4.2.4

#define LCM_RW P3_4 //定义LCD引脚 #define LCM_RS P3_3 #define LCM_E P3_5 #define LCM_Data P1

#define Busy 0x80 //用于检测LCM状态字中的Busy标识 void LCMInit(void);

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Delay5Ms(void); void Delay400Ms(void);

void Decode(unsigned char ScanCode);

void WriteDataLCM(unsigned char WDLCM);

void WriteCommandLCM(unsigned char WCLCM,BuysC);

unsigned char ReadDataLCM(void); unsigned char ReadStatusLCM(void);

unsigned char code mcustudio[] ={"ZDH-122ban-33hao"}; unsigned char code email[] = {"distance-display"}; unsigned char code Cls[] = {" "};

unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};

static unsigned char DisNum = 0; //显示用指针 unsigned int time=0; unsigned long S=0; bit flag =0; unsigned char disbuff[4] ={ 0,0,0,0,};

//写数据

void WriteDataLCM(unsigned char WDLCM) { ReadStatusLCM(); //检测忙 LCM_Data = WDLCM; LCM_RS = 1; LCM_RW = 0; }

LCM_E = 0; //若晶振速度太高可以在这后加小的延时 LCM_E = 0; //延时 LCM_E = 1;

//写指令

void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测 {

if (BuysC) ReadStatusLCM(); //根据需要检测忙 LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0; LCM_E = 0; LCM_E = 0; LCM_E = 1; }

//读数据

unsigned char ReadDataLCM(void) { LCM_RS = 1; LCM_RW = 1;

LCM_E = 0; LCM_E = 0; LCM_E = 1; return(LCM_Data); }

//读状态

unsigned char ReadStatusLCM(void) { LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; while (LCM_Data & Busy); //检测忙信号 return(LCM_Data); }

void LCMInit(void) //LCM初始化 { LCM_Data = 0;

WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号 Delay5Ms(); WriteCommandLCM(0x38,0); Delay5Ms(); WriteCommandLCM(0x38,0); Delay5Ms(); WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号 WriteCommandLCM(0x08,1); //关闭显示 WriteCommandLCM(0x01,1); //显示清屏 WriteCommandLCM(0x06,1); // 显示光标移动设置 WriteCommandLCM(0x0F,1); // 显示开及光标设置 }

//按指定位置显示一个字符

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) { Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40; X |= 0x80; //算出指令码 WriteCommandLCM(X, 1); //发命令字

WriteDataLCM(DData); //发数据 }

//按指定位置显示一串字符

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) { unsigned char ListLength;

ListLength = 0; Y &= 0x1; }

X &= 0xF; //限制X不能大于15,Y不能大于1

while (DData[ListLength]>0x19) //若到达字串尾则退出 {

}

if (X

//5ms延时

void Delay5Ms(void) { unsigned int TempCyc = 5552; while(TempCyc--); }

//400ms延时

void Delay400Ms(void) { unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA--) { TempCycB=7269; while(TempCycB--); }; }

/********************************************************/ void Conut(void) { time=TH0*256+TL0;

TH0=0; TL0=0;

S=(time*1.7)/100; //算出来是CM

if((S>=700)||flag==1) //超出测量范围显示“-” { flag=0;

DisplayOneChar(0, 1, 'D'); DisplayOneChar(1, 1, 'i'); DisplayOneChar(2, 1, 's'); DisplayOneChar(3, 1, 't'); DisplayOneChar(4, 1, 'a'); DisplayOneChar(5, 1, 'n'); DisplayOneChar(6, 1, 'c'); DisplayOneChar(7, 1, 'e'); DisplayOneChar(8, 1, ' '); DisplayOneChar(9, 1, ':');

DisplayOneChar(10, 1, ASCII[11]);

DisplayOneChar(11, 1, ASCII[10]); //显示点 DisplayOneChar(12, 1, ASCII[11]); DisplayOneChar(13, 1, ASCII[11]);

DisplayOneChar(14, 1, ASCII[12]); //显示M } else {

disbuff[0]=S%1000/100; disbuff[1]=S%1000%100/10; disbuff[2]=S%1000%10 %10; DisplayOneChar(0, 1, 'D'); DisplayOneChar(1, 1, 'i'); DisplayOneChar(2, 1, 's'); DisplayOneChar(3, 1, 't'); DisplayOneChar(4, 1, 'a'); DisplayOneChar(5, 1, 'n'); DisplayOneChar(6, 1, 'c'); DisplayOneChar(7, 1, 'e'); DisplayOneChar(8, 1, ' '); DisplayOneChar(9, 1, ':');

DisplayOneChar(10, 1, ASCII[disbuff[0]]);

DisplayOneChar(11, 1, ASCII[10]); //显示点 DisplayOneChar(12, 1, ASCII[disbuff[1]]); DisplayOneChar(13, 1, ASCII[disbuff[2]]);

DisplayOneChar(14, 1, ASCII[12]); //显示M }

}

/********************************************************/ void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围 {

flag=1; //中断溢出标志 }

/********************************************************/

/********************************************************/ void delayms(unsigned int ms) { unsigned char i=100,j; for(;ms;ms--) { while(--i) { j=10; while(--j); } } }

/*********************************************************/ void main(void) { unsigned char TempCyc; Delay400Ms(); //启动等待,等LCM讲入工作状态 LCMInit(); //LCM初始化

Delay5Ms(); //延时片刻(可不要) DisplayListChar(0, 0, mcustudio); DisplayListChar(0, 1, email);

ReadDataLCM();//测试用句无意义

for (TempCyc=0; TempCyc

Delay400Ms(); //延时 DisplayListChar(0, 1, Cls); while(1) {

TMOD=0x01; //设T0为方式1,GATE=1; TH0=0;

TL0=0;

ET0=1; //允许T0中断 EA=1; //开启总中断

while(1) {

StartModule(); // DisplayOneChar(0, 1, ASCII[0]); while(!RX); //当RX为零时等待 TR0=1; //开启计数 while(RX); //当RX为1计数并等待 TR0=0; //关闭计数 Conut(); //计算 delayms(80); //80MS } } }

4.2.5

按键模块

按键模块处理流程图如图4.2所示。

图 4.2 按键处理程序流程图

把89V81RB2的P3.5引脚设置为检测引脚,设置为输入,进行扫描键盘。使

用变量i作为位码设置变量,由0至7依次循环,例如当按下5号键的时候,当i变成5的时候,会在5号线上出现低电平,p3.5上出现低电平,当89V81RB2上边检测到低电平的时候,将变量i的值赋值给按键号标志变量whichkeydown,,当按键松开后,对whichkeydown的值进行处理,也就是相当于对按键的事件进行了处理,处理完成后,将whichkeydown的值赋值为8,说明没有按键按下。按键要定时检测按键是否按键,实时处理即可。这里使用的是前面设置的16位定时器0的定时2.5ms进行检测。其具体详见程序清单4.7.

程序清单 4.2.5按键检测

void Key_Proc(void) { }

uint32 key;

if(有按键) //有按键

DelayNS(30); //延时去抖

if(按键有效0) //按键有效

读取按键值

//等待释键

while()

;

switch(key) { }

case按键1:

„„; //按键1处理

break; case按键2:

„„; //按键2处理

break; case按键3:

„„; //按键3处理

break;

4.2.6 超声波模块

所谓遥控即通过电磁波的远距离传送特点进行工作,由处理器通过对接收装置的管脚的电平的读取从而作出相应工作。 程序清单4.8 超声波发送接收

void StartModule()

//启动模块

{ TX=1;

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0;

}

//启动一次模块

第5章 系统调试分析

5.1 系统设计中的注意事项

5.1.1

外部因素

外部因素主要有环境光线、赛道材质等因素。以采用光电寻迹方案的智能车为例,如果接收的信号中有很多噪声成分,或者黑白区分不清晰,就很难识别路线,从而对后续的控制过程造成很大影响。因此,合理的传感器离地间隙和反射角度、较好的滤波电路设计都是需要考虑的。

5.1.2 (1)

内部因素

重量因素

整车质量的增加,对系统动力性有较大影响。因此,除了智能车工作必须的

电路之外,应尽可能减少车重。即使是必备部件,可应该采用轻量化的设计。比如为了测量模型车的速度,需要在驱动轮上加装转速传感器,一般购买的电机编码器重量都较大,有的队伍就利用鼠标上的光电电路设计制作了一个轻量化的转速传感器,从而大大减小了重量。

(2)

过度转向的避免

由于是后轮驱动,在弯曲的路线上加速可能会出现过度转向现象,因此在车

辆弯道行驶时需要小心控制车辆的转向速度。

(3)

传感器的影响

刚开始的时候,我的传感器装的比较高,这样就不能很好的感应到路线,以

至于出现乱跑的现象。如果在以后的设计中需要的话,可以采用激光传感器进行探测,这样就会更精准的寻迹。 5.2 硬软件总体调试

硬件、软件独立调试都有效果之后,下一步就是硬软件总体调试了,在硬软件总体调试之前,应现把各个跳线接后,然后在用贴有黑胶带的白纸来回在红外线发射接收管左右移动,看小车的电机转速是否会发生变化,如果用贴有黑胶带的白纸来回在各个红外线发射接收管左右移动时,电机的转速都会发生改变,则说明总体调试初步有效,最后让小车在赛道上进行行走,在初次调试的时候,小车的速度不能太大。

第6章 结束语

历经四五天的课余时间,终于把本次嵌入式课程设计完成了,从资料的搜索到最终的调试,在整个课程过程中,感觉自己学到了许多东西,忽然间才明白,原来看起来很难的东西,其实只要努力去做,其实并没有什么。很多时候,真正阻止一个人发展的,还是自己的心。因为在很多时候,我们都被自己吓回去了。于是,这个世界,终究是属于那些敢想敢干,并坚持下去的人的。

在这之前,我也曾想做好多东西。然而真正下决心并做成的,其实并没有几个。此次的成功,无疑给予了我很大的决心。

关于此次的循迹车,从一幅幅电路图到一个个电子元件,再到一个一个成型的模块,最后到组装并成功实现功能。这其中所花费的精力,也有些让自己动容。然而我想,做每个项目本都应该如此吧!一步步的,品味到了辛酸,才会获得甘甜。十分的信心,十足的恒心。只有这样,才能成事。

在本课题的设计中,虽然把实物做出来了,而且都符合课题设计的要求并在此基础上还加了些功能,但是相比“飞思卡尔”智能汽车邀请赛上的智能小车还是存在很大的差距,最主要的问题是速度上的问题,本论文设计的智能小车的行走的速度不能太快,否则会出现寻迹不准确。还有一个问题就是红外线接收头之间存在干扰问题。由于时间的问题,没能用PWM进行调速,这实在是一大遗憾。如果时间允许的话,采用PID精准算法来控制电机的转速。我想,这才算是一个真正的智能的小车吧。

一个实验项目的成功,需要的是信心,敢于探索,不屈不挠才会获得成功。 真正的智能,我相信,还在不久之后,会在我们的制作之下,在大家面前展现。

致谢

感谢王祖麟老师。王老师是我最崇敬的师长。王老师为了我们,为了“3+1”,为了教育事业,一直默默的顽强的奉献着。并时刻影响着我们,无论是在学习上还是精神上,他独特的人格魅力都给了我极其大的影响。他是我们“3+1”班的领军者,更是我人生路上的指路明灯。使我越加相信自己,相信未来,让我明白成就梦想这并非一句空话!

感谢张振利老师,在他的鼓励与教导之下,我快对自己充满了信心。促使我迅速成长。他就像一位大哥哥一样,相信,在他的教导与帮助之下,我会更加的出色,会变得更优秀。

感谢大二的学长,每次去找他们时,他们都不惜自己的时间给我们讲解难点以及告诉我们他们当时的经验。感谢1409里面的各位同学,在1409里面,一年马上就要过去了,但是,我们在这儿留下的每一个印记,都将成为我们大学生活充实难舍的部分。

感谢我的所有老师,是他们让我在人生的道路上不断的学习与进步,。 感谢 “3+1”班所有同学。是他们陪我一起在本次实践中共同努力,共同学习,共同生活。我们从这里起航!

感谢江西理工大学给我这个学习的环境,这是让我梦想起航的地方。

参考文献

[1] 周立功等. 《项目驱动-单片机应用设计基础》. 北京:北京航空航天大学出版社,2004

[2] 周立功等. 《 新编计算机基础教程》. 北京:北京航空航天大学出版社,2004

[3] 周航慈. 《 单片机程序设计基础》. 北京:北京航空航天大学出版社,2003

附录图

小车全图 电机驱动板 电源板

LCD1602液晶显示 超声波模块

循迹模块 单片机及其外扩


    相关文章

    初三物理实验报告1752314

    (此文档为word 格式,下载后您可任意编辑修改!) 物理实验报告 年级 级班 姓名 实验日期 年 月 日 实验名称:用天平和量筒测定液体的密度 实验目的:用天平和量筒测液体的密度. 实验器材: 托盘天平.砝码.镊子.量筒.烧杯.滴管 盐水 ...

    例谈科学探究实验与实验报告

    例谈科学探究实验与实验报告 山东菏泽曹县第二中学 陈焘   摘要:科学探究实验是新课程着重介绍的知识点,同时又是当前基础教育课程改革的热点、亮点和难点。本文对科学探究的六大要素逐一加以解释,并以实例说明如何做好科学探究实验及如何做实验报告。 ...

    北邮电子工艺实习实验报告_智能循迹小车

    北京邮电大学实习报告 智能循迹小车 摘 要: 本设计是一种基于单片机控制的简易自动寻迹小车系统,包括小车系统构成软硬件设计方法.小车以AT90C52为控制核心, 用单片机控制小车速度.利用红外光电传感器对路面黑色轨迹进行检测,并将路面检测信 ...

    倒立摆建模与控制终结报告(最终版)

    目录 1 实验一:根轨迹方法控制实验................................................................................ 2 1.1 根轨迹校正 Simulink ...

    智能小车实验报告

    北京邮电大学实习报告 附1 实习总结 为期两周的电子工艺实习,我过得十分忙碌和充实.从茫然地走进实验室,到学习最基本的焊接,到组装小车,再到无数次地调试程序,最后获得全院比赛的二等奖,有很多的辛苦,但是有更多的收获. 焊接是电子工艺实习最基 ...

    初中物理运动学解答题

    一.解答题(共23小题) 1.(2014•云南)如图是根据某小汽车在一段平直的路面上行驶的时间和通过的路程绘制的示意图. (1)判断图中小汽车是做匀速直线运动还是变速直线运动: (2)求图中小汽车全程的平均速度: 7 (3)若小汽车以20k ...

    青岛版六年级科学实验报告范例

    实验题 一. 探究馒头发霉的实验 实验材料:新馒头.塑料袋. 实验过程:1.水对馒头发霉的影响:取两快大小和新旧程度相同的馒头,把一块馒头烤干:在另一块馒头上滴上几滴水,用塑料袋分别将两块馒头包好,放在温暖的地方.过一段时间观察现象. 2. ...

    五年级上册科学实践性作业设计

    此作业设计获得县级二等奖 五年级上册科学实践性作业设计1 双沟镇白庄小学 蔡克喜 第一单元 生物与环境 作业1 观察绿豆种子发芽 绿豆种子萌发的环境条件 1.提出问题:在哪种环境条件下种子才能萌发? 2.作出假设:种子的萌发需要适宜的温度. ...

    智能小车设计报告

    湖南涉外经济学院 课程设计报告 课程名称:专业综合课程设计 报告题目:智能小车设计 学生姓名: 所在学院:信息科学与工程学院 专业班级: 学生学号: 指导教师:廖亦凡 20 15 年 7 月1日 课程设计任务书 摘要 STC89C52单片机 ...

    科学学生实验报告单

    四年级科学实验报告单 五年级科学实验报告单 1.唾液能消化淀粉的验证实验: 实验仪器:碘酒,滴管,试管,淀粉液.馒头等. 实验过程:取两个试管,分别加入等量的淀粉液,在其中一个试管中 加入少量唾液,并摇晃,使其均匀混合.将两个试管放入温度为 ...