单片机小车实验报告(陈进源)

时间:2024.4.5

单片机控制系统 课程设计报告

题 目

专 业

班 级

姓 名

学 号 指导教师

乱飞的苍蝇 通信技术 1班 陈进源 0902201002 林佳楠

2012 年 6 月 6 日

单片机小车实验报告陈进源

一、设计目的

设计一台基于单片机的智能小车,使该小车能在该空房间内自由行驶而不会撞到墙壁(即遇到墙壁之前能转弯,从而避免撞墙)。

二、设计要求

①房间内随机摆放体积不定的障碍物,小车能躲避障碍物;

②小车运行速度不得低于50m/min;

③小车的电源由电池或其他方式提供,不得采用外接电源供电。

【提示】:可采用光敏传感器、超声波传感器;墙壁或地面不得粘贴或安装任何物体改变智

能小车的运行(包括但不限于胶布、导向轮、轨道等)。

三、方案选择

(一) 单片机

【8051】:51单片机是对目前所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。AT89C51完全兼容MCS-51系列单片机的所有功能,并且本身带有2K的内存储器,可以在编程器上实现闪烁式的电擦写达几万次以上,比以往惯用的8031CPU外加EPROM为核心的单片机系统在硬件上具有更加简单方便等优点,具体如下:

①AT89C51单片机是最早期也最典型的产品,低功耗、高性能、采用CHMOS工艺的8位单片机。

②它在硬件资源和功能、软件指令及编程上与Intel 80C3X单片机完全相同。在应用中可直接替换。

③在AT89C51内部有FLASH程序存储器,既可用常规的编程器编程,也可用在线使之处于编程状态对其编程。编程速度很快,擦除时也无需紫外线,非常方便。

④AT89C5X系列可认为是Intel 80C3X的内核与Atmel FLASH技术的结合体。它为许多嵌入式控制系统提供了灵活、低成本的解决方案。

【AVR】: AVR单片机硬件结构采取8位机与16位机的折中策略,即采用局部寄存器

存堆(32个寄存器文件)和单体高速输入/输出的方案(即输入捕获寄存器、输出比较匹配寄存器及相应控制逻辑)。提高了指令执行速度(1Mips/MHz),克服了瓶颈现象,增强了功能;同时又减少了对外设管理的开销,相对简化了硬件结构,降低了成本。故AVR单片机在软/硬件开销、速度、性能和成本诸多方面取得了优化平衡,是高性价比的单片机。

AVR单片机内嵌高质量的Flash程序存储器,擦写方便,支持ISP和IAP,便于产品的调试、开发、生产、更新。内嵌长寿命的EEProm可长期保存关键数据,避免断电丢失。片内大容量的RAM不仅能满足一般场合的使用,同时也更有效的支持使用高级语言开发系统程序,并可像MCS-51单片机那样扩展外部 RAM。

AVR单片机的I/O线全部带可设置的上拉电阻、可单独设定为输入/输出、可设定(初始)高阻输入、驱动能力强(可省去功率驱动器件)等特性,使的得I/O口资源灵活、功能强大、可充分利用。

综上所述,主控电路采用8051方案。

(二) 测障电路

【红外对管】:红外对管的稳定性较高,被广泛应用在测距、循迹等领域。经过调制的红外光波能准确辨识障碍物(黑色障碍物除外)。同时,LM567能准确检波,使发射频率和接收频率一致,防止误判。

【光敏电路】:红色LED的波长在物理学上是最有利于反射的颜色。而光敏电阻可以根据光的强度而改变自身的阻值。由于光敏电阻成本极其低廉,且本身机械强度较红外对管更高(智能车调试过程中易发生碰撞等事故),因此也被广泛采用。

综合成本和稳定性等因素,测障电路采用红外对管的方案。

四、电路设计

(一) 电源部分设计

电池盒可内装4节5号电池,每节电池电压1.5V,电池之间相互串联,电压总计6V,经过AMS1117线性稳压电路,保证输出在5V左右,可正常驱动小车的主控和测障电路,保证小车整体正常工作。

(二) 测障部分

测障部分包括红外对管和主电路。

由于红外对管本质为二极管,因此需加电阻以分压和限流。根据本次采购的对管实际

测试,采用1.2K的电阻可保证最大LED亮度和最小电流。

(三) 主控电路和驱动电路

51单片机具有丰富的外部IO口,目前的IO口分配安排如图所示:

五、制作过程:

(一) 使用Protel99SE绘制原理图

单片机小车实验报告陈进源

单片机小车实验报告陈进源

①建立工程,在工程中新建原理图;

②选取所需原件,并按照草图连线,缺失原件原理图的自己手工绘制;

③建立PCB图,检测原理图封装正误,缺失PCB元件自制,检测通过后转为PCB图; ④进行PCB图排版,线尽量不要交叉,设置好线宽及焊盘尺寸,选好层次,进行手动布线。

(二) 使用Multisim仿真:

①从放置菜单选择元器件或者从工具栏上选择元器件添加到Multisim工作区;

②放置好元器件之后,连线,鼠标指针停留在元件管脚上单击就可以将导线引出来了,到要连接到的管脚再次单击就可以将导线画好;

③画好导线之后,添加虚拟万用表或者示波器等仪器仪表连接到适当的位置; ④点击运行开始仿真,双击仪器仪表,打开仪表界面,进行设置和观察仿真结果。

