资源描述
河南理工大学
《微机原理和单片机接口技术》
课程设计汇报
出租车计价器设计
姓 名: 郝高锋 蒋亚光
学 号:
专业班级:
指导老师:
所在学院: 电气工程和自动化学院
04月 10 日
摘要
本设计是一个基于单片机出租车计价器。本设计关键完成功效有计时,计费,统计里程,空车显示,暂停,测速等。用到硬件关键有C51单片机,直流电动机,霍尔传感器等。经过霍尔传感器及单片机外部中止功效,统计车轮旋转圈数,经过车轮周长计算里程。因为使用单片机系统附带数码管显示只有四个数码管,所以每次只能显示一个数据:里程、费用或等候时间。为了全部数据全部能在数码管上显示,加入了按键。第五个键能够显示里程,第六个键能够显示等候时间,第五个键和第六个键全部没有按话就是显示费用。本设计还附有测速功效,经过单片机内部计时器计时,经过每分钟测得里程计算出车速度。经过测得速度判定使用里程计费还是经过时间计费,这么也比较人性化。本设计另一个人性化之处于于能够暂停计费,这么能够随时暂停计费,支持部分收费。本设计空车提醒功效对司机和乘客全部有好处,方便乘客叫车,也能够降低司机麻烦。本设计经过灯提醒表示某个键被按下,这么能让司机和乘客很清楚看到按了什么键。当按下开启计费键后绿灯会亮,这么就会让司机很轻易判定是不是按了开启计费键,以免造成无须要损失。当按下暂停键时,红灯就会亮,这么方便乘客判定是不是暂停了计费,有利于保障乘客正当权益。而空车则有黄灯提醒,这么乘客只要看到黄灯就能判定是空车能够方便乘客叫车。
本设计关键有三部分组成,分别是霍尔传感器测量部分、单片机处理部分、数码显示部分。霍尔传感器测量部分关键是由硬件组成不需要太多编程,而单片机处理部分关键任务是编程,数码管显示部分是单片机扩张部分。下面对本设计进行部分简单功效总体描述。加电以后系统默显示三公里内费用,此时处于初始状态;第一个键是计费开启键,按下以后开始计费同时绿灯亮;第二个键是计费暂停键,按下以后计费暂停同时红灯亮;第三个键是空车提醒键,按下以后黄灯亮,同时等候时间、里程、费用等全部归零;第四个键是单程和往返转换键,能够实现单程、往返转化;第五个键是里程查询键,按了以后数码管显示里程数;第六个键是等候时间查询键,按了以后能够查询等候时间。
关键字:C51单片机 霍尔传感器 费用 里程 等候时间 中止 计时器
1概述
1.1出租车起源
出租车是一个公共交通工具,通常是短途、往返于同一城市不一样地点。其收费通常比其它公共交通高,比如:公交车、地铁等。出租车起源于英国。1620年,伦敦出现了第一家四轮马车出租车队,尽管整个车队才有四辆马车,不过车夫们穿着统一订做制服,行驶于街道十分拉风,随即这一行业开始迅猛发展起来。1654年,英国议会颁布了出租马车管理法令,并给出租马车主发放营业许可证。 1886年卡尔·本茨发明了以汽油发动机为动力三轮汽车,这十二个月被称为汽车元年。 而直到1897年,世界上第一家出租汽车企业才在德国斯图加特成立。
中国出租车行业最早是始于清朝末年,当初有部分德国商人和法国商人在中国办了洋车行,包含上海、北京、青岛、宁波等口岸城市。建国以后出租车行业曾经存在过一阵子,到文革期间出租车被看成资本主义尾巴给根本割掉了。以后文革以后有缓慢发展,到改革开放后有了较大发展。
1.2出租车计价器研究现实状况
出租车计价器大约经历了四个发展阶段,一、传统全部由机械元器件组成机械式,二、半电子式即用电子线路替换部分机械元器件,三、集成电路式,四、单片机式。
使用单片机设计出租车计价器功效很强大,能够满足计时、计程、计费、查看、存放、统计等多个计量功效。利用编程可设计出多个不一样计费模式,不一样情况采取不一样收费方法,使司机在工作中能够应付多种突发情况,设计理念愈加人性化,符合当今社会需要。其多种功效由键盘控制,操作简单。且计价器造价低廉,安装方便,优势显著。
1.3出租车计价器发展趋势
伴随单片机性能不停提升而价格却不停下降,单片机控制得到更广泛应用。外围芯片不停发展使得计价器功效愈加强大,性能愈加稳定。伴随电子技术发展和对计价器不停改善和完善,产生了很多附加功效。比如: (1)存放功效,可存放多项营运数据,便于查询。新型数据存放器应用使得计价器营运数据在掉电情况下还能够保留;(2)永久时钟功效,在非营运状态下,日历时钟芯片使用使计价器能够显示永久时钟;(3)LCD显示功效,液晶屏使用让计价器实现多屏显示功效,可同时显示各项营运数据使乘客一目了然。
1.4本设计目标及意义
伴随人民生活水平提升,大家已经不再满足于衣食住享受,出行舒适程度已经受到越来越多人关注。于是,出租车行业以较低价格,较高服务质量,给大家带来了出行方便及享受。不过大量买卖纠纷困扰着行业发展。改良计价器是处理这一矛盾最好方法。用愈加精良计价器来为乘客提供愈加方便快捷、优良服务是本设计一大目标。凡坐过出租车人全部知道,只要汽车一开动,伴随行驶里程增加,汽车前面计价器,里程显示器显示读数就会从零逐步增大,而当行驶到某一值时(如3千米)计费数字显示器开始从起步价(如5元)增加。当出租车抵达某地需要在那里等候时,司机按下“计时”键,每等候一定时间,计费显示就增加一个等候费用。汽车继续行驶时,停止计算等候费,继续增加里程计费。抵达目标地,便可按显示数字收费。
中国在70年代开始出现出租车,但那时计费系统大全部是从国外进口,不仅不正确,而且价格还十分昂贵。伴随改革开放日益深入,出租车行业发展势头已十分突出,中国很多机械厂家全部推出了国产计价器。出租车计价器功效也从刚开始只显示旅程(需要司机自己定价,计算后四舍五入),发展到能够自主计费,和现在能够打发票和语音提醒、按时间自主变动单价等功效。伴随城市旅游业发展,出租车行业已成为城市窗口,象征着一个城市文明程度。所以能够本课题研究很有必需,意义重大。
2系统总体方案及硬件设计
2.1计价器工作原理
出租车计价器是依据乘客乘坐汽车行驶距离和等候时间多少进行计价,并在行程中同时显示费用。从起步价开始,当汽车程行驶未满3公里时,均按起步价计算。过3公里后,实现每1公里单价收费,中间遇暂停时,开始计时收费,测距收费和计时收费和便组成了乘客总车费。完整出租车计价器还应包含存放、查看、统计等功效。
本计价器设计采取单片机控制。关键是利用单片机丰富I/O端口和其控制灵活性,实现基础里程计价功效、时钟显示功效、空车提醒等功效。其原理框图以下:
里
程
键 盘 控 制
89S51
单
片
机
里程计算单元
串口显示驱动电路
总金额显示
等候时 间
原理框架图
经过键盘控制计价器开启、暂停、空车提醒及多种显示之间转换。测量单元是很关键单元,用来测量里程;同时和计时器配合工作也能够测速。而单片机是关键处理单元,处理按键信息及测量单元信息,并发出正确指令,在整个系统中作用就相当于人大脑。显示单元是一个关键人际交流单元,关键用来显示费用、里程、总等候时间等信息,为司机和乘客提供多种方便。
2.2单片机单元
单片机单元是本设计关键部分,采取是C51单片机。AT89C51是美国ATMEL企业生产低电压,高性能CMOS8位单片机,片内含4k bytes可反复擦写只读程序存放器(PEROM)和128 bytes随机存取数据存放器(RAM),器件采取ATMEL企业高密度、非易失性存放技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存放单元,功效强大AT89C51单片机可为您提供很多高性价比应用场所,可灵活应用于多种控制领域。
关键性能参数:
·和MCS-51产品指令系统完全兼容
·4k字节可重擦写Flash闪速存放器
·1000次擦写周期
·全静态操作:0Hz-24MHz
·三级加密程序存放器
·128×8字节内部RAM
·32个可编程I/O口线
·2个16位定时/计数器
·6个中止源
·可编程串行UART通道
·低功耗空闲和掉电模式
单片机引脚图以下:
AT89C51 提供以下标准功效:4k 字节Flash 闪速存放器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中止结构,一个全双工串行通信口,片内振荡器立即钟电路。同时,AT89C51可降至0Hz静态逻辑操作,并支持两种软件可选节电工作模式。空闲方法停止CPU工作,但许可RAM,定时/计数器,串行通信口及中止系统继续工作。掉电方法保留RAM中内容,但振荡器停止工作并严禁其它全部部件工作直到下一个硬件复位。
·P0 口:P0 口是一组8 位漏极开路型双向I/O 口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流方法驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。在访问外部数据存放器或程序存放器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在FIash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
·P1口:P1是一个带内部上拉电阻8位双向I/O口,P1输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,经过内部上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。FIash编程和程序校验期间,P1接收低8位地址。
·P2口:P2是一个带有内部上拉电阻8位双向I/O口,P2输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,经过内部上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存放器或16位地址外部数据存放器(比如实施MOVX@DPTR指令)时,P2口送出高8位地址数据。在访问8 位地址外部数据存放器(如实施MOVX@RI 指令)时,P2 口线上内容(也即特殊功效寄存器(SFR)区中R2寄存器内容),在整个访问期间不改变。Flash编程或校验时,P2亦接收高位地址和其它控制信号。
·P3口:P3口是一组带有内部上拉电阻8 位双向I/O 口。P3 口输出缓冲级可驱动(吸收或输出电流)4 个TTL逻辑门电路。对P3 口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。作输入端时,被外部拉低P3 口将用
上拉电阻输出电流(IIL)。P3口除了作为通常I/O口线外,更关键用途是它第二功效,以下表所表示:
端口引脚
第二功效
P3^0
RXD(串行输入口)
P3^1
TXD(串行输出口)
P3^2
/INT0(外中止0)
P3^3
/INT1(外中止1)
P3^4
T0(定时/计数器0外部输入)
P3^5
T1(定时/计数器1外部输入)
P3^6
/WR(外部数据存放器写选通)
P3^7
/RD(外部数据存放器读选通)
本设计使用单片机最小系统以下图:
2.3里程计算
里程计算是经过安装在车轮上霍尔传感器A44E检测到信号,送到单片机,经处理计算,送给显示单元。霍尔传感器是依据霍尔效应制作一个磁场传感器。在半导体薄片两端通以控制电流I,并在薄片垂直方向施加磁感应强度为B匀强磁场,则在垂直于电流和磁场方向上,将产生电势差为UH霍尔电压。因为A44E 属于开关型霍尔器件,其工作电压范围比较宽(4.5~18V),其输出信号符合TTL 电平标准,能够直接接到单片机IO 端口上,而且其最高检测频率可达成1MHZ。
差分放大器C、施密特触发器D 和OC 门输出E 五个基础部分组成。在输入端输入电压CC V ,经稳压器稳压后加在霍耳电势发生器两端,依据霍耳效应原理,当霍耳片处于磁场中时,在垂直于磁场方向通以电流,则和这二者相垂直方向上将会产生霍耳电势差H V 输出,该H V 信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC 门输出。当施加磁场达成“工作点”(即OP B )时,触发器输出高电压(相对于地电位),使三极管导通,此时OC 门输出端输出低电压,通常称这种状态为“开”。当施加磁场达成“释放点”(即rP B )时,触发器输出低电压,三极管截止,使OC 门输出高电压,这种状态为“关”。这么两次电压变换,使霍耳开关完成了一次开关动作。
里程测量原理图以下:
本设计选择了P3.2 口作为信号输入端,内部采取外部中止0,车轮每转一圈(我们设车轮周长是1 米),霍尔开关就检测并输出信号,引发单片中止,对脉计数,当计数达成1000 次时,也就是1 公里,单片机就控制将金额自动加增加,算公式:单价× 公里数=金额。
2.4键盘控制及指示灯单元
本设计是用了最小系统全部六个键。第一个键是计费开启键,按下以后开始计费同时绿灯亮;第二个键是计费暂停键,按下以后计费暂停同时红灯亮;第三个键是空车提醒键,按下以后黄灯亮,同时等候时间、里程、费用等全部归零;第四个键是单程和往返转换键,能够实现单程、往返转化;第五个键是里程查询键,按了以后数码管显示里程数;第六个键是等候时间查询键,按了以后能够查询等候时间。
键盘电路以下图:
本设计灯指示功效关键是方便乘客和司机。按下开启键时绿灯亮这么既能提醒乘客已经开始计费,预防司机多计费又能预防司机忘记按下开启键而造成少收费,使司机受到损失。是一个很人性化设计。
2.5显示单元
本设计利用单片机最小系统只有四个数码管动态显示所以同一时间内只能显示费用、里程、等候时间中一个,所以为了能够让乘客和司机能看到多种数据就要用到键盘转换,按下不一样键显示不一样数据。系统默认是显示费用,假如想看到其它数据就要按下对应按键。第五个键是里程查询键,按了以后数码管显示里程数;第六个键是等候时间查询键,按了以后能够查询等候时间。单片机最小系统所用数码显示管是共阴极数码显示管,送高电平亮。因为四个数码管共用一个八位端口所以要用到动态显示。
数码管动态显示扫描时间比较难调整,需要数次调整。比较繁琐不过只要坚持数次调整就能够成功。
3 软件设计
本设计电路部分比较简单关键是软件部分,所以软件是关键部分。关键包含外部中止0,定时器中止1,键盘扫描,数码管显示等模块。
3.1主程序模块
主程序关键是完成初始化,包含推挽试输出、设置定时器工作方法、中止控制寄存器设置。当然还包含一个死循环,循环中包含键盘扫描和数码管显示。
开 始
初始化、赋初值
键盘扫描
数码管显示
判定是那个键被按下
实施相关操作
3.2外部中止
车轮每转一周实施一次中止程序实施一次中止程序,假如是处于依据里程计费模式则统计圈数变量q和n全部增加1,然后判定q是否达成一千,假如达成一千则旅程增加二百米。同时判定是单程还是双程,假如单程则费用增加0.4元,假如是双程则费用增加0.3元。假如是处于计时收费模式则仅n增加1。步骤图以下
否
是
否
是
否
是
否
是
开始
K是否为0
q++
n++
n++
q是否为1000
j是否大于3
f==5
d是否为0
f=2*(j-3)
f=1.5*(j-3)
j+0,2
结束
变量k是否为零是为了判定是否为计程收费,假如k为零则说明是计程收费、假如k不为零则表示是计时收费。变量j表示里程,里程小于3公里时费用为5元,当里程大于三公里时按单程价格为2元/公里,往返价格为1.5元/公里收费。
3.3计时测速单元
定时测速关键是为了满足“车速<5公里/小时时间累积为总等候时间,每5分钟等候时间相当于里程数增加1公里”这项要求。测速原理是:经过定时器能够实现每一分钟全部实施一次定时器中止程序,在定时器中止程序中判定车轮在这一分钟转圈数,然后利用圈数及车轮周长计算车速。当车速小于5公里/小时时就会进入计时收费模式,此时变量k置1,中止程序中统计车运行圈数不会增加,同时统计圈数变量q要减去这一分钟内圈数n。当速度再次大于5公里/小时时k又被置0,进入计程收费模式,同时统计q加上这一分钟之内汽车转过圈数n。
是
是 否
否
否
是
否
是
开始 初始化 赋初值
是否到一分钟
n是否大于100
q=q-n j=j+0.2 k=1
j是否大于3
d是否为0
f=2*(j-3)
f=1.5*(j-3)
f==5
k是否为1
r=n
k=0
n=0 结束
3.4键盘扫描单元
键盘扫描关键是判定哪个键被按下然后实施相关程序。按键具体功效描述以下:第一个键是计费开启键,按下以后开始计费同时绿灯亮;第二个键是计费暂停键,按下以后计费暂停同时红灯亮;第三个键是空车提醒键,按下以后黄灯亮,同时等候时间、里程、费用等全部归零;第四个键是单程和往返转换键,能够实现单程、往返转化;第五个键是里程查询键,按了以后数码管显示里程数;第六个键是等候时间查询键,按了以后能够查询等候时间。
3.5显示单元
显示单元比较简单只是利用了动态显示,将要显示数据经过数码管显示。步骤图以下:
开始
e是否等于1
w是否等于1
g=10*f
g=j*10
g=h
显示g 结束
4 Proteus软件仿真
5课程设计体会
刚开始时不了解霍尔传感器是怎样使用所以感觉硬件电路部分无从下手,为了处理这个问题查了很多资料也在网络上找了很多资料而且和同学进行了讨论。明白了霍尔传感器工作原理以后就是焊接电路了,这次设计电路相对还是比较简单,所以焊接电路只碰到了部分比较小问题还是很轻易就能处理。关键是程序设计,相关怎样测量问题开始有两种方案:一、用计数器统计车轮转过圈数,二、使用外部中止统计车轮转过圈数。经过分析发觉用计数器统计圈数不轻易测速,所以选择了使用外部中止进行统计圈数。圈定好方案后首先大约把程序结构想好然后在进行程序编写。其实程序编写过程还是很顺利,没有碰到什么困难,不过在程序调试中碰到了一个难题即外部中止程序不能够实施,经过了数次检验全部没有发觉错,开始怀疑是硬件出了问题于是就怀疑是霍尔传感器出了问题。不过把霍尔传感器装到其它同学电路上却运行正常,排除了霍尔传感器问题。还是回到了程序上,经过对程序认真仔细检验最终发觉了错误所在,其实就是一个细节问题,一个很细小失误,不过这个失误让我付出了很大代价。首先是花费时间,为了这个很小失误我大约用了近五六个小时时间,不停调试、查看程序。其次是很影响心情,因为整个程序构思和各个方面全部没有什么错误,不过偏偏运行结果不正确,这对我造成了很大心理压力,信心也很受打击。处理了这个细小失误以后程序和硬件基础上就没有什么问题了,达成了预想要求。
以后次设计中我学到最关键一点就是细节决定成败。做任何事全部要重视细节,正所谓千里之提溃于蚁穴。一定要把每个细节做好,不能只看整体思绪没有问题就认为大功告成了,往往在某个细节上功亏一篑。其实做好每个细节并不难就看你认真不认真,或许很仔细很认真去做会在刚开始时候有点慢,用时间比较多,不过在调试时候会省去很多时间。以前我认为能把程序主体部分先编出来然后在进行调试就简单了,不过伴随编写程序增多我发觉调试和修改程序往往比编写程序更麻烦,更需要精力。因为你第一遍编写时候是根据你设想编写,因为你不认真可能造成实际编写和你所设想算法有些出入,然后你检验时候因为潜意识中认为是根据自己设想编写就很轻易忽略一些小失误,这么就极难查出那些不太显著错误。恰恰就是这些小失误可能造成你整个工程无法完成。
参考文件
[1] 河南理工大学.微机原理和单片机接口技术[M].
[2] 徐淑华等著. 《单片机微型机原理及应用》 .哈尔滨工业大学出版社
[3] 马淑华等著《单片机原理和接口技术》.北京邮电大学出版社
[4]李群芳、张士军、黄建.《单片微型计算机和接口技术》(第三版).电子工业出版社,.
[5]李群芳,肖看.单片机原理接口和应用.北京:清华大学出版社,.
附1:源程序代码
#include <stc51.h>
#define uint unsigned int
#define uchar unsigned char
sbit w1=P0^0;
sbit w2=P0^1;
sbit w3=P0^2;
sbit w4=P0^3;
sbit L1=P0^5;
sbit L2=P0^6;
sbit L3=P0^7;
sbit H1=P3^6;
sbit H2=P3^7;
sbit D1=P2^0;
sbit D4=P2^3;
sbit D7=P2^6;
sbit D10=P3^3;
sbit D3=P2^2;
sbit D6=P2^5;
sbit D12=P3^5;
sbit D2=P2^1;
sbit D5=P2^4;
sbit D8=P2^7;
sbit D11=P3^4;
char tab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
char tab2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
static uchar x,m,k,s,d,e,r,w,y,g1,g2,g3,g4;
static int q,n;
static float j,f;
static uint g,h;
void xianshi();
void dealy(uint i,c)//延时函数
{
uint a,b;
for(a=i;a>0;a--)
for(b=c;b>0;b--);
}
void INT0() interrupt 0 //外部中止0,用于统计车轮圈数
{
if(k==0)//k==1时为表示计时收费,k==0时表示计程收费
{
q=q+r;//加上在计时收费最终一分钟里漏加圈数
r=0;
q++;//圈数加一
if(q>=1000)//是否达成二百米
{
q=0;
j=j+0.2;//里程增加二百米
if(j>3&&d==0)//单程
f=5+2*(j-3);
if(j>3&&d==1)//往返
f=5+1.5*(j-3);
}
if(j<=3)//里程小于三公里费用为五元
f=5;
}
if(j<=3)//里程小于三公里费用为五元
f=5;
n++;//用于测速圈数n加一
}
void T1() interrupt 3//定时器1中止
{
TH1 = (65536-50000)/256;//赋初值
TL1 = (65536-50000)%256;
x++;
if(x>=5)//是否到一秒
{
x=0;
m++;
if((m-1)>=10)//是否到一分钟
{
m=0;
if(n<100)//n小于100时表示速度小于5公里/小时
{
q=q-n;//圈数减去计程最终一分钟中多加圈数
j=j+0.2;//每分钟相当于两公里
if(j>3&&d==0)//单程
f=5+2*(j-3);
if(j>3&&d==1)//往返
f=5+1.5*(j-3);
if(j<=3)//里程小于三公里费用为五元
f=5;
k=1;//进入计时收费模式,k==1时为表示计时收费,k==0时表示计程收费。
h++;//等候时间加一分钟
}
if(n>=100)//n大于100时表示速度大于5公里/小时
{
if(k==1)//是否为进入计程收费模式第一个一分钟,假如是则需要把q加n
r=n;
k=0;//进入计程收费模式,k==1时为表示计时收费,k==0时表示计程收费。
}
n=0;//n清零
}
}
}
void key1()//键盘扫描
{
H1=0;
H2=1;
if(L1==0)//第一个键被按下,是开启键
{
while(L1==0)//松手检测
xianshi();
TR1=1;//开定时器
EX0=1;//开外部中止0
D1=D4=D7=D10=0;//全部绿灯亮
D3=D6=D12=D2=D5=D8=D11=1;//关闭其它灯
}
if(L2==0) //第二个键被按下,是暂停键
{
while(L2==0)//松手检测
xianshi();
TR1=0;//关定时器
EX0=0;//关外部中止
D1=D4=D7=D10=D2=D5=D8=D11=1;//关闭其它灯
D3=D6=D12=0;//三个红灯亮
}
if(L3==0)//第三个键按下,是清零键及空车提醒键
{
while(L3==0)//松手检测
xianshi();
f=j=q=n=m=x=h=0;//全部统计变量清零
TR1=0;//关定时器
EX0=0;//关外部中止
D1=D4=D7=D10=D3=D6=D12=1;//关闭其它灯
D2=D5=D8=D11=0;//全部红灯亮
}
H1=1;
H2=0;
if(L1==0)//第四个键被按下,单双程转换键
{
while(L1==0)//松手检测
xianshi();
d=!d;//d==0为单程、d==1往返
y++;//y加一,y==1表示由单程转换为往返,y==2为由往返转换为单程
if(y==1&&f>5)//由单程转换为往返
f=f*3/4;
if(y==2&&f>5)//为由往返转换为单程
{
f=f*4/3;
y=0;
}
}
if(L2==0)//第五个键被按下,让显示转换为显示里程
{
while(L2==0)//松手检测
xianshi();
w=!w;//w==1显示里程
}
if(L3==0)//第六个键被按下,让显示转换为显示等候时间
{
while(L3==0)//松手检测
xianshi();
e=!e;//e==1显示等候时间
}
}
void xianshi()
{
if(e==1)//e==1显示等候时间
g=h;
if(w==1)//w==1显示里程
g=j*10;//把j由float转换成int
if(e==0&&w==0)
g=f*10;//把f由float转换成int
g1=g/1000;//求出千位数
g2=(g/100)%10;//求出百位数
g3=(g/10)%10;//求出十位数
g4=g%10;//求出个数位
w1=0;//显示第一个数
P1=tab1[g1];
dealy(50,13);//延时
w1=1;
w2=0;//显示第二位数
P1=tab1[g2];
dealy(50,13);//延时
w2=1;
w3=0;//显示第三位数
if(e==0)//旅程或费用,带小数点
P1=tab2[g3];
if(e==1)//显示时间不带小数点
P1=tab1[g3];
dealy(50,13);//延时
w3=1;
w4=0;//显示第四位数
P1=tab1[g4];
dealy(50,13);//延时
w4=1;
}
void main()
{
P1M0=0xff;//推挽式输出
P1M1=0x00;
TMOD=0x10;//定时器0工作在方法二 定时器一工作在方法一
EA=1;//开总中止
ET1=1;//开定时器中止
EX0=0;//关外部中止
//IT0=1;
//k=0;
f=5;//f赋初值
//TH0=0xca;
//TL0=0xca;
TH1 = (65536-50000)/256;//定时器赋初值
TL1 = (65536-50000)%256;
while(1)//死循环
{
key1();//调用键盘扫描函数
xianshi();//调用显示函数
}
}
附2:系统原理图
展开阅读全文