当前位置:首页 >> 计算机软件及应用 >>

智能小车(单片机格式)循迹 遥控 避障


西安科技大学

自动寻迹及避障小车

学院: 专业: 学生:

电气与控制工程学院 测控技术与仪器 潘富强 袁鑫 朱明

指导老师:侯媛彬 陈毅静 王建

1

西安科技大学

摘 要
单片机应用技术飞速发展,从导弹的导航装置,到

飞机上各种仪表的控制, 从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以 及生活中广泛使用的各种智能 IC 卡、电子宠物等,这些都离不开单片机。单片 机是集 CPU,RAM,ROM ,定时,计数和多种接口于一体的微控制器。它体积小, 成本低,功能强,广泛应用于智能产业和工业自动化上。 本文是基于单片机的智能小车设计,通过红外遥控、躲避障碍物功能,寻迹 功能和测速功能来诠释智能小车的冰山一角,向大家展示智能小车的强大功能。 关键词:单片机,智能小车,红外遥控,躲避障碍物,寻迹,测速。

Abstract
SCM application technology is developing rapidly from the missile's navigation devices, to the aircraft instrument control, computer network communications and data transmission, industrial automation process real-time control and data processing, as well as the widely used in a variety of intelligent life IC card, electronic pets, which are inseparable from the microcontroller. SCM is a set of the CPU, RAM, ROM, timing, counting and a variety of interfaces in one of the microcontroller. Its small size, low cost, functional, widely used in smart industries and industrial automation. Microcontroller-based intelligent car design, infrared remote control, to avoid obstacles feature, look for the trace function and speed function to interpret the tip of the iceberg of the smart car, to show a strong function of the smart car. Keywords: microcontroller, smart car, infrared remote control to avoid obstacles, tracing velocimetry.

2

西安科技大学

目录
第 1 章 绪论 ··········································· ··········· ·········· ··········· ·········· 4 ·········· ··········· ··········· ·········· 1.1 智能小车成果 ····································· ··········· ·········· ··········· ····· ·········· ··········· ··········· ···· 4 1.2 智能小车发展 ····································· ··········· ·········· ··········· ····· ·········· ··········· ··········· ···· 4 1.3 本次智能小车设计 ··································4 ··········· ·········· ··········· ·· ·········· ··········· ··········· ·· 第 2 章 智能小车设计及器件介绍 ·······························6 ··········· ·········· ·········· ·········· ··········· ·········· 2.1 设计思路 ·······································6 ··········· ·········· ··········· ······· ·········· ··········· ··········· ······· 2.2 器件介绍 ·······································7 ··········· ·········· ··········· ······· ·········· ··········· ··········· ······· 2.2.1 主芯片 STC89C52 .................................................................................................... 7 2.2.2 马达控制驱动芯片 L9110 ...................................................................................... 8 2.2.3 MAX232 ..................................................................................................................... 9 2.2.4 OPTC 光断续器 ........................................................................................................ 9 2.2.5 液晶显示 LM016L .................................................................................................... 9 第 3 章 单元模块设计 ·····································11 ··········· ·········· ··········· ····· ·········· ··········· ··········· ···· 3.1 红外遥控及避障模块设计 ······························11 ··········· ·········· ········· ·········· ··········· ········ 3.1.1 功能 ....................................................................................................................... 11 3.1.2 电路结构 ............................................................................................................... 11 3.1.3 程序流程图 ........................................................................................................... 11 3.1.4 实现效果 ............................................................................................................... 13 3.2 寻迹模块设计 ···································· 13 ··········· ·········· ··········· ···· ·········· ··········· ··········· ···· 3.2.1 功能 ....................................................................................................................... 13 3.2.2 电路结构 ............................................................................................................... 13 3.2.3 程序流程图 ........................................................................................................... 14 3.2.4 实现效果 ............................................................................................................... 14 3.3 测速模块设计 ···································· 15 ··········· ·········· ··········· ···· ·········· ··········· ··········· ···· 3.3.1 功能 ....................................................................................................................... 15 3.3.2 电路设计 ............................................................................................................... 15 3.3.3 程序流程图 ........................................................................................................... 16 3.3.4 实现功能 ............................................................................................................... 16 小车附加功能 ········································· 17 ··········· ·········· ··········· ········· ·········· ··········· ··········· ········· 设计总结 ············································ ··········· ·········· ··········· ··········· · ···········································18 参考文献 ············································ ··········· ·········· ··········· ··········· · ···········································19 附录一 红外遥控及避障编程 ································· ··········· ·········· ··········· · ································ 20 附录二 寻迹编程 ······································· 28 ··········· ·········· ··········· ······· ·········· ··········· ··········· ······· 附录三 测速编程 ······································· 31 ··········· ·········· ··········· ······· ·········· ··········· ··········· ······· 附录四 元件清单 ······································· 39 ··········· ·········· ··········· ······· ·········· ··········· ··········· ······· 附录五 实物图 ········································· ········································ 40 ·········· ··········· ··········· ········

3

西安科技大学

第 1 章 绪论
1.1 智能小车成果
系统运用多重传感器与控制器良好的结合,系统可分为传感器检测部分, 智能控制部分和电源模块。传感器部分为红外循迹模块。智能控制部分包括四 个主要单元模块:单片机控制模块、电机驱动模块、显示模块、信号传输模块。 该系统的独特之处在于没有人的操作与干预下可以智能的完成多项任务,比如 小车的直线行驶,寻迹,避障,测速等各项任务。

