多功能出租车计价器

第1节 引 言

本次课程设计利用单片机技术来实现一台多功能出租车计价器,具有性能可靠、电路简单、成本低等特点。

1.1 出租车计价器概述

计价器显示的营运金额是营运里程与价格的函数(等候时间一般折算成一定比例的里程来计算)。出租车计价器通过传感器与行驶车辆连接。出租汽车的实际里程通过传感器的脉冲信号在计价器里折算成一定的计价营运里程。目前市场上出租车计价器功能主要有具有数据的复位功能、白天/晚上转换功能、数据输出功能、计时计价功能等等,但能够进行语音播报数据信息的出租车计价器还是比较少见的,针对这一点我们来设计一款多功能出租车计价器,在原有功能的基础上增加单价输出、单价调整、路程输出、显示当前的系统时间、语音播报数据信息等功能。

1.2 本设计任务

1.2.1 设计任务

设计一款基于AT89S51单片机的出租车计价器。

1.2.2 设计要求

1.基本要求

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

l 白天

l 晚上

l 途中等待(>10min 开始收费)

(2) 能进行手动修改单价。

(3) 具有数据的复位功能。

(4) IO 口分配的简易要求。

l 距离检测使用霍尔开关A44E

l 白天/晚上收费标准的转换开关

l 数据的清零开关

l 单价的调整(最好使用+和-按键)

(5) 数据输出(采用LCM103)。

l 单价输出 2 位

l 路程输出 2 位

l 总金额输出 3 位

(6) 按键。

l 启动计时开关

l 数据复位(清零)

l 白天/晚上转换

2.发挥部分

(1) 能够在掉电的情况下存储单价等数据。

(2) 能够显示当前的系统时间。

(3) 语音播报数据信息。

1.3 系统主要功能

本课程设计所设计的出租车计价器的主要功能有:数据的复位、白天/晚上转换、数据输出、计时计价、单价输出及调整、路程输出、语音播报数据信息、实现在系统掉电的时候保存单价和系统时间等信息等功能。输出采用8 段数码显示管。本电路设计的计价器不但能实现基本的计价,而且还能根据白天、黑夜、中途等待来调节单价,同时在不计价的时候还能作为时钟为司机同志提供方便。

第2节 计价器硬件设计

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

2.1 系统的硬件构成及功能

计价器的单片机控制方案图如图1所示。它由以下几个部件组成:单片机AT89S51、总金额及单价显示部件、键盘控制部件,AT24C02 掉电存储控制、里程计算单元、串中显示驱动电路等。

利用单片机丰富的IO端口,及其控制的灵活性,实现基本的里程计价功能和价格调节、时钟显示功能。不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级。具体电路参见“多功能出租车计价器总体电路图”。

fdc10c4c79c8fe8a36263e5e58a86bf8.png

2.2 AT89S51单片机及其引脚说明

AT89S51是美国ATMEL公司生产的低功耗,高性能CMOS 8位单片机,片内含4KB的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。它集Flash程序存储器既可在线编程(ISP)也可用传统方法进行编程及通用 8位微处理器于单片芯片中,具有高性价比。

AT89S51是一个有40个引脚的芯片,引脚配置如图2所示。

bec9f4cd5de929de689b49314d621407.png

AT89S51芯片的40个引脚功能为:

VCC 电源电压。

GND 接地。

RST 复位输入。当RST变为高电平并保持2个机器周期时,将使单片机复位。WDT溢出将使该引脚输出高电平,设置SFR AUXR的DISRTO位(地址8EH)可打开或关闭该功能。DISKRTO位缺省为RESET输出高电平打开状态。

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

XTAL2 来自反向振荡放大器的输出。

P0口 一组8位漏极开路型双向I/O口。也即地址/数据总线复用口。作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。

P1口 一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。Flash编程和程序校验期间,P1接收低8位地址。P1口部分端口引脚及功能如表1所示。

表1 P1口特殊功能

P1口引脚

特殊功能

P1.5

MOSI(用于ISP编程)

P1.6

MOSI(用于ISP编程)

P1.7

SCK(用于ISP编程)

P2口 一个带内部上拉电阻的8位双向I/O口。P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16位地址的外部数据存储器时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器时,P2口线上的内容在整个访问期间不改变。Flash编程和程序校验期间,P2亦接收低8位地址。

P3口 一个带内部上拉电阻的8位双向I/O口。P3的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写“1”时,它们被内部的上拉电阻把拉到高电并可作输入端口。作输入端口使用时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如表2所示。P3口还接收一些用于Flash闪速存储器编程和程序校验期间的控制信号。

表2 P3口特殊功能

P3口引脚

特殊功能

P3.0

