出租车计价器模拟装置的设计报告-电子课程设计_第1页
出租车计价器模拟装置的设计报告-电子课程设计_第2页
出租车计价器模拟装置的设计报告-电子课程设计_第3页
出租车计价器模拟装置的设计报告-电子课程设计_第4页
出租车计价器模拟装置的设计报告-电子课程设计_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、电子设计课程设计报告电子设计课程设计报告摘要:本文介绍了出租车计价器系统在实际生产生活中的重要性,介绍一种以单片机ATmega16 为核心的多功能出租车计价器模拟装置的设计,阐述软硬件设计过程中关键技术的处理。结果表明该计价器模拟装置具有集计程、计时、计费、等多种计量功能,并且具速度检测与显示、系统设置与数据存储等多种功能。本课题主要研究出租车计价器模拟装置的软硬件设计。论文详细阐述了该计价器模拟装置的总体设计:控制器模块、速度检测模块、里程检测模块、LED显示模块、键盘模块等。实验表明该系统具有可靠性好、精度高等优点。关键词:出租车计价器模拟装置,ATmega16单片机,LED扫描显示,速度

2、检测,里程检测。第一章 绪论41.1 前言41.2 设计的意义41.3 系统设计的要求4第二章 系统设计52.1方案论证与比较52.1.1 方案一52.1.1 方案二62.2系统总体方案62.3单元电路方案72.3.1 系统电源输入与转换模块72.3.2 单片机控制核心模块72.3.3 LED数码管动态扫描显示模块8第三章 相关芯片介绍83.1 ATMEGA16单片机83.2 3-8线译码器74HC138103.3 移位寄存器74HC16410第四章 软件设计11第五章 系统测试11结论/展望11致谢12参考文献12附录13第一章 绪论1.1 前言出租汽车已经成为我国城市公共交通的重要组成部分

3、和现代化城市必备的基础设施,成为人们工作、生活中不可缺少的交通工具。出租汽车服务行业和出租汽车计价器紧密相关,因为出租汽车必须安装出租汽车计价器才能投入营运。出租汽车计价器是一种能根据乘客乘坐汽车行驶距离和等候时间的多少进行计价,并直接显示车费值的计量器具。计价器是出租汽车的经营者和乘坐出租汽车的消费者之间用于公平贸易结算的工具,因而计价器计价准确与否,直接关系到经营者和消费者的经济利益。依据国家有关法律、法规,出租汽车计价器是列入国家首批强制检定的工作计量器具之一,也是近年来国家质量技术监督部门强化管理的六类重点计量器具之一。出租车行业在我国是八十年代初兴起的一项新兴行业,随着我国国民经济的

4、高速发展,出租汽车已成为城市公共交通的重要组成部分。多年来国内普遍使用的计价器只具备单一的计量功能。目前全世界的计价器中有90%为台湾所生产。现今我国生产计价器的企业有上百家,主要是集中在北京,上海,沈阳和广州等地。1.2 设计的意义在出租车是城市交通的重要组成部分,行业健康和发展也获得越来越多的关注。汽车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。它关系着交易双方的利益。具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。因此,汽车计价器的研究也是十分有一个应用价值的。1.3 系统设计的要求(1) 设计并制作一个出租车计价器的模

5、拟装置,示意图如图1-1所示。 如图1-1 出租车计价器示意图(2) 8位数码管显示器的前4位数码管用于实时显示行车里程数(000.0),单位为公里;后4位数码管用于实时显示金额数(000.0),单位为元。 (3) 规定出租车单程价格为2元/公里,往返则价格为1.5元/公里。单程与往返分别由“单程” 按键和“往返” 按键设定。行车里程可用一按键模拟,规定每按一次键,行车里程加0.1公里。 (4) 起步公里数为3公里,价格为8元,若实际运行大于3公里,按“基本要求2”计算价格。 (5) 到达目的地后,按“暂停” 键,计价器可暂停计价;反复按“查询”键,计价器能依次显示总等待时间,里程数和金额数;

