出租车计价器 硬件课程设计.docx

上传人:b****7 文档编号:9249370 上传时间:2023-02-03 格式:DOCX 页数:31 大小:1.10MB
下载 相关 举报
出租车计价器 硬件课程设计.docx_第1页
第1页 / 共31页
出租车计价器 硬件课程设计.docx_第2页
第2页 / 共31页
出租车计价器 硬件课程设计.docx_第3页
第3页 / 共31页
出租车计价器 硬件课程设计.docx_第4页
第4页 / 共31页
出租车计价器 硬件课程设计.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

出租车计价器 硬件课程设计.docx

《出租车计价器 硬件课程设计.docx》由会员分享,可在线阅读,更多相关《出租车计价器 硬件课程设计.docx(31页珍藏版)》请在冰豆网上搜索。

出租车计价器 硬件课程设计.docx

出租车计价器硬件课程设计

硬件课程设计报告

 

题目:

出租车计价器

 

目录

1.引言4

1.1设计目的4

1.2设计任务4

1.3设计思路4

2.需求分析4

2.1芯片原理4

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

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

2.1.312864液晶显示器ST7920原理5

2.2硬件设计5

2.3软件设计5

2.3.1功能模块图5

2.3.2程序流程图5

2.3.3模块流程图5

3.详细设计5

3.1程序模块分析8

3.1.1初始化模块程序分析8

3.1.2判断开关程序模块分析8

3.1.3圈数统计模块程序分析8

3.1.4计算里程模块程序分析8

3.1.5显示模块程序分析8

3.1.6结束模块程序分析8

3.2程序代码8

4.程序结果9

5.分析与测试9

6.体会9

附录A:

参考文献10

 

一、引言

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-18254内部结构图

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

图2-28254管脚图

A1、A0:

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

CLK0-2:

时钟脉冲输入端,用于输入定时脉冲或计数脉冲信号。

CLK可以是系统的时钟脉冲,也可以由系统时钟分频或者其他脉冲源提供。

当用于定时时,这个脉冲必须是均匀的、连续的、周期精确的,而用于计数时,这个脉冲可以是不均匀的、断续的、周期不定的。

GATE0-2:

门控输入端,用于外部控制计数器的启动计数和停止计数的操作。

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

OUT0-2:

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

8253的方式控制字

图2-38254控制字图

本设计中8254的功能

只是用通道1,采用方式三。

采用二进制计数,输入0FFFH。

先输入低字节,再输入高字节。

当8254从0FFFFH递减到159FH时(即转了60000圈时),8254向总线发信号使程序向下进行。

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

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

图2-48255内部结构图