RXD(串行输入口)

P3.1

TXD(串行输出口)

P3.2

outside_default.png(外部中断0)

P3.3

outside_default.png(外部中断1)

P3.4

T0(定时器0外部输入)

P3.5

T1(定时器1外部输入)

P3.6

outside_default.png(外部数据存储器写选通)

P3.7

outside_default.png(外部数据存储器读选通)

PSEN/ 程序储存允许输出是外部程序存储器的读先通信号,当AT89S51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN/有效,即输出两个脉冲。当访问外部数据存储器,没有两次有效的PSEN/信号。

EA/VPP 外部访问允许。欲使CPU仅访问外部程序存储器,EA端必须保持低电平,需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。Flash存储器编程时,该引脚加上+12V的编程电压VPP。

2.3 AT24C02引脚图及其引脚功能

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

76250291960dd9b4d487a694119ff79b.jpeg

AT24C02芯片DIP封装,共有8个引脚,其中:

A2~A0 地址引脚;

SDA、SCL I2C总线接口;

WP 写保护引脚,WP接VSS时,禁止写入高位地址,WP接VDD时,允许写入任何地址;

VCC 电源端

GND 接地端

2.4 AT24C02 掉电存储单元的设计

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

c404dba883761ea826abff04322005ac.png

图 4 掉电存储电路原理图

图中R8、R10 是上拉电阻,其作用是减少AT24C02 的静态功耗,由于AT24C02 的数据线和地址线是复用的,采用串口的方式传送数据,所以只用两根线SCL(移位脉冲)和SDA(数据/地址)与单片机传送数据。

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

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

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

84616c689576cd9167d551615d54947c.png

图 5 传感器测距示意图

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

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

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

我们选择了P3.2 口作为信号的输入端,内部采用外部中断0(这样可以减少程序设计的麻烦),车轮每转一圈(我们设车轮的周长是1 米),霍尔开关就检测并输出信号,引起单片机的中断,对脉计数,当计数达到1000 次时,也就是1 公里,单片机就控制将金额自动的加增加,其计算公式:当前单价×公里数=金额。

2.6 数据显示单元设计

由于设计要求有单价(2 位)、路程(2 位)、总金额(3 位)显示输出,加上我们另外扩展了时钟显示(包含时分秒的显示),采用LCD 液晶段码显示,在距离屏幕1 米之外就无法看清数据,不能满足要求,而且在白天其对比度也不能够满足要求,因此我们采用6 位LED数码管的分屏显示,如图6 所示:

be0d2f369f6bf70480eca9bf7a872e22.png

时钟显示(图中显示为12 点0 分46 秒)

71cfaff5eb9b089d4899c9b01d4c3fc2.png

总金额和单价显示(图中显示为总金额55.3元,每公里4.6 元)

f2b4409cee02f96c1677d0dee3c6d0cf.png

路程和单价显示(图中显示为总路程12 公里,当前单价4.6 元)

5a7a32f41bca1956c8eda9e1f9100c12.png

单价调整显示(图中显示为右起白天单价4 .6 元/晚上7.8 /中途等待1.2 元)

图 6 采用6 位LED数码管的分屏显示

数据的分屏的显示是通过按键S1 来实现切换的,如图7 所示。

在出租车不走的时候,按下S1,可以实现数据的分屏显示;车在行走的时候只有总金额和单价显示屏在显示,当到达目的地的时候,客户要求查看总的里程的时候,就可以按下S1 切换到里程和单价显示屏,供客户查询。显示电路的电路原理图如图8所示。

bea18f668e9c7796941388819e01f6a3.png

图 7 S1切换显示屏

9d701a6f633f2c2dc9a6660230543b0a.png

图 8 显示器原理图

从单片机串口输出的信号先送到左边的移位寄存器(74HC164),由于移位脉冲的作用,使数据向右移,达到显示的目的。移位寄存器74HC164还兼作数码管的驱动,插头1(header1)接电源,插头2(header2)接数据和脉冲输出端。电路中的三个整流管D1~D3 的作用是降低数码管的工作电压,增加其使用寿命。

第3节 系统的软件设计

本系统的软件设计主要可分为主程序模块、定时计数中断程序、里程计数中断服务程序、中途等待中断服务程序、显示子程序服务程序、键盘服务程序六大模块。下面对各部分模块作介绍。

3.1 系统主程序设计

