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

时间:2019-05-13 23:54:39下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《51单片机 出租车计价器课程设计》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《51单片机 出租车计价器课程设计》。

第一篇:51单片机 出租车计价器课程设计

第一章 出租车计价系统的设计要求与设计方案

1.1 出租车计价器设计要求

设计一个出租车自动计费器,计费包括起步价、行车里程计费、等待时间计费三部分,用七段数码管显示总金额,单价,运行里程,起步价为6元,超过6元,每一公里增加1元或2元,等待时间单价为每30秒钟1元,计费功能:费用的计算是按行驶里程收费。设起步价为6元。

1、当总金额<6元时,按起价计算费用

2、当总金额>6元时,每公里按1元或2元计费

3、等待累计时间>30s时,按1元/30s计费

4、S1为启动按钮、S2转换单价按钮、S3复位按钮。显示功能:

1、显示行驶里程:用三位数字显示,显示方式为“XX.X”,单位为km。计程范围0-99.9km,精确到0.1km。

2、显示单价:用两位数字显示,显示方式为“X.X”,单位为元。

3、显示总费用:用三位数字显示,显示方式为“XX.X”,单位为元。计价范围0-99.9元,精确到0.1元。

1.2 系统主要功能

本出租车自动计费,上电后显示最初的起步价,里程计费单价。同时具有运行,复位,转换等状态,可以切换白天与晚上不同计费单价,可以实现每等待30s收1元功能。出租车显示行驶的总费用,里程,单价。

1.3 方案论证与比较

方案一:采用数字电子技术,利用555定时芯片构成多谐振荡器,或采用外围的晶振电路作为时钟脉冲信号,采用计数芯片对脉冲尽心脉冲的计数和分频,最后通过译码电路对数据进行译码,将译码所得的数据送给数码管显示,一下是该方案的流程框图,方案一如图1-1所示:

图1-1方案一

方案二:采用EDA技术,根据层次化设计理论,该设计问题自顶向下可分为分频模块,控制模块 计量模块、译码和动态扫描显示模块,其系统框图如图1-2所示:

图1-2方案二

方案三:采用MCU技术,通过单片机作为主控器,采用外部晶振作为时钟脉冲,通过按键可以方便调节,以下是方案三的系统流程图,本方案主要是必须对于数字电路比较熟悉,成本又不高。方案图如图1-3所示:

图1-3方案三

方案总结:通过各个方案的比较,本次采用方案三,不但控制简单,而且成本低廉,设计电路简单。

第二章 出租车计价系统的硬件设计

2.1 AT89C51单片机介绍

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集合输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89S51是一种高效微控器,为很多嵌入式控制系统提供了一种灵活性且廉价的方案 单片机各引脚功能说明:

VCC:供电电压。GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行。校验时,P0输出原码,此时P0外部必须被拉高。

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脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:当/EA保持低电平时,则在此期间选择外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。

2.2 里程计算、计价单元的设计

里程计算是通过安装在车轮上的霍尔传感器A44E检测到的信号,送到单片机,经处理计算,送给显示单元的。其原理如图2-1所示

图2-1 由于A44E 属于开关型的霍尔器件,其工作电压范围比较宽(4.5~18V),其输出的信号符合TTL 电平标准,可以直接接到单片机的I/O 端口上,而且其最高检测频率可达到1MHZ。

如图2-2,A44E 集成霍耳开关由稳压器A、霍耳电势发生器(即硅霍耳片)B、差分放大器C、施密特触发器D 和OC 门输出E 五个基本部分组成。

图2-2 路程测量电路

在输入端输入电压CC V,经稳压器稳压后加在霍耳电势发生器的两端,根据霍耳效应原理,当霍耳片处在磁场中时,在垂直于磁场的方向通以电流,则与这二者相垂直的方向上将会产生霍耳电势差H V 输出,该H V 信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC 门输出。当施加的磁场达到工作点(即OP B)时,触发器输出高电压(相对于地电位),使三极管导通,此时OC 门输出端输出低电压,通常称这种状态为开。当施加的磁场达到释放点(即rP B)时,触发器输出低电压,三极管截止,使OC 门输出高电压,这种状态为关。这样两次电压变换,使霍耳开关完成了一次开关动作。

我们选择了P3.5 口作为信号的输入端,内部采用计数的方式,车轮每转一圈(我们设车轮的周长是10米),霍尔开关就检测并输出信号,引起单片机对脉冲计数,当计数达到10次时,也就是0.1 公里,单片机就控制将金额自动的加增加,其计算公式:当前单价× 公里数=金额。

2.3 数据显示单元的设计

由于设计要求有单价(2 位)、路程(3位)、总金额(3位)显示输出,我们采用8个7段数码管动态显示。如图2-3:

图2-3 数据显示硬件电路图

2.4 按键单元的设计

电路共采用了四个按键,S1、S2、S3、S4,其功能分别是:S1 启动计价开关、S2 白天/晚上转换开关、S3 数据复位清零开关、S4闭合表示出租车正常运行,计价器也正常计价;若打开S4则表示出租车在暂停,转入判断是否收费程序,闭合超过30秒,开始计价。如图2-4:

图2-4 按键单元电路图 2.5 振荡电路

单片机内部有一个高增益、反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。通过这两个引脚在芯片外并接石英晶体振荡器和两只电容(电容和一般取33pF)。这样就构成一个稳定的自激振荡器。振荡电路脉冲经过二分频后作为系统的时钟信号,再在二分频的基础上三分频产生ALE信号,此时得到的信号时机器周期信号。振荡电路如图2-5所示:

图2-5 振荡电路

2.6 复位电路

复位操作有两种基本形式:一种是上电复位,另一种是按键复位。按键复位具有上电复位功能外,若要复位,只要按图中的RESET键,电源VCC经电阻R1、R2分压,在RESET端产生一个复位高电平。上电复位电路要求接通电源后,通过外部电容充电来实现单片机自动复位操作。上电瞬间RESET引脚获得高电平,随着电容的充电,RERST引脚的高电平将逐渐下降。RERST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。按键复位电路图如图2-6所示。

图2-6 复位电路 总电路图

第三章 出租车计价系统的软件设计

3.1主程序流程图记描述

由于用到了外部中断0,所以,按中断系统的编程结构在0000H处放置一条长跳转指令LJMP START跳转到主程序入口,在外部中断0的中断入口地址0003H处放置一条长跳转指令LJMP EXT0跳转到外部中断0服务程序处。主程序进行程序中用到的一些存储单元的初始化,T0,T1的初始化。首先,进行存储器单元初始化,将71H-79H单元赋值。然后进行定时器的设置。设置T1的工作方式为模式2,计数状态,自启动。T0的工作方式,模式1,定时状态,自启动,对输入的脉冲进行计数,给T0、T1赋初值。之后调用计数脉冲子程序,及等待子程序,数码管动态显示子程序,最后进入键盘扫描子程序进行扫描。主程序不断进行调用数码管显示子程序及键盘扫描子程序循环操作,等待中断。如图3-1:

图3-1 主程序流程图 3.2计费子程序流程图

72H存储总金额小数位,73H存储器总金额个位,78H存储器总金额十位,77H存储单价元。将72H中值放入A中,再将A与77H相加,即小数位与单价相加,结果存入A,再进行十进制调整,将结果存于R6,将高四位与低四位交换并屏蔽高四位,保留低四位与个位相加得到总金额个位。若总金额超过10则清零,并且总金额十位加1。将R6中数值取出,屏蔽高四位,输出总金额小数位。如图3-2:

图3-2 计费子程序流程图 3.3 等待是否收费子程序

在出租车的计价系统中,出租车在等待的时候也要计价,本设计体现了这点。程序判断了出租车是否停止,若停止30秒以上是,开始计价。55H中赋初值20,56H中赋初值10,总共30秒延时。超过30秒时,调用计费子程序。如图3-3

图3-3 等待是否收费子程序流程图

3.4 按键子程序流程图

图3-4 等待收费子程序流程图

3.5 外部中断0流程图

图3-5 外部中断0子程序流程图 程序

ORG 0000H LJMP MAIN ORG 0003H;外部中断入口地址 LJMP REST ORG 030H MAIN:

MOV 71H,#00H;脉冲计数每10个脉冲里程数加0.1显示缓冲单元 MOV 72H,#00H;存储总金额小数位 MOV 73H,#00H;存储总金额个位 MOV 74H,#00H;存储里程数小数位 MOV 75H,#00H;存储里程数个位 MOV 76H,#00H;存储单价角位 MOV 77H,#01H;存储单价元位 MOV 78H,#00H;存储总金额十位 MOV 79H,#00H;存储里程数十位 MOV 55H,#20;给定等待初值20*50ms MOV 56H,#10;10秒等待时间初值 SETB EA;开总中断 SETB EX0;开外部中断0 MOV TCON,#04H;外部中断0低电平

MOV TMOD,#61H;设置使用定时器1,模式2,计数状态,自启动,定时器0,模式1,定时状态,自启动

MOV TL0,#0B0H;50ms初值设定C350H MOV TH0,#03CH MOV TL1,#0FFH;设置定时器低八位初值为FFH,即有一脉冲输入就溢出

MOV TH1,#0FFH;设置定时器高八位初值为FFH,用于重装低八位 START: LCALL PULSE;调用计数脉冲子程序 LCALL WAIT;调用等待子程序 LCALL DISPLAY;调用显示程序进行显示 LCALL KEY;调用键盘扫描程序

SJMP START;返回START处继续循环执行 REST: PUSH ACC MOV 71H,#00H;脉冲计数每10个脉冲里程数加1显示缓存单元 MOV 72H,#00H;存储总金额个位 MOV 73H,#00H;存储总金额十位 MOV 74H,#00H;存储里程数个位 MOV 75H,#00H;存储里程数十位 MOV 78H,#00H;存储总金额百位 MOV 79H,#00H;存储里程数百位 MOV 55H,#20 MOV 56H,#10 POP ACC RETI PULSE: JBC TF1,PTO1;TF1为1则转PT01 LJMP PSOUT PTO1: MOV 55H,#20 MOV 56H,#10 INC 71H MOV R1,71H CJNE R1,#0AH,PSOUT;脉冲调整,改变立即数即可;里程数个位74H,R1不等于0AH则转PSOUT MOV 71H,#00H INC 74H LCALL MONEY MOV R1,74H CJNE R1,#0AH,PSOUT;里程数十位75H MOV 74H,#00H INC 75H MOV R1,75H CJNE R1,#0AH,PSOUT MOV 75H,#00H INC 79H MOV R1,79H CJNE R1,#0AH,PSOUT MOV 79H,#00H PSOUT:RET WAIT: JBC TF0,PTO2 LJMP CHU0 PTO2:MOV TL0,#0B0H MOV TH0,#03CH DJNZ 55H,CHU0;不为0则转 MOV 55H,#20 DJNZ 56H,CHU0 MOV 56H,#10;30秒等待计时 INC 72H MOV A,72H LCALL MONEY1 CHU0:RET MONEY: MOV A,72H ADD A,77H MONEY1:DA A MOV R6,A SWAP A ANL A,#0FH ADD A,73H MOV 73H,A CJNE A,#0AH,MONEY2 MOV 73H,#00H INC 78H MOV A,78H CJNE A,#0AH,MONEY2 MOV 78H,#00H MONEY2:MOV A,R6 ANL A,#0FH MOV 72H,A RET DISPLAY:MOV A,78H CJNE A,#00H,L2 MOV A,73H CJNE A,#06H,L1 L1:JNC L2 MOV A,#82H ADD A,#80H MOV P0,A MOV P2,#02H LCALL DELAY MOV P2,#00H MOV A,#0C0H MOV P0,A MOV P2,#01H LCALL DELAY MOV P2,#00H MOV A,#0C0H MOV P0,A MOV P2,#40H LCALL DELAY MOV P2,#00H LJMP L3 L2:MOV A,73H MOV DPTR,#TAB MOVC A,@A+DPTR ADD A,#80H MOV P0,A MOV P2,#02H LCALL DELAY MOV P2,#00H MOV A,72H MOVC A,@A+DPTR MOV P0,A MOV P2,#01H LCALL DELAY MOV P2,#00H MOV A,78H MOVC A,@A+DPTR MOV P0,A MOV P2,#40H LCALL DELAY MOV P2,#00H L3:MOV A,75H MOV DPTR,#TAB MOVC A,@A+DPTR ADD A,#80H MOV P0,A MOV P2,#08H LCALL DELAY MOV P2,#00H MOV A,74H MOVC A,@A+DPTR MOV P0,A MOV P2,#04H LCALL DELAY MOV P2,#00H MOV A,77H MOVC A,@A+DPTR ADD A,#80H MOV P0,A MOV P2,#20H LCALL DELAY MOV P2,#00H MOV A,76H MOVC A,@A+DPTR MOV P0,A MOV P2,#10H LCALL DELAY MOV P2,#00H

