您好,欢迎来到步遥情感网。
搜索
您的当前位置:首页基于单片机的智能小车毕业论文

基于单片机的智能小车毕业论文

来源:步遥情感网


) (业设计论文毕本科

基于单片机的智能小车控制

业: 测控技术与仪器 专

咸蛋小超人 名: 姓

2013 6 年月

基于单片机的智能小车控制

摘要:智能化作为现代电子产品的新趋势,是今后的电子产业的发展方向。

智能化设计的电子产品可以按照预先设定的模式在一个环境里自动运作,不需要人为的管理,可应用于科学勘探、环境监测、智能家居等方面。基于单片机的智能小车控制就是其中的一个体现。本设计实现了一种基于51单片机的自动避障智能模型车系统,通过红外传感器采集路况信息,通过对检测信息的分析,自动控制转向电机转向,改变行驶路径,绕过障碍物,从而实现车稳定避障。 本课题设计的智能小车,具有自动避障功能,超声波测距报警,无线电遥控等功能。

关键词:智能车;51单片机;避障;红外线

Smart car based on SCM control

:As a new trend of modern electronic products, intelligent Abstract is the developmental direction of electronic industry after then. Electronic products, which are intelligently designed, can automatically operate following the mode that is pre-set. Without the management of human beings, it can be used for scientific exploring, environmental monitoring, intelligent home furnishing, etc. One of the embodiments is the intelligent control car which is based on single chip microcomputer. In the design, an intelligent model car system based on MCU 51 has been realized. It can collect traffic information with infrared sensors. Meanwhile, by the analysis of information examined, it can transfer from automatic control to motor steering in order to change the route and dodge the obstacles so that the steady avoidance of the barrier can come true. In this paper, a car with the ability of intelligent judgment has been designed and made. It functions as the device which can dodge obstacles automatically, alarm with ultrasonic distance examination, and remote control by radio.

Smart Cart;Single-chip 51;Obstacle Avoidance;Infrared Key words:

目 录

序 言 ......................................................................................................... 错误!未定义书签。

第1章 总体设计方案 ...................................................................... 错误!未定义书签。

1.1课题任务分析 ............................................................................ 错误!未定义书签。 1.2 方案论证 .................................................................................... 错误!未定义书签。 1.2.1小车遥控部分 ................................................................. 错误!未定义书签。 1.2.2小车驱动部分 ................................................................. 错误!未定义书签。

第2章 系统硬件构成 ...................................................................... 错误!未定义书签。

2.1系统设计原理 ............................................................................. 错误!未定义书签。 2.2主要元器件简介 ......................................................................... 错误!未定义书签。 2.2.1 STCC52RC简介 ........................................................ 错误!未定义书签。 2.2.2 NRF24L01无线收发芯片简介 ................................. 错误!未定义书签。 2.2.3 L298N芯片直流电机驱动模块 ............................... 错误!未定义书签。 2.2.4 红外避障模块 ................................................................ 错误!未定义书签。 2.2.5 HC-SR04超声波测距模块 .......................................... 错误!未定义书签。 2.2.6 蜂鸣器驱动电路 ........................................................... 错误!未定义书签。 2.2.7 液晶显示电路 ................................................................ 错误!未定义书签。 2.2.8遥控部分按键电路 ............................................... 错误!未定义书签。

第3章 软件的设计与说明 ........................................................... 错误!未定义书签。

3.1软件设计 ...................................................................................... 错误!未定义书签。

3.2软件的说明 .................................................................................. 错误!未定义书签。 3.2.1 遥控部分主程序流程 .................................................. 错误!未定义书签。 3.2.2 24L01子程序流程图 ................................................... 错误!未定义书签。 3.2.3 小车部分主程序流程图 ............................................. 错误!未定义书签。

第4章 调试与总结 ........................................................................... 错误!未定义书签。

4.1硬件部分 ...................................................................................... 错误!未定义书签。 4.1.1硬件的焊接 错误!未定义书签。 ..................................................................... 4.1.2 24L01无线电模块 ........................................................ 错误!未定义书签。 4.1.3 外接电源模块 ................................................................ 错误!未定义书签。 4.2 软件部分 ..................................................................................... 错误!未定义书签。 4.2.1 超声波模块 .................................................................... 错误!未定义书签。 4.3 小车联调 ..................................................................................... 错误!未定义书签。 4.4 调试的总结 ................................................................................................................. 20

参考文献 ................................................................................................................................... 21 致 谢 ........................................................................................................................................... 22 附录 .............................................................................................................................................. 23

附件1 L298N电机驱动模块 ........................................................................................ 23 附件2 小车侧视图 ........................................................................................................... 24 附件3 小车俯视图 ........................................................................................................... 25 附件4 小车的遥控部分 .................................................................................................. 26 附件5 小车最终硬件图 .................................................................................................. 27 附件6 程序清单................................................................................................................ 28 1.遥控部分程序 ......................................................................................................... 28 2.小车部分程序 ......................................................................................................... 37 附件7 元器件清单 ........................................................................................................... 47

附件8 英文资料及中文翻译 .......................................................................................... 48

序 言

随着我国科学技术的进步,智能化和自动化技术越来越普及,各种高科技也广泛应用于智能小车和机器人玩具制造领域,使智能机器人越来越多样化。智能小车是一个多种高新技术的集成体,它融合了机械、电子、传感器、计算机硬件、[1]。而智能软件、人工智能等许多学科的知识,涉及到当今许多前沿领域的技术电动车正是智能机器人的一种,具有不可估量的实际意义。智能车辆是一个运用计算机、传感、信息、通信、导航、人工智能及自动控制等技术来实现环境感知、规划决策和自动行驶为一体的高新技术综合体。它在军事、民用和科学研究等方面已获得了应用,对解决道路交通安全提供了一种新的途径。随着汽车工业的迅速发展,关于汽车的研究也就越来越受人关注。全国电子大赛和省内电子大赛几乎每次都有智能小车这方面的题目,全国各高校也都很重视该题目的研究,许多国家已经把电子设计比赛作为创新教育的战略性手段。电子设计涉及到多个学科,机械电子、传感器技术、自动控制技术、人工智能控制、计算机与通信技术[2]。电子设计技术,它是一个国家高科技实例的一个等等,是众多领域的高科技重要标准,可见其研究意义很大。

总体设计方案 1章第 1.1课题任务分析

的电动小汽车基本上采取的是基于纯硬件电路的一种开环控制方法, 或当前 者是直线行使, 或者是在遥控下作出前进、后退、转弯、停车等基本功能。但是

这不能满足某些特殊场合下的要求。基于此,本文设计了智能小车控制系统。 智能小车是一个运用传感器、单片机、信号处理、电机驱动及自动控制等技术来实现环境感和自动行驶为一体的高新技术综合体,它在军事、民用和科学研究等方面已获得了应用。 通过各种选题之后,我们发现制作智能小车非常有意思,它唤起我们对玩具的革新思想,智能小车制作的兴趣。自己遇到过的汽车的功能是怎样的,想通过自己的手创作出属于自己的智能汽车。也夹杂一种童年时对玩具智能化的假想。所以我选定制作单片机智能小车。

通过这次设计,掌握51单片机的原理,了解简单传感器组成原理,初步掌握传感器的调整及测试方法,提高动手能力和排除故障的能力。同时通过本课题设计与装配、调试,提高自己的动手能力,巩固已学的理论知识,建立单片机理论和实践的结合,了解传感器各单元电路之间的关系及相互影响,从而能正确设计、计算定时计数的各个单元电路。初步掌握传感器的调整及测试方法。提高动手能力和排除故障的能力。 本设计采用直流减速电机,电机专用驱动芯片L298N进行电机驱动控制,主控芯片为STCC52,测距部分采用超声波模块,控制器采用24L01无线电通信模块,自动避障部分采用红外收发模块。

本次设计虽然只是一个演示模型,但是具有充分的科学性和实用性。首先我们根据交通路面的复杂情况,按照适当的比例制作出一个路况模型,包括弯道、直道以及路面上设置的障碍物等。在弯、直道上,小车沿着预定轨道自由行使,当小车遇到障碍物时,脉冲调制的红外线传感器将检测到的信号发送给单片机,单片机根据程序发出相应的控制信号控制小车自动避开障碍物。由无线模块控制小车进行倒车、前进、左转、右转等动作。

1.2 方案论证

1.2.1小车遥控部分 方案一:小车的无线通信模块采用红外遥控,红外收发遥控是目前大部份遥控小车采用的遥控手段,红外遥控具有代码简单,操作性强的特点。如图1-1为红外遥控模块实物图。

图1-1 红外遥控模块实物图

方案二:小车的通信模块采用无线电NRF24L01模块,NRF24L01是一款工作在2.4~2.5GHz,世界通用ISM频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型SchockburstTM模式控制器、功率放大器、晶体振荡器、调制器、解调器。输出功率、频道选择和协议的设置可以通过SPI接口进行设置。如1-2为NRF24L01无线模块实物图。

图1-2 NRF24L01无线模块实物图

方案论证:方案一中的红外遥控模块的信号传送距离有限,并且发送和接收发射频率高,所受到的干扰影响较小,无NRF20L01的红外信号容易受到干扰。. 线通信的距离比红外的要长许多。小车的遥控是小车的最主要的部分之一,所以选择NRF24L01无线通信模块,故选择方案一。

1.2.2小车驱动部分

方案一:小车的电机驱动部分采用自己搭建的9012三极管电路来实行小车的驱动,9012三极管电路具有电路简单,操作方便的等特点。 方案二:小车的电机驱动部分采用L298N芯片直流电机驱动模块,该模块具有较大的驱动带载能力,驱动部分端子供电范围Vs:+5V~+35V,并且另外自带了5V、3V的输出端口。 方案论证:本设计为4轮驱动的小车,对于小车驱动部分要求能够有较大的帯载能力,并且在小车的实际设计过程中,需要不同的输出电压来提供给小车的各个模块。因此综上所述采用方案二,小车的电机驱动部分使用L298N芯片直流电机驱动模块。

第2章 系统硬件构成

2.1系统设计原理

本设计主要分为两部分:遥控部分和小车部分。遥控部分主要由电源电路,单片机最小系统,无线电模块组成,遥控部分的系统框图如图2-1所示。

按键模无线电模块源电STC

图2-1 遥控系统框图

单片机最小系统部外

小车部分由电源电路,单片机最小系统,显示电路,无线电木块,报警电路,超声波电路等电路模块组成,小车部分的系统框图如图2-2所示。

电机驱动模块无线电模块超声波模块源电STC鸣器红外避障模块

图2-2 小车的系统框图

单片机最小系统部外显示电路蜂

主要元器件简介 2.2.

2.2.1 STCC52RC简介 常用的单片机有很多种:Intel8051系列、Motorola和M68HC系列、Atmel的AT系列、华邦(Winbond)W78系列、荷兰PiliPs的PCF80C51系列、[1]。本次设计最终选系列等4位单片机、义隆的EM-78MicrochiP公司系列用了STCC52单片机。

本系统采用最常用的STCC52单片机,它是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS 8位微处理器。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的STCC52是一种高效微控制[6]单片机为很多嵌入式系统提供了一种灵活性高且价廉的方案。器。STCC52引

脚排列如图2-3所示。

图2-3 STC系列引脚排列

2.2.2 NRF24L01无线收发芯片简介

NRF24L01是一款工作在2.4-2.5GHz,世界通用ISM频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型SchockburstTM模式控制器、功率放大器、晶体振荡器、调制器、解调器。输出功率、频道选择和协议的设置可通过SPI接口进行设置。极低的电流消耗:当工作在发射模式下发射功率为-6dBm时电流消耗为9mA,接收模式时为12.3mA。掉电模式和待机模式下电流消耗更低。NRF24L01引脚排列如图2-4所示。

图2-4 NRF24L01引脚排列

2.2.3 L298N芯片直流电机驱动模块

该模块由L298N作为双H桥直流电机驱动芯片,驱动部分端子供电范围Vs:+5V~+35V。如果在模块上取电压供电,则模块供电范围为Vs:+7V~+35V。模块的驱动不封峰值电流Io为2A。其他相关参数见表2-1。模块的实物图见附录附件1(注:红色线框部分为电源接口)。

表2-1 L298N芯片直流电机驱动模块产品参数

逻辑部分端子供电范围Vss 逻辑部分工作电流范围 控制信号输入电压范围 使能信号输入电压范围 最大功耗 存储温度 驱动板尺寸 驱动板重量 其他扩展 +5V~+7V(可板内取电+5V) 0~36mA 低电平:-0.3V≤Vin≤1.5V 高电平:2.3V≤Vin≤Vss 低电平:-0.3≤Vin≤1.5V(控制信号无效) 高电平:2.3V≤Vin≤Vss(控制信号有效) 20W(温度T=75℃时) -25℃~+130℃ 82mm*57mm*33mm (带固定铜柱,散热片高度) 60g 控制方向指示灯、 逻辑部分板内取电接口

红外避障模块 2.2.4 红外避障的原理:用红外线传感器进行避障。红外线发射头与接收头于一体的检测开关,其工作原理是根据发射头发出的光束,被物体反射,接收头据此做出判断是否有障碍物。当有光线反射回来时,输出低电平。当没有光线反射回来时,输出高电平。单片机根据接收头电平的高低做出相应控制,避免小车碰到障红外接收二极管有利于单片机对信号的处理。电平,TTL由于接收管输出碍物。. 又叫红外光电二极管,也可称红外光敏二极管。它广泛用于各种家用电器的遥控接收器中,如音响、彩色电视机、空调器、VCD视盘机、DVD视盘机以及录像机等。红外接收二极管能很好地接收红外发光二极管发射的波长为94Onm的红外光信号,而对于其他波长的光线则不能接收。因而保证了接收的准确性和灵敏度。 小车采用红外线传感器进行避障的电路原理图如下图2-5所示,实物图如图2-6所示。红外模块的功能指标如表2-2所示。

表2-2 红外模块的功能指标

使用芯片 结束蜂鸣器报警危险距离N0.1s延时 NE555 N 3.3V - 5V 是否有按下按键0自动 ACK应答允许N 工作电压设置频道收到信号 输出模式 测量距离允许接收地址只有频道 数字信号 1CM - 200CM Y0Y 是 发送相应键值 探测到障碍物为高电平,无障碍物或超出探测范围输出低电平 2.4GHZ 红色为Power指示灯,绿色为Status指示灯 32字节发射速率为1MHZY 探测距离是否可以调节 判断按键值 检测信号设置信道工作为执行命令 LED 设置接收数据长度为超声波测距

红外线传感器进行避障的电路原理图2-5 图

图2-6 红外线传感器进行避障的实物图

2.2.5 HC-SR04超声波测距模块

HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能,测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。 基本工作原理:

(1)采用IO口TRIG触发测距,给至少10us的高电平信号;

(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;

(3)有信号返回,通过IO口ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2。 HC-SR04超声波测距模块的时序图如图2-7所示。

超声波模块时序图图2-7

该模块内部将以上脉冲触发信号, 10uS 以上时序图表明你只需要提供一个 发出 8 个 40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:uS/58=厘米或者 uS/148=英寸;或是:距离=高电平时间*声速(340M/S)/2;建议测量周期为 60ms 以上,以防止发射信号对回响信号的影响。

HC-SR04超声波测距模块的电路图如图2-8所示,实物图如图2-9所示。

超声波模块的电路图2-8 图

超声波模块实物图2-9 图

蜂鸣器驱动电路 2.2.6

广泛应用于计蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电, 算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD” 等)表示。只需对驱动由于自激蜂鸣器是直流电压驱动的,不需要利用交流信号进行驱动,其驱动电路口输出驱动电平并通过三极管放大驱动电流就能使蜂鸣器发出声音(通过定时翻转电平产生符合蜂鸣器要求利用定时器来做定时,所示),如图2-10 的频率的波形,这个波形就可以用来驱动蜂鸣器了。

图2-10 蜂鸣器驱动电路

2.2.7 液晶显示电路

该设计的显示部分采用LCD1602来显示超声波测距模块测得的距离。对于现实电路我们可以采用数码管,也可以采用液晶显示。液晶显示相对于数码管显示电路更简洁,显示更明了,故我们采用液晶显示电路。液晶又分字符型和点阵型,我们使用的液晶是字符型液晶。LCD1602自带字符库,不需要查找代码,英文字符可直接使用。液晶电路使用时,如果发现液晶不亮可以调节连接液晶的电位器,

所示。2-11调节液晶的亮度。液晶显示电路如图

图2-11 液晶显示电路

遥控部分按键电路2.2.8

遥控部分的按键与单片机的接口设置为P2.0、P2.1、P2.2、P2.3、P2.4,分别控制小车的前进、后退、左转弯、右转弯、以及功能切换。按键采用低电平触发,即当按下按键时给单片机一个低电平信号,单片机随后做出相应的处理,当按键松开时,单片机接收到一个高电平信号,单片机随后继续做出相应处

理。遥控部分的按键电路如图2-12所示。

遥控部分按键电路2-12 图

第3章 软件的设计与说明

3.1软件设计

系统功能的实现依赖于软、硬件的协同工作。主控芯片为STCC52RC单片机。单片机控制软件实现遥控和小车的各项功能。程序编译采用Keil uVision4编程软件,Keil uVision4程序编译界面如图3-1所示。程序部分采用目前单片机最

通用的C语言进行编程。程序的烧录软件采用STC_ISP_V479软件烧写编译好的HEX文件,STC_ISP_V479软件程序烧写界面如图3-2所示。

编程软件界面3-1 Keil uVision4图

软件程序烧写界面3-2 STC_ISP_V479图

3.2软件的说明

3.2.1 遥控部分主程序流程

遥控部分主程序流程图如图3-3所示。程序从主函数开始执行,24L01无线模块初始化,同时在主函数中定义单片机口对应的按键按下时所发出的函数值。接下来判断是否有按键按下,如果有按键按下,则发送相应的按键对应的函数值,接着判断是否又有按键按下。如果未发现按键按下则在主函数中循环判断是否有

按键按下。.

开始24L01初始化定义键值

遥控主程序流程图图3-3

3.2.2 24L01子程序流程图

24L01子程序流程图如图3-4所示,本模块子程序采用收发一体的驱动程序,即使该模块既可以在需要时发送信号,又可以在需要时接收信号。24L01子程序模块先初始化,初始化的同时在设置的写入reg函数中写入本地地址,写入接收端地址,并且设置频道0自动ACK应答允许。设置24L01的允许接收地址只有频道0,并且是信道工作在2.4GHz,以及设置数据长度为32字节,发射速率为1MHz。

开始24L01初始化写本地地址写接收端地址 图3-4 24L01子程序流程图

3.2.3 小车部分主程序流程图

小车部分主程序流程图如图3-5所示。程序从主函数开始执行,24L01无线模块初始化,液晶显示模块初始化,24L01无线电模块初始化,超声波模块初始化。各个模块初始化完毕后,单片机判断是否接受到了信号,如果接收到信号,则判断相应的按键值,如果没有接收到按键值则返回继续判断是否接受到信号。接收到信号后,小车开始执行键值对应的相应的命令。而超声波测距,并在液晶 )