在主程序模块中,需要完成对各接口芯片的初始化、出租车起价和单价的初始化、中断向量的设计以及开中断、循环等待等工作。另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。主程序流程图如图9 所示。当按下S1时,就启动计价,将根据里程寄存器中的内容计算和判断出行驶里程是否已超过起价公里数。若已超过,则根据里程值、每公里的单价数和起价数来计算出当前的累计价格,并将结果存于价格寄存器中,然后将时间和当前累计价格送显示电路显示出来。当到达目的地的时候,由于霍尔开关没有送来脉冲信号,就停止计价,显示当前所应该付的金额和对应的单价,到下次启动计价时,系统自动对显示清零,并重新进行初始化过程。

3.2 定时中断服务程序

在定时中断服务程序中,每100ms 产生一次中断,当产生10 次中断的时候,也就到了一秒,送数据到相应的显示缓冲单元,并调用显示子程序实时显示。其程序流程如图10 所示。

3.3 里程计数中断服务程序

每当霍尔传感器输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满1000 次时,使微机进入里程计数中断服务程序中。在该程序中,需要完成当前行驶里程数和总额的累加操作,并将结果存入里程和总额寄存器中。

3.4 中途等待中断服务程序

当在计数状态下霍尔开关没有输出信号,片内的T1 定时器便被启动,每当计时到达10分钟,就对当前金额加上中途等待的单价,以后每十分钟都自动加上中途等待的单价。当中途等待结束的时候,也就自动切换到正常的计价。

3.5 显示子程序服务程序

由于是分屏显示数据,所以就要用到4 个显示子程序,分别是:时分秒显示子程序(HMS_DIS)、金额单价显示子程序(CP_DIS)、路程单价显示子程序(DP_DIS)、单价调节子程序(PA_DIS)。

3.6 键盘服务程序

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

第4节 系统调试与测试结果分析

根据系统设计方案,本系统的调试共分为三大部分:硬件调试,软件调试和软硬件联调。测试包括里程计价测试、掉电存储测试测试。

4.1 使用的仪器仪表

数字万用表        DT9203

单片机仿真器       WAVE6000

烧写器 GF2100

双踪稳压稳流电源     DH1718E-5

数字示波器      TDS1002

4.2 系统调试

根据系统设计方案,本系统的调试共分为三大部分:硬件调试,软件调试和软硬件联调。由于在系统设计中采用模块设计法,所以方便对各电路模块功能进行逐级测试。

2b27ccdbd43c8717aa670700e8f325e3.png

3.计价表使用说明

(1)S1按键的功能

在出租车不走的时候,按下S1,可以实现数据的分屏显示;车在行走的时候只有总金额和单价显示屏在显示,当到达目的地的时候,客户要求查看总的里程的时候,就可以按下S1 切换到里程和单价显示屏,供客户查询。

(2)S2按键的功能

在按下S1按键之后,若接着按下S2键则进行单价调整(默认为调整白天单价),当接着按下S1时,则进行晚上单价调,再次按下S1可进行中途等待单价调整。当单价调整结束后,可以通过过按下S2按键进行时间调整,默认为调整时,接着按下S1可进行调整分,分调整后再接下S1可进行秒调整。当时调整完成后,若接着按下S2则又可进行单价调整。

(3)S3按键的功能

在显示金额及单价时,若按下S3键则显示路程和单价,再次按下S3,可返回显示金额及单价。

(4)S4按键的功能

在按下S1按键之后,若接着按下S4按键,则进行设定默认晚上单价,并启动计价器,若没有按下S4则可设定默认单价(白天),并启动计价器。当设定默认晚上单价结束后,再次接下S4按键,则可设定默认中途等待单价,并启动计价器。当设定默认中途等待单价后,若还按一次S4,则返回系统时间的显示。

4. 全部源程序

该出租车计价器的系统软件设计源程序如下:

DAY_PRICEEQU 6FH

NIGHT_PRICEEQU 6EH

MIDWAY_PRICEEQU 6DH

START_PRICEEQU 6CH

COUNTL EQU 6BH

COUNTH EQU 6AH

M100 EQU 69H ; 外部中断次数

DISTANCE EQU 68H ; 行车距离

MS100 EQU 67H

SEC EQU 66H

MIN EQU 65H

HOUR EQU 64H

LEDSL EQU 63H ; 时分钞显示缓冲区

LEDSH EQU 62H

LEDML EQU 61H

LEDMH EQU 60H

LEDHL EQU 5FH

LEDHH EQU 5EH

LEDDANJIAL EQU 5DH ; 总额,单价显示缓冲区

LEDDANJIAH EQU 5CH

LINE_ EQU 5BH

LEDCOUNT1 EQU 5AH

LEDCOUNT2 EQU 59H

LEDCOUNT3 EQU 58H

LEDDANJIA2L EQU 57H ; 路程,单价显示缓冲区

LEDDANJIA2H EQU 56H

LINE__ EQU 55H

LINE___ EQU 54H

