第1章 绪 论
1.1 课题的背景
随着公路交通运输的发展,交通拥挤、道路阻塞和交通事故频繁发生等问题越来越严重地困扰着世界各大城市。在我国,长期以来城市人均道路面积一直处于低水平状态,近十年有了较快发展,人均面积由2.8平方米上升到6.6平方米。尽管其增长幅度较快,仍赶不上城市交通流量年均20%的增长速度。这种状况在大城市中尤为突出目前全国32个百万人口以上的大城市中,有27个城市的人均道路面积低于全国平均水平。
另外,最近几年也是大城市机动车增长速度最快的年份,轿车、客车、面包车以及摩托车的增幅年均在15%以上。以广州为例,广州市近10年来机动车年均增长速度为17%,其中轿车为19%,摩托车为35%。
相对于交通运输工具的飞速发展,我国交通配套设施建设明显滞后,道路安全网络、道路标识、交通指挥中心仍然不足。单独从车辆方面或道路方面考虑,均很难有效地解决交通问题。
停车场是交通事故频发区之一。随着汽车的日益普及,停车场越来越拥挤,车辆间距离非常接近,使得驾驶员在停车场穿行、掉头或倒车时常常顾此失彼,发生碰撞和拖挂的事故,在夜间,事故发生率最高。
汽车倒车超声波报警器能在一定程度上帮助驾驶员避免事故的发生,它能显示出车尾距离障碍物的距离,并能在低于安全距离时发出报警声音。对于后视不良的车辆如大客车,货车驾驶员和驾车新手来说,拥有一个倒车报警器是很有必要的。
1.2 课题目的及意义
本课题把硬件电路和电路软件有机的结合起来,完成汽车倒车报警系统的设计,能够了解单片机技术的现状,而且通过对电路系统的设计,学习掌握了数字电路从原理图到PCB版的全部过程,形成完善的设计思路以及思想,并通过对汽车倒车超声波报警器的软件设计的过程,锻炼应用C以及相关汇编语言等软件设计电路程序的能力为以后参与实际工作奠定良好的设计基础。
本课题要求使用现在应用非常广泛的计算机软件PROTEL,及Keil C51,随着计算机技术的发展,计算机软件在电路设计中的应用越来越广泛,Protel是人们熟悉的常用EDA软件。作为电路设计自动化(EDA)的一种工具,Protel应用于电路原理图设计、电路板设计等,它基于Windows环境,功能强大,人机界面友好,能让人们在具有最完整的功能环境下,提升设计上的品质和效率。本课题将要求Protel在电路设计中的应用,包括电路原理图设计和印刷电路板设计以及设计过程中遇到的问题和解决方法。Keil C51,是51系列单片机学习和调试的常用软件,是众多单片机应用开发的优秀软件之一,它集编辑、编译、仿真于一体,支持汇编、PLM语言和C语言的程序设计,界面友好,易学易用。这样使学生也能将所学与所用有机结合起来。在步入工作岗位之前得到全方位的工程设计训练。
通过对汽车倒车报警电路的设计能初步具有用PROTEL软件设计电路原理图以及电路版图的能力。与实际电路相结合,通过理论联系实际的方法,使所学的知识通过自己设计思考真正应用到实践中。通过该次设计能了解51系列的一些单片机的知识,并能熟练运用PROTEL,Keil C51软件,提高实际动手能力。
通过运用汇编语言编程,可以锻炼严谨的编程思路,进一步提高编程能力和对汇编思想的理解。为以后的工作打下良好的基础。
第2章 总体设计方案和开发软件介绍
2.1超声波测距原理
人耳的听音范围是20~20 000Hz ,超声波是人耳听不到的一种声波,是一种频率超过 20kHz 的机械波。超声波作为一种特殊的声波,同样具有声波传输的基本物理特性—反射、折射、干涉、衍射、散射。超声波具有方向性集中、振幅小、加速度大等特点,可产生较大力量,并且在不同的媒质介面,超声波能量损失小大部分能量会反射。同时,由于超声波对人体和环境是无害的,所以超声拨检测可以广泛应用到各个部门。而且利用超声波检测往往比较迅速,方便,易于做到实时控制,并且在测量精度方面能达到工业实用的要求。在本设计中综合各方面考虑,采用的超声波频率为40KHz。
超声波的纵向分辨率较高,对色彩和光照度不敏感,对外界光线和电磁场不敏感,可以用于测量较近目标的距离。本设计采用的超声波传感器往返距离为15m ,在有灰尘、烟雾、强磁场干扰、有毒等各种环境下都能稳定工作.超声波测距是根据超声波传播过程中遇到障碍物会发生反射这一原理来测量距离的,即用发射超声波和接收其回波之间的时间差来计算距离,计算公式为:
v = 331. 5 + 0. 607 T (2-1)
式中:v 为超声波在空气中传播速度T为环境温度
常温下可简化为
(2-2)
式中:S为被测距离;Δt为发射超声脉冲与接收其回波的时间差:t1为超声回波接收时刻;t0为超声脉冲发射时刻. 用单片机可以很方便地测量t0时刻和t1时刻,根据以上公式,用软件编程即可得到被测距离S。
2.2 汽车倒车雷达的发展
倒车雷达其实跟大家所知道的雷达是一样的,是根据蝙蝠在黑夜里高速飞行而不会与任何障得物相撞的原理设计开发的,通过感应装置发出超声波,然后通过反射回来的超声波来判断前方有无障得物,以及距障碍物的距离、障碍物的大小、方位和形状等。不过由于倒车雷达体积和实用性的限制,目前的倒车雷达主要具备的就是判断障碍物的距离,并作出提示,让驾驶者便于判断是否该减速或熄火。
通常的倒车雷达主要由三部分组成:感应器(探头)、主机和显示设备。感应器发出和接收超声波信号,然后将得到的信号传输到主机里面的电脑进行分析,再通过显示设备显示出来。探头装在后保险杠上,探头有1、3、4、6只不等。探头以45°角辐射,上下左右搜寻目标。它最大的特点是能探索到那些低于保险杠而驾驶员从后窗难以看见的障碍物( 如花坛、蹲在车后玩耍的小孩等)并报警。倒车雷达的显示器装在驾驶室仪表板上,它不停地提醒驾驶员汽车距后面物体还有多少距离。到危险距离时蜂鸣器就开始鸣叫,提醒驾驶员停车。
按探头分,倒车雷达有粘贴式、钻孔式和悬挂式三种。粘贴式探头后有层胶,可直接粘在后保险杠上。钻孔式探头,是在保险杠上打一个洞,然后把探头嵌进去。悬挂式探头主要用于货车。从显示器分,有数字显示、颜色显示和蜂鸣三种。
下面介绍倒车雷达的发展:
第一代——轰鸣器,这是倒车雷达系统的真正开始,倒车时,如果车后1.5~1.8m处有障碍物,轰鸣器就会开始工作。轰鸣声越急,表示车辆离
障碍物越近,没有语音提示,也没有距离显示,虽然司机知道有障碍物,但不能确定障碍物离车有多远,对驾驶员帮助不大。
第二代——数码波段显示,这代产品要先进得多,它安装在仪表台的位置,可以显示车后障碍物离车体的距离。如果是物体,在1.8m 开始显示;如果是人,在0.9m左右的距离开始显示;这一代产品有两种显示方式,数码产品显示距离数字,而波段显示产品由三种颜色来区别显示:绿色代表安全距离,表示障碍物离车体距离有0.8m 以上;黄色代表警告距离,表示离障碍物的距离只有0.6~0.8m;红色代表危险距离,表示离障碍物只有不到0.6m 的距离,你必须停止倒车。这种产品把数码和波段组合在一起,比较实用。但缺点是反应不够快,而且使用寿命较短。
第三代——液晶显示屏动态显示,这一代产品非常引人注目,特别是屏幕显示开始出现动态显示系统。它不用挂倒挡,只要发动汽车,显示器上就会出现汽车图案以及车辆周围障碍物的距离。其外表美观,可以直接粘贴在仪表盘上,安装很方便,给人以舒适的感觉,显示的距离也更准确些。相比其他倒车雷达产品,这种产品广为车主接受。但是,液晶显示器存在抗干扰能力不强的毛病,所以有时出现误报的情
第四代——魔幻镜倒车雷达,它结合了前几代产品的优点,采用了最新仿生超声雷达技术,配以高速电脑控制,可全天候准确地测知2m以内的障碍物,并以不同等级的声音提示和直观的显示提醒驾驶员。魔幻镜倒车雷达可以把后视镜、倒车雷达、免提电话、温度显示和车内空气污染显示等多项功能整合在一起,并设计了语音功能。因为其外形就是一块倒车镜,所以并不占用车内空间,直接可安装在车内后视镜的位置。当然,它的价格也相对较高。
第五代——整合影音系统,这是专为高档轿车生产的,它在上一代产品的基础上新增了很多功能。从外观上来看,这套系统比上代产品更精致和典雅;从功能上来看,它除了具备上代产品的所有功能之外,还整合了高档轿车具备的影音系统,可以在显示器上观看DVD影像。
可见汽车倒车雷达的技术发展已经比较成熟了。
2.3总体设计方案
本系统由89S51单片机、超声波发射电路、超声波接收电路、显示电路等部分组成。如图2-1所示
图2-1 总体设计框图
本设计以ATMEL公司生产的AT89S51为中心,通过AT89S51单片机控制超声波发射电路发出40KHz的超声波,与此同时单片机内计数器开始计时;经过延迟后开启超声波接收电路,当接收电路收到经障碍物反射的回波后,计数器计时结束。通过AT89S51单片机计算出即时距离,在显示电路显示出来,若低于警戒距离则开启报警。超声波发射电路和超声波接收电路是整个系统的基础;显示电路选用LED作为显示设备,一来价钱便宜,二来编程方便;报警电路选用蜂鸣器报警,也是从经济和编程的角度去考虑的。
2.4 Keil C51介绍
KEILC51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。C51编译器的功能不断增强,使你可以更加贴近CPU本身,及其它的衍生产品。C51已被完全集成到uVision2的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。uVision2 IDE可为它们提供单一而灵活的开发环境。
C51 V7版本是目前最高效、灵活的8051开发平台。它可以支持所有8051的衍生产品,也可以支持所有兼容的仿真器,同时支持其它第三方开发工具。因此,C51 V7版本无疑是8051开发用户的最佳选择。
2.4.1 uVision2集成开发环境
项目管理 ,工程(project)是由源文件、开发工具选项以及编程说明三部分组成的。一个单一的uVision2工程能够产生一个或多个目标程序。产生目标程序的源文件构成“组”。开发工具选项可以对应目标,组或单个文件uVision2包含一个器件数据库(device database),可以自动设置汇编器、编译器、连接定位器及调试器选项,来满足用户充分利用特定微控制器的要求。此数据库包含:片上存储器和外围设备的信息,扩展数据指针(extra data pointer)或者加速器(math accelerator)的特性。uVision2可以为片外存储器产生必要的连接选项:确定起始地址和规模。
集成功能uVision2的强大功能有助于用户按期完工。
1.集成源极浏览器利用符号数据库使用户可以快速浏览源文件。用详细的符号信息来优化用户变数存储器。
2.文件寻找功能:在特定文件中执行全局文件搜索。
3.工具菜单:允许在V2集成开发环境下启动用户功能。
4.可配置SVCS接口:提供对版本控制系统的入口。
5.PC-LINT接口:对应用程序代码进行深层语法分析。
6.Infineon的EasyCase接口:集成块集代码产生。
7.Infineon的DAVE功能:协助用户的CPU和外部程序。DAVE工程可被直接输入uVision2。
2.4.2部分编辑器和调试器
源代码编辑器,uVision2编辑器包含了所有用户熟悉的特性。彩色语法显像和文件辩识都对C源代码进行和优化。可以在编辑器内调试程序,它能提供一种自然的调试环境,使你更快速地检查和修改程序。
断点, uVision2允许用户在编辑时设置程序断点(甚至在源代码未经编译和汇编之前)。用户启动V2调试器之后,断点即被激活。断点可设置为条件表达式,变量或存储器访问,断点被触发后,调试器命令或调试功能即可执行。在属性框(attributes column)中可以快速浏览断点设置情况和源程序行的位置。代码覆盖率信息可以让你区分程序中已执行和未执行的部分。
调试函数语言, uVision2中,你可以编写或使用类似C的数语言进行调试。
内部函数:如printf, memset, rand及其它功能的函数。
信号函数:模拟产生CPU的模拟信号和脉冲信号(simulate analog and digital inputs to CPU)。
用户函数:扩展指令范围,合并重复动作。
变量和存储器,用户可以在编辑器中选中变呈来观察其取值。双层窗口显示,可进行以下调整:
1.当前函数的局部变量
2.用户在两个不同watch窗口页面上的自定义变量
3.堆栈调用(call stack)页面上的调用记录(树)(call tree)
4.不同格式的四个存储区
2.4.3 C51编译器
KEIL C51编译器在遵循ANSI标准的同时,为8051微控制器系列特别设计。语言上的扩展能让用户使用应用中的所有资源。
存储器和特殊功能寄存器的存取, C51编
译器可以实现对8051系列所有资源的操作。SFR的存取由sfr和sbit两个关键字来提供。变量可旋转到任一个地址空间。用关键字-at-还能把变量放入固定的存储器.存储模式(大,中,小)决定了变量的存储类型。连接定位器支持的代码区可达32个,这就允许用户在原有64K ROM的8015基础上扩展程序。在V2的编译器和许多高性能仿真器中,可以支持应用程序的调试。
中断功能, C51允许用户使用C语言编写中断服务程序,快速进、出代码和寄存器区的转换功能使C语言中断功能更加高效。可再入功能是用关键字来定义的。多任务,中断或非中断的代码要求必须具备可再入功能。
灵活的指针, C51提供了灵活高效的指针。通用指针用3个字节来存储存储器类型及目标地址,可以在8051的任意存储区内存取任何变量。特殊指针在声明的同时已指定了存储器类型,指向某一特定的存储区域。由于地址的存储只需1到2字节,因此,指针存取非常迅速。
2.4.4 测试程序
uVision2调试器具备所有常规源极调试,符号调试特性以及历史跟踪,代码覆盖,复杂断点等功能.DDE界面和shift语言支持自动程序测试.
CPU和外设模拟装置, uVision2为8051及衍生产品提供了高速CUP模拟功能和片上扩展口.在对话框内可直接观察和修改I/O值,也可以用预装的C-LIKE宏指令书写符号函数来提供动态输入。
目标监控器,uVision2含一个可配置的监控器,可测试目标器件上的软件体。监控器用uVision2的调试器直接工作,可支持代码区。它要求目标系统具备6字节堆栈空间,6KB的代码ROM和256字节Xdata RAM。
MCB517/251启动工具包,在开始一项8051工程时,MCB启动工具会对你有很大帮助。每一个启动工具包括一套2K字节的开发工具和许多可快速运行的举例程序。用户可在检测8051性能的同时,查看开发工具的可行性。MCB517AC板含高性能InfineonC517A单片机,它提供标准8052外围设备和A/D转换器,PWM,搜索/比较,8位数据指针,一个高速运算单元。同时包含对81C90CAN控制器和代码区的支持。
2.5 AT89S51简介
AT89S51是美国ATMEL公司生产的低功耗,高性能CMOS 8位单片机,片内含4K bytes的可系统编程的flash只读程序寄存器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。它集flash程序存储器既可在线编程(ISP)也可用传统方法进行编程及通用8位微处理器于单片芯片中,ATMEL公司的功能和强大,低价位的AT89S51单片机可提供许多高性价比的应用场合,可灵活用于各种控制领域。
2.5.1主要性能参数
与MCS-51产品指令系统安全兼容
4k字节在系统编程(ISP)FLASH闪速存储器
1000次擦写周期
4.0-5.5V的工作电压范围
全静态操作:0HZ—33MHZ
三级加密程序存储器
128×8字节内部RAM
32个可编程I/O口线
2个16位定时/计数器
6个中断源
全双工串行UART通道
低功耗空闲和掉电模式
中断可以从空闲模式唤醒系统
看门狗(WDT)及双数据指针
掉电标识和快速编程特性
灵活的在系统编程(ISP-字节或页写模式)AT89S51提供以下标准功能:4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个五向量两级中断结构,一个全双工,片内振荡器及时钟电路。同时,AT89S51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式件可选的节电工作模
图2-2 89S51引脚图
式。空闲方式停止CPU工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其他所有部件工作直到下一个硬件复位。引脚图如图2-2所示。
2.5.2 引脚功能说明
Vcc:电源电压
GND:地
P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对断口写“1”
可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节。而在程序检验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部上拉电阻把端口拉到高电平,此时可作输入口。作输出口使用时,因为存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流( )。
Flash编程和程序校验期间,P1口接受低8位地址。
P2口:P2是一个带内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部上拉电阻把端口拉到高电平,此时可作输入口。作输出口使用时,因为存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流( )。
在访问外部程序存储器或16位地址的外部数据存储器P2口送出高8位地址数据。在访问八位地址的外部数据存储器,P2口线上的内容(也即特殊功能存储器(SFR)区中R2寄存器)。在整个访问期间不改变。
FLASH编程或校验时,P2亦接受地址和其它控制信号
P3口:P3口是一组带有内部上拉电阻的八位双向I/O口,P3口输出缓冲级可驱动(吸收或输出电流)四个TTL逻辑门电路。对P3口写入“1”时。它们被内部上拉电阻拉高并可作为输入端口。作输入端时,被外部拉低的P3口将用上拉电阻输出电流(I )。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如表2-1所示。
表2-1 P3口的分配
端口引脚 第二功能
P3.0 RXD(串性输入口)
P3.1 TXD(串行输出口)
P3.2 (外中段0)
P3.3 (外中段1)
P3.4 (定时/计数器0)
P3.5 (定时/计数器1)
P3.6 (外部数据存储器写选通)
P3.7 (外部数据存储器读选通)
P3口还接受一些用于FLASH闪速存储器和程序校验的控制信号。
RST;复位输入。当振荡器工作时,RST引脚出现机器周期以上高电平将使单片机复位。
ALE:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低八位字节。即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是,每当访问外部数据存储器时将跳过一个ALE脉冲。
对Flash
存储器编程期间,该引脚还用于输入编程脉冲( )。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令ALE才会被激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。
:程序储存允许( )输出是外部程序存储器的读选通信号,当AT89C51由外部程序存储器取指令(或数据)时,每个机器周期两次 有效,即输出两个脉冲。在次期间,当访问外部数据存储器时,这两次有效的 信号不出现。
EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。
Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp。当然这必须是该器件是使用12V编程电压Vpp。
XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。
XTAL2:振荡器反相放大器的输出端。
当采用外部时钟时,外部时钟接到XTAL1端,即内部时钟发生器的输入端,XTAL2则悬空。若选用12M晶振,时钟周期为1微秒。
第3章 主程序设计原理
主程序设计按自上而下的设计理念。主程序主要完成初始化工作,对超声波发射和接收的控制,以及对计算和显示的控制。
主程序需要实现对两个定时器/计数器的设定、中断的开启关闭以及控制调用各子程序从而实现系统功能。
3.1 AT89S51的定时器/计数器的控制器
与定时器/计数器应用有关的控制寄存器有三个。
3.1.1 定时控制寄存器(TCON)
TCON寄存器既参与中断控制又参与定时控制。
TF0和TF1:计数器溢出标志位
当计数器计数溢出(计满)时,该位置“1”。使用查询方式时,此位为状态位以供查询,但应注意查询有效后,需用软件方法及时将该位清“0”;使用中断方式时,此位为中断标志位,在转向中断服务程序时由硬件自动清“0”。
TR0和 TR1:定时器运行控制位
TR0(TR1)=0 停止定时器/计数器工作
TR0(TR1)=1 启动定时器/计数器工作
该位根据需要以软件方法使其置“1”或清“0”。
3.1.2 工作方式控制寄存器(TMOD)
TMOD寄存器是一个专用寄存器,用于设定两个定时器/计数器的工作方式,但TMOD寄存器不能位寻址,只能用字节传送指令设置其内容。格式如下:
表3-1 TMOD寄存器格式
D7 D6 D5 D4 D3 D2 D1 D0
GATE C/T M1 M0 GATE C/T M1 M0
GATE:门控位
GATE=0由运行控制位TR启动定时器;
GATE=1由外中断请求信号(INT0和INT1)和TR的组合状态启动定时器。
C/T:定时方式或计数方式选择位
C/T=0定时器工作方式;
C/T =1计数器工作方式。
M1M0:工作方式选择位
M1M0=00 方式0,13位定时器/计数器工作方式;
M1M0=01 方式1,16位定时器/计数器工作方式;
M1M0=10 方式2,常数自动装入的8位定时器/计数器工作方式;
M1M0=11 方式3, 仅适用于T0,为两个8位定时器/计数器工作方式;在方式3时T1停止计数。
3.1.3中断允许控制器(IE)
中断允许寄存器格式如下:
表3-2 中断允许寄存器格式
D7 D6 D5 D4 D3 D2 D1 D0
EA — — ES ET1 EX1 ET0 EX0
寄存器中用于控制中断的共6位,可实现中断管理。EA为中断允许总控制位。EA=1时,CPU开中断;EA=0时,CPU屏蔽所有中断请求。
ES、ET1、EX1、ET0、EX0为对应的串行口中断、定时器/计数器1中断、外部中断1中断、定时器/计数器0中断、外部中断0中断的中断允许位。对应位为1时,允许其中断,对应位为0时,禁止其中断。
89S51单片机中断系统的管理是由中断允许控制EA和各中断源的控制位联合作用实现的,缺一不可。
3.2主程序设计
本系统需要实现功能有收发超声波、显示距离、计算距离、开启报警等。这些功能都需要主程序控制完成。收发超声波中用到的定时器/计数器需要在主程序中对其进行设置;通过调用计算子程序,可以计算出当前的距离;通过调用显示子程序显示当前的距离。程序流程如图3-1所示。
程序开始执行后,首先进行初始化:显示缓冲单元清“0”,接收成功标志位清“0”, T0、T1的工作方式的设定。在完成初始化后,CPU开中断,定时器1开中断,开外部中断0中断,并且开启定时器1用于65ms定时。
当65ms定时完成后,转入中断处理程序,也就是超声波发射程序,控制超声波发射器发射超声波。当收到回波信号后,接收成功标志位置“1”,这时候CPU关中
碍物,但不能确定障碍物离车有多远,对驾驶员帮助不大。第二代——数码波段显示,这代产品要先进得多,它安装在仪表台的位置,可以显示车后障碍物离车体的距离。如果是物体,在11 开始显示;如果是人,在11左右的距离开始显示;这一代产品有两种显示方式,数码产品显示距离数字,而波段显示产品由三种颜色来区别显示:绿色代表安全距离,表示障碍物离车体距离有11以上;黄色代表警告距离,表示离障碍物的距离只有0.6~0;红色代表危险距离,表示离障碍物只有不到的距离,你必须停止倒车。这种产品把数码和波段组合在一起,比较实用。但缺点是反应不够快,而且使用寿命较短。第三代——液晶显示屏动态显示,这一代产品非常引人注目,特别是屏幕显示开始出现动态显示系统。它不用挂倒挡,只要发动汽车,显示器上就会出现汽车图案以及车辆周围障碍物的距离。其外表美观,可以直接粘贴在仪表盘上,安装很方便,给人以舒适的感觉,显示的距离也更准确些。相比其他倒车雷达产品,这种产品广为车主接受。但是,液晶显示器,存在抗干扰能力不强的毛病,所以有时出现误报的情驾驶员。魔幻镜倒车雷达可以把后视镜、倒车雷达、驾驶员。魔幻镜倒车雷达可以把后视镜、倒车雷达、驾驶员。魔幻镜倒车雷达可以把后视镜、魔幻镜倒车雷达
图3-1 主程序原理图
断,调用计算子程序计算出当前距离。然后调用显示子程序,将当前距离显示在LED上。测量间隔一定时间后转入下一循环,继续执行。
第4章 超声波发射及接收程序的设计
超声波发射程序主要实现对超声波发射电路的控制,从实际的角度考虑,设计本汽车倒车超声波报警器的最远探测距离为11m,由公式(2-2)可计算出时间间隔约为65ms,为了
避免超声波发射端的声波直达到超声波接收端,必须在发射之后延迟一段时间,在实际设计的电路中,发射头和接收头的距离约为7cm所以最小探测距离设置为7cm,算出的时间间隔约为0.5ms,也就是说发射电路发射结束后0.5ms才能开启接收电路。
超声波接收程序完成对超声波接收电路的控制,通俗点说就是将收到回波的消息告诉单片机,并完成保存计数器值的功能。
两个程序都采用中断控制的方式设计,下面对AT89S51的中断系统及发射、接收中断程序做分别的介绍。
4.1 AT89S51中断系统
4.1.1 中断源
AT98S51共有5个中断向量:2个外中断(INT0和INT1),2个定时中断(TIMER0和TIMER1)和一个串行中断。
外部中断:INT0和INT1,它们的中断请求信号有效方式分别电平触发和脉冲触发两种。电平方式是低电平有效,脉冲方式为负跳变触发有效。
内部中断:内部中断有TF0、TF1、TI、RI,分别为定时器/计数器溢出中断和串行口的发送接收中断。
4.1.2 中断控制
89S51单片机设置了4个专用寄存器用于中断控制,用户通过设置其状态来管理中断系统,下面介绍下本设计中用到的3个中断控制寄存器。
1、定时器控制寄存器(TCON)
TCON的格式如下:
表4-1 TCON的格式
D7 D6 D5 D4 D3 D2 D1 D0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
在该寄存器中,TR1、TR0用于定时器/计数器的启动控制,其余6位用语中断控制,其作用如下:
IT0为外部中断0请求信号方式控制位,IT0=1为脉冲出发方式(负跳变有效);IT0=0为电平触发方式(低电平有效)。
IE0为外部中断0请求标志位。当CPU检测到INT0(P3.2)端有中断请求信号时,由硬件置位,使IE0=1请求中断,中断响应后转向中断服务程序时,由硬件自动清零。
IT1为外部中断1请求信号方式控制位,其作用同IT0。
IE1为外部中断1请求标志位,其作用同IE0。
TF0(TF1)为定时器/计数器溢出标志位。
2、中断允许控制寄存器(IE)
寄存器中用于控制中断的共6位,可实现中断管理。EA为中断允许总控制位。EA=1时,CPU开中断;EA=0时,CPU屏蔽所有中断请求。
ES、ET1、EX1、ET0、EX0为对应的串行口中断、定时器/计数器1中断、外部中断1中断、定时器/计数器0中断、外部中断0中断的中断允许位。对应位为1时,允许其中断,对应位为0时,禁止其中断。
3、中断优先级控制寄存器(IP)
中断优先级控制寄存器的格式如下:
表4-2 中断优先级控制寄存器的格式
D7 D6 D5 D4 D3 D2 D1 D0
— — — PS PT1 PX1 PT0 PX0
89S51中规定了两个中断优先级:高级中断和低级中断,用中断优先级寄存器(IP)的5位状态管理5个中断源的优先级别,即PS、PT1、PX1、PT0、PX0分别对应串行口中断、定时器/计数器1中断、外部中断1中断、定时器/计数器0中断、外部中断0中断,当相应位为1时,设置其为高级中断:相应位为0时,设置其为低级中断。通过对IP的设置可以为中断设置不同的优先级别。
4.2 超声波发射程序
对于超声波发射程序,设计采用中断控制的方式让超声波发射电路每隔65ms发射出一次超声波。单片机89S51的定时器T1设置为65ms的定时,控制本中断程序每65ms执行一次。该中断为定时器/计数器1溢出中断,入口地址为001BH。
每执行一次,单片机就控制超声波发射管发射一次超声波,在本系统中设计由单片机的P1.0口控制,对端口写“1”,通过内部上拉电阻把端口拉到高电平,此时可作输入口;作输出口使用时,因为存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。如上所说为避免发射的信号直达超声波接收器,发射结束后应该延迟一定时间,再开启接收中断。
程序流程图如图4-1所示。
碍物,但不能确定障碍物离车有多远,对驾驶员帮助不大。第二代——数码波段显示,这代产品要先进得多,它安装在仪表台的位置,可以显示车后障碍物离车体的距离。如果是物体,在11 开始显示;如果是人,在11左右的距离开始显示;这一代产品有两种显示方式,数码产品显示距离数字,而波段显示产品由三种颜色来区别显示:绿色代表安全距离,表示障碍物离车体距离有11以上;黄色代表警告距离,表示离障碍物的距离只有0.6~0;红色代表危险距离,表示离障碍物只有不到的距离,你必须停止倒车。这种产品把数码和波段组合在一起,比较实用。但缺点是反应不够快,而且使用寿命较短。第三代——液晶显示屏动态显示,这一代产品非常引人注目,特别是屏幕显示开始出现动态显示系统。它不用挂倒挡,只要发动汽车,显示器上就会出现汽车图案以及车辆周围障碍物的距离。其外表美观,可以直接粘贴在仪表盘上,安装很方便,给人以舒适的感觉,显示的距离也更准确些。相比其他倒车雷达产品,这种产品广为车主接受。但是,液晶显示器,存在抗干扰能力不强的毛病,所以有时出现误报的情驾驶员。魔幻镜倒车雷达可以把后视镜、倒车雷达、驾驶员。魔幻镜倒车雷达可以把后视镜、倒车雷达、驾驶员。魔幻镜倒车雷达可以把后视镜、魔幻镜倒车雷达
图4-1 超声波发射中断程序流程图
设计中每次发射,发射两次超声波脉冲,这可以通过对P1.0反复取反来控制,取4次就可以满足每次发送两个超声波脉,通过对取反次数位的设置可以控制每次发送脉冲的个数。超声波发出的同时计数器T0需要立即开启计数,这样才能保证测量的准确性。由于要避开从发射端直达接收段的超声波,需要延迟一定时间才开启接收,这样才能使系统正常工作,但使得近距离范围无法测量,出现“盲区”。
延迟0.5ms的子程序设计如下:
delay_250: push psw
mov r7, #0ffh
delay_250_1: djnz r7,delay_250_1 ;执行一次占用2个机器周期
pop psw
ret
4.3 超声波接收程序
对于超声波接收程序,也采用中断控制的方式。如上所说,当发射工作结束后经过0.5ms延时,开启回波接收中断,超声波接收中断为外部中断0中断。若超声波经障碍物放射回来被超声波接收管收到后,将脉冲送入CX20106红外接收芯片输入端放大,由CX20106输出端将遥控指令输出到单片机。在电路连接中用AT89S51单片机的 (外部中断0)脚接收该指令。当接收到指令后,转入中断服务程序,计数器
图4-2 超声波接收中断程序流程图
T0停止计数,此时T0的值就是超声波由发射头到达障碍物再由障碍物反射回接收头所使用的时间。程序
设计如下:外中断0,中断入口0003H,收到回波时进入。
这里使用内存44H、45H、46H用于计算距离,当收到回波时CX20106输出给单片机P3.2口一个低电平,中断程序开始工作,关计数器T0并将计数器的值放入内存单元以便下面计算使用,同时接收成功标志位置“1”,这是后面转入计算子程序的标志,最后计数器清“0”,中断结束。程序比较简单,主要是完成对计数值的保存,但这却是系统最重要的步骤。
第5章 计算程序和显示程序设计
5.1 实现功能
计算子程序需要将计数器值转化为即时距离,程序中包括两字节无符号数乘法程序和四字节/两字节除法程序两个子程序,通过对乘法、除法程序的调用将每位的结果存到显示缓冲单元。
显示子程序实现将计算的结果从89S51单片机送到LED数码管显示的功能,为了简化电路和降低成本,采用LED动态显示方式实现这一功能,一共需要显示四位。单片机的P0口送段选信号,P2口送位选信号。
5.2 计算子程序的设计
计算子程序主要实现对计数器值进行计算,和往显示缓冲单元存储数据的功
两字节无符号数乘法流程图
能。由于时钟周期为1× 秒,根据公式(2-2),可知数值计算主要完成“计数值×17/1000cm”的工作,其中涉及了乘法和除法,这里分别用两个子程序:两字节无符号数乘法程序和四字节/两字节无符号数除法程序来实现。
5.2.1 两字节无符号数乘法程序
实现R7R6R5R4 <= R3R2 ×R1R0,涉及到2个左移,R7R6R5R4的左移和R1R0的左移,大家都知道R7R6R5R4向左移一位为乘以2,,后者的左移控制“R7R6R5R4 + R3R2”一次还是“R7R6R5R4×2”一次,由于为两字节无符,循环次数为16次。程序方框图如图5-1所示。
下面用一组数据来验证这个算法,若R1R0=17,这个数据也是本程序所用到的R1R0的值。也就是R1R0=0000 0000 0001 0001,R1R0需要循环12次才能使C位第一次为1,第一次执行R7R6R5R4+R3R2,现在的R7R6R5R4也就等于R3R2,此时16自减为4,不为0,跳转到R7R6R5R4循环左移,也就是R7R6R5R4
乘以2,R1R0再左移,C不等于0,16自减为3,R7R6R5R4再乘以2……16自减为1,此时R7R6R5R4已经为R3R2的16倍,R1R0左移后C位为1,执行R7R6R5R4+R3R2此时的R7R6R5R4为R3R2的17倍,接下来16自减为0跳出两字节无符号数乘法子程序。
(c) R7R6R5R4循环左移 (d) 计算完成
图5-2 17乘以0808H部分计算流程
图5-2是R3R2为0808H也就是约为2ms时的部分计算流程。
5.2.2四字节/两字节无符号数除法程序
首先来了解一下2进制数是怎样完成除法运算的。
2进制完成除法运算就是移位和相减,比如1011011除以1110顺序如下:
1 - 1110不够减,结果添0,1左移一位再加上原来1后的0,为10。
10 - 1110不够减,结果添0,10左移一位再加上原来10后的1,为101。
101 - 1110不够减,结果添0,101左移一位再加上原来101后的1,为1011。
图5-3 四字节/两字节无符号数除法程序流程图
1011- 1110不够减,结果添0,1011左移一位再加上原来1011后的0,为10110。
10110- 1110= 1000结果添1,同上左移加原来10110后的1得10001。
10001 - 1110 = 11结果添1,同上左移加原来101101后的1得111。
111- 101不够减,结果添0,此时1011011所有位都已移完,运算完毕。
即 1011011 = 1110 ×0000110。
要完成R7R6R5R4/R3R2=R7R6R5R4(商)……R1R0(余数)这样一个四字节/两字节无符号数除法程序,应该怎样实现呢?注意到,当不够减的时候,结果添“0”,够的时候,结果添“1”,这正好和当时的“C”位值相反,可以通过观察“C”位来实现。还有,若够减的时候,减下的值要保留后再移位,不够减的时候,减法运算的结果是不被保留的,继续原来的值再移位,由于是四字节的数需要移位32次才能移完。
程序流程图如图5-3所示,整个程序的关键就是围绕“C”位进行处理,根据“C”位来判断减法运算的结果是否保留。通过运行调试,程序实现了除法的功能。
5.2.3 计算程序设计
现在已经能够计算出即时的距离了,在将计算值送到四个LED显示之前还
需要对显示缓冲单元的值再次进行调整,若最高位为“0”的时候我们不显示它,当距离小于1米的时候还需要开启报警功能,这里采用蜂鸣器来实现报警。程序方框图如图5-4所示。
先通过对上述两个子程序的调用计算出即时的距离,单位为厘米。再调用除法程序完成除以1000算出最高位,结果保存在寄存器R4中,余数保留在R1R0中。然后再将余数R1R0赋给R5R4,除以100算出次高位,以此类推算出次次高位,和最低位,通过编程判断是否将其对应的数码管电亮。若最高位为“0”,不点亮该灯;若次高位为“0”,先看最高为是否点亮,若最高位未被点亮,次高位也将不点亮,若最高位已被点亮,次高位点亮;同理接下来检查次次高位;最
后一位无论是否为“0”都将被点亮。
报警电路由放大器和蜂鸣器组成。当需要报警时AT89S51的P1.1口控制报警电路导通发出蜂鸣报警。
设计安全距离为1米,当低于一米时发出报警,注意到当低于1米时LED的最高位和次高位不点亮,所以可以在判断是否点亮次高位时确定是否发出报警,点亮说明高于1米,不点亮说明小于1米,立即开启报警。
图5-4 计算程序流程图
5.3 显示程序设计
经过主程序计算后待显示的结果存到了40H到43H,40H 为最高位,43H为最低位,设计采用先扫描最高位的方式,将40 H到43H依次显示在4个数码管。由于人眼的反应时间没有那么快,4个数码管看上去是同时点亮的。这里主要涉及两个重点注意的地方:第一,每位结果的值需要通过查表后才能送到P0口送显示;第二,P2控制循环点亮4个数码管,要设置好供移动的值。
显示子程序流程如图5-5所示。
图5-5显示子程序流程图
由于是共阳极七段码,当位选信号为“0”时驱动LED 点亮。如果将位选字设为“0101 1111”,此时LED0和LED2将被点亮,LED1和LED3不亮。考虑到需要循环显示四位数码管,每次点亮一位,位选字设置为“0111 1111”即可实现,通过对位选字的右移可以循环点亮四个LED,当位选字为“1110 1111”时表明四个
LED都被点亮了一次,这也是进入下一循环的标志。
LED显示器的七段码如下:
表5-1 共阳段码表
TAB 18H 7BH 2CH 29H 4BH 89H 88H 3BH 08H 09H 0FFH
共阳段码表值 0 1 2 3 4 5 6 7 8 9 不亮
第6章 系统调试及结论
本设计采用51汇编语言编写,采用Keil C51编译和调试,以及采用keil和proteus联调仿真。由于proteus仿真库里并无超声波仿真模型,因此这里采用光电二极管和光电三极管来代替超声波发送探头和超声波接收探头,且仿真中略去了超声波在空气中的传播过程。联调仿真后,发现数字电路的延迟效果比较明显,所以需要软件矫正。
由于超声波探头存在余震效应, 为避免余震产生的“虚假反射波”超声测距数据的采集与处理错误申请中断,超声波脉冲发射后,软件中设置了一段时间的延时,称为“死区”时间,“死区”形成了距离测量中的“盲区”,由于探头的性能误差,运行后要不断调整探头的“死区”。经过应用过程的调试,本系统的测量“盲区”控制在20cm内。
本报警系统由于受到超声波发射角度和环境温度、湿度等因素的影响,测量值和实际之间有一定的差异,原来理想的有效工作范围为7cm-11m,但经过联机调试实际的工作范围为20cm-8m,下面是联机测试的一些结果:
表6-1 联试结果1
实际值(cm) 700 300 90 50 30
LED显示结果 680 288 85 47 26
蜂鸣器 未鸣叫 未鸣叫 鸣叫 鸣叫 鸣叫
从上表可以看出,本报警器基本完成了显示和报警的功能,但也存在不少问题,测量精度不是很高,特别是距离较远的时候精度不能保证,这主要是由于所使用的声速与实际声速有差别造成的,但误差也不是很大,满足汽车倒车超声波报警器的基本要求。
表6-2 联试结果2
实际值(cm) 25 12 9 3
LED显示结果 24 20 20 20
从上表可以看出,本报警器的工作盲区为20cm。
本系统探测范围为0.2-8m,制作成本为150元左右,基本达到了汽车倒车报警器的设计要求,相信经过进一步改造后可以用于中低档车辆。若要使系统更加可靠,仍有一些需要改进之处:
1、温度对超声波速度的影响,改进方法是加入一个温度传感器,并对计算子程序做相应的修改。
2、超声波在传播过程中受空气对流及尘埃吸收的影响,使得远距离的回波难以检测,可以通过提高超声波探头功率来改进。
总结
本课题把硬件电路和电路软件有机的结合起来,完成了汽车倒车报警系统的设计,能够了解单片机技术的现状,而且通过对电路系统的设计,学习掌握了数字电路从原理图到PCB版的全部过程,形成完善的设计思路以及思想,并通过对汽车倒车超声波报警器的软件设计的过程,锻炼应用汇编语言等软件设计电路程序的能力为以后参与实际工作奠定良好的设计基础。
通过对系统程序的编写,进一步加深了对汇编语言的理解和操控能力,汇编语言的控制直接,实时性好,代码短。熟练掌握汇编有利于更好的理解单片机的结构,有利于充分地利用单片机的资源,有利于程序的调试。
设计中用到了现在应用非常广泛的计算机软件Keil C51等软件。Keil C51是51系列单片机学习和调试的常用软件,是众多单片机应用开发的优秀软件之一,它集编辑、编译、仿真于一体,支持汇编、PLM语言和C语言的程序设计,界面友好,易学易用。通过对这些软件的学习和使用使我能将所学与所用有机结合起来。在步入工作岗位之前得到全方位的工程设计训练。
通过对汽车倒车报警电路的设计能初步具有用PROTEL软件设计电路原理图以及电路版图的能力。与实际电路相结合,通过理论联系实际的方法,使所学的知识通过自己设计思考真正应用到实践中。通过该次设计能了解51系列的一些单片机的知识,能熟练运用PROTEL,Keil C51软件,提高了实际动手能力。
致 谢
本论文是在西南科技大学高频实验室中完成的。特别要感谢我的导师曾毅,曾老师不仅引导我进入单片机系统世界,悉心指导我作项目开发,还对我的软件设计方面认真辅导。曾老师对工作认真负责的作风和严谨的治学态度给我留下了深刻的印象,并将使我终生受益。
我也感谢大学四年期间所有指导过我的老师,感谢他们对我无私的教诲和帮助。
感谢我大学四年的同窗,是你们让我感受了大学的美好。和你们共同走过的这大学四年,我感到无比的快乐。
参考文献
[1] 胡汉才.单片机原理及其接口技术.清华大学出版社,1996
[2] 刘乐善.微型计算机接口技术及其应用.华中科技大学出版社,2001
[3] 张明友、吕幼新.信号与系统分析.电子科技大学出版社,1999
[4] 周明德.微型计算机系统原理及应用.清华大学出版社,1998
[5] 丁玉美、高西全.数字信号处理.西安电子科技大学出版社,1994
[6] 康华光、皱寿彬.电子技术基础数字部分(第四版).高等教育出版社,2000
[7] 马建国、孟宪元.电子设计自动化技术基础.清华大学出版社,2004
[8] 丁元杰.单片微机原理及应用.机械工业出版社,2002
[9] 何立民.MCS-51系列单片机应用系统设计系统配置与接口技术.北京航空航天大学出版社,1990
[10] 姜志海.单片机原理及应用.电子工业出版社,2005
[11] 彭容修.数字电子技术基础.武汉理工大学出版社,2003
[12] 丁鹭飞、耿富录.雷达原理.西安电子科技大学出版社,2005
[13] Huelaman,l.p.Basic circuit Theory(2nd dition).Prentice-Hall,Inc.,1984
[14]Rabiner L R and Gold B.Theory and Application of Digital signal Processing.Prentice-Hill Inc.,1975
[15]Rao.Guthikonda V.Microprocessora and micro computer system.Van Nostrand Reinhold company,1982
[16] Texas Instruments Incorporated.MAX3221 3V to 5.5V multichannelRS-232 line driver/ receiver ,2000.
[17] Alessio Carullo and Marco Pavis,"An Ultrasonic Sensor for Distance Measurement in Automotive Application,"IEEE SENSOR JOURNAL.VOL.1.NO.2.AUGUST 2001.
附录1 本设计的实物图
实物图
附录2 本设计的程序
本次设计的程序如下所示:
;测距范围7CM-11M,堆栈在4FH以上,20H用于标志
;显示缓冲单元在40H-43H,使用内存44H、45H、46H用于计算距离
;
VOUT EQU P1.0 ; 红外脉冲输出端口
speak equ p1.1
;********************************************
;* 中断入口程序 *
;********************************************
;
ORG 0000H
LJMP START
ORG 0003H
LJMP PINT0
ORG 000BH
reti
ORG 0013H
RETI
ORG 001BH
LJMP INTT1
ORG 0023H
RETI
ORG 002BH
RETI
;
;********************************************
;* 主 程 序 *
;********************************************
;
START: MOV SP,#4FH
MOV R0,#40H ;40H-43H为显示数据存放单元(40H为最高位)
MOV R7,#0BH
CLEARDISP: MOV @R0,#00H
INC R0
DJNZ R7,CLEARDISP ;;;;;;;;;;清零 40H-43H单元
MOV 20H,#00H
MOV TMOD,#11H ;T1为 T0为16位定时器
MOV TH0,#00H ;65毫秒初值
MOV TL0,#00H
MOV TH1,#00H
MOV TL1,#00H
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV R4,#04H ;超声波脉冲个数控制(为赋值的一半)
SETB PX0
SETB ET1
SETB EA
SETB TR1 ;开启测距定时器
start1: LCALL DISPLAY
JNB 00H,START1 ;收到反射信号时标志位为1
CLR EA
LCALL WORK ;计算距离子程序
clr EA
MOV R2,#32h ;#64H ;测量间隔控制
LOOP: LCALL DISPLAY
DJNZ R2,LOOP
CLR 00H
setb et0
mov th0,00h
mov tl0,00h
SETB TR1 ;重新开启测距定时器
SETB EA
SJMP Start1
;
;****************************************************
;* 中断程序* *
;****************************************************
;T1中断,发超声波用 ;T1中断,65毫秒中断一次
INTT1: CLR EA
CLR TR0
clr ex0
MOV TH0,#00H
MOV TL0,#00H
MOV TH1,#00H
MOV TL1,#00H
SETB ET0
SETB EA
SETB TR0 ;启动计数器T0,用以计
intt11:
CPL VOUT ;40KHZ
nop
nop
nop
nop
nop
nop
nop
nop
nop
DJNZ R4,intt11
;超声波发送完毕,
MOV R4,#04H
lcall delay_250 ;延时,避开发射的直达声波信号
SETB EX0 ;开启接收回波中断
RETIOUT: RETI
;外中断0,收到回波时进入
PINT0: nop
jb p3.2,pint0_exit
CLR TR0 ;关计数器
CLR EA ;
CLR EX0 ;
MOV 44H,TL0 ;将计数值移入处理单元
MOV 45H,TH0 ;
mov th0,#00h
mov tl0,#00h
jnb p3.2,$
SETB 00H ;接收成功标志
pint0_exit:
RETI
;
;****************************************************
;* 显示程序 *
;****************************************************
; 40H为最高位,43H为最低位,先扫描高位
DISPLAY: MOV R1,#40H ;G
MOV R5,#7fH ;G
PLAY: MOV A,R5
MOV P0,#0FFH
MOV P2,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DL1MS
INC R1
MOV A,R5
JNB ACC.4,ENDOUT;G
RR A
MOV R5,A
AJMP PLAY
ENDOUT: MOV P2,#0FFH
MOV P0,#0FFH
RET
;
TAB: DB 18h, 7Bh, 2Ch, 29h, 4Bh, 89h, 88h, 3Bh, 08h, 09h,0ffh
;共阳段码表 "0" "1" "2" "3" "4" "5""6" "7" "8" "9" "不亮""A""-"
;
;****************************************************
;* 延时程序 *
;****************************************************
;
DL1MS:
push 06h
push 07h
MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
pop 07h
pop 06h
RET
;
;****************************************************
;* 距离计算程序 (=计数值*17/1000cm) *
;****************************************************
;
work: PUSH ACC
PUSH PSW
PUSH B
MOV PSW, #18h
MOV R3, 45H
MOV R2, 44H
MOV R1, #00D
MOV R0, #17D
LCALL MUL2BY2
MOV R3, #03H
MOV R2, #0E8H
LCALL DIV4BY2
LCALL DIV4BY2
MOV 40H, R4
MOV A,40H
JNZ JJ0
MOV 40H,#0AH ;最高位为零,不点亮
JJ0: MOV A, R0
MOV R4, A
MOV A, R1
MOV R5, A
MOV R3, #00D
MOV R2, #100D
LCALL DIV4BY2
MOV 41H, R4
MOV A,41H
JNZ JJ1
MOV A,40H ;次高位为0,先看最高位是否为不亮
SUBB A,#0AH
JNZ JJ1
MOV 41H,#0AH ;最高位不亮,次高位也不亮
CPL speak; 小于1米时开启报警
JJ1: MOV A, R0
MOV R4, A
MOV A, R1
MOV R5, A
MOV R3, #00D
MOV R2, #10D
LCALL DIV4BY2
MOV 42H, R4
MOV A,42H
JNZ JJ2
MOV A,41H ;次次高位为0,先看次高位是否为不亮
SUBB A,#0AH
JNZ JJ2
MOV 42H,#0AH ;次高位不亮,次次高位也不亮
JJ2: MOV 43H, R0
POP B
POP PSW
POP ACC
RET
;
;****************************************************
;* 两字节无符号数乘法程序 *
;****************************************************
; R7R6R5R4 <= R3R2 * R1R0
;
MUL2BY2: CLR A
MOV R7, A
MOV R6, A
MOV R5, A
MOV R4, A
MOV 46H, #10H
MULLOOP1: CLR C
MOV A, R4
RLC A
MOV R4, A
MOV A, R5
RLC A
MOV R5, A
MOV A, R6
RLC A
MOV R6, A
MOV A, R7
RLC A
MOV R7, A
MOV A, R0
RLC A
MOV R0, A
MOV A, R1
RLC A
MOV R1, A
JNC MULLOOP2
MOV A, R4
ADD A, R2
MOV R4, A
MOV A, R5
ADDC A, R3
MOV R5, A
MOV A, R6
ADDC A, #00H
MOV R6, A
MOV A, R7
ADDC A, #00H
MOV R7, A
MULLOOP2: DJNZ 46H, MULLOOP1
RET
;
;****************************************************
;* 四字节/两字节无符号数除法程序 *
;****************************************************
;R7R6R5R4/R3R2=R7R6R5R4(商)...R1R0(余数)
;
DIV4BY2: MOV 46H, #20H
MOV R0, #00H
MOV R1, #00H
DIVLOOP1: MOV A, R4
RLC A
MOV R4, A
MOV A, R5
RLC A
MOV R5, A
MOV A, R6
RLC A
MOV R6, A
MOV A, R7
RLC A
MOV R7, A
MOV A, R0
RLC A
MOV R0, A
MOV A, R1
RLC A
MOV R1, A
CLR C
MOV A, R0
SUBB A, R2
MOV B, A
MOV A, R1
SUBB A, R3
JC DIVLOOP2 ;看是否够减,不够跳转,够R0,R1保留继续
MOV R0, B
MOV R1, A
DIVLOOP2: CPL C
DJNZ 46H, DIVLOOP1
MOV A, R4
RLC A
MOV R4, A
MOV A, R5
RLC A
MOV R5, A
MOV A, R6
RLC A
MOV
R6, A
MOV A, R7
RLC A
MOV R7, A
RET
;
delay_250:
push psw
push 07h
mov r7,#0ffh
delay_250_1:
nop
nop
nop
djnz r7,delay_250_1
pop 07h
pop psw
ret
;-----------------------
END