6、按“清除”键,能将记录的数据(里程、等待时间与价格等)清0。 (6) 再增加8位数码管显示器,前4位数码管用于实时显示车速(000.0),单位为公里/小时;后4位数码管用于实时显示累计等待时间(00:00),单位为分:秒。 (7) 设计并制作一个能模拟出租车车速的装置。要求采用单片机控制电机使转盘转动,用光电传感器检测转盘转动,车速与转数成正比。规定转盘转速为5转/分对应车速5公里/小时,转盘转速为50转/分对应车速50公里/小时,依此类推。转速可以通过键盘预置。(8) 能按上述模拟装置的转数计算行车里程,并依此作为计价依据,计价误差的绝对值小于10%。 (9) 增加等待时间计价功能。规定总等

7、待时间为车速<5公里/小时的累积时间,总等待时间每增加5分钟,相当于里程数增加1公里进行计价。(10) 增加起步价、起步价里程和每公里价格的预置功能。价格预置功能要求密码确认,价格的默认值与基本要求一致。 第二章 系统设计2.1方案论证与比较2.1.1 方案一方案一的系统框图如图2-1所示。该方案拟采用单片机AT89C51为控制器,附加以数据存储模块,速度检测模块,LED显示模块,键盘模块等。AT89C51单片机数据存储模块速度采集模块LED显示模块键盘模块图2-1方案一系统框图AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable a

8、nd Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。AT89C51单片机易学易懂,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。但是AT89C51单片机是一种比较低端的单片机,片上资源偏少。例如本设计中要求存储数据功能,AT89C51单片机没有内部EEPROM,只能外加数据存储芯片,导致硬件线

9、路和软件编程显得复杂。另外,AT89C51单片机的软件开发平台不够人性化,软件开发比较繁琐。2.1.1 方案二方案二的系统框图如图2-2所示。该方案拟采用单片机ATMEGA16为控制器,附加以内部数据存储,速度检测模块,LED显示模块,键盘模块等。ATMEGA16单片机内部数据存储速度采集模块LED显示模块键盘模块图2-2方案二系统框图ATmega16有如下特点:16K字节的系统内可编程Flash(具有同时读写的能力,即RWW),512 字节EEPROM,1K 字节SRAM,32 个通用I/O 口线,32 个通用工作寄存器,用于边界扫描的JTAG 接口,支持片内调试与编程,三个具有比较模式的灵

10、活的定时器/ 计数器(T/C),片内/外中断,可编程串行USART,有起始条件检测器的通用串行接口,8路10位具有可选差分输入级可编程增益(TQFP 封装) 的ADC ,具有片内振荡器的可编程看门狗定时器,一个SPI 串行端口,以及六个可以通过软件进行选择的省电模式。ATmega16单片机具有强大而丰富的片上资源和灵活方便的人性化软件开发平台,大大地简化了硬件线路的设计和软件的开发过程,减了软硬件的开发时间,并完全符合本设计的要求。综上,通过分析论证,本次设计采用方案二。2.2系统总体方案方案二的系统框图如图2-3所示。系统仿真图见附件。图2-3系统总体设计方案该方案由ATMEGA16单片机为

11、核心控制器,用以检测速度脉冲并计算转化为实际速度输出显示;检测模拟装置的状态(包括空车状态、单程状态、等待状态、返程状态)并作出相应的动作;检测模拟动作(包括里程加一模拟按键、速度模拟加减按键、数据清除按键);检测参数修改于数据储存(包括起步里程的修改、起步价的修改、单程单价的修改、返程单价的修改);检测参数修改时应通过的密码确认;速度控制输出;参数提取并送到LED数码管扫描显示;工作状态指示输出等等。2.3单元电路方案2.3.1 系统电源输入与转换模块稳定的电源供应是单片机嵌入式系统的稳定工作的必要前提,所以电源的转换设计必须有较高的可靠性和抗干扰能力。本设计所采用的电源输入与转换方案如图2

12、-4所示。该方案采用LM7805线性电源稳压芯片,加以前后两级电容滤波以及5个平波小电容,所构成的电源转换方案具有输出平稳,高压隔离,平波抗干扰等优点,具有较高的可靠性和抗干扰能力,保证了所设计系统的电源的稳定供应。图2-4电源输入与转换电原理图2.3.2 单片机控制核心模块本设计所采用的核心控制芯片为Atmel公司生产的8位高性能单片机ATmega16,单片机控制核心模块电原理图如图2-5所示。其中包括单片机工作必不可少的晶振电路、复位电路。由于ATmega16单片机四个IO端口均是标志双向IO,具有输入内部可设置上拉电阻,故系统的按键不必外界上拉电阻,大大简化了硬件线路的设计。图2-4电源

13、输入与转换电原理图速度检测原理是:直接将速度传感器反馈的脉冲信号输入到ATmega16单片机的外部中断(INT1)输入端。速度检测原理是:当速度传感器返回一个脉冲信号时,单片机读出其内部定时器从上一个脉冲信号到该返回脉冲信号所经过的定时时间,两个速度反馈脉冲直接的路程除以该时间间隔即为瞬时速度。速度控制输出原理:是利用单片机内部8位的定时器2的脉宽调制功能产生占空比可变的PWM信号去控制速度。2.3.3 LED数码管动态扫描显示模块LED数码管的动态扫描显示是本出租车计价器模拟装置的核心功能之一,LED数码管扫描显示是否稳定直接关系系统的工作效果。LED数码管动态扫描显示电原理图如图2-5所示

14、。图2-5LED数码管扫描显示电原理图LED数码管动态扫描显示的原理是:采用四位共阴极LED数码管,其位选信号引脚接到低电平输出有效的3-8线译码器74HC138的输出端,单片机控制译码器的输出端来选通某一位数码管工作,达到动态扫描显示的效果。LED数码管的段选信号引脚接到8位以为寄存器74HC164的并行输出端,单片机将要显示的字型码信息串行输入到移位寄存器,再又移位寄存器并行输出到LED数码管的段选引脚,使得已选通的数码管某一位显示特定的数字。第三章 相关芯片介绍3.1 ATmega16单片机ATmega16是基于增强的AVR RISC结构的低功耗8 位CMOS微控制器。由于其先进的指令集

15、以及单时钟周期指令执行时间,ATmega16 的数据吞吐率高达1 MIPS/MHz,从而可以缓减系统在功耗和处理速度之间的矛盾。ATmega16 AVR 内核具有丰富的指令集和32 个通用工作寄存器。所有的寄存器都直接与算逻单元(ALU) 相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。这种结构大大提高了代码效率,并且具有比普通的CISC 微控制器最高至10 倍的数据吞吐率。ATmega16 有如下特点:16K字节的系统内可编程Flash(具有同时读写的能力,即RWW),512 字节EEPROM,1K 字节SRAM,32 个通用I/O 口线,32 个通用工作寄存器,用于边界扫

16、描的JTAG 接口,支持片内调试与编程,三个具有比较模式的灵活的定时器/ 计数器(T/C),片内/外中断,可编程串行USART,有起始条件检测器的通用串行接口,8路10位具有可选差分输入级可编程增益(TQFP 封装) 的ADC ,具有片内振荡器的可编程看门狗定时器,一个SPI 串行端口,以及六个可以通过软件进行选择的省电模式。ATmega16单片机管脚图如图3-1所示。图3-1ATmega16管脚图工作于空闲模式时CPU 停止工作,而USART、两线接口、A/D 转换器、SRAM、T/C、SPI 端口以及中断系统继续工作;掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外都停止工作;

17、在省电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其余功能模块处于休眠状态; ADC 噪声抑制模式时终止CPU 和除了异步定时器与ADC 以外所有I/O 模块的工作,以降低ADC 转换时的开关噪声; Standby 模式下只有晶体或谐振振荡器运行,其余功能模块处于休眠状态,使得器件只消耗极少的电流,同时具有快速启动能力;扩展Standby 模式下则允许振荡器和异步定时器继续工作。本芯片是以Atmel 高密度非易失性存储器技术生产的。片内ISP Flash 允许程序存储器通过ISP 串行接口,或者通用编程器进行编程,也可以通过运行于AVR 内核之中的引导程序进行编程。引导程序可以使用

18、任意接口将应用程序下载到应用Flash存储区(ApplicationFlash Memory)。在更新应用Flash存储区时引导Flash区(Boot Flash Memory)的程序继续运行,实现了RWW 操作。 通过将8 位RISC CPU 与系统内可编程的Flash 集成在一个芯片内, ATmega16 成为一个功能强大的单片机,为许多嵌入式控制应用提供了灵活而低成本的解决方案。ATmega16 具有一整套的编程与系统开发工具,包括:C 语言 编译器、宏汇编、 程序调试器/ 软件仿真器、仿真器及评估板。3.2 3-8线译码器74HC13874HC138是一款高速CMOS器件,74HC13

19、8引脚兼容低功耗肖特基TTL(LSTTL)系列。74HC138译码器可接受3位二进制加权地址输入(A0, A1和A2),并当使能时,提供8个互斥的低有效输出(Y0至Y7)。74HC138特有3个使能输入端:两个低有效(E1和E2)和一个高有效(E3)。除非E1和E2置低且E3置高,否则74HC138将保持所有输出为高。利用这种复合使能特性,仅需4片74HC138芯片和1个反相器,即可轻松实现并行扩展,组合成为一个1-32(5线到32线)译码器。任选一个低有效使能输入端作为数据输入,而把其余的使能输入端作为选通端,则74HC138亦可充当一个8输出多路分配器,未使用的使能输入端必须保持绑定在各自

20、合适的高有效或低有效状态。74HC138的管脚图如图3-2所示。图3-274HC138管脚图本设计中用于显示的LED数码管是四位共阴极数码管,即每四位LED数码管显示计价器模拟装置的一个参数。当动态扫描显示的时候,用74HC138来选通LED数码管的位选管脚,既达到增强LED数码管的驱动电流的效果,也能节省单片机的IO端口,使硬件设计变得简洁。3.3 移位寄存器74HC16474HC164、74HCT164 是高速硅门 CMOS 器件,与低功耗肖特基型 TTL (LSTTL) 器件的引脚兼容。74HC164、74HCT164 是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。数据通过