LEDDISTANCEL EQU 53H

LEDDISTANCEH EQU 52H

LEDDAY_PL EQU 51H ; 中途,晚上,白天显示缓冲区

LEDDAY_PH EQU 50H

LEDNIG_PL EQU 4FH

LEDNIG_PH EQU 4EH

LEDW_PL EQU 4DH

LEDW_PH EQU 4CH

S1 BIT P1.0

S2 BIT P1.1

S3 BIT P1.2

S4 BIT P1.3

S11 EQU 4BH

S22 EQU 4AH

S33 EQU 49H

S44 EQU 48H

M1 EQU 47H

H1 EQU 46H

M2 EQU 45H

H2 EQU 44H

PRICE EQU 43H

ORG 0000H

AJMPMAIN

ORG 0003H

AJMPTO

ORG 000BH

AJMPTOTIME

ORG 001BH

AJMPTOSTART

ORG 0030H

MAIN: MOV SP,#70H

MOV TMOD, #11H

MOV TH0, #3CH

MOV TL0, #0B0H

MOV TH1, #3CH

MOV TL1, #0B0H

MOV 22H, #0AH

SETB EA

SETB TR0

SETB EX0

SETB IT0

SETB ET0

SETB ET1

MOV R7,#34

MOV R0,#69H

LOOPL:MOV @R0,#0

DEC R0

DJNZR7,LOOPL

MOV COUNTL, #00H ; 起步价

MOV COUNTH, #05H

MOV DAY_PRICE,#25H ; 白天价格初始化

MOV NIGHT_PRICE,#30H ; 晚上价格初始化

MOV MIDWAY_PRICE,#10H ; 中途等待初始化

MOV START_PRICE, #50H ; 起步价初始化

MOV S11, #0

MOV S22, #0

MOV S33, #0

MOV S44, #0

MOV DISTANCE, #02H

MOV HOUR, #12H

KEY_MAIN: SETB TR0

ACALL HMS_DIS

ACALL T100MSD

ACALL T100MSD

ACALL T100MSD

JB S1, KEY_MAIN

ACALL T10MSD

JB S1, KEY_MAIN

JNB S1,$

SJMP WAI1

WA1:JB S1, K1

ACALL T10MSD

JB S1, K1

WAIT1:JNB S1, WAIT1

MOV R0, #LEDDANJIAL

MOV R2, #6

CLR A

MOV COUNTL,A

MOV COUNTH,A

MOV M100, A

MOV DISTANCE,A

BK1: MOV @R0, A

DEC R0

DJNZ R2, BK1

MOV PRICE,DAY_PRICE; 起动初始化

MOV COUNTL, #00H; 起步价

MOV COUNTH, #05H

LCALL CP_DIS; 总金额和单价显示

K1: JB S2, K2

ACALL T10MSD

JB S2, K2

WAIT2: JNB S2, WAIT2

INC S22

MOV A, S22

CJNE A, #1, NEXT1

LCALL PA_DIS

LJMP KEY_DJ

NEXT1:CJNE A, #2, NEXT2

CLR TR0

LCALL HMS_DIS

LJMP KEY_SJ

NEXT2:CJNE A, #3, K2

MOV S22, #0

K2: JB S3, K3

ACALL T10MSD

JB S3, K3

WAIT3:JNB S3, WAIT3

INC S33

MOV A, S33

CJNE A, #1, NXT1

LCALL DP_DIS

NXT1: CJNE A, #2, NXT2

CLR C

MOV A, M2

SUBB A, M1

MOV M1, A

MOV A, H2

SUBB A, H1

MOV H1, A

NXT2: CJNE A, #3, K3

MOV S33, #0

LCALL CP_DIS

K3: JB S4, BK_KEY_MAIN

ACALL T10MSD

JB S4, BK_KEY_MAIN

WAIT4:JNB S4, WAIT4

INC S44

MOV A, S44

CJNE A, #1, NT1

MOV PRICE,DAY_PRICE

LCALL CP_DIS

NT1:CJNE A, #2, NT2

MOV PRICE,NIGHT_PRICE

LCALL CP_DIS

NT2:CJNE A, #3, NT3

MOV PRICE,MIDWAY_PRICE

SETB TR1

LCALL CP_DIS

NT3:CJNE A, #4, BK_KEY_MAIN

MOV S44, #0

LJMP KEY_MAIN

BK_KEY_MAIN: LJMP WA1

KEY_DJ:JB S1, KY1

ACALL T10MSD

JB S1, KY1

WAIT5:JNB S1, WAIT5

INC S11

MOV A, S11

CJNE A, #1, NEXT11

LJMP DAY_P

NEXT11: CJNE A, #2,