MOV A,79H MOVC A,@A+DPTR MOV P0,A MOV P2,#80H LCALL DELAY MOV P2,#00H RET KEY: MOV A,#0FH MOV P3,A MOV A,P3 ORL A,#0F0H CJNE A,#0FFH,KEY1 LCALL DELAY SJMP EKEOUT KEY1: LCALL DELAY MOV A,P3 ORL A,#0F0H CJNE A,#0FFH,KEY2 SJMP EKEOUT KEY2: MOV R1,A KEY3: MOV A,P3 ORL A,#0FCH CJNE A,#0FFH,KEY3 MOV A,R1 JNB ACC.0,RUN JNB ACC.1,CHANGE SJMP EKEOUT RUN: SETB TR0 SETB TR1 SETB EA SJMP EKEOUT EKEOUT:RET CHANGE: PUSH ACC MOV A,77H CJNE A,#02H,NIGHT MOV 77H,#01H SJMP CHOUT NIGHT: MOV 77H,#02H CHOUT: POP ACC RET DELAY: MOV R7,#100 DJNZ R7,$ RET TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H END

第二篇:单片机课程设计出租车计价器1.

常州机电职业技术学院 毕业设计(论文

作者:丛佳伟学号:40931111系部:电气工程系 专业:应用电子技术 题目:出租车计价器系统 指导者:徐登黄勇 评阅者: 2012年05月 摘要

现在各个城市出租车行业都已普及,因此出租车计价器的技术已经成熟,但是出租车计价器的市场还具有广阔的前景。随着城市建设的日益完善,关乎城市面貌的出租车行业也将迅速发展,出租车计价器的的大批量需求也是毫无疑问的,所以未来出租车计价器的市场还是有相当大的潜力的。

本次出租车计价器设计以AT89S52单片机为中心,采用U18霍尔传感器对轮胎转数进行计数,实现对出租车里程的测量,并最终计算出结果。其中采用寄存器芯片AT24C02使系统在掉电的时候对单价、里程、车轮长度等信息进行存储,采用时钟芯片DS1302来显示时间和在系统需要时进行计时。输出采用两个4段数码显示管,而且根据按键有空车指示灯、等待查询指示灯、单程指示灯进行指示。

汽车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。它关系着交易双方的利益。具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。因此,汽车计价器的研究也是有一定的应用价值的。

关键词:计价器、霍尔传感器、单片机 目录 摘要(1 1 绪论(3 1.1 出租车计价器概述(3 1.2 单片机的概述(3 2 总体方案设计(4 2.1 设计任务要求(4 2.1.1 设计任务(4 2.1.2 设计要求(5 2.2 设计的主要功能(5 2.3 方案的选取(5 2.3.1 硬件设计方案(5 2.3.2 软件设计方案(6 3 硬件设计(7 3.1 AT89S52单片机及最小系统(7 3.2 测距单元(10 3.3 按键单元(12 3.4 时钟单元(12

3.5 显示单元(13 3.6 储存单元(15 4 软件设计(16 4.1 系统主程序(16 4.2 数据处理子程序(17 4.3 等待时间计时子程序(18 4.4 键盘扫描子程序(19 5 Proteus软件仿真(21 总结.............................................错误!未定义书签。致谢.(23 参考文献(23 附

1、系统原理图(25 1 绪论

1.1 出租车计价器概述

我国在70年代开始出现出租车,但那时的计费系统大都是国外进口不但不够准确,价格还十分昂贵。随着改革开放日益深入,出租车行业的发展势头已十分突出,国内各机械厂家纷纷推出国产计价器。出租车计价器的功能从刚开始的只显示路程(需要司机自己定价,计算后四舍五入,到能够自主计费,以及现在的能够打一发票和语音提示、按时间自主变动单价等功能。随着城市旅游业的发展,出租车行业已成为城市的窗口,象征着一个城市的文明程度。

本次设计的目的在于现在各大中城市出租车行业都已普及自动计价器,所以计价器技术的发展已成定局。而部分小城市尚未普及,但随着城市建设日益加快,象征

着城市面貌的出租车行业也将加速发展,计价器的普及也是毫无疑问的,所以未来汽车计价器的市场还是十分有潜力的。

1.2 单片机的概述

计算机系统已明显地朝巨型化、单片化、网络化三个方向发展。巨型化发展的目的在于不断提高计算机的运算速度和处理能力,以解决复杂系统计算和高速数据处理,比如系统仿真和模拟、实时运算和处理。单片化是把计算机系统尽可能集成在一块半导体芯片上,其目的在于计算机微型化和提高系统的可靠性,这种单片计算简称单片机。单片机的内部硬件结构和指令系统主要是针对自动控制应用而设计的所以单片机又称微控制器MCU(Micro Controller Unit。用它可以很容易地将计算机嵌入到各种仪器和现场控制设备中,因此单片机又叫做嵌入式微控制器(Embedded MCU。单片机自20世纪70年代问世以来,以其鲜明的特点得到迅猛发展,已广泛应用于家用电器、智能玩具、智能仪器仪表、工业控制、航空航天等领域,经过30多年的发展,性能不断提高,品种不断丰富,已经形成自动控制的一支中坚力量。据统计,我国的单片机年容量已达1~3亿片,且每年以大约16%的速度增长,但相对于国际市场我国的占有率还不到1%。这说明单片机应用在我国有着广阔的前景。对于从事自动控制的技术人员来讲,掌握单片机原理及其应用已经成为必不可少的学习任

务。

单片机的应用十分广泛,在工业控制领域、家电产品、智能化仪器仪表、计算机外部设备,特别是机电一体化产品中,都有重要的用途。其主要的用途可以分为以下方面。

●显示:通过单片机控制发光二极管或是液晶,显示特定的图形和字符。●机电控制:用单片机控制机电产品做定时或定向的动作。

●检测:通过单片机和传感器的联合使用,用来检测产品或者工况的意 外发生。

●通信:通过RS-232串行通信或者是USB通信,传输数据和信号。●科学计算:用来实现简单的算法。

那么单片机是不是解决上述应用的唯一选择呢?当然不是!单片机最明显的优点是价格便宜,从几元人民币到几十元人民币。这是因为这类芯片的生产量很大,技术也很成熟。

其次,单片机的体积也远小于其他两种方案。单片机本身一般用40引脚封装,当然功能多一些的单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,有的甚至只有8只引脚。

当然,单片机无论在速度还是容量方面都小于其他两种方案,但是在实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能。例如,控制电冰箱的控制器就不需要使用嵌入式系统,用一片51就可以轻松实现。所以应用的关键是看能否够用,是否有很好的性能价格比。51系列的单片机已经面世十多年,依然没有被淘汰,还在不断发展中,这就说明是它有广阔的应用前景。总体方案设计

本次设计是使用单片机技术来实现一个出租车的数字计价器,利用单片机丰富的IO端口,及其控制的灵活性,实现基本的里程计价功能和单双程价格调整、时钟显示功能等等。具有性能可靠,电路简单、成本低、扩展空间大等特点。

2.1 设计任务要求 2.1.1 设计任务

设计一款基于AT89S52单片机的出租车数字计价器,通过对传感器的检测,对数值进行处理和显示。

2.1.2 设计要求

一、基本要求

(1能显示里程,单位为公里,最后一位为小数位。(2能显示金额数,单位为元,最后一位为小数位。

(3可设定单程价格和往返价格,单程价格为2元/公里,往返价格为1.5元/ 公里。

(4车速<5公里/小时的时间累积为总等待时间,每5分钟等待时间相当于 里程数增加1公里。

(5起步公里数为3公里,价格为5元,若实际距离大于3公里,按规则3计 算价格。

(6按暂停键,计价器可暂停计价,按查询键,可显示总等待时间。

二、发挥部分

(1增加了空车指示功能,当无客人时,按下功能切换按键,空车指示灯亮。(2增加实时时间显示,无论计价器工作或者空车,都能显示实时时间,便于时间提醒。

(3增加信息储存功能。可以储存等待时间,里程和金额。2.2 设计的主要功能

本设计所设计的出租车数字计价器的主要功能有:金额输出、路程输出、数据复位、计时计价、空车显示等。输出采用2个4位8段共阳数码管,车辆行走时前4位显示路程,后4位显示金额。车辆候车时,前4位显示等待时间,后4位显示等待金额。空车时显示实时时间。储存等待时间,里程和金额。

2.3 方案的选取

本设计是由软件设计和硬件设计两部分组成的。软件设计要进行程序的编写和软件仿真;硬件设计要设计电路、硬件仿真和制作电路板。

2.3.1 硬件设计方案

本系统的硬件设计主要包括单片机AT89S52、数据显示部件、U18霍尔传感 器电路、里程计算及计价单元的设计。在硬件设计过程中,充分利用各部件的功能,实现多功能的出租车计价器设计。

计价器的单片机系统框图如图2-1所示。它由以下几个部件组成:霍尔传感器单元、AT89S52单片机、金额显示、里程显示、电源。利用单片机丰富的IO 端口,及其控制的灵活性,实现基本的里程和价格的计算及显示功能。

图2-1计价器系统框图 2.3.2 软件设计方案

本设计程序的采取C 语言进行编写,使用Keil uVision3编译和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。

单 片 机 霍尔

传感器 数据显示 状态指示 时钟显示 按键 信息存储

(3等待收费的标准为5分钟算一公里;(4暂停时计价器暂停计价,不收费用。3 硬件设计

本设计的硬件设计包括单片机AT89S52单元、测距单元、显示单元(数码管显示金额、等待时间和里程,指示灯对单双程切换指示、空车指示、等待计时指示、按键单元、时钟单元和储存单元。

3.1 AT 89S52单片机及最小系统

1、AT89S52单片机

AT89S52具有如下特点:40个引脚,8k Bytes Flash片内程序存储器, 256bytes的随机存取数据存储器(RAM,32个外部双向输入/输出(I/O口,3个16位可编程定时计数器,全双工串行口,看门狗(WDT电路,片内时钟振荡器。

P0口有二个功能:

1、外部扩展存储器时,当做数据/地址总线。

2、不扩展时,可做一般的I/O使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻。

P1口只做I/O口使用:其内部有上拉电阻。

P2口有两个功能:

1、扩展外部存储器时,当作地址总线使用。

2、做一般I/O口使用,其内部有上拉电阻。

P3口有两个功能:除了作为I/O使用外(其内部有上拉电阻,还有一些特殊功能,由特殊寄存器来设置。

图3-1 AT89S52引脚图

设计中用到的单片机各管脚(图3-1功能以及与其他模块连接介绍如下: 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口接数码管位选段。P3.2:接霍尔传感器的输出口。P3.3:接存储器的SCL口。P3.4:接储存器的SDA口。

P3.5:接时钟电路DS1302的RST口。P3.6:接DS1302的SCLK口。P3.7:接DS1302的I/O口。

2、单片机最小系统

复位电路和晶振电路是AT89S52工作所需的最简外围电路。单片机最小系统电路图如图3-2所示。

图3-2单片机最小系统

AT89S52 的复位端是一个史密特触发输入,高电平有效。RST端若由低电平上升到高电平并持续2个周期,系统将实现一次复位操作。在复位电路中,按一下复位开关就使在RST端出现一段时间的高电平,外接11.0592M 晶振和两个30pF 电容组成系统的内部时钟电路。

3.2 测距单元

本次设计我们选取了霍尔传感器来进行里程测量。

霍尔器件是一种磁传感器。用它们可以检测磁场及其变化,可在各种与磁场有关的场合中使用。霍尔器件以霍尔效应为其工作基础。

霍尔器件具有许多优点,它们的结构牢固,体积小,重量轻,寿命长,安装方便,功耗小,频率高,耐震动,不怕灰尘、油污、水汽及盐雾等的污染或腐蚀。

霍尔器件分为:霍尔元件和霍尔集成电路两大类,前者是一个简单的霍尔片,使用时常常需要将获得的霍尔电压进行放大。后者将霍尔片和它的信号处理电路集成在同一个芯片上。本次设计选取了霍尔集成电路来测量里程。

里程测量是通过将霍尔传感器的集成电路安装在车轮上方的铁板上,将磁铁安装在车轮上,旋转的车轮将磁铁对准集成电路时,霍尔传感器会输出一个脉冲信号,送到单片机,经过单片机的计算处理,将行驶的里程送到显示单元并显示出来。

其原理示意图如下:

图3-3 传感器测距示意图

U18是一种利用霍尔效应做成的半导体集成电路器件,它被设计在交变磁场中运行,特别是能在低电源电压和长时间运行温度范围可达到125℃。这种霍尔IC可用作各种类型的传感器(速度传感器、位移传感器、转速传感器等等,接触开关以及

相类似的应用场合。其工作电压比较宽(2.5~20V,可运行在较大的温度范围内(-20℃~125℃, 其输出的信号符合TTL电平标准,可以直接接到单片机的IO 端口上,而且其最高检测频率可达到1MHZ。

霍尔传感器的特性如图3-4所示,其中BOP为工作点“开”的磁感应强度, BRP为释放点“关”的磁感应强度。当外加的磁感应强度超过动作点BOP时,传

感器输出低电平,当磁感应强度降到动作点BOP以下时,传感器输出电平不变,一直要降到释放点BRP时,传感器才由低电平跃变为高电平。BOP与BRP之间的滞后使开关动作更为可靠。

U18集成霍耳开关由稳压器A、霍耳电势发生器(即硅霍耳片B、差分放大器C、施密特触发器D和OC门输出E五个基本部分组成。

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

图3-4 U18霍尔传感器和其输出特性

U18霍尔传感器有3个外接口,2个是电源的正负极接口,最后一个是脉冲信号输出口,只要将霍尔传感器的信号输出端接到单片机的端口上便可以实现距离检测。

其中,单片机的P3.2(INT0引脚作为信号的输入端,采用外部中断0进行计数。车轮每转一圈,霍尔传感器就产生一个脉冲信号,根据霍尔效应原理,当霍尔片处在磁场中时,霍尔传感器的输出端输出低电平。当车轮转动一圈时小磁铁提供一个磁场,则霍尔传感器输出一次低电平完成一次数据采集,从而产生信号。霍尔传感器检测并输出信号到单片机的INT0或INT1计算脉冲输入端, 引起单片机的中断,对脉冲计数,当计数达到特定的次数时,里程就会增加,单片机对里程进行计算后,通过接口电路将计算好的结果传送到数码管并显示出来。

3.3 按键单元

本设计的按键单元电路(如图3-5有5个按键,功能分别是:S1是空车时查询上次金额和里程以及等待时间,结账时查询本次金额和里程以及等待时间;S2功能键,不按时空车指示灯亮而且数码管显示实时时间,按下时可设置单双程,此时再按S3可进行单程和双程之间切换,再按S1可确认单双程,双程时双程指示灯亮并开始计价;按下S4可对本次金额、里程以及等待时间进行查询;S5为清零键,按下时清零之前数据消除以及存储本次信息。

图3-5 按键单元电路 3.4 时钟单元

本设计采用基于DS1302的时钟电路(如图3-6对时间进行实时显示,单片机掉电对其没有影响。用数码管表现出来,当出租车空车时就显示时间,给人时间提示。

图3-6 时钟电路单元 3.5 显示单元

本设计显示单元包括两部分:数码管显示(图3-7和二极管指示显示(图3-8。数码管显示部分使用两个四位一体的LED数码管,LED显示器是由LED发光二极管发展过来的一种显示器件,是发光二极管的改型。LED是发光二极管的简称,是一种将电能转换成光能的设备。本身也是一种光源。LED显示器是由发光二极管排列组成的显示器件。它采用低电压扫描驱动,具有:耗电少、使用寿命长、成本低、故障少、视角大、可视距离远等特点。此外,它的响应时间短(一般不超过0.1us,亮度也比较高。它的缺点是工作电流比较大,每一段的工作电流在10mA左右。

其中每位数码管是由8个发光二极管演变而来,其中7个发光二极管构成7笔字形,另一个构成小数点,称为8段LED。8段LED数码管是利用7个LED(发光二极管外加一个小数点的LED组合而成的显示设备,可以显示0~9等10个数字和小数点,使用非常广泛,它的外观如图3-9所示:

图3-9 8段数码管

这类数码管可以分为共阳极(8个发光二极管的阳极接在—起与共阴极(8 个发光二极管阴极连在一起两种,共阳极就是把所有LED的阳极连接到共同接点,而每个LED的阴极分别为a、b、c、d、e、f、g及dp(小数点;共阴极则是把所有LED的阴极连接到共同接点,而每个LED的阳极分别为a、b、c、d、e、f、g及dp(小数点,如图3-10所示。

图3-10 共阳和共阴数码管结构

通过控制这个公共端,可使该位亮或暗。如共阴极端接地或共阳极接高电平,则该位显示器有效,反之无效。本设计采用共阴LED数码管。

数码管有静态显示和动态显示两种,这里采用动态显示。它具有低功耗、接口少等特点。如图3-7两个四位一体数码管接P0口作为段选,接P2口作为位选。空车时显示时间,开始计价时前四位显示路程,后四位显示价钱。当查询等待时间时显示为等待时间。

图3-7显示单元(数码管显示部分

二极管指示部分包括空车指示灯、等待时间查询指示、开始计时指示和双程指示如图3-8。这些指示灯能对出租车的每一种状态进行指示,空车时空车指示灯亮,查询等待时间时等待时间查询指示灯亮,当汽车速度小于5km/h 时开始计时,计时指示灯亮。计价前如果按下双程键双程指示灯亮,表示为双程。

图3-8 显示单元(二极管指示部分 3.6 储存单元

存储单元的作用是储存上一次的里程、金额和等待时间。AT24C02 是Atmel 公司的1KB的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10uA(5.5V,芯片内的资料可以在断电的情况下保存40年以上,而且采用8 脚的DIP 封装,使用方便。

图3-11储存单元电路

图中R3、R4 是上拉电阻,其作用是减少AT24C02 的静态功耗。由于AT24C02的数据线和地址线是复用的,采用串口的方式传送数据,所以只用两根线SCL(时钟脉冲和SDA(数据/地址与单片机P3.3和P3.4口连接,进行传送数据。软件设计

本系统的软件设计主要分为系统主程序、数据处理子程序、等待时间及时子程序和键盘扫描子程序五个模块,下面对每一块进行介绍。

4.1 系统主程序

本设计中,软件设计采用模块化操作,利用各个模块之间的相互联系,在设计中采用主程序调用各个子程序的方法,使程序通俗易懂,我们设计了整体程序流程图。

在main函数编写开始,要进行初始化,包括对系统初始化和对硬件设备进行初始化,并使硬件处于就绪状态。

在主程序模块中,需要完成对各接口芯片的初始化、出租车起价和单价的初始化、中断向量的设计以及开中断、循环等待等工作。系统流程图如下图4-1。

开始 初始化 数据处理 键盘扫描 结束

图4-1系统主程序流程图 4.2 数据处理子程序

每当霍尔传感器输出一个低电平信号就使单片机中断一次,在计数中断服务程序,里程和金额都相应变化,当然等待时间也换算成里程(当速度小于5km/h 时5分钟想当于1公里。计算程序根据里程数分别进入不同的计算公式。如果里程大于3公里,则执行公式:金额=(里程-3*单价+5;否则,执行公式:总金额=起步价。程序流程图如图4-2所示。

计算里程 开始

里程<3公里否是

金额=5元金额=单价*(里程-3+5 显示金额

结束

图4-2 数据处理子程序流程图 4.3 等待时间计时子程序

当出租车的速度5km/h时等待时间开始计时,并被换算里程,进行计算显示等待时间和金额。当结算时停止计时和计费并显示金额,当有查询键按下时显示等待时间,当有清零键按下时存储本次金额。如图4-3: 开始

结算键按下?Speed<5公里/ 小时?开始计时,并显示Speed>5公里/ 小时?停止计时,开始计 路程 否 是

停止计时,计费,显示金额 查询键按下? 存储本次金额 是清零键按下? 是 否

显示等待时间

图4-3等待时间计时子程序 4.4 键盘扫描子程序

键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结束再返回。流程图如图4-4。

开始 功能键按下? 单双程设置 切换键按下? 切换单双程 确认键按下? 空车指示灭,开始计价计时,显示里 程,价格 结算键按下? 结算金额显示 是 是 是 是

否 显示时间 否 否 否

查询键按下? 显示等待时间与里 程

清零键按下?存储金额 是 否 是否 按下两次? 是

查询键按下? 显示上次金额 是

图4-4 键盘扫描子程序 5 Proteus软件仿真

本设计需要用Keil uVision3对C51程序进行编译,生成“.hex”文件,如图5-1 :

图5-1 Keil uVision3编译

在Proteus软件中画出仿真电路(如图5-2,把Keil uVision3编译后生成的“.hex”导入到单片机中,按“运行仿真”键进行仿真。

图5-2Proteus仿真 总结

总结在本次设计中,我们采用AT89S52芯片为核心器件,设计出了简单的出租车计价器,能够实现显示时间、等待时间、金额和里程,按键控制,空车指示。

选题后,我们便开始复习单片机方面的知识,也查阅、搜索了很多相关资料,进行总体设计与具体设计,同时也学习仿真软件Proteus和编程软件Keil uVision3。由于以前都采用汇编语言实现编程,对用C语言来实现单片机的编程不太习惯,花费了一些时间来熟悉C语言的编程。在设计开始,要形成流程图,它可以使设计有一定的逻辑性与严密性,使得设计思路明确。采用模块化的设计思想很重要,它方便编写、修改与调试,另外加上必要的注释,便于交流与理解。

这次课程设计设计完成后,体会颇多,在学与做的过程中,取长补短,不断学习新的知识,吸取经验,达到进步的目的。通过自身的努力以及相关图书资料的帮助,逐渐熟

悉了Keil uVision3、PROTEUS和C语言等软件的使用以及硬件焊接与检测过程中的一些小技巧。本次设计我学习到不少单片机的知识,但由于自己的理论知识水平有限,实践知识和设计经验不足,在设计过程中难免存在一些问题。所焊实物尚有许多不足,个别功能还不能很好的实现,主要原因是考虑问题不周全,电路设计经验少,实际动手能力不足。恳请各位老师批评指正,以使我在以后的学习和实践中加以改进和提高。

致谢

毕业设计即将结束,在老师的指导和同学的帮助之下,学生对于出租车计价器设计有了更多新的认知,对出租车计价器设计有了更深一步的认识,对出租车计价器综合设计的整体脉络了解得更加的清晰透彻。通过毕业设计,学生对自己三年以来所学的知识有更多的认识。

毕业设计,帮助我们总结大学的收获、认清自我。同时,还帮助我们改变一些处理事情时懒散的习惯。从最开始时的搜集资料,整理资料,到方案比选,确定方案,再到着手开始设计,每一步都是环环相扣,衔接紧密,其中任何一个步骤产生遗漏或者疏忽,就会对以后的设计带来很多的不便。

本次作者的毕业设计是由徐老师指导的,在他的悉心指导下,我开阔了眼界,明确了思路。在整个的设计过程中,徐老师提出了许多宝贵的建议和指导,使我能够顺利的完成整个设计,在此,谨向徐老师表示由衷的感谢。

在即将离开学校之际,我要感谢在大学生活中任课的众多老师,正是在他们的谆谆教诲下使我顺利完成了大学的基础知识和专业知识的学习。在此,还要感谢陪伴我共同走过大学时代并给予我帮助的同学和朋友们,感谢你们,祝福你们在以后的日子里开开心心的度过每一天!参考文献

1.戴佳, 陈斌, 苗龙.51单片机应用系统开发典型实例.中国电力出版社,2005

2.余发山,王福忠.单片机原理及应用技术.中国矿业大学出版社, 2008.6 3.侯玉宝, 陈忠平, 李成群.基于Proteus的51系列单片机设计与仿真.电子工业出版社,2008 4.李玉梅.基于MCS-51系列单片机原理的应用设计.国防工业出版社,2006 5.边春元, 李文涛, 江杰.C51单片机典型模块设计与应用.机械工业出版社,2008 6.楼然苗,胡佳文,李光飞等.单片机实验与课程设计.浙江大学出版社,2010.10 常州机电职业技术学院毕业设计报告 附

1、系统原理图、25

第三篇:单片机出租车计价器源程序

出租车计价器设计与制作

设计并制作一台出租车计价器。调试时采用10Hz方波信号模拟,每个方波代表10m。基本要求:

(1)不同情况具有不同的收费标准

白天 1元/公里 晚上 2元/ 公里 途中等待(30s)1元/30s

(2)数据输出(6位LED数码管显示)

单价输出2位 路途输出2位 总金额输出2位

(3)按键(3个)

启动计价开关 数据复位(清零)白天/晚上转换

3.4.1模块1:系统设计

(1)分析任务要求,写出系统整体设计思路

通过分析,需要实现四个主要的功能模块,分别为脉冲计数模块、定时器计时模块、按键的处理以及

数码管动态扫描等功能。

定时器计时模块主要完成途中等待(即没有脉冲来时)30秒的计时。在启动键按下后,定时器就不停的计时,只要有脉冲来就将计时的值清除为零。如果没有脉冲来,当计时超过30秒时,相应的总金额要

按照收费标准计价。

中断的管理:尽管中断有嵌套以及优先级的功能,但是由于定时器已经使用一个了中断资源,脉冲检测不宜再采用中断方式,而是采用查询方式。由于需要不停的要清除30秒的计时,因此,脉冲的计数不

采用定时器的计数方式。

启动键触发定时器开始工作,而定时器的运行可以作为脉冲计数的标志,只要定时器计时在运行,每来一个中断都应该计数。

主程序完成键盘的扫描和按键的处理,查询脉冲产生的中断,并完成脉冲的计数。每个脉冲代表10米,则当计数到100时表示1千米的距离,相应的总金额要按照收费标准计价

(2)选择单片机型号和所需外围器件型号,设计单片机硬件电路原理图

采用MCS51系列单片机At89S51作为主控制器,外围电路器件包括数码管驱动、独立式键盘、复位电

路等。硬件电路原理图如图3-9所示。

图3-11 出租车计价器的硬件电路原理图

数码管驱动采用2个四联共阴极数码管显示,由于单片机驱动能力有限,采用74HC244作为数码管的驱动。在74HC244的7段码输出线上串联100欧姆电阻起限流作用。

独立式按键使用上提拉电路连接,在没有键按下时,输出高电平。P0口用于输出7段LED共阴极显示代码,P2口用于输出低电平有效的位选码。0~9的7段LED共阴极显示代码:3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。

(3)分析软件任务要求,写出程序设计思路,分配单片机内部资源,画出程序流程图

软件的任务要求包括定时器的设置、按键的扫描、按键的功能处理、脉冲的计数、路途等待超30秒的计

时以及总金额的计算等。

程序设计的思路:使用中断方式对定时器的溢出进行计数实现30秒的计时。主程序采用查询外部中断标志实现脉冲的计数,由于每个脉冲代表10m,因此,当脉冲计数超过100时,计价器按照收费标准计价。主程序在初始化变量和定时器参数设置之后,进入一个循环结构,循环扫描键盘、查询脉冲的中断、数码管的动态扫描等功能,当脉冲的中断标志被查询到,若路途等待时间未超30秒时,要及时将路途等待时间的值清除为零。主程序的流程图如图3-12所示。

图3-12 出租车计价器的主程序流程图

中断服务程序主要实现计时功能,当启动键按下之后,定时器开始工作,用一个变量对定时器溢出中断的次数进行计数,达到计时功能,该变量在每次脉冲到来时被清零(在主程序中清零),当脉冲长时间没有来,则当该变量计数超过30秒时,总金额按照途中等待计费标准进行计价。中断程序的流程图如图

3-13所示。

图3-13 出租车计价器的中断服务程序流程图

(4)设计系统软件调试方案、硬件调试方案及软硬件联合调试方案

软件调试方案:伟福软件中,在“文件新建文件”中,新建C语言源程序文件,编写相应的程序。在“文件新建项目”的菜单中,新建项目并将C语言源程序文件包括在项目文件中。

在 “项目编译”菜单中将C源文件编译,检查语法错误及逻辑错误。在编译成功后,产生以 “*.hex”和“*.bin” 后缀的目标文件。

硬件调试方案:在设计平台中,将单片机的P1.0-P1.2分别与3个独立式键盘通过插线连接起来,将P3.2与脉冲信号源连接起来。

在伟福中将程序文件编译成目标文件后,将下载线安装在实验平台上,运行“MCU下载程序”,选择相应的flash 数据文件,点击“编程”按钮,将程序文件下载到单片机的Flash中。

然后,上电重新启动单片机,检查所编写的程序是否达到题目的要求,是否全面完整地完成试题的内容。3.4.2 程序设计

/*晶振:11.0592M T1-250微秒溢出中断一次;P3.2(int0)-中断100次,查询IE0置位,P1^0为启动键;P1^1为清除键;P1^2为白天/晚上的切换键 变量的定义: key_val: 返回按键的值 255-无键

T1_cnt: 定时器溢出数计数

cnt_30: 30秒钟的计时

cnt_distance: 计算路程

cnt_cost: 总金额

state_val: 状态:0-白天 1 夜晚

cost_val[3]: 收费标准:白天单价cost_val[0]=1元/公里;晚上单价cost_val[1]=2元/公里; 等待单价cost_val[2]=1元/30s

led_seg_code:数码管7段码 */ //-------------------#include “reg51.h” unsigned char data cnt_30,cnt_distance,cnt_cost;unsigned int data T1_cnt,D_cnt;unsigned char data key_val,key_val_old;unsigned char data state_val;char code cost_val[3]={1,2,1};char code led_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//led_seg_code[0-9]代表0-9 //-------延时-----------------void delay(unsigned int i)//延时 { while(--i);} //-------初始化变量------------------void init_variant()//初始化一些变量的内容 {unsigned char i;cnt_30=0;//30秒的计时 D_cnt=0;//脉冲的个数 cnt_distance=0;//距离的计数

cnt_cost=0;//保存总价格 } //-------扫描键盘-----------------unsigned char scan_key(){ unsigned char i,k;i=P1;if(i==0xff){ k=255;} //无键按下

else //有键按下

{ delay(10);//延时去抖动

if(i!=P1){k=255;} else { switch(i){ case 0xfe: k=0;break;//P1.0按下,启动键

case 0xfd: k=1;break;//P1.1按下,清除键

case 0xfb: k=2;break;//P1.2按下,切换键

} } } return k;} //-------数码管动态扫描-------------void led_show(){unsigned char i,k;

//-----显示单价----k=cost_val[state_val];i=k%10;//暂存个位 P0=led_seg_code[i];P2=0xbf;delay(10);i=k%100/10;P0=led_seg_code[i];P2=0x7f;delay(10);//-----显示距离------k=cnt_distance;i=k%10;//暂存个位 P0=led_seg_code[i];P2=0xf7;delay(10);i=k%100/10;P0=led_seg_code[i];P2=0xef;delay(10);//-----显示总价格-----------k=cnt_cost;i=k%10;//暂存个位 P0=led_seg_code[i];P2=0xfe;delay(10);i=k%100/10;P0=led_seg_code[i];P2=0xfd;delay(10);} //-------计时----------------void timer1()interrupt 3 //T1中断 { T1_cnt++;if(T1_cnt>3999)//如果计数>3999, 计时1s { T1_cnt=0;if(cnt_30<30)//没有超过30秒,继续计时

{cnt_30++;} else //超过30秒,途中等待计价

{cnt_30=0;cnt_cost=cnt_cost+cost_val[2];} } } //---------主程序----------------

main(){//初始化各变量 T1_cnt=0;state_val=0;key_val_old=255;init_variant();//初始化51的寄存器

TMOD=0x20;//用T1计时 8位自动装载定时模式,不用T0 TH1=0x19;//250微秒溢出一次;250=(256-x)*12/11.0592-> x= 230.4 TL1=0x19;EA=1;//开中断 ET1=1;

TR1=0;//定时器T0 TCON=0x01;//Int0中断取边沿触发模式 while(1){ key_val=scan_key();// 255;// if(key_val!=key_val_old){ key_val_old=key_val;if(key_val!=255){ switch(key_val){ case 0: //启动键

TR1=1;//启动计时,TR1=1为启动了的标志

break;case 1: //清除键

init_variant();//清除变量

TR1=0;//关闭定时器

break;case 2: //白天/黑夜的切换

if(state_val==0){state_val=1;} else {state_val=0;} break;} } } if(IE0==1&& TR1==1)//每来1个脉冲,中断一次

{ IE0=0;cnt_30=0;//30秒的计时清零

if(D_cnt<100)

{D_cnt++;} else //计数100次,每次10米,表示一公里

{D_cnt=0;cnt_distance=cnt_distance+1;

cnt_cost=cnt_cost+cost_val[state_val];} } led_show();} } //-----出租车计价器程序结束------------

第四篇:出租车计价器 硬件课程设计

硬件课程设计报告

题目:出租车计价器

目录

1. 引言....................................................................................................................................错误!未定义书签。

1.1设计目的................................................................................................................错误!未定义书签。1.2设计任务................................................................................................................错误!未定义书签。1.3设计思路................................................................................................................错误!未定义书签。

2.需求分析.............................................................................................................................错误!未定义书签。

2.1芯片原理................................................................................................................错误!未定义书签。2.1.1可编程计数器/定时器8253/8254原理.............................................................错误!未定义书签。2.1.2可编程外围接口芯片8255原理.......................................................................错误!未定义书签。2.1.3 12864液晶显示器ST7920原理........................................................................错误!未定义书签。2.2硬件设计................................................................................................................错误!未定义书签。2.3软件设计................................................................................................................错误!未定义书签。2.3.1功能模块图.........................................................................................................错误!未定义书签。2.3.2程序流程图.........................................................................................................错误!未定义书签。2.3.3模块流程图.........................................................................................................错误!未定义书签。

3.详细设计.............................................................................................................................错误!未定义书签。

3.1程序模块分析........................................................................................................错误!未定义书签。3.1.1初始化模块程序分析.........................................................................................错误!未定义书签。3.1.2判断开关程序模块分析.....................................................................................错误!未定义书签。3.1.3圈数统计模块程序分析.....................................................................................错误!未定义书签。3.1.4计算里程模块程序分析.....................................................................................错误!未定义书签。3.1.5显示模块程序分析.............................................................................................错误!未定义书签。3.1.6结束模块程序分析.............................................................................................错误!未定义书签。3.2程序代码................................................................................................................错误!未定义书签。

4.5.6.程序结果.............................................................................................................................错误!未定义书签。分析与测试.........................................................................................................................错误!未定义书签。体会.....................................................................................................................................错误!未定义书签。

附录A:参考文献.....................................................................................................................错误!未定义书签。

一、引言

1.1设计目的

现在各大城市出租车已经成为了一种重要的交通工具,当然出租车的收费问题也成了人们关注的焦点,那么怎么样才能实现一种合理的收费方式让大家都认可呢?在这种要求下,出租车自动计价器就走进了人们的生活,当然这就要求有一种合理公正的计价器收费方式。这不仅关系到出租车计价器的市场,也影响这出租车的市场,这就要求我们设计出更好的计价器来满足人们的需求。

本设计是关于出租车计价器的设计。在本次设计中,我以计价器的基本功能作为设计的重点。为了完成上述设计,我们采用了8254、8255等芯片,用计算机汇编语言进行软件功能的实现。

1.2设计任务

1.实现一个出租车计价器,可以显示起步价。2.一个键来控制是否到达终点,是否计价要清零。3.基于路程的出租车计价方式。

1.3设计思路

利用直流电机来模仿出租车轮子的转动来计算出租车行进的路程。将直流电机的直流端与滑动变阻器相连,通过人工控制滑动变阻器来模拟出租车的行进;并将计数端与8253CLK0端相连,GATE0接高电平,工作方式为方式二。直流电机每转1000圈,8253输出一个高电平,假设出租车已经走了1公里。同时将8253OUT0接入8255方便CPU读取。再将8255与ST7920显示器相连,CPU通过控制8255来控制显示,一旦8255从8253读入一个高电平,则公里数加一,同时价格相应增加。另有一个开关连入8255,用以判断出租车计价器是否启动。

二、需求分析

2.1芯片原理

本节主要在介绍本次设计所用到的芯片的原理,共有可编程计数器/定时器8253/8254、可编程外围接口芯片8255和12864液晶显示器ST7920原理三种芯片。

2.1.1可编程计数器/定时器8253/8254原理

图2-1 8254内部结构图

从图2-1可见,8254内部包含数据总线缓冲器、读/写控制逻辑、控制字寄存器和3个结构完全相同的计数器,这3个计数器分别称为计数器0、计数器1和计数器2。

图2-2 8254管脚图

A1、A0:地址输入线,用来控制8253内部的4个端口,即3个计数器和1个控制字寄存器与CPU系统地址线相连。

CLK0-2:时钟脉冲输入端,用于输入定时脉冲或计数脉冲信号。CLK可以是系统的时钟脉冲,也可以由系统时钟分频或者其他脉冲源提供。当用于定时时,这个脉冲必须是均匀的、连续的、周期精确的,而用于计数时,这个脉冲可以是不均匀的、断续的、周期不定的。

GATE0-2:门控输入端,用于外部控制计数器的启动计数和停止计数的操

作。两个或两个以上计数器连用时,可用此信号同步,也可用于与外部某信号的同步。

OUT0-2:计数输出,当计数器从初值开始完成计数操作进,OUT引脚输出相应的信号。

8253的方式控制字

图2-3 8254控制字图

本设计中8254的功能

只是用通道1,采用方式三。采用二进制计数,输入0FFFH。先输入低字节,再输入高字节。当8254从0FFFFH递减到159FH时(即转了60000圈时),8254向总线发信号使程序向下进行。

2.1.2可编程外围接口芯片8255原理

内部结构如图所示,由以下4个部分组成:

图2-4 8255内部结构图

(1)输入/输出端口A、B、C。这三个端口均可看作是I/O端口,但它们的结构和功能也稍有不同。A口和B口是一个独立的8位I/O口。C口:可以看作是一个独立的8位I/O口;也可以看作是两个独立的4位I/O口。

(2)A组和B组控制电路。这是两组根据CPU命令控制8255A工作方式的电路,这些控制电路内部设有控制寄存器,可以根据CPU送来的编程命令来控制8255A的工作方式,也可以根据编程命令来对C口的指定位进行置/复位的操作。A组控制电路用来控制A口及C口的高4位;B组控制电路用来控制B口及C口的低4位

(3)读/写控制逻辑。(同上:它负责管理8255A的数据传输过程。它接收CS*及RD*、WR*、RESET,还有来自系统地址总线的口地址选择信号A0和A1。将这些信号组合后,得到对A组控制部件和B组控制部件的控制命令,并将命令发给这两个部件,以完成对数据、状态信息和控制信息的传输。)

(4)数据总缓冲器。(同上:它是8位的双向的三态缓冲器。作为8255A与系统总线连接的界面,输入/输出的数据,CPU的编程命令以及外设通过8255A传送的工作状态等信息,都是通过它来传输的。)

如图所示8255A的芯片引脚信号。除了电源和地以外,其他信号可以分为两组:

图2-5 8255管脚图

1.和外设一边相连的: PA7-PA0:A组数据信号

PB7-PB0:B组数据信号 PC7-PC0:C组数据信号 2.和CPU一边相连的:

RESET:复位信号,低电平有效。当RESET信号来到时,所有内部寄存器就被清除,同时,3个数据端口被自动设为输入端口。

D7-D0:它们是8255A的数据线,和系统数据总线相连。

CS*:芯片选择信号,低电平有效。在一个系统中,一般根据全部接口芯片来分配若干较低位地址(比如A5、A4、A3)来组成各种芯片选择码,当这几位地址组成某一个代码时,译码器便往8255A的CS*端输出一个低电平,于是8255A被选中。只有当 CS*有效时,读信号RD*和写信号WR*才对8255A有效。

RD*:芯片读出信号低电平有效。WR*:芯片写入信号低电平有效。8255的方式控制字格式

图2-6 8255控制字图

本设计中8255的功能

8255PA0-PA7和PC0-PC2与ST7920相连,控制输出。PB0与8253的OUT1相连,读入8253OUT1 的数据。PB1与开关K0相连,读入K0的数值用于确定是否开启计价器。

2.1.3可编程外围接口芯片8255原理

ST7920控制器系列中文图形液晶模块的软件特性主要由ST7920控制驱动器决定。ST7920同时作为控制器和驱动器,它可提供33路com输出和64路seg输出。在驱动器ST7921的配合下,最多可以驱动256×32点阵液晶。

ST7920是台湾矽创电子公司生产的中文图形控制芯片,它是一种内置12864汉字图形点阵的液晶显示控制模块,用于显示汉字及图形。该芯片共内置8192

个中文汉字(16×16点阵)、128个字符的ASCII字符库(8×16点阵)及64×2256点阵显示RAM(GDRAM)。

为了能够简单、有效地显示汉字和图形,该模块内部设计有2MB的中文字型CGROM和64×256点阵的GDRAM绘图区域;同时,该模块还提供有4组可编程控制的16×16点阵造字空间;除此之外,为了适应多种微处理器和单片机接口的需要,该模块还提供了4位并行、8位并行、2线串行以及3线串行等多种接口方式。利用上述功能可方便地实现汉字、ASCII码、点阵图形、自造字体的同屏显示,所有这些功能(包括显示RAM、字符产生器以及液晶驱动电路和控制器)都包含在集成电路芯片里,因此,只要一个最基本的微处理系统就可以通过ST7920芯片来控制其它的芯片

图2-7 ST7920外观尺寸图

本设计中ST7920的功能

用于显示出租车行驶路程与应收费用。

2.2硬件设计

其中,8253GATE1连+5V高电平,直流电机连0~+5V,8253连280h~287h,8255连288h~28fh。8255PA0-PA7连ST7920显示器D0-D7,PC0连DI,PC1连RW,PC2连E。开关K0连8255PB0。8253CLK1连直流电机计数端。

0~+5V直流电机D0-D7计数ST7920显示屏DIRWE+5VGATE1CLK1PA0-PA7+5VPC0PC1PC2开关K0PB0+5V8253CS8255CS280H-288H289H-28FH总线图2-8硬件连接图

实际连接图如下图所示

图2-9硬件实际连接图

2.3软件设计 2.3.1功能模块图

本节先给出一个程序的功能模块图。

出租车计价器系统计价器开关功能模块读入直流电机转圈数模块ST7920显示功能模块根据里程计算价格模块

图2-10软件功能模块图

2.3.2程序流程图

本节先给出一个程序的整体流程图。

开始结束8253初始化液晶显示屏初始化8255初始化是计价器是否开始工作通过8255读入b0否是否有键盘输入否液晶显示屏初始化是液晶显示屏调用显示价格功能从直流电机读入输入圈数将更改过的路程在显示器中显示出来读到一定圈数走的路程加一比较路程是否大于3公里是价格为(路程-3)*2+7 元将储存的显示字符串内路程价格改为目前路程价格否价格为7元

图2-11软件程序流程图

2.3.3模块流程图

如果对整个程序进行细分则可以分为初始化模块,判断开关模块,圈数统计模块,计算里程模块、结束模块和显示模块。其中初始化模块是8253芯片、8255芯片和显示屏的初始化。判断开关模块是对8255的b0端是否有高电平进行判断。

圈数统计模块是对直流电机传入8253中高电平的数量进行圈数统计。计算里程模块是对里程及价格进行计算的模块。结束模块是程序结束的操作与方法。显示模块是控制显示屏显示计算模块的结果。

初始化模块显示模块调用关判断开关模块开结束模块圈数统计模块计算里程模块调用显示模块图2-12软件模块流程图

三、详细设计

3.1程序模块分析

我们将按模块分析程序的功能并给出模块内的功能流程图。

3.1.1初始化模块分析

在初始化模块中,我们定义了需要使用的8255和8254的接口,需要使用的变量如JSS,要输出的字符串等,初始化了DS,完成了8255的初始化以及显示屏的初始化。其流程图为

开始图3-1初始化模块流程图

3.1.2判断开关模块分析

以上为判断开关模块,在判断开关模块中,系统读入8255PB0的电平,如果是高电平则程序继续进行,如果是低电平则程序调用chushi函数,用屏幕显示“空车欢迎乘坐”,并继续度8255PB0直到有高电平为止。其流程图如下所示:

8255PB0是否为高电平是圈数统计模块否Chushi函数计数变量和对应的字符串置零显示 空车 欢迎乘坐 调用显示模块

图3-2判断开关模块流程图

3.1.3圈数统计模块分析

在圈数统计模块中,我们将直流电机计数端连入8254CLK1中(8253采用方式三),在CLK1中读所记的数,从0FFFFH向下计,一直计到159FH,即转了6000圈后,进入程序的下一段。其流程图如下所示:

读8254计数值否是否到159FH以下是重新将8254计数初值设为0FFFFH计算里程模块

图3-3圈数统计模块流程图

3.1.4计算里程模块分析

我们用地址JSS里表示已经走过的公里,即8254传过来的高电平,同时我们采用价格公式来计算价格,将其里程和价格对应的中文字码表存入要显示的字符串中。我们用地址JSS里表示已经走过的公里,即8254传过来的高电平,同时我们采用价格公式来计算价格,将其里程和价格对应的中文字码表存入要显示的字符串中。

计算公式为: 价格=(里程-3)* 2……(里程>3)

价格= 7…………………..(里程<=3)并调用显示模块来显示这些字码其流程图如下所示:

圈数统计模块计数值JSS加一并十进制化里程数加一里程数是否是大于3是价格为(里程-3)*2调用显示模块否价格为7

图3-4计算里程模块流程图

3.1.5显示模块分析

在显示模块中,我们使用ST7920显示我们要显示的两行字符串。我们采取先显示第一行,再显示第二行的方法,只是用ST7920的中间两行。

调整显示屏指针指向第二行调整显示屏指针指向第三行调整字符串指针指向第一个字调整字符串指针指向第九个字输出输出延时延时

图3-5显示模块流程图

3.1.6结束模块分析

结束模块在程序的尾部在结束模块中,我们规定只要在键盘上按任意一个键就会结束整个程序。如果无键按下,则程序自动跳转到程序头部。其程序流程图如下图所示:

调用DOS中断是否有键按下是结束否判断开关模块

图3-6结束模块流程图

3.2程序代码

IO8253A

EQU 280H IO8253B

EQU 281H IO8253C

EQU 283H

DATA

SEGMENT HZ DW 0C2B7H,0B3CCH,0A3B0H,0A3B0H,0A3AEH,0A3B0H,0B9ABH,0C0EFH

DW BCDBH,0B8F1H,0A3B0H,0A3B0H,0A3B0H,0A3AEH,0A3B0H,0D4AAH;存放原始输出 HZ_TAB DW 0C2B7H,0B3CCH,0A3B0H,0A3B0H,0A3AEH,0A3B0H,0B9ABH,0C0EFH

DW 0BCDBH,0B8F1H,0A3B0H,0A3B0H,0A3B0H,0A3AEH,0A3B0H,0D4AAH;存放要输出的值 HZ_BG DW 0BFD5H,0B3B5H,0A2A0H,0A2A0H,0BBB6H,0D3ADH,0B3CBH,0D7F8H

DW 0A2A0H,0A2A0H,0A2A0H,0A2A0H,0A2A0H,0A2A0H,0A2A0H,0A2A0H;存放“空车欢迎乘坐”

HZ_ADR DB ?

;存放显示行起始端口地址 JSS

DW 0000H DII

DW 0000H GAO

DW 0000H ZHE

DW 0000H NUMBER

DW 0A3B0H,0A3B1H,0A3B2H,0A3B3H,0A3B4H,0A3B5H,0A3B6H,0A3B7H,0A3B8H,0A3B9H DATA

ENDS IO_ADDRESS

EQU 288H

CODE SEGMENT ASSUME CS:CODE,DS:DATA START:

MOV AX,DATA MOV DS,AX

MOV DX,IO_ADDRESS ADD DX,3 MOV AL,82H OUT DX,AL

;8255初始化 MOV AL,0FFH MOV DX,300H OUT DX, AL CALL CLEAR

;LCD 清除

LLL:

MOV DX,IO_ADDRESS ADD DX,1 IN AL,DX

;判断开关是否打开 AND AL,01H CMP AL,01H JZ F0 CALL CHUSHI JMP LLL F0: MOV AL,01110110B MOV DX,IO8253C OUT DX,AL

;8254初始化 MOV AL,0FFH MOV DX,IO8253B OUT DX,AL MOV AL,0FFH

;设置计数初值0FFFFH OUT DX,AL F1: MOV AL,01000000B

MOV DX,IO8253C OUT DX,AL MOV DX,IO8253B

IN AL,DX MOV AH,AL IN AL,DX XCHG AH,AL CMP AX,159FH

;查看是否下降到159FH JA F1

;不满足条件继续读值

MOV AL,01110110B

;重置8253 MOV DX,IO8253C OUT DX,AL MOV AL,0FFH MOV DX,IO8253B OUT DX,AL MOV AL,0FFH OUT DX,AL

CALL DISP

;调显示子程序

CALL DDSP

CALL DELAY PUSH DX

MOV AH,06H MOV DL,0FFH INT 21H POP DX

JZ LLL

MOV AH,4CH

;退出

INT 21H L1:

JMP

START;L1

CHUSHI PROC NEAR

LEA SI, HZ_TAB LEA DI,HZ MOV CX,0FH F3: ADD SI,2 ADD DI,2 MOV AX,[DI] MOV [SI],AX LOOP F3

;重置HZ_TAB

MOV AX,0000H LEA BX,JSS MOV [BX],AX LEA BX, HZ_BG MOV CH,2

CALL LCD_DISP LEA BX, HZ_BG MOV CH,3

;显示“空车欢迎乘坐” CALL LCD_DISP RET CHUSHI ENDP

DDSP

PROC NEAR

LEA DI,HZ_TAB LEA BX,JSS LEA SI,NUMBER MOV AX,WORD PTR[BX]

MOV BP,AX AND BP,00FFH ADD BP,BP

MOV DX,WORD PTR[BP+SI] MOV WORD PTR[DI+6],DX

;将JSS中低八位传入HZ_TAB MOV BP,AX AND BP,0FF00H ROR BP,8 ADD BP,BP MOV DX,WORD PTR[BP+SI] MOV WORD PTR[DI+4],DX

LEA BX, HZ_TAB

MOV CH,2

CALL LCD_DISP LEA DI,HZ_TAB LEA BX,JSS LEA SI,NUMBER MOV AX,WORD PTR[BX] CMP AX,0003H

JBE L3 CALL BJ LEA BX,JSS JMP L4

L3:MOV BP,0007H

ADD BP,BP MOV DX,WORD PTR[BP+SI ] MOV WORD PTR[DI+24],DX JMP L4 L4:

LEA BX, HZ_TAB

MOV CH,3

CALL LCD_DISP RET DDSP

ENDP

BJ

PROC NEAR

LEA DI,HZ_TAB LEA BX,JSS LEA SI,NUMBER MOV AX,WORD PTR[BX] CMP AL,03H

;将JSS中高八位传入HZ_TAB

;显示第2行信;比较路程与3的大小;路程比3小的情况

;显示第3行信息

JAE BJ1 SUB AH,01H ADD AL,0AH SUB AL,03H AAS

;路程减三并十进制化 JMP BJ2 BJ1:

SUB AX,0003H BJ2: MOV CX,AX AND AX,00FFH ADD AL,AL AAA ADD AX,07H AAA

LEA BX,DII MOV [BX],AX;DII MOV BP,AX AND BP,00FFH ADD BP,BP MOV DX,WORD PTR[BP+SI] MOV WORD PTR[DI+24],DX

MOV AX,CX SHR AX,8 AND AX,00FFH ADD AL,AL

AAA LEA BX,GAO MOV [BX],AX;GAO LEA BX,DII MOV DX,[BX];DII AND AX,00FFH AND DX,0FF00H SHR DX,8 AND DX,00FFH ADD AL,DL

AAA LEA BX,ZHE MOV [BX],AX;ZHE MOV BP,AX AND BP,00FFH ADD BP,BP MOV DX,WORD PTR[BP+SI]

;路程加七并十进制化;先计算个位

;十位相加

;再加进位

MOV WORD PTR[DI+22],DX

;再计算十位 LEA BX,ZHE MOV DX,[BX] LEA BX,GAO MOV AX,[BX] AND DX,0FF00H AND AX,0FF00H SHR AX,8 SHR DX,8 ADD DL,AL

;百位加进位 AAA MOV BP,DX AND BP,00FFH ADD BP,BP MOV DX,WORD PTR[BP+SI] MOV WORD PTR[DI+20],DX

;最后计算百位 RET BJ ENDP

DISP

PROC NEAR

;显示子程序

PUSH DX

LEA BX, JSS

MOV AX,WORD PTR[BX]

ADD AL,01H

CMP AL,09H

;判断是否<=9

JLE NUM

;若是则为'0'-'9',ASCII码加30H

MOV AL,00H

ADD AH,01H

CMP AH,0AH

JZ L2 NUM:

MOV WORD PTR[BX],AX

ADD AL,30H

ADD AH,30H

MOV DL,AH

MOV DH,AL

MOV AH,02H

;屏幕显示

INT 21H

MOV DL,DH

MOV AH,02H

;屏幕显示

INT 21H

MOV DL,0DH

;加回车符

INT 21H

MOV DL,0AH

;加换行符

INT 21H

POP DX

RET

;子程序返回 DISP ENDP L2: MOV AH,4CH

;退出

INT 21H

CLEAR

PROC

MOV AL,0CH

CLEAR

FUNCUP

;

;

;

FUNCUP

LCD_DISP

;

DISP_SEC:

NEXT:

CONTINUE:

MOV DX, IO_ADDRESS OUT DX,AL

;设置CLEAR命令 CALL CMD_SETUP

;启动LCD执行命令 RET

ENDP

PROC MOV AL, 0FH

;LCD功能设置命令 OUT DX, AL CALL CMD_SETUP MOV AL, 34H

;LCD显示状态命令 OUT DX, AL CALL CMD_SETUP RET

ENDP PROC LEA BX, HZ_TAB CMP CH, 2 JZ DISP_SEC MOV BYTE PTR HZ_ADR, 88H

;第三行起始端口地ADD BX,16

;指向第二行信息 JMP NEXT MOV BYTE PTR HZ_ADR,90H MOV CL,8

PUSH CX MOV AL,HZ_ADR MOV DX, IO_ADDRESS OUT DX, AL CALL CMD_SETUP

;设定DDRAM地址命令 MOV AX,[BX] PUSH AX MOV AL,AH

;先送汉字编码高位 MOV DX,IO_ADDRESS OUT DX,AL CALL DATA_SETUP

;输出汉字编码高字节

CALL DELAY

;延迟

POP AX

MOV DX,IO_ADDRESS

OUT DX, AL

CALL DATA_SETUP

;输出汉字编码低字节

CALL DELAY

INC BX

INC BX

;修改显示内码缓冲区指针

INC BYTE PTR HZ_ADR

;修改LCD显示端口地址

POP CX

DEC CL

JNZ CONTINUE

RET LCD_DISP

ENDP CMD_SETUP

PROC

MOV DX,IO_ADDRESS

制端口

ADD DX,2

NOP

MOV AL,00000000B

(LCD I端=0,W端=0)

OUT DX, AL

CALL DELAY

NOP

MOV AL,00000100B

=1)

OUT DX, AL

NOP

CALL DELAY

MOV AL, 00000000B

0)

OUT DX, AL

CALL DELAY

RET CMD_SETUP

ENDP DATA_SETUP

PROC

MOV DX,IO_ADDRESS

ADD DX,2

MOV AL,00000001B

(LCD I端=1)

OUT DX, AL

NOP

CALL DELAY

;指向8255端口控

;PC1置0,PC0置0

;PC2置1(LCD E端

;PC2置0,(LCD E端置

;指向8255控制端

;PC1置0,PC0=1

MOV AL,00000101B

;PC2置1(LCD E端=1)

OUT DX, AL

NOP

CALL DELAY

MOV AL, 00000001B

;PC2置0,(LCD E端=0)

OUT DX, AL

NOP

CALL DELAY

RET DATA_SETUP

ENDP DELAY

PROC

PUSH CX

PUSH DX

MOV CX, 0FFFH X1:

LOOP

X1

POP DX

POP CX

RET DELAY

ENDP

CODE ENDS

END START

四、程序结果

我们利用8254、8255、ST7920显示屏、直流电机等制作出了一个出租车计价器有专用键可以表示是否空车,同时利用直流电机模拟车轮运动,通过路程计算价格,成果如下图所示:

图4-1程序结果图

五、分析与测试

程序中,我遇到的最大的难题就是如何完成正确的十进制计算,因为所有的计算指令都是十六进制的,虽然有的计算里有类似AAA这样的调整指令,但是很多时候就不一定记得起来加上。同时由于需要根据数字来查表对应相应的字符码,而且我是建立一个从零到九的数组,而由于计算错误导致经常出现乱码,而且比较难找到相应的错误。而且有些计算没有十进制转换指令,需要自己编写。

同时我认为我利用提前存储变量来表示走过的路程比利用堆栈要好,因为堆栈容易记混,而变量有独特的名字,利于记忆与调用。而且易于清零、增减。

六、心得体会

这次课程设计中,令我印象最为深刻的就是我们应该有一种坚持的精神,有时候几个小时都没有成果,找不到BUG。显示的就是有问题,这时候我们应该有一种坚持下去的毅力,积极询问老师同学,问题的解决就很快了。

同时我发现编程习惯非常重要,应该有一个提前的规划,不能想到哪写到哪,这样的话,后期的DEBUG会非常麻烦,因为自己也看不懂自己的代码,我们都应该有规范化的代码意识,这样的编程能力才能上升。

参考文献

[1]周荷琴,吴秀清,《微型计算机原理与接口技术》,合肥:中国科学技术大学出版社 2008。[2] 曹国清,《数字电路与逻辑设计》,徐州:中国矿业大学出版社 2003。[3] 8255芯片原理:http://baike.baidu.com/link?url=KHojvZzBGmo26_6iYGTdrdqH6PxQbM1Hnnc8hWQNPIp60L7TWG5LZu_ppSkXo5maU5M4APs4qCGSudiqZ0bdl_ [4]ST7920芯片原理:http://wenku.baidu.com/view/0dafd9232f60ddccda38a0fa.html访问时间2013/10/15 [5]ST7920中文字码表:http://wenku.baidu.com/view/d4abe628647d27284b735127.html访问时间:2013/10/15

第五篇:出租车计价器课程设计2

出租车计价器课程设计

目录

前言

1、系统工作原理 1.1 功能说明 1.2 基本原理

2、硬件设计

2.1 单片机最小系统单元 2.2 A44E霍尔传感器检测单元 2.3 AT24C01存储单元 2.4 键盘调整单元 2.5 显示单元

3、软件设计 3.1 系统主程序 3.2 中断程序

3.2.1 里程计数中断程序 3.2.2 中途等待中断程序 3.3 计算程序 3.4 显示程序 3.5 键盘程序

4、总结 参考文献

附录A 系统原理图

附录B 系统源程序

前言

随着出租车行业的发展,出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。本设计采用AT89S52单片机为主控器,以A44E霍尔传感器测距,实现对出租车的多功能的计价设计,并采用AT24C01实现在系统掉电的时候保存单价等信息,输出采用8段数码显示管。本电路设计的计价器不但能实现基本的计价,而且还能根据白天,黑夜和中途等待来调节单价。

第一章 系统工作原理

1.1 功能说明

出租车计价器根据乘客乘坐汽车行驶距离和等候时间的多少进行计价,并在行程中同步显示车费值。从起步价开始,当汽车程行驶未满3公里时,均按起步价计算。过3公里后,实现每1公里单价收费,中间遇暂停时,计程数不再增加,开始计时收费,测距收费和测时收费的和便构成了一位乘客的车费。同时,白天和夜晚价格不同,可以进行切换。白天单价、夜晚单价、等待单价和起步价格都可通过独立键盘进行调节。(默认起步价为5元/3公里,里程单价白天为1.5元/公里,夜晚为1.8元/公里,等待计时单价为0.5元/5分钟)

1.2 基本原理

计数器系统主要由五部分组成:A44E霍尔传感器、AT89S52单片机、独立键盘、EEPROM AT24C01和显示数码管。

霍尔传感器安装在车轮上,主要检测汽车行进的公里数,并产生一系列相应的脉冲输出,脉冲送到单片机进行处理,单片机根据程序设定通过计算脉冲数换算出行驶公里数,再根据从EEPROM中读取的价格等相关数据进行金额的计算,计算好的金额、里程和单价都实时地显示在数码管上。独立键盘可以调节价格等相关数据,按下相应的按钮,产生信号交由单片机处理并实时显示出来,调节好的数据存储到EEPROM中,掉电后可以使调好的数据不丢失,下次得电后直接从EEPROM读到单片机,系统结构图如图1。

图1 系统结构图

第二章 硬件设计

2.1 单片机最小系统单元

主控机系统采用了Atmel 公司生产的 AT89S52单片机,它含有256 字节数据存储器,内置8K 的电可擦除FLASH ROM,可重复编程,大小满足主控机软件系统设计,所以不必再扩展程序存储器。复位电路和晶振电路是AT89S52 工作所需的最简外围电路。单片机最小系统电路图如图2所示。

图2 单片机最小系统图

AT89S52 的复位端是一个史密特触发输入,高电平有效。RST端若由低电平上升到高电平并持续2个周期,系统将实现一次复位操作。在复位电路中,按一下复位开关就使在RST端出现一段时间的高电平,外接11.0592M 晶振和两个30pF 电容组成系统的内部时钟电路。

2.2 A44E霍尔传感器检测单元

A44E 属于开关型的霍尔器件,其工作电压范围比较宽(4.5~18V),其输出的信号符合TTL电平标准,可以直接接到单片机的IO 端口上,而且其最高检测频率可达到1MHZ。

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

图3 A44E霍尔传感器原理

里程计算是通过安装在车轮上的霍尔传感器检测到的脉冲信号,送到单片机产生中断,单片机再根据程序设定,计算出里程。其原理如图4所示。

图4 传感器测距示意图

本系统选择了将A44E的脉冲输出口接到P3.3口外部中断1作为信号的输入端(这样可以减少程序设计的麻烦),车轮每转一圈(设车轮的周长是1米),霍尔开关就检测并输出信号,引起单片机的中断,对脉冲计数,当计数达到1000次时,即1公里,单片机就控制将金额自动增加,如图5。

图5 A44E霍尔元件接线图

2.3 AT24C01存储单元 存储单元的作用是在电源断开的时候,存储当前设定的单价信息。AT24C01 是Ateml公司的1KB的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10uA(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8 脚的DIP 封装,使用方便。

AT24C02芯片引脚配置如图6所示。

存储单元电路连接如图7所示。

图 7 存储单元电路原理图 图中R4、R5 是上拉电阻,其作用是减少AT24C01 的静态功耗。由于AT24C01的数据线和地址线是复用的,采用串口的方式传送数据,所以只用两根线SCL(时钟脉冲)和SDA(数据/地址)与单片机P2.2和P2.3口连接,进行传送数据。

每当设定一次单价,系统就自动调用存储程序,将单价信息保存在芯片内;当系统重新上电的时候,自动调用读存储器程序,将存储器内的单价等信息,读到缓存单元中,供主程序使用。

2.4 键盘调整单元

当单价等信息需要进行修改时,就要用到键盘进行修改。由于调节信息不多,故采用4个独立键盘即可,分别实现清零、切换、增大、减小和功能等作用。电路原理如图8所示。

图8 键盘调整单元接线图

S1:接P1.0口,对上一次的计费进行清零,为下次载客准备

S2:接P1.1口,实现白天和夜晚单价的切换;当功能键S4按下时,S2可对数据进行增大。S3:接P1.2口,当功能键S4按下时,S3可对数据进行减小。S4:接P1.3口,按1次,进入调整白天单价;按2次,进入调整夜晚单价;按3次,进入调整等待单价;按4次,进入调整起步价;按5次,返回。

2.5 显示单元

显示单元由7个8段共阳数码管组成,采用动态扫描进行显示。前三个数码管分别接P3.0、P3.1和P3.2,用于显示总金额;中间两个分别接P3.4和P3.5,用于显示里程;后边两个分别接P3.6和P3.7,用于显示单价。电路如图9所示。

图9 数码管显示图

第三章 软件设计

3.1 系统主程序

在主程序模块中,需要完成对各参量和接口的初始化、出租车起价和单价的初始化以及中断、计算、循环等工作。另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。

当汽车运行起来时,就启动计价,根据里程寄存器中的内容计算和判断行驶里程是否已超过起步价公里数。若已超过,则根据里程值、每公里的单价数和起步价数来计算出当前的总金额,并将结果存于总金额寄存器中;中途等待时,无脉冲输入,不产生中断,当时间超过等待设定值时,开始进行计时,并把等待价格加到总金额里,然后将总金额、里程和单价送数码管显示出来。程序流程如图10所示。

图10 主程序流程图 图11 计算程序流程图

3.2 中断程序

3.2.1 里程计数中断程序

每当霍尔传感器输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满1000次时,进入里程计数中断服务程序中,里程变量加一。主函数中总金额也相应地变化。

3.2.2 中途等待中断程序

在中途等待中断程序中,每1ms产生一次中断,将当前里程值送入某个缓存变量,每5分钟将缓存变量中的值和当前里程值比较,当汽车停止,霍尔传感器5分钟没有输出信号,当前里程值和缓存变量内的值相同,则进入等待计时,每5分钟记一次价格。

3.3 计算程序

计算程序根据里程数分别进入不同的计算公式。如果里程大于3公里,则执行公式:总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:总金额=起步价+等待时间*等待单价。程序流程图如图11所示。

3.4 显示程序

显示程序利用定时器每1ms产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。

3.5 键盘程序

键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结束再返回。流程图如图12。

图12 键盘程序流程图

第四章 总结

经过这些天有关于出租车计价器的课程设计,使我对单片机的应用有了更深的了解。在课程设计的过程中,还是碰到了许多的问题。比如,对于数码管动态扫描显示和键盘的延时防抖的综合编程不能较好地解决;对于代码的前后顺序及调用掌握得还不够好;对于一些相关的应用软件没能熟练掌握。通过这几天晚上的苦想和反复调试,以及参考网上的程序,最终还是把问题解决了。通过这次课程设计,我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,也充分体会到了自己设计东西的乐趣、学会查阅资料和对别人的东西融会变通的重要性,也明白了很多知识光靠趴在书本上学是学不到其中的精髓的,必须亲自去试着实践,亲自去经历才能对它们真正的掌握,凡事都要自己去动下手,去实践一下,遇到困难,永远不要沮丧气馁。在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识;这次设计给了我极大的鼓舞和信心,相信在以后的学习中可以通过不断的摸索和实践来提高其他方面的知识。

参考文献

[1] 马淑华,王凤文,张美金编著.单片机原理与接口技术(第二版).北京:北京邮电大学出版社,2007.[2] 谭浩强著.C程序设计(第三版).北京:清华大学出版社,2005.附录A 系统原理图

源程序

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define delayNOP();{_nop_();_nop_();_nop_();_nop_();_nop_();};

uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

sbit exter=P3^3;

//外部中断

sbit key0=P1^0;

//清零

sbit key1=P1^1;

//切换/+

sbit key2=P1^2;

//-

sbit key3=P1^3;

//功能键

sbit p30=P3^0;

//数码管各位控制

sbit p31=P3^1;

sbit p32=P3^2;

sbit p34=P3^4;

sbit p35=P3^5;

sbit p36=P3^6;

sbit p37=P3^7;

sbit SDA=P2^3;

//IIC引脚

sbit SCL=P2^2;

uint inter,aa,bb,temp,temp1;

uint zongjine,licheng,dengdai;

uint key3num,qiehuantemp,delaytemp;

uchar danjia1,danjia2,danjia3,danjia,qibu;

void delay(uint x)

//延时时基为1ms {

int i,j;

for(i=x;i>0;i--)

for(j=340;j>0;j--);}

void start()

//IIC开始位

{

SDA = 1;

SCL = 1;

delayNOP();

SDA = 0;

delayNOP();

SCL = 0;

}

void stop()

// IIC停止位

{

SDA = 0;

delayNOP();

SCL = 1;

delayNOP();

SDA = 1;}

void respons()

//IIC应答位

{

uchar i;

SCL=1;

delayNOP();

while((SDA==1)&&(i<250))

i++;

SCL=0;

delayNOP();}

uchar read_byte()

// 从EEPROM读到MCU {

uchar i,j;

for(i=0;i<8;i++)

{

SCL=1;

j<<=1;

j|=SDA;

SCL=0;

}

return(j);}

void write_byte(uchar date)

{

uchar i,temp;

temp=date;

for(i=0;i<8;i++)

{

temp=temp<<1;

SCL=0;

delayNOP();

SDA=CY;

delayNOP();

SCL=1;

delayNOP();

}

SCL=0;

// 从MCU写到EEPROM

delayNOP();

SDA=1;

delayNOP();}

void write_data(uchar addr, uchar date){

start();

write_byte(0xa0);

respons();

write_byte(addr);

respons();

write_byte(date);

respons();

stop();}

uchar read_data(uchar addr)

{

uchar date;

start();

write_byte(0xa0);

// 在指定地址addr处写入数据date // 在指定地址addr读取数据

respons();

write_byte(addr);

respons();

start();

write_byte(0xa1);

respons();

date=read_byte();

stop();

return date;}

void display(uint zongjine0,uint licheng0,uint danjia0){

uint jbai,jshi,jge,lshi,lge,dshi,dge;

uint numwei,numshu;

//数码管位置分配

jbai=zongjine0/100;

jshi=zongjine0%100/10;

jge=zongjine0%100%10;

lshi=licheng0/10;

//数码管显示

lge=licheng0%10;

dshi=danjia0/10;

dge=danjia0%10;

//数码管动态显示

if(aa)

{

aa=0;numshu++;if(numshu==7)

numshu=0;P3=0xff;switch(numwei){

case 0:p30=0;P0=table[jbai];break;

case 1:p31=0;P0=table[jshi]&0x7f;break;

case 2:p32=0;P0=table[jge];break;

case 3:p34=0;P0=table[lshi];break;

case 4:p35=0;P0=table[lge];break;

case 5:p36=0;P0=table[dshi]&0x7f;break;

case 6:p37=0;P0=table[dge];break;

}

numwei++;

if(numwei==7)

numwei=0;

} }

void keyscan()

//键盘扫描

{

if(key3==0)

//功能键调节

{

delay(5);

if(key3==0)

{

key3num=1;

while(!key3);

delay(5);

while(!key3);

while(key3num)

{

if(key3num==1)

调白天单价

//

{

if(key1==0)

{

delay(5);

if(key1==0)

danjia1=0;

{

danjia1++;

if(danjia1==100)

while(!key1);

delay(5);

while(!key1);

} } if(key2==0){

delay(5);

if(key2==0)

{

danjia1--;

if(danjia1==-1)

danjia1=99;

while(!key2);

delay(5);

while(!key2);

}

调夜晚单价

danjia2=0;

}

display(1,0,danjia1);} if(key3num==2)

//{

write_data(1,danjia1);

if(key1==0)

{

delay(5);

if(key1==0)

{

danjia2++;

if(danjia2==100)

while(!key1);

delay(5);

while(!key1);

}

}

danjia2=99;

if(key2==0)

{

delay(5);

if(key2==0)

{

danjia2--;

if(danjia2==-1)

while(!key2);

delay(5);

while(!key2);

}

}

display(2,0,danjia2);} if(key3num==3)

//调等待单价

{

write_data(2,danjia2);

if(key1==0)

danjia3=0;

{

delay(5);

if(key1==0)

{

danjia3++;

if(danjia3==100)

while(!key1);

delay(5);

while(!key1);

} } if(key2==0){

delay(5);

if(key2==0)

{

danjia3--;

if(danjia3==-1)

danjia3=99;

while(!key2);

步价

delay(5);

while(!key2);

}

}

display(3,0,danjia3);} if(key3num==4)

//调起{

write_data(3,danjia3);

if(key1==0)

{

delay(5);

if(key1==0)

{

qibu++;

if(qibu==100)

qibu=0;

while(!key1);

delay(5);

qibu=99;

while(!key1);

} } if(key2==0){

delay(5);

if(key2==0)

{

qibu--;

if(qibu==-1)

while(!key2);

delay(5);

while(!key2);

} }

display(4,0,qibu);

}

if(key3num==5)

//退出功能键

{

}

}

write_data(4,qibu);

key3num=0;}

if(key3==0){

delay(5);

if(key3==0)

{

key3num++;

while(!key3);

delay(5);

while(!key3);

} }

} } void init(){ SDA=1;SCL=1;

zongjine=0;licheng=0;dengdai=0;

danjia1=read_data(1);danjia2=read_data(2);danjia3=read_data(3);qibu=read_data(4);

aa=0;//数码管动态扫描的定时器时基个数

bb=0;//判断是否等待的时基个数

inter=0;

EA=1;//开总中断

EX1=1;//开外部中断1 IT1=1;//触发方式下降沿

TMOD=0x01;TH0=(65536-1000)/256;TL0=(65536-1000)%256;ET0=1;//开定时器T0中断

TR0=1;//开定时器T0

P3=0x08;P0=table[0];}

void jisuan(){ if(licheng>3)zongjine=qibu+(licheng-3)*danjia+dengdai*danjia3;//金额计算

else zongjine=qibu+dengdai*danjia3;//起步公里内金额计算 }

void qiehuan(){ if(key1==0)//白天夜晚切换

{ delay(5);//键盘防抖

if(key1==0)qiehuantemp=!qiehuantemp;while(!key1);delay(5);while(!key1);} if(qiehuantemp==0)danjia=danjia2;if(qiehuantemp==1)danjia=danjia1;}

void main(){ init();qiehuantemp=1;key3num=0;while(1){ qiehuan();//切换白天夜晚单价

jisuan();//计算总金额

display(zongjine,licheng,danjia);keyscan();if(key0==0)//清零键

init();} }

void inter1()interrupt 2 //脉冲中断 { delay(5);// if(exter==0)// { // IT1=1;inter++;if(inter==5){ inter=0;licheng++;} } // while(!exter);// delay(5);// while(!exter);// }

void timer0()interrupt 1 { TH0=(65536-1000)/256;TL0=(65536-1000)%256;aa++;bb++;temp1=licheng;//测试是否进入等待

if(bb==10000)//10s无反应进入等待计费

{ bb=0;if(temp=temp&temp1)dengdai++;temp=licheng;} }

原来文件地址http://blog.sina.com.cn/s/blog_609003ef0100dt1o.html

存储器可以不用

下载51单片机 出租车计价器课程设计word格式文档
下载51单片机 出租车计价器课程设计.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    出租车计价器Multisim课程设计[精选五篇]

    时序逻辑电路的课程设计题目 组员:杨天乐 闫帅铮 艾文杰 一、题目:出租车计价器         设计内容:1)进行需求分析,确定总体框架;2)画出逻辑图; 3)对设计的电路进行仿真; 设计要求:1)......

    基于单片机的出租车计价器设计报告(★)

    河南理工大学 《单片机应用与仿真训练》设计报告 出租车计价器设计 姓名学号: 专业班级: 指导老师: 所在学院: 2012年6月25日 摘要 本设计用直流电机转动模拟出租车车轮转动,实现......

    出租车计价器(范文大全)

    基于单片机的出租车计价器设计 摘要 出租车计价器的数字系统的设计正是基于一些专用的芯片,才发挥其有效特性,从而实现出租车的计价功能。此数字系统主要分为三个单元,即里程计......

    《基于单片机的出租车计价器的设计》开题报告

    《基于单片机的出租车计价器的设计》开题报告 关键词:出租车计价器 浙江师范大学应用电子技术专业开题报告范文 杭州论文 开题报告 一.选题背景和意义 随着我国经济的迅速发展......

    出租车计价器设计范文

    平顶山工业职业技术学院 目录 目录 .....................................................................................................................................

    第二组_出租车计价器课程设计调试报告

    电子设计与制作课程设计报告 题目:出租车计价器课程设计 学年:2011学年 学期:上学期 专业:信息电子班级:H09-1 组别2 姓名: 曾磊 指导教师: 刘锐老师 小组成员: 曾磊 刘毅 朱亮......

    EDA课程设计-简易出租车计价器设计5则范文

    HBQY #20080230403 课程设计 EDA 课 程 设 计 [RTX于2012/2/22] 简 易 出租车计价器设计 要求:  计价器按1.2元/公里计费,超过10公里后,则按1.8元/公里收费。  起步价6元(3公......

    出租车计价器毕业论文附录

    北京信息科技大学 毕业设计(论文)附录 题 目:学 院: 专 业:学生姓名: 班级/学号 指导老师/督导老师:起止时间:2012 年 月 日 至 2012 年 月 日 目录 附件1 原理图·······......