1.2 智能小车发展
智能小车的发展主要是在自动化控制领域,一些高校为了培养学生动手及 编程能力,同时提高学生的兴趣,为智能小车控制领域提供了环境。同时一些 比较大型的比赛,如全国电子设计大赛开始采用这类的题目,虽然都是用小车, 但是控制方式都是不一样。 智能小车的研究、开发和应用涉及传感技术、电气技术、电气控制技术、 智能控制等学科,智能控制技术是一门跨科学的综合性技术,当代研究十分活 跃,应用日益广泛的领域。智能作为现代社会的新产物,是以后的发展方向, 它可以按照预先设定的模块在一个特定的环境里自动的运行,可运用于科学勘 探等用途,无需人为的管理,便可以完成预期所要达到的或更高的目标。智能 机器人正在代替人们完成这些任务,凡不宜有人直接承担的任务,均可由智能 机器人代替,可以适应不同环境,不受温度、湿度等条件的影响,完成危险地 段,人类无法介入等特殊情况下的任务,智能小车就是其中的一个体现。智能 车辆又称为轮式移动机器人,是移动机器人的一种,是一个集环境感知、规划 决策、自动驾驶等多种功能于一体的综合体统。如果将以上技术引用到现实生 活中,可以使我们的未来生活变得更加智能。除了潜在的军用价值外,还可以 应用于科学研究、地质勘探、危险搜索、智能救援等,其在交通运输中的应用 前景也受到西方国家的普遍关注。

1.3 本次智能小车设计
智能寻迹机器人采用现在较为流行的 8 位单片机作为系统大脑。以 8051 系列家族中的 STC89C51/STC89C52 为主芯片。 脚的 DIP 封装使它拥有 32 个 40

4

西安科技大学 完全 I/O(GPIO—通用输入输出)端口,通过对这些端口加以信号输入电路,控 制电路,执行电路共同完成寻迹机器人。P0.0,P0.1,P0.2,P0.3 分别通过 LG9110 电机驱动来驱动电机 1 和电机 2。由电机的正转与反转来完成机器人的 前进,后退,左转,右转,遇障碍物绕行等基本动作。在机器人前进时如果前 方有障碍物,由红外发射管发射的红外信号被反射给红外接收管,红外接收管 将此信号经过 P3.7 传送入 STC89C52 中, 主芯片通过内部的代码进行机器人的 绕障碍物操作,同时主芯片将 P3.7 的信号状态通过 P2.5 的 LED 指示灯显示 出来。机器人行走时会通过 P3.5 与 P3.6 的红外接收探头来进行检测路面情 况,实现小车自动寻迹功能。P0.4 为机器人的声控检测端口,在运行为前进状 态时,可以能过声控(如拍手声)来控制它的运行与停止。P0.6 为机器人的声音 输出端。在机器人遇到障碍物时可以通过此端口控制蜂鸣器发出报警声。当为 白天或黑夜时可以通过 P0.5 端口中的光敏电阻来进行判断, 以方便完成机器人 夜间自动照明等功能。两个按键以查询/中断两种不同的方式来展现按键操作。 你可以按下 S1 键来进行机器的停止。再按下 S2 键来进行机器人的运行。这个 按键的信息分别被 P3.2,P3.4 接收到。IR1 为红外遥控接收器,这就为机器人 进行远程遥控创造了可能。这个红外遥控接收头接收到红外信号时将信号经过 P3.3 送入到主芯片,主芯片对其进行解密后以不同的方式对机器人进行控制。 同时将使用者的按键信息通过 P2 端口上 LED 数码管显示出来。

5

西安科技大学

第 2 章 智能小车设计及器件介绍

2.1 设计思路
本次设计主要实现小车的自动寻迹,红外遥控、躲避障碍物及测速功能,由 红外发射管发射红外信号被红外接收管反射接收, 红外接管将此信号经过数据线 传送入STC89C52 中,主芯片通过内部的代码进行机器人的功能操作,同时主芯 片将接收的信号状态通过数据线由LED指示灯或数码管显示出来。 在测速模块中, 由另一块STC89C52为控制核心, 采用光电断续器检测车轮运转情况,通过计算处 理后,由LM16L液晶屏显示速度。

晶振电路

驱动电机 M1M2

复位电路


LG9110 驱动芯片

红外发射管

片 机
数码管显示

红外接收管 LED 指示灯显示

图1 红外遥控、避障模块,寻迹模块硬件设计图

6

西安科技大学

光电断续器


晶振电路

LM16L 液 晶 显 示屏

片 机

复位电路

图2 测速模块硬件设计图

2.2 器件介绍
2.2.1 主芯片 STC89C52 STC89C52是美国ATMEL公司生产的 低功耗,高性能COMS8位单片机,片内 含4Kbytes的可反复擦写的Flash只读 程序存储器和256bytes的随机存取数 据存储器(RAM),器件采用ATMEL公司 的高密度,非易失性存储技术生产,兼 容标准MCS-51指令系统,片内置通用8 位中央处理器和Flash存储单元,功能 强大的STC89C52单片机为我们提供许 多较复杂系统控制应用场合。 STC89C52有40个引脚, 32个外部双 向输入/输出(I/O)端口,同时内含2 个外中断口,3个16位可编程定时计数 器,2个全双工串行通信口,2个读写口 线。

7

西安科技大学 2.2.2 马达控制驱动芯片 L9110 L9110 是为控制和驱动电机设计的两通道推挽式功率放大专用集成电路器 件,将分立电路集成在单片IC 之中,使外围器件成本降低,整机可靠性提高。 该芯片有两个TTL/CMOS兼容电平的输入,具有良好的抗干扰性;两个输出端能直 接驱动电机的正反向运动, 它具有较大的电流驱动能力,每通道能通过800mA 的 持续电流,峰值电流能力可达1.5A;同时它具有较低的输出饱和压降;内置的钳 位二极管能释放感性负载的反向冲击电流,使它在驱动继电器、直流电机、步进 电机或开关功率管的使用上安全可靠。L9110 被广泛应用于玩具汽车电机驱动、 脉冲电磁阀门驱动,步进电机驱动和开关功率管等电路上。

8

西安科技大学 2.2.3 MAX232 max232是一种把 电脑的串行口rs232信号电平(-10 ,+10v)转换为单片机 所用到的TTL信号点平(0 ,+5)的芯片。RS232引脚定义: 1 载波测 DCD 2 接收据 RXD 3 发送据 TXD 4 数据终端准备端 5 信号地 SG 6 数据准备端 DSR 7 请求发送 RTS 8 清除发送 CTS 9 振铃提示 RI