NEXT12

LCALL NIG_P

NEXT12:CJNE A, #3, KY1

LCALL MID_P

MOV S11, #0

LJMP KEY_MAIN

KY1:JB S2, KY2

ACALL T10MSD

JB S2, KY2

WAIT6:JNB S2, WAIT6

INC S22

MOV A, S22

CJNE A, #1, NEXT13

LCALL PA_DIS

LJMP KEY_DJ

NEXT13:CJNE A, #2, NEXT14

CLR TR0

LCALL HMS_DIS

LCALL KEY_SJ

NEXT14:CJNE A, #3, KY2

MOV S22, #0

LJMP KEY_MAIN

KY2:AJMP KEY_DJ

KEY_SJ:JB S1, KEY1

ACALL T10MSD

JB S1, KEY1

WAIT7:JNB S1, WAIT7

INC S11

MOV A, S11

CJNE A, #1,NEXT21

LCALL HOU_T

NEXT21:CJNE A, #2,NEXT22

LCALL MIN_T

NEXT22: CJNE A, #3,KEY1

MOV S11, #0

LJMP KEY_MAIN

KEY1: JB S2, KEY2

ACALL T10MSD

JB S2, KEY2

WAIT8:JNB S2, WAIT8

INC S22

MOV A, S22

CJNE A, #1, NEXT23

LCALL PA_DIS

LJMP KEY_DJ

NEXT23:CJNE A, #2, NEXT24

CLR TR0

LCALL HMS_DIS

NEXT24:CJNE A, #3, KEY2

MOV S22,#0

LCALL KEY_SJ

LJMP KEY_MAIN

KEY2:AJMP KEY_SJ

DAY_P:SETB F0

LCALL T100MSD

LCALL T100MSD

MOV LEDDAY_PL, #0AH

MOV LEDDAY_PH, #0AH

LCALL PA_DIS1

LCALL T100MSD

LCALL T100MSD

LCALL PA_DIS

LP1: JB S3, KEY11

MOV A, #1

ADD A, DAY_PRICE

DA A

MOV DAY_PRICE,A

MOV A, DAY_PRICE

CJNE A, #99H, KEY11

MOV DAY_PRICE, #0

KEY11: JB S4, KEY12

LCALL T10MSD

JB S4, KEY12

MOV A,DAY_PRICE

ADD A, #99H

DA A

MOV DAY_PRICE,A

CJNE A, #00H, KEY12

MOV A, #99H

KEY12: JB S1, KEY13

ACALL T10MSD

JB S1, KEY13

WAIT11: JNB S1, WAIT11

INC S11

MOV A, S11

CJNE A, #1,

NEXT31

LCALL DAY_P

NEXT31:CJNE A, #2,NEXT32

LCALL NIG_P

NEXT32:CJNE A, #3,NEXT33

LCALL MID_P

NEXT33:CJNE A, #4, KEY13

MOV S11, #0

KEY13:JB S2, KEY14

LCALL T10MSD

JB S2, KEY14

WAIT12:JNB S2, WAIT12

LJMP KEY_MAIN

KEY14:AJMP DAY_P

NIG_P:SETB F0 ;调用定时延时标志位

LCALL T100MSD

LCALL T100MSD

MOV LEDNIG_PL, #0AH

MOV LEDNIG_PH, #0AH

LCALL PA_DIS1

LCALL T100MSD

LCALL T100MSD

LCALL PA_DIS

JB S3, KEY21

LCALL T10MSD

JB S3, KEY21

MOV A, #1

ADD A, NIGHT_PRICE

DA A

MOV NIGHT_PRICE,A

CJNE A, #99H,KEY21

MOV NIGHT_PRICE,#0

KEY21:JB S4, KEY22

LCALL T10MSD

JB S4, KEY22

MOV A, NIGHT_PRICE

ADD A, #99H

DA A

MOV NIGHT_PRICE,A

CJNE A, #00H, KEY22

MOV NIGHT_PRICE,#99H

KEY22:JB S1, KEY23

ACALL T10MSD

JB S1, KEY23

WAIT15:JNB S1, WAIT15

INC S11

MOV A, S11

CJNE A, #1,

NEXT41

LCALL DAY_P

NEXT41:CJNE A, #2,NEXT42

LCALL NIG_P

NEXT42:CJNE A, #3,NEXT43

LCALL MID_P

NEXT43:CJNE A, #4, KEY23

MOV S11, #0

LJMP KEY_DJ

KEY23:JB S2, KEY24

LCALL T10MSD

JB S2, KEY24

WAIT30:JNB S2, WAIT30

LJMP KEY_MAIN

KEY24: AJMP NIG_P

