2022年出租车计价器课程研究设计

上传人:汽*** 文档编号:567310309 上传时间:2024-07-19 格式:PDF 页数:39 大小:958.54KB
返回 下载 相关 举报
2022年出租车计价器课程研究设计_第1页
第1页 / 共39页
2022年出租车计价器课程研究设计_第2页
第2页 / 共39页
2022年出租车计价器课程研究设计_第3页
第3页 / 共39页
2022年出租车计价器课程研究设计_第4页
第4页 / 共39页
2022年出租车计价器课程研究设计_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《2022年出租车计价器课程研究设计》由会员分享,可在线阅读,更多相关《2022年出租车计价器课程研究设计(39页珍藏版)》请在金锄头文库上搜索。

1、河南理工大学单片机应用与仿真训练设计报告出租车计价器姓名:学号:专业班级:电气 09 指导老师:所在学院:电气工程与自动化学院2012 年 5 月 10日摘要本设计是以AT89S52 单片机为核心,以A44E 霍尔传感器为信号采集传感器,采用 AT24C02 作为存储芯片,加上各种外围电路构成的出租车计价器。本设计采用霍尔传感器对轮胎转数进行计数,并将采集到的脉冲信号传输给单片机,单片机通过内部定时器对一定时间内的转动圈数进行一次统计,经计算实现对出租车速度、里程、应付金额等状态信息的测量。本设计采用了寄存器芯片 AT24C02,实现系统对单价、里程、等待时间等信息的存储,采用时钟芯片DS13

2、02 在正常及掉电的时候来显示时间和在系统需要时进行计时。本设计设置5 个按键为输入控制方式,分别控制查询、功能、单双成切换、暂停(结账)以及清零,输出显示采用了两个4 段数码管实现对时间、金额、里程的显示,设置了四个 LED 灯,分别为空车指示灯、等待查询指示灯、单双程指示灯。关键词单片机霍尔传感器出 租 车 计 价 器时钟Abstract This design use AT89S52 SCM as the core, with U18 Hall sensors for signal acquisition sensor, tire rotation to count, SCM calcu

3、lation for a taxi speed, processing realizes such status information measurement mileage. This design used a register AT24C02 chip, and realize the system in unit price, mileage, waiting time information storage, the clock DS1302 chip in normal and power lost time to display the time and in the syst

4、em needs to be carried out when the timer. The design for the input control buttons to way, output shows two of the four periods of digital nixie tube, lamp, and 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 39 页waiting for inquires empty car lamp, one-way lamps way. KeywordsAT89S52 SCM Hall

5、sensors Taximeter Clock 目录摘要 0目录 11 概述 21.1 设计目的、意义 21.2 AT89S52单片机功能简介 22 系统总体方案设计32.1 设计要求 32.1.1 基本要求 32.1.2 发挥部分 32.2 设计的主要功能 42.3 方案的选取 42.3.1 硬件设计方案 42.3.2 软件设计方案 53 硬件设计 53.1 AT89S52单片机及最小系统53.1.1 AT89S52单片机 53.1.2 单片机最小系统 73.2 测距单元 73.3 按键单元 93.4 时钟单元 103.5 显示单元 103.6 储存单元 134 软件设计 144.1 系统主

6、程序 144.2 数据处理子程序 144.3 等待时间计时子程序154.4 键盘扫描子程序 165Proteus软件仿真 166 课程设计体会 17参考文献 18附 1:源程序代码 19附 2:系统原理图 0精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 39 页1概述1.1 设计目的、意义随着经济的不断发展,人们的收入得到很大提高。人们便越来越追求生活的舒适与方便,而出行方式便是关切到人们生活质量的一个重要方面。在物价上涨的今天,相对于自己购买私家车,更多的人倾向于乘坐出租车出行。虽然现在有部分小城市尚未普及出租车,但随着城市建设日益

7、加快,象征着城市面貌的出租车行业也将加速发展。汽车计价器作为乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。它关系着交易双方的利益。具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。因此,汽车计价器的研究也是十分有一个应用价值的。本次设计的目的在于现在各大中城市出租车行业都已普及自动计价器,所以计价器技术的发展已成定局。采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。而采用单片机进行的设计,相对来说功能强大,是深化单片机应用的良好途径,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活

8、性强,可以通过软件编程来完成更多的附加功能。1.2AT89S52单片机功能简介计算机系统已明显地朝巨型化、单片化、网络化三个方向发展。巨型化发展的目的在于不断提高计算机的运算速度和处理能力,以解决复杂系统计算和高速数据处理,比如系统仿真和模拟、实时运算和处理。单片化是把计算机系统尽可能集成在一块半导体芯片上,其目的在于计算机微型化和提高系统的可靠性,这种单片计算简称单片机。单片机的内部硬件结构和指令系统主要是针对自动控制应用而设计的, 所以单片机又称微控制器MCU(Micro Controller Unit)。用它可以很容易地将计算机嵌入到各种仪器和现场控制设备中,因此单片机又叫做嵌入式微控制

