出租车计价器 硬件课程设计.docx
《出租车计价器 硬件课程设计.docx》由会员分享,可在线阅读,更多相关《出租车计价器 硬件课程设计.docx(31页珍藏版)》请在冰豆网上搜索。
![出租车计价器 硬件课程设计.docx](https://file1.bdocx.com/fileroot1/2023-2/3/67c49650-da8b-44f9-b32e-baed45f064ac/67c49650-da8b-44f9-b32e-baed45f064ac1.gif)
出租车计价器硬件课程设计
硬件课程设计报告
题目:
出租车计价器
目录
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