(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-58255管脚图

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-68255控制字图

本设计中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-7ST7920外观尺寸图

本设计中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连直流电机计数端。

图2-8硬件连接图

实际连接图如下图所示

图2-9硬件实际连接图

2.3软件设计

2.3.1功能模块图

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

图2-10软件功能模块图

2.3.2程序流程图

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

图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直到有高电平为止。

其流程图如下所示:

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

3.1.3圈数统计模块分析

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

其流程图如下所示:

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

3.1.4计算里程模块分析

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

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

计算公式为:

价格=(里程-3)*2……(里程>3)

价格=7…………………..(里程<=3)

并调用显示模块来显示这些字码其流程图如下所示:

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

3.1.5显示模块分析

在显示模块中,我们使用ST7920显示我们要显示的两行字符串。

我们采取先显示第一行,再显示第二行的方法,只是用ST7920的中间两行。

图3-5显示模块流程图

3.1.6结束模块分析

结束模块在程序的尾部在结束模块中,我们规定只要在键盘上按任意一个键就会结束整个程序。

如果无键按下,则程序自动跳转到程序头部。

其程序流程图如下图所示:

图3-6结束模块流程图

3.2程序代码

IO8253AEQU280H

IO8253BEQU281H

IO8253CEQU283H

DATASEGMENT

HZDW0C2B7H,0B3CCH,0A3B0H,0A3B0H,0A3AEH,0A3B0H,0B9ABH,0C0EFH

DWBCDBH,0B8F1H,0A3B0H,0A3B0H,0A3B0H,0A3AEH,0A3B0H,0D4AAH

;存放原始输出

HZ_TABDW0C2B7H,0B3CCH,0A3B0H,0A3B0H,0A3AEH,0A3B0H,0B9ABH,0C0EFH

DW0BCDBH,0B8F1H,0A3B0H,0A3B0H,0A3B0H,0A3AEH,0A3B0H,0D4AAH

;存放要输出的值

HZ_BGDW0BFD5H,0B3B5H,0A2A0H,0A2A0H,0BBB6H,0D3ADH,0B3CBH,0D7F8H

DW0A2A0H,0A2A0H,0A2A0H,0A2A0H,0A2A0H,0A2A0H,0A2A0H,0A2A0H

;存放“空车欢迎乘坐”

HZ_ADRDB?

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

JSSDW0000H

DIIDW0000H

GAODW0000H

ZHEDW0000H

NUMBERDW0A3B0H,0A3B1H,0A3B2H,0A3B3H,0A3B4H,0A3B5H,0A3B6H,0A3B7H,0A3B8H,0A3B9H

DATAENDS

IO_ADDRESSEQU288H

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVDX,IO_ADDRESS

ADDDX,3

MOVAL,82H

OUTDX,AL;8255初始化

MOVAL,0FFH

MOVDX,300H

OUTDX,AL

CALLCLEAR;LCD清除

LLL:

MOVDX,IO_ADDRESS

ADDDX,1

INAL,DX;判断开关是否打开

ANDAL,01H

CMPAL,01H

JZF0

CALLCHUSHI

JMPLLL

F0:

MOVAL,01110110B

MOVDX,IO8253C

OUTDX,AL;8254初始化

MOVAL,0FFH

MOVDX,IO8253B

OUTDX,AL

MOVAL,0FFH;设置计数初值0FFFFH

OUTDX,AL

F1:

MOVAL,01000000B

MOVDX,IO8253C

OUTDX,AL

MOVDX,IO8253B

INAL,DX

MOVAH,AL

INAL,DX

XCHGAH,AL

CMPAX,159FH;查看是否下降到159FH

JAF1;不满足条件继续读值

MOVAL,01110110B;重置8253

MOVDX,IO8253C

OUTDX,AL

MOVAL,0FFH

MOVDX,IO8253B

OUTDX,AL

MOVAL,0FFH

OUTDX,AL

CALLDISP;调显示子程序

CALLDDSP

CALLDELAY

PUSHDX

MOVAH,06H

MOVDL,0FFH

INT21H

POPDX

JZLLL

MOVAH,4CH;退出

INT21H

L1:

JMPSTART;L1

CHUSHIPROCNEAR

LEASI,HZ_TAB

LEADI,HZ

MOVCX,0FH

F3:

ADDSI,2

ADDDI,2

MOVAX,[DI]

MOV[SI],AX

LOOPF3;重置HZ_TAB

MOVAX,0000H

LEABX,JSS

MOV[BX],AX

LEABX,HZ_BG

MOVCH,2

CALLLCD_DISP

LEABX,HZ_BG

MOVCH,3;显示“空车欢迎乘坐”

CALLLCD_DISP

RET

CHUSHIENDP

DDSPPROCNEAR

LEADI,HZ_TAB

LEABX,JSS

LEASI,NUMBER

MOVAX,WORDPTR[BX]

MOVBP,AX

ANDBP,00FFH

ADDBP,BP

MOVDX,WORDPTR[BP+SI]

MOVWORDPTR[DI+6],DX;将JSS中低八位传入HZ_TAB

MOVBP,AX

ANDBP,0FF00H

RORBP,8

ADDBP,BP

MOVDX,WORDPTR[BP+SI]

MOVWORDPTR[DI+4],DX;将JSS中高八位传入HZ_TAB

LEABX,HZ_TAB

MOVCH,2;显示第2行信息

CALLLCD_DISP

LEADI,HZ_TAB

LEABX,JSS

LEASI,NUMBER

MOVAX,WORDPTR[BX]

CMPAX,0003H;比较路程与3的大小

JBEL3

CALLBJ

LEABX,JSS

JMPL4

L3:

MOVBP,0007H;路程比3小的情况

ADDBP,BP

MOVDX,WORDPTR[BP+SI]

MOVWORDPTR[DI+24],DX

JMPL4

L4:

LEABX,HZ_TAB

MOVCH,3;显示第3行信息

CALLLCD_DISP

RET

DDSPENDP

BJPROCNEAR

LEADI,HZ_TAB

LEABX,JSS

LEASI,NUMBER

MOVAX,WORDPTR[BX]

CMPAL,03H

JAEBJ1

SUBAH,01H

ADDAL,0AH

SUBAL,03H

AAS;路程减三并十进制化

JMPBJ2

BJ1:

SUBAX,0003H

BJ2:

MOVCX,AX

ANDAX,00FFH

ADDAL,AL

AAA

ADDAX,07H

AAA;路程加七并十进制化

LEABX,DII

MOV[BX],AX;DII

MOVBP,AX

ANDBP,00FFH

ADDBP,BP

MOVDX,WORDPTR[BP+SI]

MOVWORDPTR[DI+24],DX;先计算个位

MOVAX,CX

SHRAX,8

ANDAX,00FFH

ADDAL,AL;十位相加

AAA

LEABX,GAO

MOV[BX],AX;GAO

LEABX,DII

MOVDX,[BX];DII

ANDAX,00FFH

ANDDX,0FF00H

SHRDX,8

ANDDX,00FFH

ADDAL,DL;再加进位

AAA

LEABX,ZHE

MOV[BX],AX;ZHE

MOVBP,AX

ANDBP,00FFH

ADDBP,BP

MOVDX,WORDPTR[BP+SI]

MOVWORDPTR[DI+22],DX;再计算十位

LEABX,ZHE

MOVDX,[BX]

LEABX,GAO

MOVAX,[BX]

ANDDX,0FF00H

ANDAX,0FF00H

SHRAX,8

SHRDX,8

ADDDL,AL;百位加进位

AAA

MOVBP,DX

ANDBP,00FFH

ADDBP,BP

MOVDX,WORDPTR[BP+SI]

MOVWORDPTR[DI+20],DX;最后计算百位

RET

BJENDP

DISPPROCNEAR;显示子程序

PUSHDX

LEABX,JSS

MOVAX,WORDPTR[BX]

ADDAL,01H

CMPAL,09H;判断是否<=9

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

MOVAL,00H

ADDAH,01H

CMPAH,0AH

JZL2

NUM:

MOVWORDPTR[BX],AX

ADDAL,30H

ADDAH,30H

MOVDL,AH

MOVDH,AL

MOVAH,02H;屏幕显示

INT21H

MOVDL,DH

MOVAH,02H;屏幕显示

INT21H

MOVDL,0DH;加回车符

INT21H

MOVDL,0AH;加换行符

INT21H

POPDX

RET;子程序返回

DISPENDP

L2:

MOVAH,4CH;退出

INT21H

CLEARPROC

MOVAL,0CH

MOVDX,IO_ADDRESS

OUTDX,AL;设置CLEAR命令

CALLCMD_SETUP;启动LCD执行命令

RET

CLEARENDP

FUNCUPPROC

;MOVAL,0FH;LCD功能设置命令

;OUTDX,AL

;CALLCMD_SETUP

MOVAL,34H;LCD显示状态命令

OUTDX,AL

CALLCMD_SETUP

RET

FUNCUPENDP

LCD_DISPPROC

;LEABX,HZ_TAB

CMPCH,2

JZDISP_SEC

MOVBYTEPTRHZ_ADR,88H;第三行起始端口地址

ADDBX,16;指向第二行信息

JMPNEXT

DISP_SEC:

MOVBYTEPTRHZ_ADR,90H

NEXT:

MOVCL,8

CONTINUE:

PUSHCX

MOVAL,HZ_ADR

MOVDX,IO_ADDRESS

OUTDX,AL

CALLCMD_SETUP;设定DDRAM地址命令

MOVAX,[BX]

PUSHAX

MOVAL,AH;先送汉字编码高位

MOVDX,IO_ADDRESS

OUTDX,AL

CALLDATA_SETUP;输出汉字编码高字节

CALLDELAY;延迟

POPAX

MOVDX,IO_ADDRESS

OUTDX,AL

CALLDATA_SETUP;输出汉字编码低字节

CALLDELAY

INCBX

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

INCBYTEPTRHZ_ADR;修改LCD显示端口地址

POPCX

DECCL

JNZCONTINUE

RET

LCD_DISPENDP

CMD_SETUPPROC

MOVDX,IO_ADDRESS;指向8255端口控制端口

ADDDX,2

NOP

MOVAL,00000000B;PC1置0,PC0置0(LCDI端=0,W端=0)

OUTDX,AL

CALLDELAY

NOP

MOVAL,00000100B;PC2置1(LCDE端=1)

OUTDX,AL

NOP

CALLDELAY

MOVAL,00000000B;PC2置0,(LCDE端置0)

OUTDX,AL

CALLDELAY

RET

CMD_SETUPENDP

DATA_SETUPPROC

MOVDX,IO_ADDRESS;指向8255控制端口

ADDDX,2

MOVAL,00000001B;PC1置0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1