DTR

2.2.4 OPTC 光断续器 光断续器都是用来 检测物体的靠近、 通过等 状态。 其发射、 接收器做 在体积很小的同一塑料 壳体中, 所以两者能可靠 对准。 可分为遮断式和反 射式两种,遮断式的槽 宽, 深度及光敏元件各不 同,反射式的检测距离较短,多用于安装空间较小的场合。由于检测范围小, 光电断续器的发光二极管可用直流电驱动, 红外 LED 的正向压降约 1.2 到 1.5V, 驱动电流控制在几十毫安。光电断续器是较便宜,简单,可靠的光电器件,广 泛用于自动控制系统,机电一体化设备,办公设备和家用电器中。本设计采用 遮断式光电断续器,将其输出端口与单片机的 P3.2 口相连接,用于向单片机提 供一定频率的脉冲。 2.2.5 液晶显示 LM016L LM016L 液晶模块采用 HD44780 控制器,hd44780 具有简单而功能较强的指 令集,可以实现字符移动,闪烁等功能,LM016L 与单片机 MCU 通讯可采用 8 位 或 4 位并行传输两种方式, hd44780 控制器由两个 8 位寄存器, 指令寄存器 (IR)
9

西安科技大学 和数据寄存器 (DR) 忙标志 (BF) 显示数 RAM DDRAM) 字符发生器 ROMA CGOROM) , ( , ( 字符发生器 RAM(CGRAM) ,地址计数器 RAM(AC)。 IR 用于寄存指令码,只能写入不能读出,DR 用于寄存数据,数据由内部操 作自动写入 DDRAM 和 CGRAM,或者暂存从 DDRAM 和 CGRAM 读出的数据, 为 1 时, BF 液晶模块处于内部模式,不响应外部操作指令和接受数据,DDRAM 用来存储显 示的字符,能存储 80 个字符码,CGROM 由 8 位字符码生成 5*7 点阵字符 160 中 和 5*10 点阵字符 32 种。 可以自定义 8 个 5*7 点阵字符或者 4 个 5*10 点阵字符, AC 可以存储 DDRAM 和 CGRAM 的地址, 如果地址码随指令写入 IR,则 IR 自动把地 址码装入 AC,同时选择 DDRAM 或 CGRAM 但愿,LM016L 如下表所示 液晶模块的引脚功能

图3

LM016L 功能引脚图

在本设计中,我们将 LCD 的 D0—D7 口分别与单片机的 p1.0—p1.7 口相连 接, p1 口是一个准双向口, 因 可用作通用 I/O 口。 内部有上拉电阻与电源相连。 实际上,电阻是两个场效应管(FET)并在一起:一个 FET 为负载管,其电 阻固定。另一个 FET 可工作在导通或者截止状态,使其总阻值变化近似为 0 或 阻值很大的两种情况。当阻值近似为 0 时,可将引脚快速拉致高电平;当阻值 很大时,P1 口为高阻输入状态。当 p1 口输出高电平时,能向外提供电流负载, 所以不必再接上拉电阻。

10

西安科技大学

第 3 章 单元模块设计

3.1 红外遥控及躲避障碍物模块设计
3.1.1 功能 小车在完成自动躲避障碍物动作外,还可以通过红外遥控器进行远程遥控。 在正常的运行过程中, 还可以通过声控(拍手声)来对小车进行控制,每一种控制 小车都会完成相应的功能。为了更清晰的看到小车运行过程状态,特将P1 端口 中的8 个指示灯作为运行状态指示灯。以用来观察小车运行中的每一步。 3.1.2 电路结构

3.1.3 程序流程图

11

西安科技大学
开始

系统初始化

前进状态

前方是 否有障 碍

是否 声控

是否 红外 遥控

判断 S1 是 否按 下

车后退,蜂鸣器报警

停止

左转 180 度

是 否 声控

遥 控 按 1 小 车 前 进 , 数 码 管 显 示 1

遥 控 按 2 小 车 后 退 , 数 码 管 显 示 2

遥 控 按 3 小 车 左 转 , 数 码 管 显 示 3

遥 控 按 4 小 车 后 退 , 数 码 管 显 示 4

按 下 电 源 电 , 小 车 停 止 , 数 码 管 显 示 5

小 车 停 止 数 码 管 显 示 3

判断 S2 是 否按 下

小车前进, 数码管显示 1

12

西安科技大学 3.1.4 实现效果 将小车置于一个桌面上。打开电源的开关,小车开始前进运行,同时运行指 示灯闪亮,这时如果前方有障碍物,小车将会先进行后退一段时间,并有蜂鸣器 报警,再向左转一段时间,最后开始向前运行、左转、后退、右转、可以通过前 方指示灯来观察。这时可以能过声控(如拍手声)来让小车停止和开启.同时也可 以用遥控来控制小车的运行。按“1”,小车将向前运行,按“2”小车将后退, 按“3”小车将左转,按“4”小车将右转.按其它(0-9)键,小车数管码显示相应 的数字符号。按电源键,小车将会停止运行当然S1、S2 也是起作用,分别用于 控制小车的停止和开启。

3.2 寻迹模块设计
3.2.1 功能 通过前方下端的四个红外探头来检测地面的信号,根据设计的要求,当道路 为白色时,红外接收到信号,与地面检测的红外相应端口低电平,当道路为黑色 时,与地面检测的红外相应端口为高电平,我们就可以根据这和判断条件来进行 道路黑白线的寻找。 3.2.2 电路结构

13

西安科技大学 3.2.3 程序流程图

开始

系统初始化

小车前进,数码管显示“1”

左、右转选择

左边是 否越界

右边是 否越界

小车右转, 数码管显示 “4” ,前端左边灯亮, 蜂鸣器报警

小车左转, 数码管显示 “3” ,前端左边灯亮, 蜂鸣器报警

3.2.4 实现效果 进行走黑线功能。

14

西安科技大学

3.3 测速模块设计
3.3.1 功能 通过光断续器对外部物理量(通光与遮光)进行测量,再将物理信号转换 为电压信号(脉冲电压) ,输入单片机,单片机对所输入的电压信号,在汇编程 序的控制之下,进行处理、计算、储存,最后通过 LCD 输出显示速度、里程的 信息。 3.3.2 电路设计

15

西安科技大学 3.3.3 程序流程图

开始

初始化

OPTC 光电断续器

数据转换

数据算法处理

LCD 显示

3.3.4 实现功能 对小车速度进行检测。

16

西安科技大学

小车附加功能

1 按键查询中断: 通过两个按键对数码管进行操作,分别演示了查询与中断 的操作方式,中断中应用了对按键进行查询的方法来判断按键的键值,查询按键 方法中则采用了键盘延迟的方法来消除按键重复输入。 通过这两种方法的学习, 让其理解中断的应用技巧,及对查询方法的理解。 2 程序状态指示灯: 通过闪灯不断的闪动,及闪灯闪动的快慢来表示程序不 同工作状态.它也是常数字设备中进行状态表示的方法之一。 3 光敏电阻:述了光敏电阻的使用方法。当处于光暗时,光敏电阻导通,将 信号传入到单片机,单片机将控制蜂鸣器按一定的频率响亮,并且前方的指示灯 也开始闪亮。通过对光敏电阻信号的接收,从而实现了夜间自动照明的功能。 4 红外反射:通过前端,底端的红外发射头和接收头来判断小车的运行轨迹, 当前与底端发生信号输入时,信号将被单片机接收,单片机来控制机器按照写好 的程序开始运行。同时为达到好的效果,加入声音识别与蜂鸣器输入输出设备, 使得此机人的运动变得更加有趣。 5 话筒识别:通过话筒对声音信号进行识别,由于本电路有效的去除杂波, 所以仅能对响度较大的声音进行识别(例:拍手声)。 像正常的说话声对本电路虑 除,不会产生信息的输入.话筒识别的加入,为我们建立了声控平台。 6 流水灯演示:程序全面的表现了子程序的用法,它从对几个子程序的操作, 显示不同的流灯技术,流水灯的不同需要不同的表现的形式,而这里主要介绍了 移位操作和内部数据存储及读入操作。 延时函数采用可重入标志,可进行函数的 递归调用。 7 数码管演示:通过对端口的置数操作,展示了数码管的应用技术,数码管 是将发光二 极管通过一定的形式封装在一个数字的外壳中,可以通过不同的点 亮方式来显不同的数字符号。 8 数码管与跑马灯:将数码管及跑马灯放在一起显示,它主要说明了,如何 将在单系 中运行多个看似并行运行的子系统.本程序在此将跑马灯子程序放入 到一个头文件中,对于一个大的工程这样将有益于程序文件的管理。

17

西安科技大学

设计总结

通过这次智能小车制作, 把理论知识与实际动手相结合,更加深刻学习了单 片机知识。在制作之前,参考了一些相关的资料。在制作过程中参考了所学单片 机的知识及单片机应用设计举例,有了设计系统的基本框架,加之在网上找到的 一些相关资料最终制作出了智能小车。在实际动手过程中遇到了许多问题,例如 各芯片的引脚连接及实现功能, 电路各模块的意义,和在焊接过程中出现的错误 查找等等。有问题就要解决,通过查找资料,我们对电路的设计,芯片的学习都 有了更深入的学习了解。在原先设计中通过4节五号电池供电,但由于电池消耗 过快,我们想过多种供电方法,例如使用直流电源,使用USB接口为系统供电, 但由于技术能力不足, 只有继续使用电池供电。在实现小车寻迹功能时多次出现 差错,通过调整红外发射头和红外接收头的位置,和软件中的调整延时,使小车 寻 迹 功 能 更 加 精 准 稳 定 。 在 设 计 过 程 中 学 会 熟 练 运 用 多 种 软 件 , 如 Keil uVision2, STC_ISP_V479等, 并且发现许多有趣并有用的小软件如电阻色环的识 别,数码管段码查询软件等。 本次设计还有许多的不足之处, 比如说小车的设计电路中多出了一些多余的 模块,使电力耗费更多。另外就是对速度控制方面不是很全面,在对小车测度模 块中,由于小车匀速行驶,所以只能测量得到的值不变,且由于知识能力善不足 我们现在无法对小车进行速度控制,这激励着我们再今后的学习中更加认真,争 取早日解决问题。 总之,通过这次智能小车的设计,我们都受益匪浅,不仅培养了我们的设计 思维,增加了动手实践能力,更重要的是我们学会了团结合作,在制作过程中一 起发现问题, 一起解决问题, 在制作中献言献策, 积极发挥着个人的聪明与才智。 共同体会制作过程的努力和成功后的喜悦。 在这里, 我们也要对陈毅静老师, 侯媛彬老师, 王建老师说一声真诚的感谢。 谢谢老师对我们的小车制作提出宝贵的建议。此外,感谢同学们对我们的帮助。 另外,还要感谢学校能安排这次单片机竞赛,为我们提供了良好的平台。

18

西安科技大学

参考文献

【1】 【2】 【3】 【4】 【5】 【6】 【7】 【8】

柴钰 单片机原理及应用 西安:西安电子科技大学出版社 2009.2 张振荣,晋明武 MSC-51系列单片机原理及实用技术 人民邮电出版社 2000.6 赵燕 传感器原理及应用 北京:北京大学出版社 2010.2 谭浩强 C程序设计(第二版)[M] 北京,清华大学出版社 1999. 周润景,张丽娜 基于PROTEUS的电路及单片机系统设计与仿真[M] 北 京,北京航空航天大学出版社 2006. 徐爱钧,彭秀华 Keil Cx51 V7.0 单片机高级语言编程与uVision2应 用实践[M] 北京,电子工业出版社 2004.6 马达控制驱动芯片L9110 http://wenku.baidu.com/view/1bb5502fb4daa58da0114a93.html max232中文资料及应用 http://wenku.baidu.com/view/7c64d38583d049649b665870.html

19

西安科技大学

附录一 红外遥控及躲避障碍物编程
#include <reg52.h> #define uint #define uchar unsigned int unsigned char //包含 51 单片机相关的头文件 //重定义无符号整数类型 //重定义无符号字符类型

uchar code LedShowData[]={0x03,0x9F,0x25,0x0D,0x99, //定义数码管显示数据 0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9 uchar code RecvData[]={0x07,0x0A,0x1B,0x1F,0x0C,0x0D,0x0E,0x00,0x0F,0x19}; uchar IRCOM[7]; static unsigned int LedFlash; unsigned char RunFlag=0; bit EnableLight=0; /***********完成基本数据变量定义**************/ sbit S1State=P1^0; sbit S2State=P1^1; sbit B1State=P1^2; sbit IRState=P1^3; sbit RunStopState=P1^4; sbit FontIRState=P1^5; sbit LeftIRState=P1^6; sbit RightIRState=P1^7; /*************完成状态指示灯定义*************/ sbit S1=P3^2; sbit S2=P3^4; /*************完成按键端口的定义*************/ sbit LeftLed=P2^0; sbit RightLed=P0^7; /*************完成前方指示灯端口定义*********/ sbit LeftIR=P3^5; sbit RightIR=P3^6; sbit FontIR=P3^7; /*************完成红外探头端口定义***********/ sbit M1A=P0^0; sbit M1B=P0^1; sbit M2A=P0^2; sbit M2B=P0^3;
20

//接收数据缓冲区 //定义闪动频率计数变量 //定义运行标志位 //定义指示灯使能位 //定义 S1 状态标志位 //定义 S2 状态标志位 //定义 B1 状态标志位 //定义 IR 状态标志位 //定义运行停止标志位 //定义 FontIR 状态标志位 //定义 LeftIR 状态标志位 //定义 RightIRState 状态标志位 //定义 S1 按键端口 //定义 S2 按键端口 //定义前方左侧指示灯端口 //定义前方右侧指示灯端口 //定义前方左侧红外探头 //定义前主右侧红外探头 //定义正前方红外探头 //定义电机 1 正向端口 //定义电机 1 反向端口 //定义电机 2 正向端口 //定义电机 2 反向端口

西安科技大学
/*************完成电机端口定义***************/ sbit B1=P0^4; sbit RL1=P0^5; sbit SB1=P0^6; /*********完成话筒,光敏电阻,蜂鸣器.端口定义**/ sbit IRIN=P3^3; /*********完成红外接收端口的定义*************/ #define ShowPort P2 extern void ControlCar(uchar CarType); void delay(unsigned char x) { unsigned char i; while(x--) { for (i = 0; i<13; i++) {} } } void Delay() { uint DelayTime=33000; while(DelayTime--); return; }

//定义话筒传感器端口 //定义光敏电阻端口 //定义蜂鸣端口 //定义红外接收端口 //定义数码管显示端口 //声明小车控制子程序 //0.14mS 延时程序 //定义临时变量 //延时时间循环 //14mS 延时

//定义延时子程序 //定义延时时间变量 //开始进行延时循环 //子程序返回

void ControlCar(uchar CarType) { M1A=0; M1B=0; M2A=0; M2B=0; LeftLed=1; RightLed=1; Delay(); switch(CarType) { case 1: //前进 { M1A=1; M2A=1; ShowPort=LedShowData[1]; break; } case 2: //后退

//定义小车控制子程序 //将电机 1 正向电平置低 //将电机 1 反向电平置低 //将电机 2 正向电平置低 //将电机 2 反向电平置低 //关闭前方左侧指示灯 //关闭前方右侧指示灯 //将此状态延时一段时间 //判断小车控制指令类型 //判断是否是前进 //将电机 1 正向端口置高 //将电机 2 正向端口置高 //数码管显示前进状态 //退出判断 //判断是否是后退

21

西安科技大学
{ M1B=1; M2B=1; ShowPort=LedShowData[2]; RightLed=0; LeftLed=0; break; } case 3: //左转 { M1B=1; M2A=1; ShowPort=LedShowData[3]; LeftLed=0; break; } case 4: //右转 { M1A=1; M2B=1; ShowPort=LedShowData[4]; RightLed=0; break; } default: { break; } } } //将电机 1 反向端口置高 //将电机 2 反向端口置高 //数码管显示后退状态 //将前方右侧指示灯置低(亮) //将前方左侧指示灯置低(亮) //退出判断 //判断是否是左转 //将电机 1 反向端口置高 //将电机 2 正向端口置高 //数码管显示左转状态 //将前方左侧指示灯置低(亮) //退出判断 //判断是否是右转 //将电机 1 正向端口置高 //将电机 2 反向端口置高 //数码管显示右转状态 //将前方右侧指示灯置低(亮) //退出判断 //默认情况下的判断 //直接退出判断

void IR_IN() interrupt 2 using 0 { unsigned char j,k,N=0; EX1 = 0; 号到达 delay(15); if (IRIN==1) { EX1 =1; return; }

//定义 INT2 外部中断函数 //定义临时接收变量 //关闭外部中断,防止再有信 //延时时间,进行红外消抖 //判断红外信号是否消失 //外部中断开 //返回

22

西安科技大学
while (!IRIN) 的前导低电平信号。 { delay(1); } for (j=0;j<4;j++) { for (k=0;k<8;k++) { while (IRIN) 4.5ms 的前导高电平信号。 { delay(1); } while (!IRIN) { delay(1); } while (IRIN) { delay(1); N++; if (N>=30) { EX1=1; return; } } IRCOM[j]=IRCOM[j] >> 1; 补零 if (N>=8) { IRCOM[j] = IRCOM[j] | 0x80; } N=0; } } if (IRCOM[2]!=~IRCOM[3]) //判断地址码是否相同 //判断数据长度 //数据最高位补 1 //清零位数计录器 //等 IR 变为高电平,跳过 9ms

//延时等待

//采集红外遥控器数据 //分次采集 8 位数据 //等 IR 变为低电平,跳过

//延时等待

//等 IR 变为高电平 //延时等待

//计算 IR 高电平时长 //延时等待 //计数器加加 //判断计数器累加值 //打开外部中断功能 //返回

//进行数据位移操作并自动

23

西安科技大学
{ EX1=1; return; } for(j=0;j<10;j++) { if(IRCOM[2]==RecvData[j]) { P2=LedShowData[j]; } } switch(IRCOM[2]) { case 0x1A: { ControlCar(1); break; } case 0x05: { ControlCar(2); break; } case 0x01: { ControlCar(3); break; } case 0x03: { ControlCar(4); break; } case 0x12: { ControlCar(5); break; } } EX1 = 1; //外部中断开 //循环进行键码解析 //进行键位对应 //数码管显示相应数码 //打开外部中断 //返回

//前进 //小车前进

//后退 //小车后退

//左转 //小车左转

//右转 //小车右转

//电源 //停止

24

西安科技大学
}

void main(void) { bit ExeFlag=0; LedFlash=3000; TMOD=0x01; 位定时器 TH0=0xFF; 初始化 TL0=0x49; TR0=1; EX1=1; IT1=1; 触发类型 ET0=0; TMOD=33; TH1=0xFD; 初值 TL1=0xFD; 初值 TR1=1; ES=1; REN=1; EA=1; ControlCar(1); ShowPort=LedShowData[0]; while(1) { while(LedFlash--) { if(RL1==0) { RightLed=1; LeftLed=1; } else 下 { RightLed=0; LeftLed=0; }

//主程序入口 //定义可执行位变量 //对闪灯数据进行初始化 //选择定时器 0 为两个 16 //对定时器进行计数值进行 //同上,时间大约为 25uS //同意开始定时器 0 //同意开启外部中断 1 //设定外部中断 1 为低边缘

//设置定时/计数器模式 //给定时器 1 高八位初始化 //给定时器 1 低八位初始化 //开启定时器 1 //开启串口通信功能 //开启接收中断标志 //总中断开启 //将小车置于前进状态 //数码管显示数字 0 //程序主循环

//闪灯总延时 //判断光敏电阻的状态 //将前方右侧指示灯点亮 //将前方左侧指示灯点亮 //在光敏电阻为不通的状态

//将前方右侧指示灯熄灭 //将前方左侧指示灯熄灭

25

西安科技大学
if(IRIN==0) 信号输入 {ExeFlag=1; } if(S1==0) { ControlCar(8); RunFlag=1; S1State=!S1State; goto NextRun; } if(S2==0) { ControlCar(1); RunFlag=0; S2State=!S2State; goto NextRun; } FontIRState=FontIR; 红外探头状态 LeftIRState=LeftIR; 侧红外探头状态 RightIRState=RightIR; 侧红外探头状态 if(FontIR==0 /* || LeftIR==1 || RightIR==1*/) 外探头状态 {ControlCar(2); SB1=!SB1; Delay(); SB1=!SB1; Delay(); SB1=!SB1; Delay(); SB1=!SB1; Delay(); SB1=!SB1; Delay(); SB1=!SB1; Delay(); SB1=!SB1; ControlCar(3); Delay(); SB1=!SB1; Delay(); //判断延时期间是否有红外 //将可执行标志位置 1 //判断是否有 S1 按下 //将小车置于停止状态 //改变小车运行状态标志位 //改变 S1 按键标志位 //跳转到 NextRun 标签 //判断是否有 S2 按下 //将小车置于前进状态 //改变小车运行状态标志位 //改变 S2 按键标志位 //跳转到 NextRun 标签 //前方红外指示灯显示正前方 //左侧红外指示灯显示前方左 //右侧红外指示灯显示前主右 //判断正前方,前左侧,前右侧红 //改变小车状态为后退 //将蜂鸣器取反 //调用延时子程序 //将蜂鸣器取反 //调用延时子程序 //将蜂鸣器取反 //调用延时子程序 //将蜂鸣器取反 //调用延时子程序 //将蜂鸣器取反 //调用延时子程序 //将蜂鸣器取反 //调用延时子程序 //将蜂鸣器取反 //改变小车左转状态 //调用延时子程序 //将蜂鸣器取反 //调用延时子程序

26

西安科技大学
SB1=!SB1; Delay(); SB1=!SB1; Delay(); SB1=!SB1; Delay(); SB1=!SB1; ControlCar(1); SB1=1; } if(B1==0) { if(RunFlag==0) { ControlCar(8); RunFlag=1; } else { ControlCar(1); RunFlag=0; } B1State=!B1State; } } NextRun: RunStopState=!RunStopState; 位 } //判断是否有话筒信号输入 //判断小车当前的运行标志位 //将小车置于停止状态 //改变小车运行标志位 //将蜂鸣器取反 //调用延时子程序 //将蜂鸣器取反 //调用延时子程序 //将蜂鸣器取反 //调用延时子程序 //将蜂鸣器取反 //改变小车为前进状态 //关闭蜂鸣器声音

//将小车置于前进状态 //改变小车运行标志位 //将话筒信号指示灯取反

//跳转标签 //改变小车运行停止状态标志

27

西安科技大学

附录二 寻迹编程
#include <at89x51.h> sbit LeftLed=P2^0; sbit RightLed=P0^7; sbit LeftIR=P3^5; sbit RightIR=P3^6; sbit FontIR=P3^7; sbit M1A=P0^0; sbit M1B=P0^1; sbit M2A=P0^2; sbit M2B=P0^3; sbit B1=P0^4; sbit SB1=P0^6; #define RunShow P1 void Delay() { unsigned int DelayTime=4000; while(DelayTime--); SB1=!SB1; return; } void ControlCar(unsigned char ConType) { M1A=0; M1B=0; M2A=0; M2B=0; switch(ConType) { case 1: //前进 { M1A=1; M2A=1; break; } case 2: //后退 { M1B=1; M2B=1; break; } case 3: //左转 { M2A=1; //包含 51 单片机相关的头文件 //定义前方左侧指示灯端口 //定义前方右侧指示灯端口 //定义前方左侧红外探头端口 //定义前方右侧红外探头端口 //定义前方正前方红外探头端口 //定义左侧电机驱动 A 端 //定义左侧电机驱动 B 端 //定义右侧电机驱动 A 端 //定义右侧电机驱动 B 端 //定义语音识识别传感器端口 //定义蜂鸣器端口 //定义数据显示端口 //定义机器人调转子时间子程序 //定义机器人转弯时间变量 //机器人转弯循环 //蜂鸣器闪响

//定义电机控制子程序 //将 M1 电机 A 端初始化为 0 //将 M1 电机 B 端初始化为 0 //将 M2 电机 A 端初始化为 0 //将 M2 电机 B 端初始化为 0 //判断用户设定电机形式 //判断用户是否选择形式 1 //M1 电机正转 //M2 电机正转

//判断用户是否选择形式 2 //M1 电机反转 //M2 电机反转

//判断用户是否选择形式 3 //M2 电机正转
28

西安科技大学
break; } case 4: //右转 { M1A=1; break; } case 8: //停止 { break; } } } void main() { bit RunFlag=0; RunShow=0; ControlCar(1); while(1) { Start: LeftLed=LeftIR; 状态 RightLed=RightIR; 状态 if(LeftIR==0&RightIR==0) {ControlCar(2); Delay(); Delay(); Delay(); goto NextRun;} if(LeftIR==0) { ControlCar(4); Delay(); Delay(); Delay(); goto NextRun; } if(RightIR==0) { //主程序入口 //定义小车运行标志位 //初始化显示状态 //初始化小车运行状态 //程序主循环 //判断用户是否选择形式 8 //退出当前选择 //判断用户是否选择形式 4 //M1 电机正转 //M2 电机反转

//前方左侧指示灯指示出前方左侧红外探头 //前方右侧指示灯指示出前方右侧红外探头

//左侧没有信号时,开始向右转一定的角度 //修改这里进行转弯角度的调整 //同上

//左侧红外探头没有接收到白色道路信号 //左侧没有信号时,开始向右转一定的角度 //修改这里进行转弯角度的调整 //同上

29

西安科技大学
ControlCar(3); Delay(); Delay(); Delay(); goto NextRun; } goto Start; NextRun: ControlCar(1); } } //右侧没有信号时,开始向左转一定的角度 //修改这里进行转弯角度的调整 //同上

30

西安科技大学

附录三 测速编程
#include "reg51.h" #include "intrins.h" sbit LCM_RS=P3^0; sbit LCM_RW=P3^1; sbit LCM_EN=P3^7; #define BUSY #define DATAPORT #define uchar #define uint #define L 0x80 P1 unsigned char unsigned int 50 //常量定义

uchar str0[16],str1[16],count; uint speed; unsigned long time; void ddelay(uint); void lcd_wait(void); void display(); void initLCM(); void WriteCommandLCM(uchar WCLCM,uchar BusyC); void STR(); void account(); void int0_isr(void) interrupt 0 /*遥控使用外部中断 0,接 P3.2 口*/

31

西安科技大学
{ unsigned int temp; time=count; TR0=0; temp=TH0; temp=((temp << 8) | TL0); TH0=0x3c; TL0=0xaf; count=0; TR0=1; time=time*50000+temp; } void time0_isr(void) interrupt 1 { TH0 =0x3c; TL0 =0xaf; count++; } void main(void) { TMOD=0x01; IP|=0x01; TCON|=0x11; IE|=0x83;
32

/*遥控使用定时计数器 1 */

/*TMOD T0 选用方式 1(16 位定时) */ /*INT0 中断优先*/ /*TCON EX0 下降沿触发,启动 T0*/

西安科技大学
TH0=0x3c; TL0=0xaf; initLCM(); WriteCommandLCM(0x01,1); for(;;) { account(); display(); } } void account() { unsigned long a; if (time!=0) { a=L*360000000/time; } speed=a; } void STR() { str0[0]='S'; str0[1]='p'; str0[2]='e';
33

//清显示屏

西安科技大学
str0[3]='e'; str0[4]='d'; str0[5]=' '; str0[6]=(speed%100000)/10000+0x30; str0[7]=(speed%10000)/1000+0x30; str0[8]=(speed%1000)/100+0x30; str0[9]='.'; str0[10]=(speed%100)/10+0x30; str0[11]=speed%10+0x30; str0[12]='k'; str0[13]='m'; str0[14]='/'; str0[15]='h'; } /*********延时 K*1ms,12.000MHz**********/ void ddelay(uint k) { uint i,j; for(i=0;i<k;i++) { for(j=0;j<60;j++) {;} } }
34

西安科技大学
/**********写指令到 LCD 子函数************/ void WriteCommandLCM(uchar WCLCM,uchar BusyC) { if(BusyC)lcd_wait(); DATAPORT=WCLCM; LCM_RS=0; LCM_RW=0; LCM_EN=1; _nop_(); _nop_(); _nop_(); LCM_EN=0; } /**********写数据到 LCD 子函数************/ void WriteDataLCM(uchar WDLCM) { lcd_wait( ); DATAPORT=WDLCM; LCM_RS=1; LCM_RW=0; LCM_EN=1; _nop_(); _nop_(); _nop_();
35

/* 选中指令寄存器*/ // 写模式

//检测忙信号

/* 选中数据寄存器 */ // 写模式

西安科技大学
LCM_EN=0; } /***********lcd 内部等待函数*************/ void lcd_wait(void) { DATAPORT=0xff; //读 LCD 前若单片机输出低电平,而读出 LCD 为高电 平,则冲突,Proteus 仿真会有显示逻辑黄色 LCM_EN=1; LCM_RS=0; LCM_RW=1; _nop_(); _nop_(); _nop_(); while(DATAPORT&BUSY) { LCM_EN=0; _nop_(); _nop_(); LCM_EN=1; _nop_(); _nop_(); } LCM_EN=0; } /**********LCD 初始化子函数***********/

36

西安科技大学
void initLCM( ) { DATAPORT=0; ddelay(15); WriteCommandLCM(0x38,0); 检测忙信号 ddelay(5); WriteCommandLCM(0x38,0); ddelay(5); WriteCommandLCM(0x38,0); ddelay(5); //三次显示模式设置,不

WriteCommandLCM(0x38,1); 号 WriteCommandLCM(0x08,1); WriteCommandLCM(0x01,1); WriteCommandLCM(0x06,1); WriteCommandLCM(0x0c,1); }

//8bit 数据传送,2 行显示,5*7 字型,检测忙信

//关闭显示,检测忙信号 //清屏,检测忙信号 //显示光标右移设置,检测忙信号 //显示屏打开,光标不显示,不闪烁,检测忙信号

/****显示指定坐标的一个字符子函数****/ void DisplayOneChar(uchar X,uchar Y,uchar DData) { Y&=1; X&=15; if(Y)X|=0x40; //若 y 为 1(显示第二行),地址码+0X40
37

西安科技大学
X|=0x80; WriteCommandLCM(X,0); WriteDataLCM(DData); } /*******显示指定坐标的一串字符子函数*****/ void DisplayListChar(uchar X,uchar Y,uchar *DData) { uchar ListLength=0; Y&=0x01; X&=0x0f; while(X<16) { DisplayOneChar(X,Y,DData[ListLength]); ListLength++; X++; } } void display() { STR(); DisplayListChar(0,0,str0); DisplayListChar(0,1,str1); } //指令码为地址码+0X80

38

西安科技大学

附录四 元件清单
名称 规格 220Ω 560Ω 1KΩ 4.7KΩ 电阻 10KΩ 15KΩ 47KΩ 150KΩ 1MΩ 电容 104 30PF 电解电容 10μ F/16V 20μ F/10V 红色 发光二极管 绿色 发射头 红外装置 端口线 底盘 车轮 电池 铜柱 螺母 螺丝钉 1.5V 接收头 I/O 数量 6 19 3 1 3 三极管 4 1 1 1 4 4 7 1 10 1 3 3 1 1 2 若干 若干 若干 若干 晶振 马达驱动 马达 MAX232CPE 光敏电阻 蜂鸣器 话筒 数码管 液晶屏 芯片 电池底板 面包板 红外遥控器 杜邦线 杜邦口 导线 齿轮 顶针 LED C1602A STC89C52 8050 11.0592MHZ L9110 1 2 2 2 1 1 1 1 1 1 2 1 3 1 若干 若干 若干 若干 若干 开关 接线座 排阻 10KΩ 8550 名称 规格 按键开关 开关 数量 3 2 6 1 2

39

西安科技大学

附录五 实物图

40


相关文章:
基于单片机的全智能小车(遥控,避障,循迹,液晶)
基于单片机的全智能小车(遥控,避障,循迹,液晶)_电子/电路_工程科技_专业资料。这是一个基于51的全智能小车,其中包含了循迹,超声波避障,无线遥控,光栅测速,舵机控制...
基于51单片机的智能循迹避障小车+C源程序_图文
通过有无光线接收来控制电动 小车的转向,从而实现自动循迹避障的功能。 关键词: 智能循迹避障小车, STC89C52 单片机, L298N 驱动芯片, 信号检测模块,循迹避障 ...
智能循迹避障小车_论文设计_图文
CPU使用STC89C52单片机,配合软件编程实现。 1.2智能小车的现状 现智能小车发展很快, 从智能玩具到其它各行业都有实质成果。 其基本可实现循迹避障、检测贴片、...
基于单片机控制的智能循迹避障小车
理论创新◆LilunChuangxin 基于单片机控制的智能循迹避障小车 姚培1 张李坚1 周晶香2 (1.西南交通大学,四川成都 611756;2.宿迁学院,江苏宿迁 223800) 摘要:根据...
智能循迹避障小车设计_图文
智能循迹避障小车设计_电子/电路_工程科技_专业资料。利用红外对管检测黑线与障碍物,并以STC89C52单片机为控制芯片控制电动小汽车的速度及转向,从而实现自动循迹避障...
基于单片机智能遥控小车的设计
本设计主要研究内容就是基于 80C51 设计一部智能小车,小车能够实现自动循迹,自 动避障,自动跟随,超声波测量距离,和红外遥控,寻光行驶的智能小车控制系统,包括 了...
智能循迹避障小车设计
智能循迹避障小车设计_电子/电路_工程科技_专业资料。...在实践 1 过程中,熟悉以单片机为核心控制芯片,设计...其中 2000 年以后遥控地面无人作战系统将 连续装备部队...
基于单片机的智能小车设计(红外避障)_图文
整个智能小车设计主要以单片机为控制核心,通过红外遥控实现小车前后左右的 移动,以及对小车功能模式的转换;通过红外传感器,实现小车的避障功能和循迹 功能。设计采用对比...
基于单片机的智能循迹小车(文献综述)
格式:doc 关键词:暂无1/2 同系列文档 基于单片机的...智能循迹避障小车设计 30页 10财富值 智能循迹避障小车...单片机 STC12C5A32S2、时钟芯片DS1302 以及红外...
基于51单片机小车的循迹避障系统
电气工程学院 号: 名: 专业年级: 指导老师: 基于 51 单片机小车循迹避障系统 专业:电子信息工程 姓名: 指导教师: 摘要 随着社会的发展,智能化越来越受到人们的...
更多相关标签: