单片机课程设计出租车计价器

上传人:仙*** 文档编号:31768292 上传时间:2021-10-12 格式:DOC 页数:38 大小:426KB
返回 下载 相关 举报
单片机课程设计出租车计价器_第1页
第1页 / 共38页
单片机课程设计出租车计价器_第2页
第2页 / 共38页
单片机课程设计出租车计价器_第3页
第3页 / 共38页
点击查看更多>>
资源描述
大学课程设计说明书 初始条件:初始条件:1运用所学的单片机原理与接口技术知识和数字电路知识;252 单片机应用开发系统一套;3PC 机及相关应用软件。要求完成的主要任务要求完成的主要任务: :以目前生活中正在使用的出租车计价器为原型进行设计,要求具有按时间和里程综合计算车价的功能,能显示时间、里程、单价、总车价等相关信息。1. 完成出租车计价器的设计和调试。 2. 撰写课程设计说明书,说明书使用 A4 打印纸计算机打印,用 Proteus等绘图软件绘制电子线路图纸。 基于基于 52 单片机原理出租车计价器的设计单片机原理出租车计价器的设计 摘要摘要 本设计的是一个基于单片机 AT89C52 的出租车自动计费设计,附有复位电路,时钟电路,键盘电路等。复位电路是单片机的初始化操作,除了正常的初始化外,为摆脱困境,通过复位电路可以重新开始。时钟电路采用 12MHz 的晶振,作为系统的时钟源,具有较高的准确性。在上电时字符型液晶 1602 显示最初的起步价,里程收费,等待时间收费三种收费,通过按键可以调整起步价,里程收费,等待时间收费。通过按键模拟出租车的运行,暂停,停止。在 1602 液晶上可以显示运行的时间,运行时暂停的时间,通过计算可以得出总共的费用和总的路程。在这里主要是以 AT89C52单片机为核心控制器,P0 口接 1602 液晶显示模块,P1 口接按键的,通过按键输入。关键词关键词:单片机 AT89C52;1602液晶;出租车计费器;大学课程设计说明书目目 录录前前 言言.1第一章第一章 出租车计价系统的设计要求与设计方案出租车计价系统的设计要求与设计方案 .21.1出租车计价器设计要求.21.2系统主要功能 .21.3方案论证与比较 .2第二章第二章 出租车计价系统的硬件设计出租车计价系统的硬件设计.42.1振荡电路 .42.2复位电路设计 .42.3键盘接口电路 .52.4显示电路 .52.5路程测量部分 .62.6单片机各引脚功能说明.62.71602 液晶的简介 .8第三章第三章 出租车计价系统出租车计价系统的软件设计的软件设计.103.1单片机资源使用 .103.2中断子函数 .103.3判键子函数 .113.4显示子程序 .113.5总程序流程框图 .13第四章第四章 PROTEUS 的简介的简介.144.1PROTEUS介绍.14第五章第五章 设计体会与小结设计体会与小结.15参考文献参考文献.15附附 录录.16一源程序.16二设计总图.2前前 言言出租车计价器是出租车营运收费的专用智能化仪表,随着电子技术的发展,出租车计价器技术也在不断进步和提高。国内出租车计价器已经经历了4 个阶段大学课程设计说明书2的发展。从传统的全部由机械元器件组成的机械式,到半电子式即用电子线路代替部分机械元器件的出租车计价器;再从集成电路式到目前的单片机系统设计的出租车计价器。出租车计价器计费是否准确、出租车司机是否作弊才是乘客最关心的问题,而计价器营运数据的管理是否方便才是出租车司机最关注的。因此怎样设计出一种既能有效防止司机作弊又能方便司机的计价器尤为重要。因此, 本文以单片机A T89S52 为核心设计一款多功能出租车计价器,该计价器能实现按时间和里程综合计算车价,能显示时间、里程、单价、总车价等相关信息显示。它比市场上的一些计价器使用更方便,功能更全,还具有有效防止司机作弊和系统稳定性好的优点。第一章第一章 出租车计价系统的设计要求与设计方案出租车计价系统的设计要求与设计方案1.1 出租车计价器出租车计价器设计要求设计要求设计一个出租车自动计费器,计费包括起步价、行车里程计费、等待时间计费三部分,用 1602 液晶 显示总金额,运行时间,暂停时间,最大值为 99.9元,起步价为 5.0 元,3Km 之内起步价计费,超过 3Km,设速度为 100m/s,10s增加 1.3 元(即 1KM 增加 1.3 元),等待时间单价为每分钟 1.5 元,用液晶显示总里程,同时用液晶显示等待时间和运行花费时间。大学课程设计说明书31.2 系统主要功能系统主要功能本出租车自动计费,上电后显示最初的起步价,里程计费单价,等待时间计费单价,通过按键可以调节起步价,里程计费单价,等待时间计费单价。同时具有运行,暂停,停止等状态,可以显示运行的时间,同时可以显示暂停的时间,具有累加功能,暂停和运行时间在暂停和运行前一次的状态上计时。出租车停止后能够显示行驶的总费用。1.3 方案论证与比较方案论证与比较方案一:采用数字电子技术,利用 555 定时芯片构成多谐振荡器,或采用外围的晶振电路作为时钟脉冲信号,采用计数芯片对脉冲尽心脉冲的计数和分频,最后通过译码电路对数据进行译码,将译码所得的数据送给数码管显示,一下是该方案的流程框图,方案一如图 1-1 所示:图 1-1 方案一案二:采用 EDA 技术,根据层次化设计理论,该设计问题自顶向下可分为分频模块,控制模块 计量模块、译码和动态扫描显示模块,其系统框图如图1-2 所示:图 1-2 方案二方案三:采用 MCU 技术,通过单片机作为主控器,利用 1602 字符液晶作为显示电路,采用外部晶振作为时钟脉冲,通过按键可以方便调节,以下是方案三的系统流程图,本方案主要是必须对于数字电路比较熟悉,成本又不高。方案图如图 1-3 所示:大学课程设计说明书4图 1-3 方案三方案总结:通过各个方案的比较,本次采用方案三,不但控制简单,而且成本低廉,设计电路简单。第二章第二章 出租车计价系统的硬件设计出租车计价系统的硬件设计4.14.1 振荡电路振荡电路单片机内部有一个高增益、反相放大器,其输入端为芯片引脚 XTAL1,其输出端为引脚 XTAL2。通过这两个引脚在芯片外并接石英晶体振荡器和两只电容(电容和一般取 33pF)。这样就构成一个稳定的自激振荡器。 振荡电路脉冲经过二分频后作为系统的时钟信号,再在二分频的基础上三分频产生 ALE 信号,此时得到的信号时机器周期信号。振荡电路如图 2-1 所示:图 2-1 振荡电路4.24.2 复位电路设计复位电路设计复位操作有两种基本形式:一种是上电复位,另一种是按键复位。按键复位具有上电复位功能外,若要复位,只要按图中的 RESET 键,电源 VCC 经电阻R1、R2 分压,在 RESET 端产生一个复位高电平。上电复位电路要求接通电源后,通过外部电容充电来实现单片机自动复位操作。上电瞬间 RESET 引脚获得高电平,随着电容的充电,RERST 引脚的高电平将逐渐下降。RERST 引脚的高电平只要能保持足够的时间(2 个机器周期) ,单片机就可以进行复位操作。按键复位电路图如图 2-2 所示。大学课程设计说明书5图2-2 AT89C51引脚配置4.34.3 键盘接口电路键盘接口电路独立式键盘:独立式键盘中,每个按键占用一根I/O口线,每个按键电路相对独立。I/O口通过按键与地相连,I/O口有上拉电阻,无键按下时,引脚端为高电平,有键按下时,引脚电平被拉低。I/O口内部有上拉电阻时,外部可不接上拉电阻。4.44.4 显示显示电路电路对于现实电路我们可以采用数码管,也可以采用液晶显示,液晶又分字符型和点阵型,我们使用的液晶是字符型液晶,并且带字符库的,不需要查找代码。英文字符就可。液晶电路使用时,如果发现液晶不亮可以调节连接液晶的点位器,改变液晶的亮度。显示电路如图 2-4 所示:大学课程设计说明书6图 2-4 数码管封装图及数据线与数码管管脚关系4.54.5 路程测量部分路程测量部分出租车中需要一个能准确获得车轮转动即路量信号的装置,以得到标准的脉冲信号送入单片机的定时/ 计数器 T1 即 P3. 5 引脚,利用单片机的 T1 的计数功能完成 100 次的计数后产生一中断来完成路程的测量。(设车轮周长为 1 m ,则霍尔传感器每产生 100 个脉冲便表示车已行程 0. 1 km ,根据际情况在程序中进行设置) 。汽车联轴器按圆周间隔嵌入磁钢,用霍传感器集成芯片 A44E 测并输出脉冲,其工作原理如图 4 所示,霍尔传感器集成芯片 A44E 有信号转换、电压放大、等功能,为增加其抗干扰的能力,经过 74L S14 对信号整形后再通过光偶送入 P3. 5 引脚。大学课程设计说明书7图 2-5 路程测量电路4.64.6 单片机各引脚功能说明单片机各引脚功能说明AT89S52电路图如图 2-6 所示: VCC:供电电压。GND:接地。P0 口:P0 口为一个 8 位漏级开路双向 I/O 口,每脚可吸收 8TTL 门流。当 P1 口的管脚第一次写 1 时,被定义为高阻输入。P0 能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在 FIASH 编程时,P0 口作为原码输入口,当 FIASH 进行 图 2-6校验时,P0 输出原码,此时 P0 外部必须被拉高。 图 2-6 AT89S52 P1 口:P1 口是一个内部提供上拉电阻的 8 位双向 I/O 口,P1 口缓冲器能接收输出 4TTL 门电流。 P1 口管脚写入 1 后,被内部上拉为高,可用作输入,P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在 FLASH编程和校验时,P1 口作为第八位地址接收。 P2 口:P2 口为一个内部上拉电阻的 8 位双向 I/O 口,P2 口缓冲器可接收,输出 4 个 TTL门电流,当 P2 口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2 口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2 口当用于外部程序存储器或 16 位地址外部数据存储器进行存取时,P2 口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2 口输出其特殊功能寄存器的内容。P2 口在 FLASH 编程和校验时接收高八位地址信号和控制信号。P3 口:P3 口管脚是 8 个带内部上拉电阻的双向 I/O 口,可接收输出 4 个TTL 门电流。当 P3 口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3 口将输出电流(ILL)这是由于上拉的缘故。P3 口也可作为 AT89S52 的一些特殊功能口,P3 口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持 RST 脚两个机器周期的高电平时间。大学课程设计说明书8ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在 FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的 1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个 ALE 脉冲。如想禁止 ALE 的输出可在 SFR8EH 地址上置 0。此时, ALE 只有在执行 MOVX,MOVC 指令是 ALE 才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态 ALE 禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN 有效。但在访问外部数据存储器时,这两次有效的/PSEN 信号将不出现。/EA/VPP:当/EA 保持低电平时,则在此期间外部程序存储器(0000H-FFFFH) ,不管是否有内部程序存储器。注意加密方式 1 时,/EA 将内部锁定为RESET;当/EA 端保持高电平时,此间内部程序存储器。在 FLASH 编程期间,此引脚也用于施加 12V 编程电源(VPP) 。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。第三章第三章 出租车计价系统出租车计价系统的软件设计的软件设计4.14.1 单片机资源使用单片机资源使用在本次设计中像电路键盘用到了 P1 口,其中 P1.0 到 P1.4 口作为键盘的输入,直流电机电路的控制线用了 P2 口线,P3.0、P3.1、P3.2 分别为 led 信号控制脚。显示电路用到了 P0 和 P2 口,P0 口为液晶的数据口。4.2 中断子函数中断子函数对于中断程序,只要定时器计数满就会产生中断 50ms 中断一次,共计 20次,秒钟加 1,秒钟计满再分钟加,当分钟加到 99 时全部清零。以下是中断子函数的流程图如图 3-1 所示:大学课程设计说明书9图 3-1 中断子程序流程图4.3 判键子函数判键子函数对于独立式键盘判键,首先看有键按下不,如果有键按下则延时一会儿,在判断是否真的有键按下,如果确实有键按下,在判键释放,最后执行键功能程序。判键子函数的流程框图如图 3-2 所示: Count+开始Second+count=0是否产生中断?Count=20?Second=60?Minite+second=0Minite=99?Minite=0结束否否否否是是是是大学课程设计说明书10图 3-2 判键子程序流程图4.4 显示子程序显示子程序1602 液晶是字符型液晶,它的内部自带字符库,它可以写两行的字符,同时每行可以写 40 个字符,在写显示程序的时候,我们先写命令,再设定字符显示,最后写数据,在每写一次命令或数据都需要判断液晶是否忙。液晶显示程序流程图如图 3-3 所示:定时器初始化开始液晶初始化判断按键函数1V=?Value1+10Value2+5Value3+5数据处理显示函数Jump_in=1?液晶清屏判断按键函数V1=?运行暂停停止数据处理显示函数Jump_out=1?液晶清屏清零函数结束否是V=1V=2V=3否是V1=1V1=2V1=3是否否是大学课程设计说明书11图 3-3 显示子总程序流程框图图 3-4 整体程序流程图大学课程设计说明书12第四章第四章 proteus 的简介的简介4.1 Proteus 介绍介绍Proteus 软件是来自英国 Labcenter electronics 公司的 EDA 工具软件,它组合了高级原理布图、混合模式 SPICE 仿真,PCB 设计以及自动布线来实现一个完整的电子设计系统。此系统受益于 15 年来的持续开发,被电子世界在其对 PCB 设计系统的比较文章中评为最好产品“The Route to PCB CAD”。Proteus 产品系列也包含了我们革命性的 VSM 技术,用户可以对基于微控制器的设计连同所有的周围电子器件一起仿真。用户甚至可以实时采用诸如LED/LCD、键盘、RS232 终端等动态外设模型来对设计进行交互仿真。 其功能模块:个易用而又功能强大的 ISIS 原理布图工具;PROSPICE 混合模型 SPICE 仿真;ARES PCB 设计。PROSPICE 仿真器的一个扩展 PROTEUS VSM:便于包括所有相关的器件的基于微处理器设计的协同仿真。此外,还可以结合微控制器软件使用动态的键盘,开关,按钮,LEDs 甚至 LCD 显示 CPU 模型。支持许多通用的微控制器,如 PIC,AVR,HC11 以及 8051。最新支持 ARM。交互的装置模型包括:LED 和 LCD 显示,RS232 终端,通用键盘,I2C,SPI 器件。强大的调试工具,包括寄存器和存储器,断点和单步模式。IAR C-SPY 和 Keil uVision2 等开发工具的源层调试。应用特殊模型的 DLL 界面-提供有关元件库的全部文件。大学课程设计说明书13第五章第五章 设计体会与小结设计体会与小结 出租车计费器系统的设计已经全部完成,能按预期的效果进行模拟汽车启动,停止,暂停等功能并能够通过 LCD 显示车费数目。本款出租车计价器包括单价输出、单价调整、显示当前的系统时间等功能。另外,多功能出租车计价器还具有性能可靠、电路简单、成本低、实用性强等特点,加上经过优化的程序,使其有很高的智能化水平。一个月来,经过自己努力,基本上完成了设计要求的内容,在系统可行性分析、原理图设计等方面都作了许多实际工作,取得了一些成绩,同时也遇到了一些问题,存在一些不足。经过这一个月的学习,我觉得自己不论是在理论知识方面还是在动手能力方面都有了不小的进步,自己从中受益匪浅。这次设计很好的把以前学到的理论知识应用于实践,使我认识到理论知识与实践之间有一定的差距,只有通过不断的努力学习和实践才能很好的把理论知识应用到实践当中,也只有通过不断的实践才能对理论知识的理解。通过这次设计不仅学会了如何去查找相关资料,更重要的是通过查找资料和翻阅书籍学到了不少知识,扩大了知识面,提高了知识水平。经过单元设计和系统设计巩固了以前所学的专业知识,自己真正认识到理论联系实际的重要性,为以后的学习和工作提供了很多有价值的经验。通过这次设计不仅增强了自己的动脑能力和动手能力,也提高了我思考问题、分析问题、解决问题的能力,更重要的是学会用工程化的思想来解决问题。这在以前的学习过程中是不曾学到的。这次设计是我认真认识到完整、严谨、科学分析问题、解决问题的思想是多么的重要,只有拥有了科学的态度才能设计出有用的产品。另外通过本次设计,是我认识到自己理论知识的应用能力有很大的欠缺,需要在以后的学习中进一步提高。参考文献参考文献1. 李广弟,朱月秀,冷祖祁.单片机基础M.第 3 版.北京航空航天大学出版社,20072. 李华.MCS-51 系列单片机实用接口技术M.北京航空航天大学出版社,19963. 李群芳,肖看.单片机原理接口与应用.北京:清华大学出版社,20054. 朱承高.电工及电子技术手册M.北京:高等教育出版社,19905. 高峰.单片微型应用系统设计及实用技术.北京:机械工业出版社,20046. 胡辉,单片机原理及应用设计21 世纪高等院校规划教材M,水利水电出版社,2005.77.刘守义,单片机应用技术M,西安:西安电子科技大学出版社,1996大学课程设计说明书14源程序源程序#include#define uint unsigned int#define unch unsigned charsbit lcden=P14; /lcd 使能端,高脉冲有效sbit lcdrs=P15; /lcd 数据-指令端,低电平-写指令,高电平-写数据sbit lcdrw=P16; /lcd 读-写指令端,低电平执行写,高电平执行读sbit key1=P20;/复位按键,初始起步价 5 元,里程数归 0sbit key2=P21;/+按键,手动调整白天、夜间的单价和时钟时间的调整sbit key3=P22;/-按键,手动调整白天、夜间的单价和时钟时间的调整sbit key4=P23;/白天夜间切换按键sbit key5=P24;/移屏显示时钟sbit key6=P25;/校正时间按键unch code time26=day ,Night;/白天夜间字符串数组unch code week_table74=Mon,Tue,Wed,Thu,Fri,Sat,Sun;/星期显示unch code date_table=Date:20;/年月日初始写入/*变量定义为整形实际显示是浮点型,程序写入小数点*/uint kilometer;/里程变量unch unit_price_day,unit_price_night;/白天夜间单价变量unch change,flag_display;/屏幕切换标志变量unch sw,gw;/分解位变量unch i;unch num1;/定时器 1 所需变量unch temp_second,temp_minute,temp_hour;/时钟小时、分钟、秒变量unch year,month,day;/时钟年、月、日变量unch week,n;/时钟星期所需变量unch temp_add1;/时钟校正时地址暂存变量unch row;/校正第几行变量大学课程设计说明书15unch count10s;/等待 10s 变量uint total_price_temp;/根据里程数确定的价格变量uint total_price_wait;/等待 10s 后的价格变量void start()temp_second=0;/秒初始值temp_minute=0;/分钟初始值temp_hour=0;/小时初始值year=10;/年份初始值month=8;/月份初始值day=24;/日初始值week=1;/星期初始值temp_add1=0;/校时地址暂存变量初始值row=1;/校时第几行初始值/*分解位函数*/void calculate(unch middle)sw=middle/10;/十位gw=middle%10;/个位/*ms 延时函数*/void delay(uint z)uint i,j;for(i=z;i0;i-)for(j=110;j0;j-);/*lcd 写数据*/大学课程设计说明书16void write_data(unch date)lcden=0;lcdrs=1; /写数据,高电平有效P0=date;/先赋值,delay(5); /延时后 lcden=1;/lcden 一旦拉高,数据立马写入delay(5); /延时后 lcden=0;/再次置低,准备下一次拉高/*lcd 写指令*/void write_com(unch com)lcden=0;lcdrs=0;/写指令,低电平有效P0=com;/赋值delay(5); /延时后 lcden=1;/lcden 拉高delay(5); /延时后 lcden=0;/再次置低/*lcd 初始化*/void lcd_initial()lcden=0;lcdrw=0;/表示对 lcd 进行写操作write_com(0 x38);/lcd 显示write_com(0 x0c);/开显示,不显示光标write_com(0 x06);/读或写后,地址指针+1total_price_wait=0;/等待时计费变量清 0kilometer=0;/里程数清 0unit_price_day=14;/白天单价初始值 1.4,程序写入小数点unit_price_night=17; /夜间单价初始值 1.7,程序写入小数点大学课程设计说明书17/*里程显示函数 整形表示,程序写入小数点,精确 0.1km*/void kilometer_display(uint temp)unch bw,sw,gw;write_com(0 x80);bw=temp/100;sw=temp%100/10;gw=temp%100%10;write_data(0+bw);write_data(0+sw);write_data(.);write_data(0+gw);write_data(k);write_data(m);/*单价显示函数(整形表示,程序写入小数点) */void unit_price_display(unch temp)unch sw,gw;sw=temp/10;gw=temp%10;write_com(0 x80+9);write_data(0+sw);write_data(.);write_data(0+gw);write_data(/);write_data(k);write_data(m);/*总价显示函数(整形表示,程序写入小数点)精确到角*/void total_price_display(uint temp)unch qw,bw,sw;大学课程设计说明书18qw=temp/1000;bw=temp%1000/100;sw=temp%1000%100/10;write_com(0 x80+0 x40);write_data(0+qw);write_data(0+bw);write_data(.);write_data(0+sw);/*白天/夜间,j=0 表示白天,j=1 表示夜间显示函数*/void time_display(unch j)unch n;write_com(0 x80+0 x40+9);for(n=0;timejn!=0;n+)write_data(timejn);/*外部中断 0 下降沿触发形式统计里程数*/void extern_interrupt0_initial()EA=1;/开总中断EX0=1;/开外部中断 0IT0=1;/外部中断 0 下降沿触发/*50ms 定时初始化用于时钟*/void timing1_initial()TMOD=0 x15;TH1=(65536-45872)/256;/11.0592M 晶振TL1=(65536-45872)%256;EA=1;/开总中断ET1=1;/开定时器 1大学课程设计说明书19TR1=1;/启动定时器 1 时钟/*采用中断的方式记录里程,下降沿触发*/void extern_interrupt0() interrupt 0unch mile_num;count10s=0;if(mile_num10) /每个方波代表 10 米,10 次代表 100 米即显示 0.1公里mile_num+;elsemile_num=0;kilometer=kilometer+1;/*屏 2 日期显示函数*/void lcd_date_display()unch i;write_com(0 x80+0 x40+24);for(i=0;date_tablei!=0;i+)write_data(date_tablei);/*屏 2 时钟显示函数*/void lcd2_display()if(num1=20)/定时器 1 50ms一次中断 20 次即为 1s大学课程设计说明书20num1=0;temp_second+;count10s+; if(temp_second=60)temp_second=0;temp_minute+; if(temp_minute=60)temp_minute=0;temp_hour+; if(temp_hour=24)temp_hour=0;day+;week+; if(week=7)week=0;if(day=32)/未考虑某月 31 天或 30 天以及闰年平年day=1;month+;if(month=13)month=1;year+;calculate(temp_second);/分解秒的各位 write_com(0 x80+24+8);/确定秒在 lcd 屏上的位置 write_data(0+sw); write_data(0+gw);大学课程设计说明书21calculate(temp_minute); /分解分的各位write_com(0 x80+24+0 x05); /确定分钟在 lcd 屏上的位置write_data(0+sw); write_data(0+gw); write_data(:);calculate(temp_hour);/分解时的各位write_com(0 x80+24+0 x02);/确定小时在 lcd 屏上的位置write_data(0+sw); write_data(0+gw);write_data(:);write_com(0 x80+24+12);/确定星期在 lcd 屏上的位置for(n=0;week_tableweekn!=0;n+)write_data(week_tableweekn);calculate(year);/分解年的各位write_com(0 x80+0 x40+24+7);/确定年在 lcd 屏上的位置write_data(0+sw); write_data(0+gw);write_data(/);calculate(month);/分解月的各位write_com(0 x80+0 x40+24+10); /确定月在 lcd 屏上的位置write_data(0+sw); write_data(0+gw);write_data(/);大学课程设计说明书22calculate(day);/分解日的各位 write_com(0 x80+0 x40+24+13);/确定日在 lcd 屏上的位置 write_data(0+sw); write_data(0+gw);write_data(0);/*定时器 1 中断程序*/void timing1() interrupt 3TR1=0;TH1=(65536-45872)/256;TL1=(65536-45872)%256;num1+;lcd2_display();/第二屏液晶显示函数TR1=1;/*独立键盘扫描函数*/void key_scan()if(key1=0)/复位按键,初始起步价 5 元,里程数归 0delay(5);if(key1=0)while(!key1);delay(5);while(!key1);total_price_temp=0;lcd_initial();/初始化液晶第一屏,里程数归 0,起步价 5 元kilometer_display(kilometer);/显示复位后初始里程数大学课程设计说明书23if(i%2=1)/奇数次按下是夜间状态再复位unit_price_display(unit_price_night);/显示夜间单价time_display(1);/显示夜间状态if(i%2=0)/偶数次按下是白天状态再复位unit_price_display(unit_price_day);/显示白天单价time_display(0);/显示白天状态total_price_display(500);/起步价 5 元,程序写入小数点lcd_date_display();/年月日初始写入if(flag_display=0)/如果是在屏幕 1if(key2=0)delay(5);if(key2=0)while(!key2);delay(5);while(!key2);if(i%2=0)/偶数次按下切换键后是白天,白天单价调整增加unit_price_day+;if(i%2=1)/奇数次按下切换键后是夜间,夜间单价调整增加unit_price_night+;if(key3=0)大学课程设计说明书24delay(5);if(key3=0)while(!key3);delay(5);while(!key3);if(i%2=0)/偶数次按下切换键后是白天,白天单价调整减少unit_price_day-;if(i%2=1)/奇数次按下切换键后是夜间,夜间单价调整减少unit_price_night-;/*如果是在屏幕 2 则校正时钟*/if(flag_display=1)if(key6=0)delay(5);if(key6=0)temp_add1+=3;/地址变量不断更新while(!key6);TR1=0;/时钟停止准备校时switch(temp_add1)case 15:temp_add1=8;/充新赋值地址暂存变量,准备校正第 2 排row=2;break;case 17:temp_add1=0;/第一屏校正完后row=1;大学课程设计说明书25write_com(0 x0c);/光标不闪TR1=1;/时钟启动break;if(temp_add1=3)/采用寻地址法校正,小时加法校正if(key2=0)delay(5);if(key2=0)while(!key2);temp_hour+;if(temp_hour=24)temp_hour=0;write_com(0 x80+24+temp_add1-1);calculate(temp_hour);write_data(0+sw);write_data(0+gw);if(temp_add1=6)/采用寻地址法校正,分钟加法校正if(key2=0)delay(5);if(key2=0)while(!key2);大学课程设计说明书26temp_minute+;if(temp_minute=60)temp_minute=0;write_com(0 x80+24+temp_add1-1);calculate(temp_minute);write_data(0+sw);write_data(0+gw);if(temp_add1=9)/采用寻地址法校正,秒加法校正if(key2=0)delay(5);if(key2=0)while(!key2);temp_second+;if(temp_second=60)temp_second=0;write_com(0 x80+24+temp_add1-1);calculate(temp_second);write_data(0+sw);write_data(0+gw);大学课程设计说明书27if(temp_add1=12)/采用寻地址法校正,星期加法校正if(key2=0)delay(5);if(key2=0)while(!key2);week+;if(week=7)week=0;write_com(0 x80+24+temp_add1);for(n=0;week_tableweekn!=0;n+)write_data(week_tableweekn);if(temp_add1=8)/采用寻地址法校正,年加法校正if(key2=0)delay(5);if(key2=0)while(!key2);year+;if(year=99)year=0;write_com(0 x80+0 x40+24+temp_add1-1);calculate(year);大学课程设计说明书28write_data(0+sw);write_data(0+gw);if(temp_add1=11)/采用寻地址法校正,月加法校正if(key2=0)delay(5);if(key2=0)while(!key2);month+;if(month=13)month=1;write_com(0 x80+0 x40+24+temp_add1-1);calculate(month);write_data(0+sw);write_data(0+gw);if(temp_add1=14)/采用寻地址法校正,日加法校正if(key2=0)delay(5);if(key2=0)while(!key2);大学课程设计说明书29day+;if(day=32)day=1;write_com(0 x80+0 x40+24+temp_add1-1);calculate(day);write_data(0+sw);write_data(0+gw);if(temp_add1=3)/采用寻地址法校正,小时减法校正if(key3=0)delay(5);if(key3=0)while(!key3);temp_hour-;if(temp_hour=255)temp_hour=23;write_com(0 x80+24+temp_add1-1);calculate(temp_hour);write_data(0+sw);write_data(0+gw);大学课程设计说明书30if(temp_add1=6)/采用寻地址法校正,分钟减法校正if(key3=0)delay(5);if(key3=0)while(!key3);temp_minute-;if(temp_minute=255)temp_minute=59;write_com(0 x80+24+temp_add1-1);calculate(temp_minute);write_data(0+sw);write_data(0+gw);if(temp_add1=9)/采用寻地址法校正,秒减法校正if(key3=0)delay(5);if(key3=0)while(!key3);temp_second-;if(temp_second=255)temp_second=59;大学课程设计说明书31write_com(0 x80+24+temp_add1-1);calculate(temp_second);write_data(0+sw);write_data(0+gw);if(temp_add1=12)/采用寻地址法校正,星期减法校正if(key3=0)delay(5);if(key3=0)while(!key3);week-;if(week=255)week=6;write_com(0 x80+24+temp_add1);for(n=0;week_tableweekn!=0;n+)write_data(week_tableweekn);if(temp_add1=8)/采用寻地址法校正,年减法校正if(key3=0)delay(5);if(key3=0)大学课程设计说明书32while(!key3);year-;if(year=255)year=99;write_com(0 x80+0 x40+24+temp_add1-1);calculate(year);write_data(0+sw);write_data(0+gw);if(temp_add1=11)/采用寻地址法校正,月减法校正if(key3=0)delay(5);if(key3=0)while(!key3);month-;if(month=0)month=12;write_com(0 x80+0 x40+24+temp_add1-1);calculate(month);write_data(0+sw);write_data(0+gw);大学课程设计说明书33if(temp_add1=14)/采用寻地址法校正,日减法校正if(key3=0)delay(5);if(key3=0)while(!key3);day-;if(day=0)day=31;write_com(0 x80+0 x40+24+temp_add1-1);calculate(day);write_data(0+sw);write_data(0+gw);/*白天/夜间切换*/if(key4=0)delay(5);if(key4=0)i+;while(!key4);delay(5);while(!key4);if(i%2=1)/奇数次按下切换键是夜间模式unit_price_display(unit_price_night);time_display(1);if(i%2=0)/偶数次按下切换键是白天模式大学课程设计说明书34unit_price_display(unit_price_day);time_display(0);/*屏幕切换按键*/if(key5=0)delay(5);if(key5=0)while(!key5);change+;if(change%2=1)/按奇数次在第二屏flag_display=1;/第 2 屏标志变量for(i=0;i16;i+) /右移屏write_com(0 x18);i=0;if(change%2=0)/按偶数次在第 1 屏flag_display=0;/第一屏标志变量for(i=0;i16;i+) /左移屏write_com(0 x1c);write_com(0 x80);write_data( );i=0;void main()lcd_initial();kilometer_display(kilometer);/初始写入里程数unit_price_display(unit_price_day);/初始写入白天模式下的单价,程序写入小数点大学课程设计说明书35total_price_display(500);/初始显示起步价 5 元,程序写入小数点time_display(0);/初始显示白天模式start();/一些变量的初始化函数lcd_date_display();timing1_initial();/时钟定时器 1 的初始化extern_interrupt0_initial();/统计里程的外部中断 0 的初始化while(1)key_scan();/键盘扫描函数kilometer_display(kilometer);/实时显示里程数if(count10s30)/前 3km 不计费total_price_temp=(kilometer-30)*unit_price_night;total_price_display(total_price_temp+500+total_price_wait);else/白天模式unit_price_display(unit_price_day);if(kilometer30)/前 3km 不计费total_price_temp=(kilometer-30)*unit_price_day;total_price_display(total_price_temp+500+total_price_wait);else if(count10s=10)/等待到了 10s 后的价格显示count10s=0;total_price_wait+=100;/每等待 10s 价格增加 1 元大学课程设计说明书36total_price_display(total_price_temp+500+total_price_wait);/*屏幕 2 校正时间时光标的写入*/if(temp_add1!=0&row=1)write_com(0 x80+24+temp_add1);write_com(0 x0f);if(temp_add1!=0&row=2)write_com(0 x80+0 x40+24+temp_add1);write_com(0 x0f);附 录 二二设计总图设计总图大学课程设计说明书37
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!