21、两个输入端(DSA 或 DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。时钟 (CP) 每次由低变高时,数据右移一位,输入到 Q0, Q0 是两个数据输入端(DSA 和 DSB)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。主复位 (MR) 输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。74HC164的管脚图如图3-3所示。图3-374HC164管脚图本设计中用于显示的LED数码管是四位共阴极数码管,即每四位LED数码管显示计价器模拟装置的一

22、个参数。当动态扫描显示的时候,用74HC164来将要显示的字型码数据通过串入并出的方式传送到LED数码管的段选管脚,大大的节省了单片机的IO端口,使硬件设计变得简洁。第四章 软件设计主控制器芯片为Atmega16,由于处理器速度较快,所以采用C语言编程方便简单。软件编写使用AVR单片机软件开发平台CVAVR编译器,改编译器有丰富的AVR单片机常用函数模块、常用外设硬件驱动动态链接库,使用极其方便,具有高度的人性化。软件流程图如图4-1所示。图4-1软件流程图第五章 系统测试由于时间不允许,设计的出租车计价器模拟装置只在电子仿真平台PROTEUS7.0仿真测试通过。测试结果表明,设计的出租车计价

23、器模拟装置具有设计要求提出的绝大部分功能,并且全部仿真测试通过。仿真电子线路图见附件。结论/展望在这段时间里,经过自己努力,基本上完成了设计要求的内容,在系统可行性分析、原理图设计、PCB绘制等方面都作了许多实际工作,取得了一些成绩,同时也遇到了一些问题,存在一些不足。经过这段时间的学习和工作,我觉得自己不论是在理论知识方面还是在动手能力方面都有了不小的进步,自己从中受益匪浅。这次设计很好的把以前学到的理论知识应用于实践,使我认识到理论知识与实践之间有一定的差距,只有通过不断的努力学习和实践才能很好的把理论知识应用到实践当中,也只有通过不断的实践才能对理论知识的理解。通过这次设计不仅学会了如何

24、去查找相关资料,更重要的是通过查找资料和翻阅书籍学到了不少知识,扩大了知识面,提高了知识水平。经过单元设计和系统设计巩固了以前所学的专业知识,自己真正认识到理论联系实际的重要性,为以后的学习和工作提供了很多有价值的经验。通过这次设计不仅增强了自己的动脑能力和动手能力,也提高了我思考问题、分析问题、解决问题的能力,更重要的是学会用工程化的思想来解决问题。这在以前的学习过程中是不曾学到的。这次设计是我认真认识到完整、严谨、科学分析问题、解决问题的思想是多么的重要,只有拥有了科学的态度才能设计出有用的产品。另外通过本次设计,使我认识到自己理论知识的应用能力有很大的欠缺,需要在以后的学习中进一步提高。

25、附录附录1 出租车计价器模拟装置仿真测试线路图 附录2出租车计价器模拟装置电原理图附录3出租车计价器模拟装置印制PCB图附录4 出租车计价器模拟装置程序清单/*This program was produced by theCodeWizardAVR V2.05.0 ProfessionalAutomatic Program Generator?Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.Project : 出租车计价器Version : 1Date : 2011/12/5Author : 曾宪金 陈志强 黄宝生Company : 广

26、西大学电气工程学院Chip type : ATmega16Program type : ApplicationAVR Core Clock frequency: 8.000000 MHzMemory model : SmallExternal RAM size : 0Data Stack size : 256*/所需头文件#include <mega16.h>#include <delay.h> /预定义移位寄存器所用端口#define HC164_data1 PORTC.0#define HC164_clk1 PORTC.1#define HC164_data2 PO

27、RTC.2#define HC164_clk2 PORTC.3#define key_oneway PINC.4#define key_pause PINC.5#define key_roundtrip PINC.6#define key_clear PINC.7#define key_licheng PIND.0#define key_jiance PIND.1#define key_shezhi PIND.2#define key_shezhi_jia PIND.4#define key_shezhi_jian PIND.5/预定义出租车状态所用变量#define zhunbei 0#de

28、fine dancheng 1#define zanting 2#define wangfan 3 #define jiance 4#define shezhi 5#define mimaqueren 6#define lunzi_kongshu 8 /轮子边沿所开的孔数,即轮子每转一圈所产生的脉冲数/#define lunzi_banjing 20 /轮子的半径(单位:mm),用于计算累加里程 2*3.14*lunzi_banjing即为轮子转过一圈时里程的累加量(单位也是:mm) /定义数码管扫描字型码及位选码flash unsigned char led_7=0x3f,0x06,0x5b

29、,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;flash unsigned char position=0x00,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x80,0x90,0xa0,0xb0,0xc0,0xd0,0xe0,0xf0;/定义taxi结构体struct taxi unsigned int licheng; unsigned int feiyong; unsigned char state; /出租车当前状态,包括单程(1)、往返(2)、暂停三个状态(0)

30、unsigned int sudu; unsigned int dengdaishijian2; unsigned char fujia_dengdai; unsigned char dancheng_danjia; unsigned char wangfan_danjia; unsigned int qibujia; unsigned char qibulicheng; ; struct taxi mytaxi; /声明mytaxi结构体unsigned char dis_buff; /声明显示缓存区bit keyflag_oneway = 1;bit keyflag_pause = 1;b

31、it keyflag_roundtrip = 1;bit keyflag_licheng = 1;bit keyflag_jiance = 1;bit keyflag_clear = 1;bit keyflag_shezhi = 1;bit keyflag_shezhi_jia = 1;bit keyflag_shezhi_jian = 1;bit flag_dancheng=0;bit flag_wangfan=0; bit flag_zanting=0;bit flag_jiance=0;bit time_lichengleijiajia_ok=0;unsigned char qibuji

32、a_from_epprom=0;unsigned int timecounter = 0;unsigned int interrupt_timecounter = 0; /每两个车速检测脉冲中断之间的时间间隔(ms)unsigned int speed_time = 0;/轮子转过一圈(轮子边沿所开的孔数个脉冲累计)所需要的时间unsigned char interrupt_cishu = 0; /判断是否转过一圈unsigned int leijia_licheng = 0; /通过速度来累加里程数(中间变量)/unsigned int licheng_timecounter = 0; /多

33、长时间更新累加里程数(因为里程累加是用这个定时时间乘以当时的瞬时速度得到的,所以这个定时时间必须足够小才能保证里程累加的准确性) void eeprom_write(unsigned int uiAddress,unsigned char ucData) /写EEPROM函数 while(EECR&(1<<EEWE); /Wait for completion of previous write EEAR = uiAddress; /Set up address register EEDR = ucData; /Set up data register EECR |= (1

34、<<EEMWE); /Write logical one to EEMWE EECR |= (1<<EEWE); /Start eeprom write by setting EEWE /*for example eeprom_write(0x01,135); eeprom_write(0x02,246); */ unsigned char eeprom_read(unsigned int uiAddress) /读EEPROM函数 while(EECR&(1<<EEWE); /Wait for completion of previous writ

35、e EEAR = uiAddress; /Set up address register EECR |= (1<<EERE); /Start eeprom read by writting EERE return EEDR; /Return data from data register /*for example mytaxi.qibulicheng = eeprom_read(0x01); mytaxi.qibujia = eeprom_read(0x02); */ void init(void) /初始化控制器端口及taxi各项参数 PORTA = 0xff; DDRA =

36、0xff; PORTB = 0x00; DDRB = 0xff; PORTC=0xff; DDRC=0x0f; PORTD=0xff; DDRD=0x80; mytaxi.licheng = 0; /实际里数的十倍 mytaxi.feiyong = 0; /实际费用的100倍 mytaxi.state = zhunbei; mytaxi.sudu = 0; /实际速度的十倍 mytaxi.dengdaishijian0 = 0; /dengdaishijian0为等待时间分钟数 mytaxi.dengdaishijian1 = 0; /dengdaishijian1为等待时间秒数 mytaxi

37、.fujia_dengdai = 0; /eeprom_write(0x03,20); / eeprom_write(0x04,15); /存储的是起步价的十倍(char型,最大存储255),但显示的是费用的百倍 /mytaxi.qibulicheng = eeprom_read(0x01); /qibujia_from_epprom = eeprom_read(0x02); /mytaxi.qibujia = (unsigned int) qibujia_from_epprom*10; void to_disbuffer(void) /更新显示缓存区函数 unsigned char j=0;

38、 /dis_buffj+ = 0; /出现了个debug,找不出来,先把它覆盖先 /dis_buffj+ = 0; dis_buffj+ = mytaxi.feiyong%10; dis_buffj+ = (mytaxi.feiyong%100)/10; dis_buffj+ = (mytaxi.feiyong%1000)/100; dis_buffj+ = (mytaxi.feiyong%10000)/1000; dis_buffj+ = mytaxi.feiyong/10000; dis_buffj+ = mytaxi.licheng%10; dis_buffj+ = (mytaxi.li

39、cheng%100)/10; dis_buffj+ = (mytaxi.licheng%1000)/100; dis_buffj+ = mytaxi.licheng/1000; dis_buffj+ = mytaxi.dengdaishijian1%10; dis_buffj+ = mytaxi.dengdaishijian1/10; dis_buffj+ = mytaxi.dengdaishijian0%10; dis_buffj+ = mytaxi.dengdaishijian0/10; dis_buffj+ = mytaxi.sudu%10; dis_buffj+ = (mytaxi.s

40、udu%100)/10; dis_buffj+ = (mytaxi.sudu%1000)/100; dis_buffj+ = mytaxi.sudu/1000; void HC164_sent_bit1(char byte) /移位寄存器1发送数据函数 char i; for(i=0;i<=7;i+) HC164_data1=byte&(1<<i); HC164_clk1=1; HC164_clk1=0; void HC164_sent_bit2(char byte) /移位寄存器2发送数据函数 char i; for(i=0;i<=7;i+) HC164_da

41、ta2=byte&(1<<i); HC164_clk2=1; HC164_clk2=0; void display(void) /数码管扫描显示函数1(显示车里程数和金额数) unsigned char temp1,i; to_disbuffer(); for(i=0;i<=7;i+) temp1=led_7dis_buffi+1; /i+1是为了忽略费用的最低位,但是还是存在的,只是不显示而已 if(i=1|i=5) HC164_sent_bit1(temp1|=0x80); /小数点显示 else HC164_sent_bit1(temp1); /PORTC&am

42、p;=0x03; /PORTC|=position(5-i); PORTA = positioni+1; delay_us(2100); PORTA = position0; void display_one(void) /数码管扫描显示函数2(显示车速度和等待时间) unsigned char temp1,i; to_disbuffer(); for(i=8;i<=15;i+) temp1=led_7dis_buffi+1; /i+1是为了忽略费用的最低位,但是还是存在的,只是不显示而已 if(i=10|i=13) HC164_sent_bit2(temp1|=0x80); /小数点显

43、示 else HC164_sent_bit2(temp1); /PORTC&=0x03; /PORTC|=position(5-i); PORTA = positioni+1; delay_us(2100); PORTA = position0; /*unsigned char read_key()static char key_state=0,key_value,key_line;char key_return=255,i;unsigned char tmp;switch(key_state)case 0:key_line=0x10; for(i=1;i<=4;i+)key_p

44、ort=key_line;key_port=key_line;tmp=key_port;tmp=key_port;key_value=tmp&0x0f;if(key_value=0x0f)key_line<<=1;elsekey_state+;break;break;case 1:if(key_value=(key_port&0x0f)switch(key_value|key_line)case 0x1e:key_return=0;break;case 0x1d:key_return=1;break;case 0x1b:key_return=2;break;case

45、 0x17:key_return=3;break;case 0x2e:key_return=4;break;case 0x2d:key_return=5;break;case 0x2b:key_return=6;break;case 0x27:key_return=7;break;case 0x4e:key_return=8;break;case 0x4d:key_return=9;break;case 0x4b:key_return=10;break;case 0x47:key_return=11;break;case 0x8e:key_return=12;break;case 0x8d:k

46、ey_return=13;break;case 0x8b:key_return=14;break;case 0x87:key_return=15;break;key_state+;elsekey_state-;break;case 2: key_port=0x0f;key_port=0x0f;tmp=key_port;tmp=key_port; if(tmp&0x0f)=0x0f) key_state=0;break;return key_return;*/ Timer 0 output compare interrupt service routineinterrupt TIM0_C

47、OMP void timer0_comp_isr(void) /time_scan_ok=1; /一毫秒定时到标志位 /*if(+licheng_timecounter=200) time_lichengleijiajia_ok=1; licheng_timecounter=0; */ if(+interrupt_timecounter%100=0)time_lichengleijiajia_ok=1; /记录每两个脉冲中断之间的时间间隔 (毫秒值) if(flag_zanting) /判断是否在等待状态,是则更新等待时间,否则不更新 if(+timecounter=10)/1s定时到 等待时

48、间加一 暂停状态下更新等待时间 if(+mytaxi.dengdaishijian1>=60) mytaxi.dengdaishijian1 = 0; mytaxi.dengdaishijian0 += 1 ; /dengdaishijian0为等待时间分钟数 if(+mytaxi.fujia_dengdai>=5)mytaxi.fujia_dengdai = 0; mytaxi.feiyong += mytaxi.dancheng_danjia*10; /等待每增加五分钟增加一公里的费用 timecounter=0; /PORTB.7=PORTB.7; /测试用 / Extern

49、al Interrupt 1 service routineinterrupt EXT_INT1 void ext_int1_isr(void)/ Place your code here /规定转盘转速为5转/分对应车速5公里/小时,转盘转速为50转/分对应车速50公里/小时,依此类推。 if(flag_jiance) speed_time += interrupt_timecounter; /累计脉冲之间的时间间隔(毫秒) interrupt_timecounter = 0; if(+interrupt_cishu=lunzi_kongshu) /计算一分钟多少转,显示的速度为真实速度的十倍 (+ 5是为了修正整形数计算误差) mytaxi.sudu = 600000/speed_time + 5; /(60秒/分钟 * 1000毫秒/秒 *10十倍实际速度)/ 车轮转一圈所经过的时间(毫秒) interrupt_cishu = 0; speed_time

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论