MID_P: SETB F0 ;调用定时延时标志位

LCALL T100MSD

MOV LEDW_PL, #0AH

MOV LEDW_PH, #0AH

LCALL PA_DIS1

LCALL T100MSD

LCALL PA_DIS

JB S3, KEY31

LCALL T10MSD

JB S3, KEY31

MOV A, MIDWAY_PRICE

ADD A, #1

DA A

MOV MIDWAY_PRICE,A

CJNE A, #99H, KEY31

MOV MIDWAY_PRICE, #00H

CJNE A, #100, KEY31

MOV MIDWAY_PRICE, #0

KEY31: JB S4, KEY32

LCALL T10MSD

JB S4, KEY32

MOV A, MIDWAY_PRICE

ADD A, #99H

DA A

MOV MIDWAY_PRICE,A

CJNE A, #00H, KEY32

MOV NIGHT_PRICE,#99H

KEY32: JB S1, KEY33

ACALL T10MSD

JB S1, KEY33

WAIT18: JNB S1, WAIT18

INC S11

MOV A, S11

CJNE A, #1,

NEXT51

LCALL DAY_P

NEXT51: CJNE A, #2,NEXT52

LCALL NIG_P

NEXT52: CJNE A, #3,NEXT53

LCALL MID_P

NEXT53: CJNE A, #4, KEY33

MOV S11, #0

LJMP KEY_DJ

KEY33: JB S2, KEY34

LCALL T10MSD

JB S2, KEY34

WAIT31:JNB S2, WAIT31

LJMP KEY_MAIN

KEY34: AJMP MID_P

HOU_T: SETB F0 ;调用定时延时标志位

LCALL T100MSD

LCALL T100MSD

MOV LEDHL, #0AH

MOV LEDHH, #0AH

LCALL HMS_DIS1;直接调用显示,不经过拆分程序

LCALL T100MSD

LCALL T100MSD

MOV SEC, #0

LCALL HMS_DIS

JB S3, KEY41

MOV A, HOUR

ADD A, #1

DA A

MOV HOUR,A

CJNE A, #24H, KEY41

MOV HOUR, #0

KEY41: JB S4, KEY42

MOV A, HOUR

ADD A, #99H

DA A

MOV HOUR,A

CJNE A, #99H, KEY42

MOV HOUR, #23H

KEY42: JB S1, KEY43

ACALL T10MSD

JB S1, KEY43

WAIT21: JNB S1, WAIT21

INC S11

MOV A, S11

CJNE A, #1,NEXT61

LJMP HOU_T

NEXT61: CJNE A, #2,NEXT62

LJMP MIN_T

NEXT62: CJNE A, #3,KEY43

MOV S11, #0

LJMP KEY_SJ

KEY43: JB S2, KEY44

LCALL T10MSD

JB S2, KEY44

WAIT32: JNB S2, WAIT32

LJMP KEY_MAIN

KEY44: AJMP HOU_T

MIN_T: SETB F0 ;调用定时延时标志位

LCALL T100MSD

LCALL T100MSD

MOV LEDML, #0AH

MOV LEDMH, #0AH

LCALL HMS_DIS1;直接调用显示,不经过拆分程序

LCALL T100MSD

LCALL T100MSD

MOV SEC, #0

LCALL HMS_DIS

JB S3, KEY51

MOV A, MIN

ADD A, #1

DA A

MOV MIN, A

CJNE A, #60H, KEY51

MOV MIN, #0

KEY51: JB S4, KEY52

MOV A, MIN

ADD A, #99H

DA A

MOV MIN, A

CJNE A, #99H, KEY52

MOV MIN, #59H

KEY52: JB S1, KEY53

ACALL T10MSD

JB S1, KEY53

WAIT24: JNB S1, WAIT24

INC S11

MOV A, S11

CJNE A, #1,NEXT71

LCALL HOU_T

NEXT71: CJNE A, #2,NEXT72

LCALL MIN_T

NEXT72: CJNE A, #3,KEY53

SETB TR0

MOV S11, #0

LJMP KEY_SJ

KEY53: JB S2, KEY54

LCALL T10MSD

JB S2, KEY54

WAIT33: JNB S2, WAIT33

LJMP KEY_MAIN

KEY54: AJMP MIN_T

TOTIME: PUSH PSW

PUSH ACC

MOV TH0, #3CH

MOV TL0, #0B0H

INC MS100

MOV A, MS100

CJNE A, #10,RETURN

MOV MS100,#0

MOV A, SEC

ADD A, #1

DA A

MOV SEC,A

CJNE A,#60H,RETURN

MOV SEC,#0

MOV A, #1H

ADD A, MIN

DA A