的语句中的。1(while上显示相应距离,危险距离报警都是贯穿在整个

开始主函数初始化液晶初始化24L01初始化超声波模块初始化 图3-5 小车部分主程序流程图

第4章 调试与总结

基于单片机的智能小车控制有许多的模块,在做整体设计之前首先是对每个模块的调试。只有在确保每个模块都正常的情况下才能进行总体的设计和总体的调试。每个模块都需要软硬件的调试才能确保模块的正常。

4.1硬件部分

4.1.1硬件的焊接

单片机的电路系统相对于简单一些,对于焊接只要多练习就不会出现问题,但是,单片机的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交叉线较多,对于各种锋利的引脚都要注意处理,否则会刺破带有包皮的导线,则会对电路造成短路现象。

在本次单片机的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是可以避免的,主要问题在于单片机上的测试用灯不亮,原因出于焊接时间过长导致电路板上的金属片脱落,造成断路。 解决方案:重新引线使电路重新导通。

4.1.2 24L01无线电模块

24L01模块是直接购买的模块,在调试的时候按照商家提供的时序图,编写程序后却一直无法通信,既不接受信号也不发送信号。 首先排除了程序上的错误,然后对硬件各部分电压进行测量并无发现异常,最后详细的阅读了说明书,发现24L01是3.3V~3.6V电压供电,而自己设计的电源部分缺少了去耦电容导致了硬件的无法正常工作。

解决方案:在3.3V电源处并入1个104瓷片电容,1个100uF电解电容,减少电源的波动对模块带来的影响。

4.1.3 外接电源模块 在刚刚接触小车的时候,本设计的小车应为是4轮驱动的,所以比一般的小而使用的两刚刚开始使用的普通的电池仅仅调试几次就没电了,车更加吃电流, 节3.7V的充电电池串联效果也不尽理想,该小车使用的减速电机对电流的要求非常大,故购买了SONY的电脑适配器,该适配器可以提供19.5V的输出电压,

以及高达4.5A的直流电流。所以设计了采用7805,与7809并联的方式作为SONY适配器下级稳压输出,成为了小车的外部供电电源。由于小车的电流需求非常大,小车在该电源的供电下只能维持10s的行驶时间。

在接下来的检查中发现,由于夏天天气热,7809散热比较慢,而单个7809的最高输出电流在1.5A。7809由于温度过高进入了掉电保护模式。

解决方案:在7809旁边并入一个7809,相当于加大了7809的输出电流。在此同时,在7809的片子上加上散热片,使7809及时散热。该方案的实施使得小车的续航能力大大提高。

4.2 软件部分

4.2.1 超声波模块

超声波模块是直接购买的模块,在调试的时候按照商家提供的时序图,编写程序。但是编写后超声波测量时值测量一次,不能一直保持测量状态。经检查后发现,电路焊接正常,接口正常,所以排除了硬件问题的可能性。在接下来程序的检查中发现了超声波中count()计算函数放在了while(1)函数外面。 解决方案:超声波中count()计算函数放在while(1)函数的循环内,并且根据时序图加上1ms的延时。该方案的实施,使得小车能够一直保持测距的状态,并且在LCM1602上一直持续显示正确的数值。

4.3 小车联调

小车的联调是一个非常复杂的过程,在此过程中,不仅仅是对平时的专业知识的考验,更是对自己的耐心的考验。 小车联调的时候遇到了很多问题:

(1)在无线电模块调试的时候,小车执行的动作与发射的信号的所需要执行的动作不一致,要求小车往左的时候小车并没有往左转弯,要求小车前进的时候小车也并没有前进。

口进行逐一排查,找出问题为小车IO解决方案:对小车的控制电机转动的 的IO口与程序定义的有所不同。重新再程序中定义IO口后,小车就能按照无线信号发射的要求做出相应的动作。

(2)当无线电模块发射了相应的信号后,小车执行的动作正确,但是有时候并没有执行相应的动作,如同“聋哑”一般不接收信号。当按键多次按下后,小车才执行相应的动作。

解决方案:小车的“聋哑”并不是真正的“聋哑”,无线电模块在发射信号的时候并不是每次都能发射出去,发射出去的信号小车的接收部分的无线模块不一定能够接收。而且,按键的抖动也会对无线的发射信号产生影响。故在程序中有按键按下时,发射5次信号信号,提高无线模块的信号发射次数,并且在按键程序中加入10ms的去抖程序。实施该方案后小车对信号的接受灵敏度大幅度提高,能够准确快速的做出相应的信号所要求的动作。

4.4 调试的总结

通过这次设计,掌握51单片机的原理,了解简单传感器组成原理,初步掌握传感器的调整及测试方法,提高动手能力和排除故障的能力。同时通过本课题设计与装配、调试,提高自己的动手能力,巩固已学的理论知识,建立单片机理论和实践的结合,了解传感器各单元电路之间的关系及相互影响,从而能正确设计、计算定时计数的各个单元电路。初步掌握传感器的调整及测试方法。提高动手能力和排除故障的能力。调试期间要多向同学老师请教,有问题就该虚心请教。 经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与对电路的分析能力,同时在软件的编程方面得到更高的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固。

参考文献

[1] 徐国华.移动机器人的发展现状及其趋势[J].机器人技术与应用,2001,(03):1102-1103,1150.

[2] 彭宏业,段编著.小型舞蹈机器人的驱动系统设计[J].国外电子元器件.2005,(04):56-65.

[3] 陈南主编.定位控制器的设计与实现[J].西安科技大学学报. 2003. [4]谭浩强.C语言程序设计[M].北京:清华大学出版社,1998.

[5]苏卫东,任思聪等.温控箱数学模型的建立及其自适应PID控制[J].中国惯性技术学报,1995年,(3):4. [6]万福君. MCS-51单片机原理、系统设计与应用[M]. 北京:清华大学出版社,2008.

[7] 彭宏业,段编著.小型舞蹈机器人的驱动系统设计[J].国外电子元器件.2005,(4).

[8] 刘甘娜等编著.IBM-PC微机原理及接口技术[J].西安:西安电子科技大学出版社,1998.

[9]孙广清.便携式温度传感标定装置[D].西北工业大学硕士学位论文,2007. [10] 鲍丽星,陈晓争.一种高精度信号源的设计[J].南京航空航天大学,2008,16(4):588-590.

[11] 党宏社.智能车辆系统发展及其关键技术概述[J].公路交通科技,2002.(4) [12] 林敏.简易数字化语音存储与回放系统[J].仪表技术,2008,28(9):13-18. [13] 余祖俊.微机监测与控制应用系统设计, 北方交通大学出版社,2001.12 [14] 温志明.运动控制系统分析与应用[J],国防工业出版社,2008.2

[15] WANG SH X,WU G N,JIANG W,et al.The principle and illumination applies of light emitting diode[J].Light and Lighting, 2006,14(5):21-23. [16]I.M

Filanvsky,H.Baltes.CMOS Schmit Trigger Design[J].IEEE Theory

Transactioms on Circuits and

System-Fundamental

andApplications.1994,41(1):46-49.

致 谢

在作品完成之际,我们要特别感谢XXX老师的热情关怀和悉心指导。在我们作品制作的过程中,老师们给了我们很多耐心的指导和启发,不仅让我学到了专业知识,还让我学到了很多做人的道理。特别是他们广博的学识、深厚的学术素养、严谨的治学精神和一丝不苟的工作作风使我们终生受益,在此表示真诚地感谢。

在作品的制作过程中,也得到了许多同学的宝贵建议,在此一并致以诚挚的谢意。感谢所有关心、支持、帮助过我们的朋友。 最后,向在百忙中抽出时间对本文进行评审并提出宝贵意见的各位领导老师表示衷心地感谢!由于自身水平有限,设计中一定存在很多不足之处,敬请各位老师批评指正。

附录

附件1 L298N电机驱动模块

附件2 小车侧视图

附件3 小车俯视图

附件4 小车的遥控部分

附件5 小车最终硬件图

附件6 程序清单

1.遥控部分程序

#include #include

typedef unsigned char uchar; typedef unsigned char uint;

//****************************************NRF24L01端口定义*************************************** sbit MISO =P1^0; sbit MOSI =P1^1; sbit SCK =P1^2; sbit CE =P1^3; sbit CSN =P1^4; sbit IRQ =P1^5;

//************************************按键

*************************************************** sbit KEY1=P2^0; sbit KEY2=P2^1; sbit KEY3=P2^2; sbit KEY4=P2^3; sbit KEY5=P2^4;

//*********************************************NRF24L01*************************************

#define TX_ADR_WIDTH 5 // 5 uints TX address width #define RX_ADR_WIDTH 5 // 5 uints RX address width #define TX_PLOAD_WIDTH 20 // 20 uints TX payload #define RX_PLOAD_WIDTH 20 // 20 uints TX payload

uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址 uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址 uchar TxBuf[20]; //

//***************************************NRF24L01寄存器指令******************************************************* #define READ_REG 0x00 // 读寄存器指令 #define WRITE_REG 0x20 // 写寄存器指令 #define RD_RX_PLOAD 0x61 // 读取接收数据指令 #define WR_TX_PLOAD 0xA0 // 写待发数据指令 #define FLUSH_TX 0xE1 // 冲洗发送 FIFO指令 #define FLUSH_RX 0xE2 // 冲洗接收 FIFO指令 #define REUSE_TX_PL 0xE3 // 定义重复装载数据指令 #define NOP 0xFF // 保留

//*************************************SPI(nRF24L01)寄存器地址****************************************************

#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式 #define EN_AA 0x01 // 自动应答功能设置 #define EN_RXADDR 0x02 // 可用信道设置 #define SETUP_AW 0x03 // 收发地址宽度设置 #define SETUP_RETR 0x04 // 自动重发功能设置 工作频率设置#define RF_CH 0x05 //

#define RF_SETUP 0x06 // 发射速率、功耗功能设置 #define STATUS 0x07 // 状态寄存器 #define OBSERVE_TX 0x08 // 发送监测功能 #define CD 0x09 // 地址检测 #define RX_ADDR_P0 0x0A // 频道0接收数据地址 #define RX_ADDR_P1 0x0B // 频道1接收数据地址 #define RX_ADDR_P2 0x0C // 频道2接收数据地址 #define RX_ADDR_P3 0x0D // 频道3接收数据地址 #define RX_ADDR_P4 0x0E // 频道4接收数据地址 #define RX_ADDR_P5 0x0F // 频道5接收数据地址 #define TX_ADDR 0x10 // 发送地址寄存器

#define RX_PW_P0 0x11 // 接收频道0接收数据长度 #define RX_PW_P1 0x12 // 接收频道0接收数据长度 #define RX_PW_P2 0x13 // 接收频道0接收数据长度 #define RX_PW_P3 0x14 // 接收频道0接收数据长度 #define RX_PW_P4 0x15 // 接收频道0接收数据长度 #define RX_PW_P5 0x16 // 接收频道0接收数据长度 #define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置

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

void Delay(unsigned int s);

void inerDelay_us(unsigned char n); void init_NRF24L01(void); uint SPI_RW(uint uchar); uchar SPI_Read(uchar reg); void SetRX_Mode(void);

uint SPI_RW_Reg(uchar reg, uchar value);

uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); unsigned char nRF24L01_RxPacket(unsigned char* rx_buf); void nRF24L01_TxPacket(unsigned char * tx_buf); //*****************************************长延时***************************************** void Delay(unsigned int s) {

