基于单片机的循迹小车实验报告

时间:2024.4.13

课程设计报告

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

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

题    目:基于P89V51RB2单片机寻迹小车

专业班级:

学    号:

学生姓名:

指导老师:

    

20##年06月07日

目 

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

1.1             引言................................................................................................................................................ 1

1.2             课题任务要求............................................................................................................................... 1

1.3             本论文研究的内容...................................................................................................................... 2

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

2.1             小车的机械特性........................................................................................................................... 3

2.2             智能小车寻迹基本原理.............................................................................................................. 3

2.3             智能小车测速基本原理.............................................................................................................. 3

2.2             智能小车遥控基本原理.............................................................................................................. 3

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

3.1             控制器的选择............................................................................................................................... 5

3.1.1          概述....................................................................................................................................... 5

3.1.2          P89V51RB2开发工具特性................................................................................................ 5

3.2             硬件电路设计............................................................................................................................... 6

3.2.1          系统电源电路...................................................................................................................... 6

3.2.2          电机驱动模块...................................................................................................................... 7

3.2.3          光电编码器.......................................................................................................................... 9

3.2.4          红外线检测电路................................................................................................................. 9

3.2.5          超声波蔽障/测距.............................................................................................................. 10

3.2.6          LCD显示设计.................................................................................................................. 10

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

4.1             编译环境..................................................................................................................................... 12

4.2             模块的驱动................................................................................................................................. 12

4.2.1          红外线传感器模块........................................................................................................... 12

4.2.2          电机模块的驱动............................................................................................................... 13

4.2.3          转速捕获............................................................................................................................ 16

4.2.4          LCD1602显示模块......................................................................................................... 17

4.2.5          按键模块............................................................................................................................ 21

4.2.6          超声波模块模块............................................................................................................... 23

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

5.1             系统设计中的注意事项........................................................................................................... 26

5.1.1          外部因素............................................................................................................................ 26

5.1.2          内部因素............................................................................................................................ 26

5.2             硬软件总体调试........................................................................................................................ 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.2示。

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

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

     利用超声波连续发出10us以上的高电平,就可以在接口有高电频输出,等待接受到返回的高电频信号时,通过定时器电波对被控对象进行时间检测。就可以计算相应的时间了。

图 2.2 系统结构图

 


    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.2 L298N输入输出逻辑真值表

其中“0”为低电平;“1” 为高电平;“X” 为任何状态。

驱动原理图

3.2.3        光电编码器/测速

2.      光电编码器原理

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

3.      光电编码器的实现

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

图 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_Mcp2==1){R2=0;}

      if(R1==1){if(R2==0){rm2++;}}

      if(rm2==1){rm2=0;Count2++;}

      if(Count2==10000){Count2=0;}

 

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

    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,Count2=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 <= 0xF) //X坐标应小于0xF

                                    {

                                             DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符

                                             ListLength++;

                                             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<10; 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液晶显示                 超声波模块                             

 

循迹模块                             单片机及其外扩                              

 

更多相关推荐:
寻迹小车实验报告

课程设计报告学院:电气工程与自动化学院题目:基于单片机的寻迹小车专业:自动化班级学号:113班07号姓名:指导老师:xxx教授20xx/x/x第一章:绪论11.1:前言41.2:课程的来源迹和现状41.2.1:…

智能循迹小车实验报告

摘要本设计主要有单片机模块传感器模块电机驱动模块以及电源模块组成小车具有自主寻迹的功能本次设计采用STC公司的89C52单片机作为控制芯片传感器模块采用红外光电对管和比较器实现能够轻松识别黑白两色路面同时具有抗...

循迹小车实践报告

江西理工大学创新实验报告题目循迹小车的制作学院电气工程与自动化学院专业自动化班级学生黄学号113盼时间20xx年8月2号自动循迹小车目录目录摘要1任务及要求11任务2系统设计方案21小车循迹原理22控制系统总体...

循迹、避障、寻光小车实验报告

简易智能小车摘要本系统基于自动控制原理以MSP430为控制核心用红外传感器光敏三极管霍尔传感器接近开关之间相互配合实现了小车的智能化小车完成了自动寻迹避障寻光入库计时铁片检测行程测量的功能本系统采用液晶LCD1...

创新性实验 循迹小车实验报告

时间:周三上午组号:5创新性实验报告创新性实验报告题目:寻迹小车学院:电子信息学院专业:班级:学号:学生姓名:指导教师:完成日期:20xx年5月目录1摘要............................…

红外自动循迹小车实验报告

摘要本实验完成采用红外反射式传感器的自寻迹小车的设计与实现采用与白色地面色差很大的黑色路线引导小车按照既定路线前进在意外偏离引导线的情况下自动回位并能显示小车停止的时间本设计采用单片机STC89C51作为小车检...

智能循迹小车报告

电子信息专业实验报告课程电子信息系统综合设计实验MCU部分实验题目智能机器小车设计实验总分学生姓名学号学生姓名学号学生姓名学号实验时间地点分组电子信息学院专业实验中心目录一摘要二题目要求三软硬件设计方案四各部分...

循迹小车实验报告

实践设计报告(嵌入式技术实践二)学院:电气工程与自动化学院题目:基于51单片机的循迹小车专业班级:自动化131班学号:19学生姓名:***指导老师:***20xx年6月30日第一章引言1.1设计目的通过设计进一…

循迹小车制作报告

综合电子设计与实践课程实验报告课题名称循迹小车的制作班级111072B实验者120xx0720xx姚城实验时间20xx228516摘要本设计主要有三个模块包括信号检测模块主控模块电机驱动模块信号检测模块采用红外...

智能循迹小车___设计报告

智能循迹小车设计专业:自动化班级:自动化132姓名:XXX指导老师:20XX年4月20XX年6月摘要:本课题是基于STC89C52单片机的智能小车的设计与实现,小车完成的主要功能是能够自主识别黑色引导线并根据黑…

智能循迹小车报告

西京学院自动化1002班概要本寻迹小车是以万能板为车架STC12C5A60S2单片机为控制核心将各传感器的信号传至单片机分析处理从而控制L293D电机驱动控制小车速度由单片机提供的PWM波控制利用红外传感器检测...

智能循迹小车课程设计报告

青岛理工大学琴岛学院课程设计报告课题名称智能循迹机器人小车学院机电工程系专业班级电气工程及其自动化学号20xx020xx29学生许辉指导老师张岐磊青岛理工大学琴岛学院教务处20xx年12月14日

循迹小车实验报告(24篇)