MOV MIN,A

CJNE A,#60H, RETURN

MOV MIN,#0

MOV A, #1H

ADD A, HOUR

DA A

MOV HOUR,A

CJNE A, #24H,RETURN

MOV HOUR,#0

RETURN: POP ACC

POP PSW

RETI

TO: PUSH PSW

PUSH ACC

MOV A,#1

ADD A,M100

MOV M100,A

MOV A, M100

CJNE A, #100,RETURN1

MOV M100,#0

INC 21H

MOV A,21H

CJNE A, #0AH, RETURN1 ;已经到了1公里

MOV 21H,#0

MOV A, #1

ADD A, DISTANCE

DA A

MOV DISTANCE,A

MOV A, PRICE

ADD A, COUNTL

DA A

MOV COUNTL,A

CJNE A, #10H,RETURN1

MOV COUNTL,#0

MOV A, #1

ADD A, COUNTH

DA A

MOV COUNTH,A

CJNE A, #99H, RETURN1

MOV COUNTH,#0

RETURN1: POP ACC

POP PSW

RETI

TOSTART: PUSH PSW

PUSH ACC

MOV TH1, #3CH

MOV TL1, #0B0H

DJNZ 22H, RETURN2 ;1S未到返回

MOV 22H, #0AH

MOV A, #1

ADD A, 23H

DA A

MOV 23H, A

CJNE A, #60H, RETURN2

MOV 23H, #0

MOV A, #1

ADD A, 24H

DA A

MOV 24H,A

CJNE A, #10H, RETURN2

MOV 24H, #0

MOV A, START_PRICE

ADD A, COUNTL

DA A

MOV COUNTL,A

CJNE A, #10H, RETURN2

MOV COUNTL, #0

MOV A, #1

ADD A, COUNTH

DA A

MOV COUNTH,A

CJNE A, #99H,RETURN2

MOV COUNTH,#0

RETURN2: POP ACC

POP PSW

RETI

HMS_DIS:PUSHACC

PUSHPSW

SETBRS1

MOV R0,#SEC ;时分秒的拆分(三个字节)

MOV R1,#LEDSL

MOV R6,#03H

LOOP1:MOV A, @R0

MOV B, A

ANL A, #0FH

MOV @R1,A

DEC R1

MOV A, B

SWAPA

ANL A, #0FH

MOV @R1,A

DEC R1

DEC R0

DJNZR6,LOOP1

POP PSW

POP ACC

HMS_DIS1: PUSH ACC

PUSH PSW

MOV R7,#06H

MOV R0,#LEDSL

LOOP: MOVA, @R0

MOVDPTR,#TAB

MOVCA,@A+DPTR

MOV SBUF,A

BK: JBCTI,NEXT

SJMPBK

NEXT: DECR0

DJNZR7,LOOP

CLRRS1

POPPSW

POPACC

RET

CP_DIS:PUSH ACC

PUSH PSW

SETB RS1

MOV R0,#COUNTH ;

MOV R1,#LEDCOUNT2

MOV A, @R0

MOV B, A

ANL A, #0FH

MOV @R1,A

DEC R1

MOV A, B

SWAPA

ANL A, #0FH

MOV @R1,A

MOV LEDCOUNT1,COUNTL

MOV A,LEDCOUNT1 ;送总金额低位

MOV DPTR,#TAB

MOVC A, @A+DPTR

MOV SBUF,A

JNB TI,$

CLR TI

MOV A,LEDCOUNT2 ;送总金额中位

MOV DPTR,#TAB

MOVC A,@A+DPTR

CPL ACC.4

MOV SBUF,A

JNB TI, $

CLR TI

MOV A,LEDCOUNT3 ;送总金额高位

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOVSBUF,A

JNB TI,$

CLR TI

CLR RS1

MOV SBUF,#0FEH ;送短线(短线的字型码是0FEH)

JNB TI, $

CLR TI

MOV R0,#PRICE;单价拆分(两个字节)

MOV R1,#LEDDANJIAL

MOV R6,#03H

MOV A, @R0

MOV B, A

ANL A, #0FH

MOV @R1,A

DEC R1

MOV A, B

SWAPA

ANL A, #0FH

MOV @R1,A

DEC R1

MOV A,LEDDANJIAL ;送单价低位

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV SBUF,A

JNB TI, $

CLR TI

MOV A, LEDDANJIAH ;送单价高位

MOV DPTR,#TAB

MOVCA,@A+DPTR

CPL ACC.4

MOV SBUF,A

JNB TI,$

CLR TI

POP PSW

POP ACC

RET

DP_DIS:PUSH ACC

PUSH PSW

SETB RS1

MOV R0,#PRICE ;单价的拆分(一个字节)