unsigned int i; for(i=0; i}

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

uint bdata sta; //状态标志 sbit RX_DR =sta^6; sbit TX_DS =sta^5; sbit MAX_RT =sta^4;

/****************************************************************************************** /*延时函数

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

void inerDelay_us(unsigned char n) {

for(;n>0;n--) _nop_(); }

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

/*NRF24L01初始化

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

void init_NRF24L01(void) {

inerDelay_us(100); CE=0; // chip enable CSN=1; // Spi disable

SCK=0; // Spi clock line init high

SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动 ACK应答允许

SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21

SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB }

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

/*函数:uint SPI_RW(uint uchar) /*功能:NRF24L01的SPI写时序

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

******************/ uint SPI_RW(uint uchar) {

uint bit_ctr;

for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit {

MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI uchar = (uchar << 1); // shift next bit into MSB.. SCK = 1; // Set SCK high.. uchar |= MISO; // capture current MISO bit SCK = 0; // ..then set SCK low again }

return(uchar); // return read uchar }

/**************************************************************************************************** uchar SPI_Read(uchar reg) 函数:/*

/*功能:NRF24L01的SPI时序

/****************************************************************************************************/ uchar SPI_Read(uchar reg) {

uchar reg_val;

CSN = 0; // CSN low, initialize SPI communication... SPI_RW(reg); // Select register to read from.. reg_val = SPI_RW(0); // ..then read registervalue

CSN = 1; // CSN high, terminate SPI communication

return(reg_val); // return register value }

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

/*功能:NRF24L01读写寄存器函数

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

uint SPI_RW_Reg(uchar reg, uchar value) {

uint status;

CSN = 0; // CSN low, init SPI transaction status = SPI_RW(reg); // select register

SPI_RW(value); // ..and write value to it..

CSN = 1; // CSN high again

return(status); // return nRF24L01 status uchar }

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

/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)

/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数

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

uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) {

uint status,uchar_ctr;

CSN = 0; // Set CSN low, init SPI tranaction status = SPI_RW(reg); // Select register to write to and read status uchar

for(uchar_ctr=0;uchar_ctrCSN = 1;

return(status); // return nRF24L01 status uchar }

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

/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)

/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数 /*********************************************************************************************************/

uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) {

uint status,uchar_ctr;

CSN = 0; //SPI使能 status = SPI_RW(reg);

for(uchar_ctr=0; uchar_ctrCSN = 1; //关闭SPI return(status); // }

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

/*函数:void SetRX_Mode(void) /*功能:数据接收配置

/****************************************************************************************************/ void SetRX_Mode(void) { CE=0;

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收 CE = 1;

inerDelay_us(130); }

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

/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) /*功能:数据读取后放如rx_buf接收缓冲区中

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

unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) {

unsigned char revale=0;

sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况 if(RX_DR) // 判断是否接收到数据 {

CE = 0; //SPI使能

SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer

revale =1; //读取数据完成标志 }

SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高 来清楚中断标志1,通过写1为 return revale; }

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

/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf) /*功能:发送 tx_buf中数据

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

void nRF24L01_TxPacket(unsigned char * tx_buf) {

CE=0; //StandBy I模式

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址 SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送

SPI_RW_Reg(WRITE_REG+STATUS,0X7E); CE=1; //置高CE,激发数据发送 inerDelay_us(10); }

//************************************主函数

************************************************************ void main(void) {

uchar bizhangflag=0; init_NRF24L01() ;

while(1) {

if(KEY1 ==0 ) { Delay(5); if(KEY1 == 0) {

TxBuf[1] = 0x99 ;

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10); while(KEY1==0); Delay(5); // 发送释放按键 TxBuf[1] = 0x00 ;

nRF24L01_TxPacket(TxBuf);

Delay(10);

nRF24L01_TxPacket(TxBuf);

Delay(10);

nRF24L01_TxPacket(TxBuf);

Delay(10);

nRF24L01_TxPacket(TxBuf);

Delay(10);

nRF24L01_TxPacket(TxBuf);

Delay(10);

}

}

if(KEY2 ==0 ) { Delay(5); if(KEY2 == 0) {

TxBuf[1] = 0x66 ;

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10); while(KEY2==0); Delay(5); // 发送释放按键 TxBuf[1] = 0x00 ;

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

} }

if(KEY3 ==0 ) {

Delay(5); if(KEY3 == 0) {

TxBuf[1] = 0x69 ;

nRF24L01_TxPacket(TxBuf);

Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10); while(KEY3==0); Delay(5);

// 发送释放按键 TxBuf[1] = 0x00 ;

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10); } }

if(KEY4 ==0 ) { Delay(5);

if(KEY4 == 0) {

TxBuf[1] = 0x96 ;

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

while(KEY4==0); Delay(5); // 发送释放按键 TxBuf[1] = 0x00 ;

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10); } }

if(KEY5 ==0 ) { Delay(5); if(KEY5 == 0) {

if(bizhangflag==0) {

bizhangflag=1; TxBuf[1] = 0xAA ;

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10); while(KEY5==0); } else {

bizhangflag=0; TxBuf[1] = 0x55 ;

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

nRF24L01_TxPacket(TxBuf); Delay(10);

while(KEY5==0); } } }

2.小车部分程序

#include #include #include p2.h #include delay.h

typedef unsigned char uchar; typedef unsigned char uint;

//****************************************NRF24L01端口定义*************************************** sbit MISO =P0^0;

sbit MOSI =P0^1; sbit SCK =P0^2; sbit CE =P0^3; sbit CSN =P0^4; sbit IRQ =P0^5;

#define KeyPort1 P0 #define DataPort P3 //定义按键端口

sbit RightSenser=P2^3; sbit LeftSenser=P2^2; sbit TX=P2^1; sbit RX=P2^0;

//*********************************************NRF24L01*************************************

#define TX_ADR_WIDTH 5 // 5 uints TX address width #define RX_ADR_WIDTH 5 // 5 uints RX address width #define TX_PLOAD_WIDTH 20 // 20 uints TX payload #define RX_PLOAD_WIDTH 20 // 20 uints TX payload

uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址 uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址 //***************************************NRF24L01寄存器指令******************************************************* #define READ_REG 0x00 // 读寄存器指令 #define WRITE_REG 0x20 // 写寄存器指令 #define RD_RX_PLOAD 0x61 // 读取接收数据指令 #define WR_TX_PLOAD 0xA0 // 写待发数据指令 #define FLUSH_TX 0xE1 // 冲洗发送 FIFO指令 #define FLUSH_RX 0xE2 // 冲洗接收 FIFO指令 #define REUSE_TX_PL 0xE3 // 定义重复装载数据指令 #define NOP 0xFF // 保留

//*************************************SPI(nRF24L01)寄存器地址****************************************************

#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式 #define EN_AA 0x01 // 自动应答功能设置 #define EN_RXADDR 0x02 // 可用信道设置 收发地址宽度设置#define SETUP_AW 0x03 // #define SETUP_RETR 0x04 // 自动重发功能设置 #define RF_CH 0x05 // 工作频率设置

#define RF_SETUP 0x06 // 发射速率、功耗功能设置 #define STATUS 0x07 // 状态寄存器 #define OBSERVE_TX 0x08 // 发送监测功能

#define CD 0x09 // 地址检测 #define RX_ADDR_P0 0x0A // 频道0接收数据地址 #define RX_ADDR_P1 0x0B // 频道1接收数据地址 #define RX_ADDR_P2 0x0C // 频道2接收数据地址 #define RX_ADDR_P3 0x0D // 频道3接收数据地址 #define RX_ADDR_P4 0x0E // 频道4接收数据地址 #define RX_ADDR_P5 0x0F // 频道5接收数据地址 #define TX_ADDR 0x10 // 发送地址寄存器

#define RX_PW_P0 0x11 // 接收频道0接收数据长度 #define RX_PW_P1 0x12 // 接收频道0接收数据长度 #define RX_PW_P2 0x13 // 接收频道0接收数据长度 #define RX_PW_P3 0x14 // 接收频道0接收数据长度 #define RX_PW_P4 0x15 // 接收频道0接收数据长度 #define RX_PW_P5 0x16 // 接收频道0接收数据长度 #define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置

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

void Delay(unsigned int s);

void inerDelay_us(unsigned char n); void init_NRF24L01(void); uint SPI_RW(uint uchar); uchar SPI_Read(uchar reg); void SetRX_Mode(void);

uint SPI_RW_Reg(uchar reg, uchar value);

uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); unsigned char nRF24L01_RxPacket(unsigned char* rx_buf); void nRF24L01_TxPacket(unsigned char * tx_buf);

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

uint bdata sta; //状态标志 sbit RX_DR =sta^6; sbit TX_DS =sta^5; sbit MAX_RT =sta^4;

/****************************************************************************************** /*延时函数

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

void inerDelay_us(unsigned char n) {

for(;n>0;n--) _nop_();

}

//***************************************************************************** *********** /*NRF24L01初始化

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

void init_NRF24L01(void) {

inerDelay_us(100); CE=0; // chip enable CSN=1; // Spi disable

SCK=0; // Spi clock line init high

SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动 ACK应答允许

SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21

SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB }

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

/*函数:uint SPI_RW(uint uchar) /*功能:NRF24L01的SPI写时序

/****************************************************************************************************/ uint SPI_RW(uint uchar) {

uint bit_ctr;

for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit {

MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI uchar = (uchar << 1); // shift next bit into MSB.. SCK = 1; // Set SCK high.. uchar |= MISO; // capture current MISO bit SCK = 0; // ..then set SCK low again }

return(uchar); // return read uchar }

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

/*函数:uchar SPI_Read(uchar reg) /*功能:NRF24L01的SPI时序

/****************************************************************************************************/ uchar SPI_Read(uchar reg) {

uchar reg_val;

CSN = 0; // CSN low, initialize SPI communication... SPI_RW(reg); // Select register to read from.. reg_val = SPI_RW(0); // ..then read registervalue

CSN = 1; // CSN high, terminate SPI communication

return(reg_val); // return register value }

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

/*功能:NRF24L01读写寄存器函数

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

uint SPI_RW_Reg(uchar reg, uchar value) {

uint status;

CSN = 0; // CSN low, init SPI transaction status = SPI_RW(reg); // select register

SPI_RW(value); // ..and write value to it.. CSN = 1; // CSN high again

return(status); // return nRF24L01 status uchar }

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

/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)

/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数

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

uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) {

uint status,uchar_ctr;

CSN = 0; // Set CSN low, init SPI tranaction status = SPI_RW(reg); // Select register to write to and read

status uchar

for(uchar_ctr=0;uchar_ctrCSN = 1;

return(status); // return nRF24L01 status uchar }

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

/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)

:写入数据的个数uchars:为待写入数据地址,pBuf用于写数据:为寄存器地址,: 功能/* /*********************************************************************************************************/

uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) {

uint status,uchar_ctr;

CSN = 0; //SPI使能 status = SPI_RW(reg);

for(uchar_ctr=0; uchar_ctrCSN = 1; //关闭SPI return(status); // }

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

/*函数:void SetRX_Mode(void) /*功能:数据接收配置

/****************************************************************************************************/ void SetRX_Mode(void) { CE=0;

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收 CE = 1;

inerDelay_us(130); }

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

/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) /*功能:数据读取后放如rx_buf接收缓冲区中

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

unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) {

unsigned char revale=0;

sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况 if(RX_DR) // 判断是否接收到数据 {

CE = 0; //SPI使能

SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer

revale =1; //读取数据完成标志 }

SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志 return revale; }

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

void nRF24L01_TxPacket(unsigned char * tx_buf) 函数:/*

/*功能:发送 tx_buf中数据

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

void nRF24L01_TxPacket(unsigned char * tx_buf) {

CE=0; //StandBy I模式

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址 SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); 16收发完成中断响应,IRQ // 位CRC,主发送 //置高CE,激发数据发送 CE=1; inerDelay_us(10); }

uchar table[5]=Dis=;

void display(x) {

uchar bai,shi,ge,xiao; bai=x/1000;

shi=(x_x0010_00)/100;

ge=((x_x0010_00)_x0010_0)/10; xiao=((x_x0010_00)_x0010_0)_x0010_; LCD_Write_Com(0x80+9); DelayUs2x(6);

LCD_Write_Data(0x30+bai); DelayUs2x(6);

LCD_Write_Data(0x30+shi); DelayUs2x(6);

LCD_Write_Data(0x30+ge); DelayUs2x(6);

LCD_Write_Data('.'); DelayUs2x(6);

LCD_Write_Data(0x30+xiao); DelayUs2x(6);

LCD_Write_Data('c'); DelayUs2x(6);

LCD_Write_Data('m'); DelayUs2x(6); }

void start() { TX=1;

DelayUs2x(20); TX=0; }

void Conut() {

uint time,S=0;

time=(TH0*256+TL0)*1.09; TH0=0; TL0=0;

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

}

void bizhang() {

if((RightSenser) && (LeftSenser)) //,前进 {

P1=0x99; // Delay(1) ; }

else if((RightSenser) && (!LeftSenser)) // 如果右边真,左边假 {

P1=0x96; // Delay(1) ; }

else if((!RightSenser) && (LeftSenser)) // 如果左边真,右边假 { P1=0x69; // Delay(1) ; }

else if((!RightSenser) && (!LeftSenser)) //无信号 停止 { P1=0x66; // Delay(1) ; } }

//************************************主函数

************************************************************ void main(void) {

unsigned int con,ttt=0;

uchar bizhangflag=0; uchar RxBuf[20]={0};

uchar i;

init_NRF24L01() ; LCD_Init();

for(i=0;i<=5;i++) {

LCD_Write_Data(table[i]); DelayMs(20); } while(1) {

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

TL0=0;

ET0=1; //允许T0中断 EA=1; SetRX_Mode();

ttt++; if(ttt>=100) { ttt=0; start(); con=0;

while(!RX) //当RX为零时等待 { con++; if(con>=500) {

break; } }

TR0=1; //开启计数 con=0;

while(RX) //当RX为1计数并等待 { con++; if(con>=500) {

break; } }

TR0=0; //关闭计数

Conut(); }

if(nRF24L01_RxPacket(RxBuf)); {

if(RxBuf[1]==0x00) {

bizhangflag=0; }

else if(RxBuf[1]==0x99) {

bizhangflag=0;

else if(RxBuf[1]==0x66)

P1=0x66;

bizhangflag=0; }

else if(RxBuf[1]==0x69) {

bizhangflag=0; }

else if(RxBuf[1]==0x96) {

bizhangflag=0;

else if(RxBuf[1]==0x55) {

}

{

}

P1=0x00;

P1=0x99;

P1=0x69;

P1=0x96;

bizhangflag=0;

else if(RxBuf[1]==0xAA)

bizhangflag=1; } }

if(bizhangflag==1)

bizhang(); } } }

}

{

{

附件7 元器件清单

1 商品名称 5V 蓝色 蓝屏 1602A 兰屏LCD液晶屏 0.036KG 带背光白字体 SOT塑封管 长5V有源蜂鸣器 电磁式( 声) 3MM 红发红光 发光二极管 红色LED (4 /20只)元 0.8MM 纯度:63% 小卷优质焊锡丝 线径 100克 绿色40P锁紧插座 40P活座(宽体) 按键开关 微动开关6*6*5MM 轻触开关 卧式 L7805CV 三端稳压电路 TO-220 ST TO-220 ST L7809CV 三端稳压电路 间距 2.54MM 单排母座单排座 插座1*40P 晶体(12MHz)49S型无源晶振 12M 插针 直针 脚距2.54mm 1x40 单排排针11mm 总高 锁紧插座绿色40P 40P活座(宽体) 直针 2x40 2.54mm脚距双排排针插针11mm 总高 串口编程 直插质量保证 STCC52RC DIP-40 数量 1 单价 金额 15.00 15.00 2 3 4 5 6 7 8 9 10 11 2 1 1 1 25 2 2 2 2 5 1.00 3.00 2.00 3.00 18.00 18.00 3.00 0.20 1.00 1.00 0.50 0.50 0.50 3.00 5.00 2.00 2.00 1.00 1.00 2.50 12 13 1 5 3.00 0.50 3.00 2.50 14 3 5.00 15.00 (程序下载)单片机 15 16 17 18 19 20 21 蔽障模避障传感器反射式红外传感器 块机器人配件 避 超声波测距模块传感器 智能小车 障传感器 机器人 轮驱动力测速小车智能小车底盘 4WD 4 强磁电机 码盘 无线升级版无线收发模块 NRF24L01() 无线数据传输 数据传送模块 SONY 19.5V 4.7A 90W 琪瑞索尼笔记本 电源适配器充电器 孔距 9*15CM 2.54MM电木万能板 洞洞板1.4MM 万用板 线路板厚 每 种常用251% 金属膜电阻包1/4W精度 种只共20500只 2 1 1 1 1 3 1 14.00 28.00 13.00 13.00 114.00 114.00 12.50 25.00 75.00 75.00 3.00 5.00 9.00 5.00

附件8 英文资料及中文翻译

Validation and Testing of Design Hardening for Single Event

Effects Using the 8051 Microcontroller

Abstract :With the dearth of dedicated radiation hardened foundries, new and

novel techniques are being developed for hardening designs using non-dedicated foundry services. In this paper, we will discuss the implications of validating these methods for the single event effects (SEE) in the space environment. Topics include the types of tests that are required and the design coverage (i.e., design libraries: do they need validating for each application?). Finally, an 8051 microcontroller core

from NASA Institute of Advanced Microelectronics (IAμE) CMOS Ultra Low Power Radiation Tolerant (CULPRiT) design is evaluated for SEE mitigative techniques against two commercial 8051 devices.

Key words:Single Event Effects; Hardened-By-Design;

microcontroller;radiation effects

I. INTRODUCTION

NASA constantly strives to provide the best capture of science while operating

in a space radiation environment using a minimum of resources [1,2]. With a relatively limited selection of radiation-hardened microelectronic devices that are often two or more generations of performance behind commercial state-ofthe-art technologies, NASA's performance of this task is quite challenging. One method of alleviating this is by the use of commercial foundry alternatives with no or minimally invasive design techniques for hardening. This is often called hardened-by-design (HBD).Building custom-type HBD devices using design libraries and automated design tools may provide NASA the solution it needs to meet stringent science performance specifications in a timely, cost-effective, and reliable manner. However, one question still exists: traditional radiation-hardened devices have lot and/or wafer radiation qualification tests performed; what types of tests are required for HBD validation?

II. TESTING HBD DEVICES CONSIDERATIONS

Test methodologies in the United States exist to qualify individual devices

through standards and organizations such as ASTM, JEDEC, and MIL-STD- 883. Typically, TID (Co-60) and SEE (heavy ion and/or proton) are required for device validation. So what is unique to HBD devices?

As opposed to a “regular” commercial-off-the-shelf (COTS) device or application specific integrated circuit (ASIC) where no hardening has been performed,

one needs to determine how validated is the design library as opposed to determining the device hardness. That is, by using test chips, can we “qualify” a future device using the same library?

Consider if Vendor A has designed a new HBD library portable to foundries B and C. A test chip is designed, tested, and deemed acceptable. Nine months later a NASA flight project enters the mix by designing a new device using Vendor A's library. Does this device require complete radiation qualification testing? To answer this, other questions must be asked.

How complete was the test chip? Was there sufficient statistical coverage of all library elements to validate each cell? If the new NASA design uses a partially or insufficiently characterized portion of the design library, full testing might be required.

Of course, if part of the HBD was relying on inherent radiation hardness of a process, some of the tests (like SEL in the earlier example) may be waived.

Other considerations include speed of operation and operating voltage. For example, if the test chip was tested statically for SEE at a power supply voltage of 3.3V, is the data applicable to a 100 MHz operating frequency at 2.5V? Dynamic considerations (i.e., nonstatic operation) include the propagated effects of Single Event Transients (SETs). These can be a greater concern at higher frequencies. The point of the considerations is that the design library must be known, the coverage used during testing is known, the test application must be thoroughly understood and the characteristics of the foundry must be known. If all these are

applicable or have been validated by the test chip, then no testing may be necessary. A task within NASA's Electronic Parts and Packaging (NEPP) Program was performed to explore these types of considerations.

III. HBD TECHNOLOGY EVALUATION USING THE 8051 MICROCONTROLLER

With their increasing capabilities and lower power consumption,

microcontrollers are increasingly being used in NASA and DOD system designs. There are existing NASA and DoD programs that are doing technology development to provide HBD. Microcontrollers are one such vehicle that is being investigated to quantify the radiation hardness improvement. Examples of these programs are the 8051 microcontroller being developed by Mission Research Corporation (MRC) and the IAμE (the focus of this study). As these HBD technologies become available, validation of the technology, in the natural space radiation environment, for NASA's use in spaceflight systems is required.

The 8051 microcontroller is an industry standard architecture that has broad acceptance, wide-ranging applications and development tools available. There are numerous commercial vendors that supply this controller or have it integrated into some type of system-on-a-chip structure. Both MRC and IAμE chose this device to demonstrate two distinctly different technologies for hardening. The MRC example of this is to use temporal latches that require specific timing to ensure that single event effects are minimized. The IAμE technology uses ultra low power, and layout and architecture HBD design rules to achieve their results. These are fundamentally

different than the approach by Aeroflex-United Technologies Microelectronics Center (UTMC), the commercial vendor of a radiation– hardened 8051, that built their 8051

microcontroller using radiation hardened processes. This broad range of technology within one device structure makes the 8051an ideal vehicle for performing this technology evaluation.

The objective of this work is the technology evaluation of the CULPRIT

process [3] from IAμE. The process has been baselined against two other processes, the standard 8051 commercial device from Intel and a version using state-of-the-art

processing from Dallas Semiconductor. By performing this side-by-side comparison, the cost benefit, performance, and reliability trade study can be done.

In the performance of the technology evaluation, this task developed hardware and software for testing microcontrollers. A thorough process was done to optimize the test process to obtain as complete an evaluation as possible. This included taking advantage of the available hardware and writing software that exercised the microcontroller such that all substructures of the processor were evaluated. This process is also leading to a more complete understanding of how to test complex structures, such as microcontrollers, and how to more efficiently test these structures in the future.

使用8051单片机验证和测试单粒子效应的加固工艺

摘要:随着代工业务(抗辐射加固设计的芯片制造加工厂专门从事的一项业务)

的减少,使用非专用代工业务的新技术逐步发展起来。在这篇论文中,我们将在空间环境中讨论单粒子效应(SEE)的验证方法。课题包括需要测试的类型和设计覆盖面(即他们是否需要验证设计库的每个应用程序?)。文章所提到的8051单片机核心是根据美国航天局的高级微电子研究所( IAμE)的CMOS超低功耗辐射容错技术(CULPRIT)设计的。它是评价两个8051工业用设备单粒子效应缓和技术的一项设计。

关键词:单粒子效应;加固工艺;微控制器;辐射效应 一 导言

美国航天局要在空间辐射环境中最低限度地使用资源条件下,不断努力提供 最好科学方法 [1,2] 。然而,拥有最先进的技术的工业用抗辐射加固微电子器

件,几代产品中都有相对局限性,所以美国航天局的这一任务很有挑战性。本文所介绍的方法是使用加固微创设计技术的工业代工。这通常称为加固工艺(HBD)。 这种使用设计程序库和自动化设计工具设计的常规加固工艺器件可为美国宇航局提供一种解决方法,它能及时满足严格的科学性能规格,具有成本低,和可靠性高的特点。

但是,仍然存在一个问题:常规辐射加固器件有许多和/或硅片辐射条件测试,加固工艺的验证需要哪些类型的试验?

二 加固工艺检测设备的考虑

美国的测试技术是要使单个器件通过如ASTM ,JEDEC的,和MIL-STD–883等 的标准和组织的测试。通常情况下使用的是TID(Co-60)和SEE(重离子和/或质子)来验证器件。那么,什么是HBD器件所独有的验证呢? 由于不采用“常规”工业现成(COTS)装置或没有固化的专用集成电路(ASIC),加固工艺的器件需要确定如何验证设计程序库而不是设备硬度。也就是说,有了测试芯片,我们是不是就可以在未来器件上使用相同的程序库了?

试想,如果卖主A的设计的新的固化工艺程序库可移植性可比卖主B和C的都个月后,美国航天局飞行项9设计,测试的测试芯片就是可接受的了。A好,那么.

目就会使用卖主A的程序库设计了新器件进行组合了。这是否需要完成辐射条件测试?回答这个问题之前,先看一下其他的问题。

如何完整地测试芯片?所有程序库元素来验证每个单元是否有足够的统计覆盖?如果美国航天局新的设计部分使用了设计程序库或使用了没有充分描述的部分,可能就需要全部测试了。当然,如果固化的部分工艺依靠一个进程的固有抗辐射硬度,也可以放弃一些测试(如SEL早先的样本)。

另外,其他考虑因素还包括运作速度和工作电压。例如,如果在电源电压3.3V的条件下,用测试芯片静态地测试单粒子效应,所测得的数据在电源电压2.5V 操作频率100MHz的条件下是否适用?动态因素(即非静态操作)包括单粒子瞬变(SETs)的普及效果 。更高的频率可能更关注这些。

需要考虑的因素是,设计程序库,测试范围,铸造特点必须是已知的,并且深刻理解测试用途。如果所有这些因素都已经具备或测试芯片已被验证,那么测试就没有必要了。美国航天局的电子零件封装(NEPP)计划是为了探讨这些因素的类型。

三 用8051 单片机评估加固工艺

由于性能的不断提高和功耗的不断降低,微控制器在美国航天局和国防部的 系统设计上的应用正越来越多。现在,美国航天局和国防部计划正在不断地改进固化工艺。微控制器是一个这样的工具,正在深入量化抗辐射固化的改进。这些计划的实例是Mission研究公司(MRC)与高级微电子研究所(这项研究的重点)所研制的8051 微控制器。在自然空间辐射环境中,由于这些固化工艺的使用,美国宇航局在航天飞行中系统中使用验证技术成为必要。

8051单片机是一个行业标准架构,被广泛接受和应用,并作为一种开发工具。有许多工业供应商,他们供应这种控制器或把这种控制器集成到某种类型的系统芯片的结构。医学研究理事会和高级微电子研究所都选择这个设备,但他们论证的是两种截然不同固化工艺。医学研究理事会的实例是使用时间锁存,需要

具体时间以确保单粒子效应减少到最低限度。高级微电子研究所采用超低功耗,以及布局和建筑固化工艺的设计原则来实现其结果。这些是与Aeroflex联合技术微电子中心(UTMC)完全不同的方法 ,抗辐射固化的8051的工业供应商,利用抗辐 单片机。8051射固化进程研制自己的.

一台设备广泛涉及的技术使得8051成为技术评价的理想载体这项工作的目标是从高级微电子研究所得到CMOS超低功耗辐射容错进程的技术评价[3]。其他两个过程--英特尔的8051商业设备标准和采用国家最先进的加工从达拉斯半导体版本—是这个进程的基础。商业研究一 一比较了他们的成本效益,性能和可靠性。技术性能的评价是为测试微控制器开发硬件和软件。完备进程中目的是优化测试过程以尽可能获得完整的评价。

这包括利用现有的硬件和在微控制器上运行的软件对所有子处理器进行评价。这个进程还会使我们较完整地理解如何测试复杂的结构,如微控制器,以及将来如何更有效地测试这些结构。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- obuygou.com 版权所有 赣ICP备2024042798号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务