(三) 调试过程:

问题1:无论如何只有一边轮子转动

解决方法:检查驱动电路的输入端,发现需要安装上拉电阻。

问题2:轮子转速不稳定

解决方法:添加电容对电源进行滤波

六、成果展示

单片机小车实验报告陈进源

七、测试结果

小车可正常前进,并且遇到障碍物时能转弯继续前进,沿车指导老师做的跑道,并从出口出去,实现了课程题目要求的功能。经测试,小车最大可在135°的急转弯中通过。

八、设计制作心得总结

课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。

从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过此次课程设计,使我更加扎实的掌握了有关单片机方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。

这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师与同学的辛勤指导下,终于迎刃而解。同时,在老师的身上我学得到很多实用的知识,在次我表示感谢!同时,对给过我帮助的所有同学和指导老师再次表示忠心的感谢!

九、参考文献

[1] 杨欣、王玉凤、刘湘黔《电子设计从零开始》,清华大学出版社,2005

[2] 洪志刚《单片机应用系统设计》,机械出版社出版,2011

[3] 百度百科/

华侨大学厦门工学院单片机课程设计成本报告表

单片机小车实验报告陈进源

单片机小车实验报告陈进源

承诺书

本人保证提交的信息资料及相关成本情况真实、准确。如果所提交的信息及情况不真实、不准确,在课程设计考核中,本人愿意随时接受相应处理并承担全部后果。

本人签名:_____________

年 月 日


第二篇:基于单片机的循迹小车实验报告


课程设计报告

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

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

题    目:基于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液晶显示                 超声波模块                             

 

循迹模块                             单片机及其外扩                              

 

更多相关推荐:
单片机实验报告

单片机实验报告学生姓名学号专业指导教师学院信息与电气工程学院20xx年11月单片机实验报告实验一MCS51指令系统实验数据排序1实验目的熟悉MCS51指令系统掌握程序设计方法加深对内部存储器读写的认识熟悉仿真开...

单片机实验报告

通信与信息工程学院20xx20xx学年第二学期实验报告课程名称单片机原理及应用专业班级学号学生姓名指导教师日期20xx年4月15日1实验一单片机汇编语言程序设计一实验目的1学习MedWin或Keilc51仿真软...

单片机实验报告

题目单片机组成原理实验报告学院计算机科学与工程学院专业信息安全姓名学号20xx年12月8日实验一输入输出接口编程一实验目的1掌握Keil软件的基本使用12掌握单片机汇编语言基本编程二实验内容1学习用Keil软件...

51单片机课程设计实验报告

51单片机课程设计报告学院:专业班级:姓名:指导教师:设计时间:51单片机课程设计一、设计任务与要求1.任务:制作并调试51单片机学习板2.要求:(1)了解并能识别学习板上的各种元器件,会读元器件标示;(2)会…

单片机实验报告

海南大学届单片机实验报告4份论文题目学生姓名学号所在院系专业班级授课教师完成时间蜂鸣器实验实验目的1熟悉实验板中蜂鸣器工作原理掌握汇编编程控制蜂鸣器播放音乐2掌握单片机编程控制蜂鸣器发出不同频率声音的方法3了解...

单片机实验报告

单片机课程设计报告实验五系别物理与电子工程学院年级专业班级学号学生姓名指导教师设计时间常熟理工学院课程设计报告目录1题目22实验要求221实验目的222实验内容23总体设计231硬件设计232软件设计44运行结...

51单片机实验报告

08424020xx单片微型计算机原理学院班级学号姓名指导教师成绩120xx年6月08424020xx硬件实验实验一定时器中断实验实验内容fosc110592MHzT0方式2产生定时中断实现秒表功能数码管后两位...

单片机实验报告

单片机实验报告实验二并行口输入输出实验循环彩灯控制任务一1实现的功能P1口接8个开关P0口接8个灯每个开关对应一个灯实时读取开关状态开关闭合时灯亮开关断开时灯灭2硬件原理图3流程图4程序ORG0000H程序入口...

单片机实验报告

一实验目的1熟练单片机的结构组成及原理2软硬兼施采用硬件电路的焊接搭建和软件的设计调试下载亲自动手对硬件系统加深了解的同时软件编程也能得心应手3了解如何从硬件和软件上分析问题排除故障二实验内容MCS51MCS5...

单片机最小系统实验报告

单片机原理及应用技术设计课题系别专业学号姓名指导老师课程设计报告20xx年6月单片机最小系统流水灯的设计一单片机简介由于单片机技术在各个领域正得到越来越广泛的应用世界上许多记成电路生产家相继推出各种类型的单片机...

单片机实验报告

单片机原理及应用一实验目的实验报告实验要求二实验电路及汇编源程序程序要加注释三仿真结果或硬件调试结果分析实验一存储器读写一实验目的1掌握寄存器存储器读写等汇编指令2掌握编程软件编辑编译调试等基本操作二实验内容1...

单片机实验报告

单片机实验报告四姓名学号时间周一11-13地点计708指导老师:实验题目C51单片机片上资源开发实验一.实验目的与要求?学习单片机片上资源开发技术?研究用片上资源实现自动控制的方案二:实验环境在KeiluVis…

单片机实验报告(42篇)