MOV R1,#LEDDANJIAL

MOV A, @R0

MOV B, A

ANL A, #0FH

MOV @R1,A

DEC R1

MOV A, B

SWAPA

ANL A, #0FH

MOV @R1,A

DEC R1

MOV A,LEDDANJIAL ;送单价低位

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV SBUF,A

JNB TI, $

CLR TI

MOV A,LEDDANJIAH ;送单价高位

MOV DPTR,#TAB

MOVCA,@A+DPTR

CPL ACC.4

MOV SBUF,A

JNB TI,$

CLR TI

MOV SBUF,#0FEH ;

JNB TI, $

CLR TI

MOV SBUF,#0FEH ;送短线

JNB TI,$

CLR TI

MOV R0,#DISTANCE

MOV R1,#LEDDISTANCEL

MOV A, @R0

MOV B, A

ANL A, #0FH

MOV @R1,A

DEC R1

MOV A, B

SWAPA

ANL A, #0FH

MOV @R1,A

DEC R1

MOV A,LEDDISTANCEL ;送路程低位

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV SBUF,A

JNB TI, $

CLR TI

MOV A,LEDDISTANCEH ;送路程高位

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOVSBUF,A

JNB TI,$

CLR TI

CLR RS1

POP PSW

POP ACC

RET

PA_DIS:PUSH ACC

PUSH PSW

SETB RS1

MOV R0,#DAY_PRICE ;价格调整拆分(三个字节)

MOV R1,#LEDDAY_PL

MOV R6,#03H

LOOP2:MOV A, @R0

MOV B, A

ANL A, #0FH

MOV @R1,A

DEC R1

MOV A, B

SWAPA

ANL A, #0FH

MOV @R1,A

DEC R1

DEC R0

DJNZR6,LOOP2

POP PSW

POP ACC

PA_DIS1:PUSH ACC

PUSH PSW

MOV A,LEDDAY_PL ;白天单价

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV SBUF,A

JNB TI, $

CLR TI

MOV A, LEDDAY_PH

MOV DPTR,#TAB

MOVCA,@A+DPTR

CPL ACC.4

MOV SBUF,A

JNB TI,$

CLR TI

MOV A,LEDNIG_PL ;晚上单价

MOV DPTR,#TAB

MOVCA,@A+DPTR

MOV SBUF,A

JNB TI, $

CLR TI

MOV A,LEDNIG_PH

MOV DPTR,#TAB

MOVC A, @A+DPTR

CPL ACC.4

MOV SBUF,A

JNB TI,$

CLR TI

MOV A,LEDW_PL ;中途等待单价

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV SBUF,A

JNB TI, $

CLR TI

MOV A,LEDW_PH

MOV DPTR,#TAB

MOVC A,@A+DPTR

CPL ACC.4

MOVSBUF,A

JNB TI,$

CLR TI

CLR RS1

POP PSW

POP ACC

RET

TAB:DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D1H,10H,90H,0FFH

T10MSD: SETBRS0; 10毫秒延时程序

MOVR4,#12

TM:MOVR3,#128

TM6:DJNZR3,TM6

DJNZR4,TM

CLRRS0

RET

T100MSD: MOV R3, #200

D11: MOV R4, #125

D12: DJNZ R4, D12

DJNZ R3, D11

RET

END

根据引用[1]和引用的内容,出租车计价器课程设计主要涉及以下几个方面: 1. 计程模块:计程模块负责记录出租车行驶的里程数。当行驶里程达到一定值时,计费数字显示开始增加。这个模块需要能够准确地记录里程数,并与其他模块进行数据交互。 2. 计费模块:计费模块根据行驶里程和等候时间来计算费用。当行驶里程达到一定值时,计费数字显示开始增加。等候时间也会导致计费数字显示增加。这个模块需要能够准确地计算费用,并与其他模块进行数据交互。 3. 计时模块:计时模块负责记录出租车的等候时间。司机按下"计时"键后,每等候一定时间,计费器显示就增加一个等候费用。这个模块需要能够准确地记录等候时间,并与其他模块进行数据交互。 4. 动态译码模块:动态译码模块负责将计费数字显示转换为可读的费用数字。这个模块需要能够将数字显示转换为对应的费用数字,并与其他模块进行数据交互。 在课程设计中,学生可以根据以上模块的功能要求,使用FPGA器件进行数字系统的设计和实现。可以使用硬件描述语言(如Verilog或VHDL)来描述各个模块的功能,并通过FPGA开发工具进行仿真和验证。 通过这样的课程设计,学生可以深入了解出租车计价器的工作原理和设计思想,掌握数字系统设计的基本方法和技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值