9、器(Embedded MCU)。单片机自 20世纪 70 年代问世以来,以其鲜明的特点得到迅猛发展,已广泛应用于家用电器、智能玩具、智能仪器仪表、工业控制、航空航天等领域,经过30 多年的发展,性能不断提高,品种不断丰富,已经形成自动控制的一支中坚力量。据统计,我国的单片机年容量已达13亿片,且每年以大约16的速度增长,但相对于国际市场我国的占有率还不到1。这说明单片机应用在我国有着广阔的前景。对于从事自动控制的技术人员来讲,掌握单片机原理及其应用已经成为必不可少的学习任务。单片机的应用十分广泛,在工业控制领域、家电产品、智能化仪器仪表、计算机外部设备,特别是机电一体化产品中,都有重要的用途。

10、其主要的用途可以分为以下方面。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 39 页显示:通过单片机控制发光二极管或是液晶,显示特定的图形和字符。机电控制:用单片机控制机电产品做定时或定向的动作。检测:通过单片机和传感器的联合使用,用来检测产品或者工况的意外发生。通信:通过 RS-232串行通信或者是USB 通信,传输数据和信号。科学计算:用来实现简单的算法。那么单片机是不是解决上述应用的唯一选择呢?淡然不是!目前,在自动控制中,一般有三种选择,分别是嵌入式微机、DSP和单片机。单片机最明显的优点是价格便宜,从几元人民币到几十元人民币

11、。这是因为这类芯片的生产量很大,技术也很成熟。其次,单片机的体积也远小于其他两种方案。单片机本身一般用40 引脚封装,当然功能多一些的单片机也有引脚比较多的,如68引脚,功能少的只有10 多个或 20 多个引脚,有的甚至只有8只引脚。当然,单片机无论在速度还是容量方面都小于其他两种方案,但是在实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能。例如,控制电冰箱的控制器就不需要使用嵌入式系统,用一片51 就可以轻松实现。所以应用的关键是看能否够用,是否有很好的性能价格比。51 系列的单片机已经面世十多年,依然没有被淘汰,还在不断发展中,这就说明是他有广阔的应用前景。2系统总体方案设计2

12、.1 设计要求2.1.1 基本要求(1)能显示里程,单位为公里,最后一位为小数位。(2)能显示金额数,单位为元,最后一位为小数位。(3)可设定单程价格和往返价格,单程价格为2元/公里,往返价格为 1.5元/公里。(4)车速 5公里/小时的时间累积为总等待时间,每5分钟等待时间相当于里程数增加 1公里。(5)起步公里数为 3公里,价格为 5元,若实际距离大于 3公里,按规则 3计算价格。(6)按暂停键,计价器可暂停计价,按查询键,可显示总等待时间。2.1.2发挥部分(1)增加了空车指示功能,当无客人时,按下功能切换按键,空车指示灯精选学习资料 - - - - - - - - - 名师归纳总结 -

13、 - - - - - -第 4 页,共 39 页亮。(2)增加实时时间显示,无论计价器工作或者空车,都能显示实时时间,便于时间提醒。(3)增加信息储存功能。可以储存等待时间,里程和金额。2.2 设计的主要功能本设计所设计的出租车数字计价器的主要功能有:金额输出、路程输出、数据复位、计时计价、空车显示等。输出采用2个4位8段共阳数码管,车辆行走时前4位显示路程,后 4位显示金额。车辆候车时,前4位显示等待时间,后 4位显示等待金额。空车时显示实时时间。储存等待时间,里程和金额。2.3 方案的选取本设计是由软件设计和硬件设计两部分组成的。软件设计要进行程序的编写和软件仿真;硬件设计要设计电路、硬件

14、仿真和制作电路板。2.3.1 硬件设计方案本系统的硬件设计主要包括单片机AT89S52、数据显示部件、 U18霍尔传感器电路、里程计算及计价单元的设计。在硬件设计过程中,充分利用各部件的功能,实现多功能的出租车计价器设计。计价器的单片机系统框图如图1所示。它由以下几个部件组成:霍尔传感器单元、 AT89C52单片机、金额显示、里程显示、电源。利用单片机丰富的IO端口,及其控制的灵活性,实现基本的里程和价格的计算及显示功能。霍尔传感器信息存储按键单片机数据显示时钟显示状态显示图1 计价器系统框图精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,

15、共 39 页2.3.2软件设计方案本设计程序的采取 C语言进行编写,使用 Keil uVision4 编译和 Proteus7.4a 仿真软件进行仿真调试。其中的里程计算和费用计算方案如下。1、里程计算(1)霍尔传感器对车轮进行信号检测,产生并输出脉冲信号到单片机;(2)单片机对传感器输出的脉冲信号进行计数,并进行km计算:每一个信号代表轮胎旋转一周,设轮胎的周长为1.57m ;每km产生的信号数为 N ,里程显示为 N 1.57m = 1.57N(km)2、费用计算(1)出租车的起步费为 5元,并且 3km内不需额外计价;(2)出租车行驶 3km后,单程 2元/km,双程 1.5元/km。(

16、3)等待收费的标准为 5分钟算一公里;(4)暂停时计价器暂停计价,不收费用。3硬件设计本设计的硬件设计包括单片机AT89S52单元、测距单元、显示单元(数码管显示金额、等待时间和里程,指示灯对单双程切换指示、空车指示、等待计时指示)、按键单元、时钟单元和储存单元。3.1 AT89S52 单片机及最小系统3.1.1AT89S52单片机AT89S52具有如下特点: 40个引脚, 4k Bytes Flash 片内程序存储器, 128 bytes的随机存取数据存储器( RAM ),32个外部双向输入 /输出( I/O)口,5个中断优先级 2层中断嵌套, 2个16位可编程定时计数器 ,2个全双工串行通

17、信口,看门狗( WDT)电路,片内时钟振荡器。P0口有二个功能:1、外部扩展存储器时,当做数据/地址总线。2、不扩展时,可做一般的I/O使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻。P1口只做 I/O口使用:其内部有上拉电阻。P2口有两个功能:1、扩展外部存储器时,当作地址总线使用。2、做一般 I/O口使用,其内部有上拉电阻。 P3口有两个功能:除了作为I/O使用外(其内部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 39 页图2 AT89S52引脚图图3 AT89S5

18、2封装图设计中用到的单片机各管脚(图2)功能以及与其他模块连接介绍如下:VCC:接+5V电源。 VSS:接地。时钟引脚: XTAL1 和XTAL2 两端接晶振和 30PF的电容,构成时钟电路。它可以使单片机稳定可靠的运行。RST:复位信号输入端,高电平有效。当在此引脚加两个机器周期的高电平时,就可以完成复位操作。P1.0:接功能按键。P1.1:接切换键,表示单双程切换。P1.2:接查询(上次金额)键。P1.3:接清零键。P1.4:接空车指示灯。P1.5:接查询指示灯。P1.6:接开始计时指示灯。P1.7:接双程指示灯。P3.0:接查询 /确认键。P0口接数码管段选端, P2口接数码管位选段。P

19、3.2:接霍尔传感器的输出口。P3.3:接存储器的 SCL口。P3.4:接储存器的 SDA口。P3.5:接时钟电路 DS1302的RST口。P3.6:接DS1302的SCLK口。P3.7:接DS1302的I/O口。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 39 页3.1.2单片机最小系统复位电路和晶振电路是 AT89S52工作所需的最简外围电路。单片机最小系统电路图如图 4所示。图4 单片机最小系统AT89S52 的复位端是一个史密特触发输入,高电平有效。RST端若由低电平上升到高电平并持续 2个周期,系统将实现一次复位操作。在复

20、位电路中,按一下复位开关就使在 RST端出现一段时间的高电平,外接11.0592M 晶振和两个30pF 电容组成系统的内部时钟电路。3.2 测距单元本次设计我们选取了霍尔传感器来进行里程测量。霍尔器件是一种磁传感器。用它们可以检测磁场及其变化,可在各种与磁场有关的场合中使用。霍尔器件以霍尔效应为其工作基础。霍尔器件具有许多优点,它们的结构牢固,体积小,重量轻,寿命长,安装方便,功耗小,频率高,耐震动,不怕灰尘、油污、水汽及盐雾等的污染或腐蚀。霍尔器件分为:霍尔元件和霍尔集成电路两大类,前者是一个简单的霍尔片,使用时常常需要将获得的霍尔电压进行放大。后者将霍尔片和它的信号处理电路集成在同一个芯片

21、上。本次设计选取了霍尔集成电路来测量里程。里程测量是通过将霍尔传感器的集成电路安装在车轮上方的铁板上,将磁铁安装在车轮上,旋转的车轮将磁铁对准集成电路时,霍尔传感器会输出一个脉冲信号,送到单片机,经过单片机的计算处理,将行驶的里程送到显示单元精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 39 页并显示出来。其原理示意图如下:单片机霍尔传感器出租车车轮小磁铁图5 传感器测距示意图A44E是一种利用霍尔效应做成的半导体集成电路器件,它被设计在交变磁场中运行,特别是能在低电源电压和长时间运行温度范围可达到125。这种霍尔IC可用作各种类型的

22、传感器(速度传感器、位移传感器、转速传感器等等),接触开关以及相类似的应用场合。其工作电压比较宽(2.520V),可运行在较大的温度范围内(-20125), 其输出的信号符合 TTL电平标准,可以直接接到单片机的 IO 端口上,而且其最高检测频率可达到1MHZ 。霍尔传感器的特性如图 6所示,其中 BOP为工作点“开”的磁感应强度,BRP为释放点“关”的磁感应强度。当外加的磁感应强度超过动作点BOP时,传感器输出低电平,当磁感应强度降到动作点BOP以下时,传感器输出电平不变,一直要降到释放点 BRP时,传感器才由低电平跃变为高电平。BOP与BRP之间的滞后使开关动作更为可靠。U18集成霍耳开关

23、由稳压器 A、霍耳电势发生器 (即硅霍耳片 )B、差分放大器C、施密特触发器 D和OC门输出 E五个基本部分组成。在输入端输入电压 VCC,经稳压器稳压后加在霍尔电势发生器的两端,根据霍尔效应原理,当霍尔片处在磁场中时,在垂直于磁场的方向通以电流,则与这二者相垂直的方向上将会产生霍尔电势差VH输出,该 VH信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC门输出。当施加的磁场达到工作点(即 Bop)时,触发器输出高电压(相对于地电位),使三极管导通,此时 OC门输出端输出低电压,三极管截止,使OC门输出高电压,这种状态为关。这样两次电压变换,使霍尔开关完成了一次开关动作。精选学习资

24、料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 39 页图6 A44E霍尔传感器和其输出特性A44E霍尔传感器有 3个外接口, 2个是电源的正负极接口,最后一个是脉冲信号输出口,只要将霍尔传感器的信号输出端接到单片机的端口上便可以实现距离检测。其中,单片机的 P3.2(INT0)引脚作为信号的输入端,采用外部中断0进行计数。车轮每转一圈,霍尔传感器就产生一个脉冲信号,根据霍尔效应原理,当霍尔片处在磁场中时,霍尔传感器的输出端输出低电平。当车轮转动一圈时小磁铁提供一个磁场,则霍尔传感器输出一次低电平完成一次数据采集,从而产生信号。霍尔传感器检测并输

25、出信号到单片机的INT0或INT1计算脉冲输入端,引起单片机的中断,对脉冲计数,当计数达到特定的次数时,里程就会增加,单片机对里程进行计算后,通过接口电路将计算好的结果传送到数码管并显示出来。3.3 按键单元本设计的按键单元电路(如图7)有5个按键,功能分别是: S1是空车时查询上次金额和里程以及等待时间,结账时查询本次金额和里程以及等待时间。S2功能键,不按时空车指示灯亮而且数码管显示实时时间,按下时可设置单双程,此时再按 S3可进行单程和双程之间切换,再按S1可确认单双程,双程时双程指示灯亮并开始计价;按下S4可对本次金额、里程以及等待时间进行查询;S5为清零键,按下时清零之前数据消除以及

26、存储本次信息。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 39 页图 7 按键单元电路3.4 时钟单元本设计采用基于 DS1302的时钟电路(如图 8)对时间进行实时显示,单片机掉电对其没有影响。用数码管表现出来,当出租车空车时就显示时间,给人时间提示。图 8 时钟电路单元3.5 显示单元本设计显示单元包括两部分:数码管显示(图11)和二极管指示显示(图12)。数码管显示部分使用两个四位一体的LED数码管, LED显示器是由 LED发光二极管发展过来的一种显示器件,是发光二极管的改型。LED是发光二极管的简称,是一种将电能转换成光

27、能的设备。本身也是一种光源。LED显示器是由发光二极管排列组成的显示器件。它采用低电压扫描驱动,具有:耗电少、使用寿命长、成本低、故障少、视角大、可视距离远等特点。此外,它的响应时间短(一般不超过0.1us),亮度也比较高。它的缺点是工作电流比较大,每一段的工作电流在10mA左右。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 39 页其中每位数码管是由 8个发光二极管演变而来,其中7个发光二极管构成 7笔字形,另一个构成小数点,称为8段LED。8段LED数码管是利用 7个LED(发光二极管)外加一个小数点的LED组合而成的显示设备,

28、可以显示09等10个数字和小数点,使用非常广泛,它的外观如图9所示:图9 8段数码管这类数码管可以分为共阳极(8个发光二极管的阳极接在起)与共阴极 (8个发光二极管阴极连在一起)两种,共阳极就是把所有LED的阳极连接到共同接点,而每个 LED的阴极分别为 a、b、c、d、e、f、g及dp(小数点);共阴极则是把所有 LED的阴极连接到共同接点,而每个LED的阳极分别为 a、b、c、d、e、f、g及dp(小数点),如图 10所示。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 39 页图10 共阳和共阴数码管结构通过控制这个公共端,可使

29、该位亮或暗。如共阴极端接地或共阳极接高电平,则该位显示器有效,反之无效。本设计采用共阴LED数码管。数码管有静态显示和动态显示两种,这里采用动态显示。它具有低功耗、接口少等特点。如图 11两个四位一体数码管接 P0口作为段选,接 P2口作为位选。空车时显示时间,开始计价时前四位显示路程,后四位显示价钱。当查询等待时间时显示为等待时间。图 11 显示单元(数码管显示部分)二极管指示部分包括空车指示灯、等待时间查询指示、开始计时指示和双程指示如图 12。这些指示灯能对出租车的每一种状态进行指示,空车时空车指示灯亮,查询等待时间时等待时间查询指示灯亮,当汽车速度小于5km/h时开始计时,计时指示灯亮

30、。计价前如果按下双程键双程指示灯亮,表示为双程。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 13 页,共 39 页图 12 显示单元(二极管指示部分)3.6 储存单元存储单元的作用是储存上一次的里程、金额和等待时间。AT24C02 是Atmel公司的1KB的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到 2.5V,额定电流为 1mA,静态电流 10uA(5.5V),芯片内的资料可以在断电的情况下保存 40年以上,而且采用 8 脚的DIP 封装,使用方便。图13 储存单元电路图中R3、R4 是上拉电阻,其作用是减少AT24C02

31、 的静态功耗。由于AT24C02的数据线和地址线是复用的,采用串口的方式传送数据,所以只用两根线SCL(时钟脉冲)和 SDA(数据 /地址)与单片机 P3.3和P3.4口连接,进行传送数据。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 14 页,共 39 页4软件设计本系统的软件设计主要分为系统主程序、数据处理子程序、等待时间及时子程序和键盘扫描子程序五个模块,下面对每一块进行介绍。4.1 系统主程序本设计中,软件设计采用模块化操作,利用各个模块之间的相互联系,在设计中采用主程序调用各个子程序的方法,使程序通俗易懂,我们设计了整体程序流程图。在m

32、ain函数编写开始,要进行初始化,包括对系统初始化和对硬件设备进行初始化,并使硬件处于就绪状态。在主程序模块中,需要完成对各接口芯片的初始化、出租车起价和单价的初始化、中断向量的设计以及开中断、循环等待等工作。系统流程图如下图14。开 始初始化数据处理键盘扫描结束图 14 系统主程序流程图4.2 数据处理子程序每当霍尔传感器输出一个低电平信号就使单片机中断一次,在计数中断服务程序,里程和金额都相应变化,当然等待时间也换算成里程(当速度小于5km/h时5分钟想当于 1公里)。计算程序根据里程数分别进入不同的计算公式。如果里程大于 3公里,则执行公式:金额 =(里程 -3)*单价+5;否则,执行公

33、精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 15 页,共 39 页式:总金额 =起步价。程序流程图如图 15所示。开 始计算里程里程 5公里/小时 ?开始计时,并显示Speed5公里/小时 ?清零键按下?显示等待时间查询键按下 ?停止计时、计费,显示金额否是是是否精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 16 页,共 39 页图 16 等待时间计时子程序4.4 键盘扫描子程序键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结

34、束再返回。流程图如图 17。开始功能键按下?存储金额结算金额显示查询键按下?清零键按下?按下两次?确认键按下?切换单双程切换键按下?单双程设置显示上次金额查询键按下?显示时间显示等待时间与里程结算键按下?空车指示灭,开始计价计时显示里程价格是是否是否否是是是否否是否是图 17 键盘扫描子程序5Proteus软件仿真本设计需要用 Keil uVision4 对C51程序进行编译,生成“ .hex”文件 ,如图18 :精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 17 页,共 39 页图 18 Keil uVision4编译在Proteus 软件中画

35、出仿真电路(如图19),把 Keil uVision4 编译后生成的“.hex”导入到单片机中,按“运行仿真”键进行仿真。图 19 Proteus仿真6课程设计体会在本次单片机课程设计中,经过讨论,我们选择的设计内容是以AT89S52精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 18 页,共 39 页芯片为核心的出租车计价器,计价器的功能是以按键为输入控制方式,实现对汽车运行过程中状态信息的测量,主要包括等待时间、金额和里程等,并实现对这些信息进行存储及显示处理等功能。在完成整个课程设计的过程中,我们遇到了许多困难,但在解决困难的同时,我们也收获

36、了许多,现在就将在整个课程设计过程中的几点收获与体会总结如下:1、巩固了单片机使用、 C 语言编程等专业知识由于单片机课程是在上学期修的,之后的这段时间也没有使用单片机实际的做一些设计,很多单片机的知识以及C 语言的编程方法已经不是能很熟练的应用。因此,选题后我们便开始复习单片机方面的知识,同时也通过各种方式查阅、搜索了很多相关资料。从总体设计与具体设计,从电路焊接到调试完成,在整个过程中,我们学会了基本的单片机开发技能。2、熟悉了 Proteus 、Keil uVision4 、word2010、viso2010等软件的操作从开始设计到最终完成设计,我们使用了仿真软件Proteus和编程软件

37、 Keil uVision4 对电路及程序进行调试。由于不熟练,开始时各种问题层出不穷,有时一个小问题便让我们困惑半天,我们查阅相关资料,请教他人最终才得以解决。通过编写程序,我们深刻意识到采用模块化的设计思想的重要性,它方便编写、修改与调试,另外加上必要的注释,便于交流与理解。通过后期的文档整理,我们熟悉了为我们对word2010、viso2010 办公室软件的操作,为我们今后的工作学习打下了良好基础。3、锻炼了团队协作能力在整个设计的过程中,我们两人通力合作。本着以学习知识为重,完成课程设计内容次之的原则,先是一人做硬件设计,一人做软件设计。在对各自分工的内容有了较深的了解之后,我们便互相

38、交流,将对各自所负责内容的理解与遇到的问题告诉对方,然后共同寻找问题的解决方法。在对方遇到困难时,我们互相鼓励,互相帮助,培养了对他人的耐心尊重与关怀。本次设计我们学习到不少专业内外的知识,但由于自己的理论知识水平有限,实践知识和设计经验不足,在设计过程中难免存在一些问题。所焊实物尚有许多不足,个别功能还不能很好的实现,主要原因是考虑问题不周全,电路设计经验少,实际动手能力不足。恳请各位老师批评指正,以使我们在以后的学习和实践中加以改进和提高。参考文献【1】 戴佳,陈斌,苗龙.51单片机应用系统开发典型实例.中国电力出版社 ,2005 【2】 余发山 ,王福忠 .单片机原理及应用技术 .中国矿

39、业大学出版社 ,2008.6 【3】 侯玉宝 ,陈忠平 ,李成群 .基于 Proteus 的 51 系列单片机设计与仿真 .电子工业出版社 ,2008 【4】 李玉梅 .基于 MCS-51 系列单片机原理的应用设计.国防工业出版社 ,2006 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 19 页,共 39 页【5】 边春元 ,李文涛 ,江杰 .C51 单片机典型模块设计与应用.机械工业出版社,2008 【6】 楼然苗 ,胡佳文 ,李光飞等 .单片机实验与课程设计 .浙江大学出版社 ,2010.10 【7】 段晨东 .单片机实用技术教程 .清华大

40、学出版社 ,2008 【8】 王晓明 .单片机接口技术 .北京航空航天大学出版社 ,2007 【9】 王晓敏 .传感器检测技术及应用 .北京大学出版社 ,2010 【10】吴红 星 .电机驱动与控制专用集成电路及应用 .中国电力出版社,2006 附 1:源程序代码#include #include #define uint unsigned int #define uchar unsigned char #define DanJia_DanCheng 20 #define DanJia_WangFan 15 #define LunJing 5 /* 车轮直径0.5m*/ #define Lun

41、Chang 1.57/m 3.14*0.5 /* 状态码定义*/ #define KongChe_flag 0 #define JinEr_LiCheng_flag 1 #define ShiJian_flag 2 #define DanJia_flag 3 /* ds1302 地址定义*/ #define WRITE_SECOND 0x80 #define WRITE_MINUTE 0x82 #define WRITE_HOUR 0x84 #define READ_SECOND 0x81 #define READ_MINUTE 0x83 #define READ_HOUR 0x85 #def

42、ine WRITE_PROTECT 0x8E /* AT24C02 */ 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 20 页,共 39 页#define OP_READ 0xa1 / 器件地址以及读取操作#define OP_WRITE 0xa0 / 器件地址以及写入操作/* 引脚定义*/ sbit Function_Key=P10 。sbit QieHuan_Key=P11 。sbit ZanTing_Key=P12 。sbit Clear_Key=P13 。sbit ChaXun_QueRen_Key=P30 。sbit KongChe_

43、Led=P14 。sbit ChaXun_Led=P15 。sbit JiShi_Led=P16 。sbit DanShuang_Led=P17 。/位寻址寄存器定义sbit ACC_7 = ACC7 。sbit SCLK = P36 。 / DS1302 时钟信号 7 脚sbit DIO= P37 。 / DS1302 数据信号 6 脚sbit CE = P35 。 / DS1302 片选 5 脚sbit SDA = P34 。sbit SCL = P33 。uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

44、0x40。uchar code wei=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f。uchar data dis1=0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00。 /时分秒显示缓冲区uchar data chuzhi=0x00,0x00,0x00。 /时分秒初值uchar data time1302=0x00,0x00,0x00,0x00,0x00,0x00,0x00。uint data Count=0 。uint data Count1=0,Count2=0 。uchar data DanJia=DanJia_DanChe

45、ng。 /默认单程价格uint data LiCheng=0 。uint data JinEr=0 。uchar data Second。uint data Minute 。uint data Speed=0。uint data Old_Count,New_Count 。uchar i=0,j=0,k=0,n=0 。uint data_temp 。bit KaiShiFlag=0 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 21 页,共 39 页bit JiShiFlag=0 。bit ChaXunFlag=0 。uint ZanTingFl

46、ag=0 。bit JinErFlag=0 。void start() 。void stop() 。unsigned char shin() 。bit shout(uchar write_data) 。unsigned char read_random(uchar random_addr) 。void write_byte(uchar addr, uchar write_data) 。void delayms(uchar ms) 。void data_process()。void fill_byte(uchar fill_data,uchar n)。void delay(uint x) uin

47、t y 。while(x-) for(y=110 。y0。y-)。 /* at24c02 程序 */ void start() / 开始位 SDA = 1 。SCL = 1。_nop_()。_nop_()。SDA = 0 。_nop_()。_nop_()。_nop_()。_nop_()。SCL = 0。 void stop() / 停止位精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 22 页,共 39 页 SDA = 0 。_nop_()。_nop_()。SCL = 1。_nop_()。_nop_()。_nop_()。_nop_()。SDA =

48、1 。 uchar shin() / 从 AT24Cxx 移入数据到MCU unsigned char i,read_data。for(i = 0 。 i 8 。 i+) SCL = 1。read_data = 1。read_data |= (unsigned char)SDA 。SCL = 0。 return(read_data)。 bit shout(unsigned char write_data) / 从 MCU 移出数据到AT24Cxx unsigned char i。bit ack_bit 。for(i = 0 。 i 8 。 i+) / 循环移入8 个位 SDA = (bit)(

49、write_data & 0x80)。_nop_()。SCL = 1。_nop_()。_nop_()。SCL = 0。write_data = 1 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 23 页,共 39 页 SDA = 1 。/ 读取应答_nop_()。_nop_()。SCL = 1。_nop_()。_nop_()。_nop_()。_nop_()。ack_bit = SDA 。SCL = 0。return ack_bit 。/ 返回 AT24Cxx 应答位 void write_byte(uchar addr, uchar write

50、_data) / 在指定地址addr 处写入数据write_data start()。shout(OP_WRITE) 。shout(addr)。shout(write_data) 。stop()。delayms(10)。/ 写入周期 uchar read_current() / 在当前地址读取 uchar read_data。start()。shout(OP_READ) 。read_data = shin()。stop()。return read_data。 uchar read_random(unsigned char random_addr) / 在指定地址读取 start()。shout

51、(OP_WRITE) 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 24 页,共 39 页shout(random_addr) 。return(read_current() 。 void fill_byte(uchar fill_data,uchar n) / 填充数据fill_data 到 EEPROM 内 uchar i 。for(i = 0 。 i n 。 i+) write_byte(i, fill_data)。 void delayms(uchar ms) unsigned char i。while(ms-) for(i = 0 。

52、i 0。 i- ) / 循环 8 次移位 SCLK = 0 。temp = addr。DIO = (bit)(temp&0x01)。 /每次传输低字节addr = 1 。 /右移一位SCLK = 1 。 /发送数据for ( i=8 。 i0。 i- ) SCLK = 0 。 temp = dat。 DIO = (bit)(temp&0x01)。 dat = 1 。 SCLK = 1 。 SCLK=1 。CE = 0。 */ /数据读取子程序unsigned char Read1302 ( unsigned char addr ) unsigned char i,temp,dat1,dat2。

53、 CE=0。 SCLK=0 。 CE = 1 。 /发送地址 for ( i=8 。 i0。 i- ) / 循环 8 次移位 SCLK = 0 。 temp = addr 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 27 页,共 39 页 DIO = (bit)(temp&0x01)。 /每次传输低字节 addr = 1 。 /右移一位 SCLK = 1 。 /读取数据 for ( i=8 。 i0。 i- ) ACC_7=DIO 。 SCLK = 1 。 ACC=1 。 SCLK = 0 。 SCLK=1 。 CE=0。 dat1=ACC

54、。 dat2=dat1/16。 /数据进制转换 dat1=dat1%16。 /十六进制转十进制 dat1=dat1+dat2*10 。 return (dat1) 。 /初始化 DS1302(选择性使用 ) /*void init1302(uchar s,uchar m,uchar h,uchar d,uchar mon,uchar y) Write1302 (WRITE_PROTECT,0X00)。 /禁止写保护Write1302 (WRITE_SECOND,s)。 /秒位初始化Write1302 (WRITE_MINUTE,m)。 /分钟初始化Write1302 (WRITE_HOUR,h

55、)。 /小时初始化/Write1302 (0x80,0x80) 。 /时钟暂停Write1302 (0x86,d) 。/日初始化Write1302 (0x88,mon) 。/月初始化Write1302 (0x8c,y) 。/年初始化Write1302 (WRITE_PROTECT,0x80)。 /允许写保护 */ void show_time() chuzhi2=Read1302(0x81) 。chuzhi1=Read1302(0x83) 。chuzhi0=Read1302(0x85) 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 28 页,共

56、 39 页dis17=chuzhi2%10 。dis16=chuzhi2/10 。 dis14=chuzhi1%10 。dis13=chuzhi1/10 。 dis11=chuzhi0%10 。 dis10=chuzhi0/10 。seg_show(7,dis17,9) 。 delay(1)。 seg_show(6,dis16,9) 。delay(1)。 seg_show(5,10,9)。delay(1)。 seg_show(4,dis14,9) 。delay(1)。 seg_show(3,dis13,9) 。delay(1)。 seg_show(2,10,9)。delay(1)。 seg_s

57、how(1,dis11,9) 。delay(1)。 seg_show(0,dis10,9) 。delay(1)。 /* 按键扫描函数 */ void keyscan() uint m=0,LastJinEr4=0,last1=0,LastLiCheng4=0,last2=0,LastMinute3=0,last3=0,LastSecond2=0,last4=0。if(KaiShiFlag=0) if(ChaXun_QueRen_Key=0) ChaXun_Led=0 。delay(5)。if(ChaXun_QueRen_Key=0) while(ChaXun_QueRen_Key=0) 。Ji

58、nErFlag=1 。n+。if(n=3) n=0。 ChaXun_Led=1 。 JinErFlag=0 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 29 页,共 39 页 if(JinErFlag=1) for(m = 4 。 m 0。 m-) LastJinErm-1=read_random(m) 。 last1=LastJinEr3+LastJinEr2*10+LastJinEr1*100+LastJinEr0*1000。for(m = 8 。 m 4。 m-) LastLiChengm-5=read_random(m) 。 last

59、2=LastLiCheng3+LastLiCheng2*10+LastLiCheng1*100+LastLiCheng0*1000。for(m = 11 。 m 8。 m-) LastMinutem-9=read_random(m) 。 last3=LastMinute2+LastMinute1*10+LastMinute0*100。for(m = 13 。 m 11。 m-) LastSecondm-12=read_random(m) 。 last4=LastSecond1+LastSecond0*10 。if(n=1) show_nint(4,last1,4,6) 。 show_nint(

60、0,last2,4,2) 。 if(n=2) seg_show(5,10,9)。show_nint(2,last3,3,9) 。 show_nint(6,last4,2,9) 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 30 页,共 39 页 if(Function_Key=0) delay(5)。if(Function_Key=0) while(Function_Key=0)。i+ 。if(i=2) i=0。 if(i=KongChe_flag)&(JinErFlag=0) show_time() 。 else if(JinErFlag=0

61、) if(DanJia=DanJia_DanCheng) seg_show(0,10,9)。 /显示 - 表示待设置单价else seg_show(5,10,9)。show_nint(1,DanJia_DanCheng,2,1) 。show_nint(6,DanJia_WangFan,2,6) 。if(QieHuan_Key=0) delay(5)。if(QieHuan_Key=0) while(QieHuan_Key=0) 。if(DanJia=DanJia_DanCheng) DanJia=DanJia_WangFan。DanShuang_Led=0。 / 双 程led亮精选学习资料 -

62、- - - - - - - - 名师归纳总结 - - - - - - -第 31 页,共 39 页 else DanJia=DanJia_DanCheng。DanShuang_Led=1。 if(ChaXun_QueRen_Key=0) delay(5)。if(ChaXun_QueRen_Key=0) while(ChaXun_QueRen_Key=0) 。KongChe_Led=1 。KaiShiFlag=1 。 else if(KaiShiFlag=1) /非空车 if(ZanTingFlag=0) EA=1 。else EA=0 。/ EA=1 。 /开始 计费if(Speed50)&(

63、ZanTingFlag=0) EX0=1 。/开始记路程 TR0=0。/暂停计时JiShiFlag=0 。JiShi_Led=1 。 if(ZanTing_Key=0) delay(5)。if(ZanTing_Key=0) while(ZanTing_Key=0) 。ChaXun_Led=1 。ZanTingFlag+ 。if(ZanTingFlag=1) EA=0 。if(ZanTingFlag=2) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 33 页,共 39 页ZanTingFlag=0 。 if(ChaXun_QueRen_Key=0

64、) delay(5)。if(ChaXun_QueRen_Key=0) while(ChaXun_QueRen_Key=0) 。ChaXunFlag=1 。ChaXun_Led=0 。k+。if(k=2) k=0。 if(Clear_Key=0) delay(5)。if(Clear_Key=0) while(Clear_Key=0) 。fill_byte(0,8) 。for(m = 4 。 m 0。 m-) /存金额 write_byte(m, JinEr%10) 。JinEr/=10 。delayms(2)。 for(m = 8 。 m 4。 m-) /存里程 write_byte(m, Li

65、Cheng%10) 。LiCheng/=10 。delayms(2)。 for(m = 11 。 m 8。 m-) /存分钟 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 34 页,共 39 页write_byte(m, Minute%10) 。Minute/=10 。delayms(2)。 for(m = 13 。 m 11。 m-) /存秒 write_byte(m, Second%10) 。Second/=10。delayms(2)。 Count=0。LiCheng=0 。JinEr=0。Second=0。Minute=0 。KongChe

66、_Led=0 。JiShi_Led=1 。DanShuang_Led=1。DanJia=DanJia_DanCheng。ChaXunFlag=0 。ChaXun_Led=1 。KaiShiFlag=0 。ZanTingFlag=0 。i=0 。j=0。k=0。 if(JiShiFlag=1) if(k=1) show_nint(0,LiCheng,4,2) 。show_nint(4,JinEr,4,6) 。 else seg_show(5,10,9)。 /显示 - show_nint(2,Minute,3,9) 。show_nint(6,Second,2,9) 。精选学习资料 - - - -

67、- - - - - 名师归纳总结 - - - - - - -第 35 页,共 39 页 else if(ChaXunFlag=0) show_nint(0,LiCheng,4,2) 。show_nint(4,JinEr,4,6) 。 else if(ChaXunFlag=1) if(k=1) show_nint(0,LiCheng,4,2) 。show_nint(4,JinEr,4,6) 。 else seg_show(5,10,9)。 /显示 - show_nint(2,Minute,3,9) 。show_nint(6,Second,2,9) 。 /* 外部中断0 初始化*/ void in

68、t0_init() EX0=1 。/外中断 0 允许 IT0=1 。 /外中断 0 触发方式设为下降沿触发 void timer_init() TMOD=0X11 。/定时器 0,1 模式设置 16 位计数器 ET0=1 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 36 页,共 39 页 ET1=1 。 TH0=0XD8 。 TL0=0XF0 。 TH1=0XD8 。 TL1=0XF0 。 TR1=1 。 void data_process() LiCheng=(uint)(Count*LunChang)/100。 /具体规则还需改动 if(

69、LiCheng=30) JinEr=50。 else JinEr=DanJia*(LiCheng-30+DanJia*Minute*10/50)/10+50。 void init_device() int0_init() 。timer_init() 。 / init1302(0x08,0x34,0x19,0x16,0x05,0x12)。 /设置时间时使用 void main() uchar i=0。 KongChe_Led=0 。 init_device() 。timer_init() 。SDA = 1 。SCL = 1。while(1) data_process()。 keyscan()。

70、精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 37 页,共 39 页 void int0() interrupt 0 using 1 EA=0 。 Count+ 。 EA=1 。 void timer0() interrupt 1 using 2 TH0=0XD8 。 TL0=0XF0 。 Count1+ 。 if(Count1=100) Count1=0 。 Second+。 if(Second=60) Second=0。Minute+ 。 void timer1() interrupt 3 using 3 TH1=0XD8 。 TL1=0XF0 。 Count2+ 。 if(Count2=100) Count2=0 。 Old_Count=New_Count 。 New_Count=Count 。 Speed=(uchar)(New_Count-Old_Count)*56.5 。 /speed=1.57*3.6* 每秒圈数 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 38 页,共 39 页附 2:系统原理图精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 39 页,共 39 页

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号