第一篇:基于CPLD的出租车计价器设计
基于CPLD的出租车计价器设计
论文编号:2303 用户评价:
本店售价:¥50元
论文摘要 商品属性 商品标签
摘 要
本文论述了一种基于CPLD的出租车计价系统的设计。该计价器通过数码管和按键可以显示时间、单价、起步价、里程数,并用扫描电路显示所走路程需要的费用。本论文主要工作是软件设计,它主要包括四个子模块:按键模块,控制模块,译码模块和显示模块。设计时采用VHDL硬件描述语言,通过软件Quartus II对本设计进行设计,下载到芯片EPM7128SLC84-l5中,从而实现计价器的计费功能。关键词:CPLD 出租车计价器 VHDL QuartusII
目 录 1 绪论.1 1.1 出租车计价器的发展概况.1 1.2 出租车行业的管理现状.1 2 出租车计价器系统硬件结构.2 2.1 硬件系统概述.2 2.1.1 EDA概述.2 2.1.2 CPLD器件MAX7000系列.2 2.1.3 霍尔传感器.3 2.2 VHDL硬件描述语言.4 2.2.1 VHDL概述.4 2.2.2 VHDL语言基础知识.4 3 软件编程环境.5 3.1 QuartusII软件的特点.6 3.2 QuartusII软件的集成工具.6 3.3 设计输入.7 3.4 综合.7 3.5 布局布线.8 3.6 仿真.8 3.7 编程与配置.8 4 出租车计价器的软件设计过程.9 4.1 出租车计费器工作原理.9 4.2 基本的设计思想.9 4.2.1 控制模块.9 4.2.2 译码显示模块.12 4.3 设计的整个过程.15 4.4 各个模块的仿真结果.22 4.4.1 控制模块仿真结果.22 4.4.2 译码显示模块仿真结果.23 5 出租车计价器存在的问题和改进工作.25 5.1 出租车计价器存在的问题.25 5.2 改进方法.25 结束语.25 参考文献.27 英文摘要.28 附录一 出租车计价器软件设计的流程图.29 附录二 软件设计的源代码.30 致谢.37 仲恺农业工程学院毕业设计成绩评定表..38
绪论
1.1 出租车计价器的发展概况
出租车行业在我国是八十年代初兴起的一项新兴行业,随着我国国民经济的高速发展,出租汽车已成为城市公共交通的重要组成部分[1]。多年来国内普遍使用的计价器只具备单一的计量功能。目前全世界的计价器中有90%为台湾所生产。现今我国生产计价器的企业有上百家,主要是集中在北京,上海,沈阳和广州等地。
我国第一家生产计价器的是重庆市起重机厂,最早的计价器全部采用机械齿轮构,只能完成简单的计程功能,可以说,早期的计价器就是个里程表。随着科学技术的发展,产生了第二代计价器。它采用了手摇计算机与机械结构相结合的方式,实现了半机械半电子化。此时它在计程的同时还可完成计价的工作。大规模集成电路的发展又产生了第三代计价器,也就是全电子化的计价器。它的功能也在不断完善。出租汽车计价器是一种专用的计量仪器,它安装在出租汽车上,能连续累加,并指示出行程中任一时刻乘客应付费用的总数,其金额值是计程和计时时间的函数[2]。出租车计价器在最初使用时具备的主要功能是根据行驶里程计价,要求精度高,可靠性好。随着电子技术的发展以及对计价器的不断改进和完善,便产生了诸多的附加功能。例如:(1)LED显示功能,数码管的使用让计价器实现多屏显示的功能,可同时显示各项营运数据,使乘客一目了然;(2)永久时钟功能,在非营运状态下,日历时钟芯片的使用使计价器可以显示永久时钟;(3)存储功能,可存储多项营运数据,便于查询。新型数据存储器的应用使得计价器的营运数据在掉电情况下还可以保存10年。1.2 出租车行业的管理现状
随着我国国民经济的高速发展,出租汽车已成为城市公共交通的重要组成部分。近几年来,出租车汽车行业在各地蓬勃发展,出租车经营也从无序状态逐渐走入正轨。出租车计价器成为出租车运营中必配的、可靠的计量器具,其使用准确性直接关系到经营者与乘客的经济利益。但在实际运营中,总有不少经营者或乘客反映相同路径,不同的出租车的收费有较大的出入[3]。本课题采用CPLD芯片为核心,用较少的硬件和适当的软件相互配合主要解决以下问题:
(1)不同地区的计费方式存在差异;即使同一地区,不同车型的出租车,其计费方式也有差别;另一方面,出租车还面临几年一次的调价或调整计费方式等问题。因此,所设计的计费器不仅要能满足不同地区的要求,而且计费方式的调整也应当很方便。
(2)由于个别地区对计费器有特殊要求,有时必须修改软件;另外,计费器还面临软件的升级;因而,所设计的计费器应能很方便地重新编程。
(3)计费器必须要有防作弊功能,能有效防止司机作弊;同时要防止计费器在营运过程中死机[4]。本课题实现上述设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能,具有一定的应用价值。由于科技的发展,芯片中的数据可保持十年不变,且芯片体积小,容量大,因此这种方式是可行的,具有十分重要的现实意义和广阔的市场前景。
第二篇:出租车计价器设计范文
平顶山工业职业技术学院
目录
目录......................................................................................................................................................1 前言......................................................................................................................................................2 第一章 系统工作原理........................................................................................................................2 1.1 功能说明..............................................................................................................................2 1.2 基本原理..............................................................................................................................2 第二章 硬件设计...............................................................................................................................3 2.1 单片机最小系统单元..........................................................................................................3 2.2 A44E霍尔传感器检测单元................................................................................................4 2.3 AT24C01存储单元..............................................................................................................6 2.4 键盘调整单元......................................................................................................................7 2.5 显示单元..............................................................................................................................8 第三章 软件设计...............................................................................................................................8 3.1 系统主程序..........................................................................................................................8 3.2 中断程序..............................................................................................................................9 3.2.1 里程计数中断程序...................................................................................................9 3.2.2 中途等待中断程序.................................................................................................10 3.3 计算程序............................................................................................................................10 3.4 显示程序............................................................................................................................10 3.5 键盘程序............................................................................................................................10 第四章 总结.....................................................................................................................................11 参考文献............................................................................................................................................12
平顶山工业职业技术学院
算出行驶公里数,再根据从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次时,进入里程计数中断服务程序中,里程变量加一。主函数中总金额也相应地变化。
101112-
第三篇:出租车计价器
基于单片机的出租车计价器设计
摘要
出租车计价器的数字系统的设计正是基于一些专用的芯片,才发挥其有效特性,从而实现出租车的计价功能。此数字系统主要分为三个单元,即里程计数及显示单元、价格计数及显示单元、脉冲产生。本设计是一个基于单片机AT89C51的出租车自动计费设计,附有复位电路,时钟电路等。关键词:出租车计费器;单片机;控制
Abstract Taximeter design digital system is based on some special chip, to play their effective characteristics, thus realizing the taxi valuation function.This system is mainly divided into there modules, namely the mileage counting and display unit, and display unit price counting, pulsing.The design is based on a single chip AT89C51taxis design, a reset circuit, clock circuit.Keywords:taximeter,a single-chip microcomputer,control
1引言
1.1 设计目的
近几年来,出租汽车行业在各地得以蓬勃发展,但采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强。
1.2 功能要求
(1)用前4位数码管实时显示里程数,单位为千米,最后一位为小数位;用后4位数码管时时显示金额数,单位为元,最后一位为小数位。
(2)规定出租车里程小于2千米收费5元,超过2千米收费为8*(way-20)/5。
1.3 设计方法
本设计采用AT89C51单片机为主控器,并用频率信号发生器模拟车速,利用AT89C51的定时器工作在方式1下定时实现对出租车的计价设计,输出采用共阴极的集成8位7段数码显示管。设计方案及原理
2.1 设计方案
采用AT89C51单片机为主控器,并用频率信号发生器模拟车速,利用AT89C51的定时器/定时器T1工作在方式1下定时实现对出租车的计价设计,输出采用共阴极的集成8位7段数码显示管。本电路设计的计价器不但能实现基本的计价,而且
单片机原理及系统课程设计报告
还能根据里程来调节单价。
2.2 设计原理
出租车计价是根据车所行驶的路程以及乘客乘车的里程综合决定的。出租车行驶总路程可以通过车轮的周长乘车轮旋转圈数得到。即可计算得到车轮旋转几周出租车能行驶一公里的路程。通过计数接收到的脉冲个数,计算出当前所行驶的路程。同时,通过数码管显示当前的行驶里程和需支付的车费。出租车计价器用于记录里程、起步公里数与价格的关系。模拟出租车计价器能根据总里程数、起步公里数的情况作出相应报价等。这个系统以AT89C51单片机为主控器,单片机的计数器/定时器T1工作在方式1下来对外部脉冲计数,最后通过集成的8位7段LED数码管显示里程数和价钱。总体模块框图如图1所示。
总金额显示单价显示AT89C51脉冲产生动态扫描数码管显示
图1 总体框图 硬件设计
对于AT89C51的计数器/定时器T1,通过对寄存器TCON的设置,即使它的M1M0=01,计数器/定时器T1工作在方式1下,构成16位计数器/定时器。此时TH0、TL0都是8位加法计数器。此设计中,T1为计数工作方式,计数范围为1~2^16=1~65536(个外部脉冲)。当计数溢出时则置位并申请中断,进入中断服务 执行中断程序。
通过74HC138接P20、P21、P22输出来对8位7段的智能扫描LED进行段选,并且通过P1口对LED进行位选,最后将结果显示在LED上。硬件设计图如图2所示。
74HC138是三八译码器,在工作之前,使74HC138的使能端有效,再使74HC138的A、B、C接P20、P21、P22的输出达到对LED位选线的控制,使相应的位显示相应的结果。硬件总设计图如图2所示。
第四篇:基于单片机的出租车计价器设计报告
河南理工大学
《单片机应用与仿真训练》设计报告 出租车计价器设计
姓名学号: 专业班级: 指导老师: 所在学院: 2012年6月25日 摘要
本设计用直流电机转动模拟出租车车轮转动,实现出租车多功能的计价功能。设计采用AT89S52单片机为主控芯片,用光电对管检测电机转盘转速,采用24C02芯片为系统在掉电时路程、钱数等重要信息提供存储保护,采用两个四位8段共阴数码管显示里程、总价格和等待时间等信息。本设计可以实现单双程设置、系统暂停、空车指示、信息显示、掉电保护等功能。
出租车计价是根据车所行驶的路程以及乘客乘车的方式综合决定的。出租车行驶总路程可以通过车轮的周长乘车轮旋转圈数得到。即可计算得到车轮旋转几周出租车能行驶一公里的路程。使用光电对管能方便地计量车轮旋转的圈数,输出的脉冲信号被接入到AT89S52单片机系统中,通过计算接收到的脉冲个数,计算出当前所行驶的路程,并且可以计算实时的速度。与此同时,根据不同的收费标准计算收费。通过键盘能够实现往返设置,启动、暂停、停止计价器、设置单返程等。
关键字:出租车计价器,AT89S52,24C02,光电对管 Abstract This design with DC motor to rotate the analog taxi wheels turning, multi-purpose taxi pricing function.Design using AT89S52 MCU for master chip with a photoelectric tube test motor turntable speed, AT24C02 chip to make the system power-down distance, money and other important information on the storage protection, the use of two four-segment common cathode digital display tube mileage, the total price and waiting time information.This design enables single and double-way set, system halted, empty instructions, information display, power-down protection and other functions.The taxi meter according to the distance traveled by the vehicle and passengers ride the decision.Taxi driving the total distance by the circumference of the wheel drive wheel rotation laps.Can be calculated by the wheel rotation a few weeks a taxi to travel one kilometer away.The use of opto-the number of turns of the tube can be easily measured wheel rotation, the output pulse signal is connected to the microcontroller AT89S52 system, calculated by computing the number of pulses received, the current driving distance, and can calculate the real-time speed.At the same time, the charge will be calculated according to the different charges.Able to achieve a round trip via the keyboard settings, start, pause, stop the meter, set the single return.Key words: Meter,AT89S52,AT24C02,Photoelectric tube 目录 1 概述 1 2 系统总体方案及硬件设计 2 2.1系统总体方案 2 2.2 硬件电路设计单元 2.2.1 电源电路单元 2 2.2.2 系统控制单元 3 2.2.3 驱动电路单元 6 2.2.4 信号检测单元 7 2.2.5 显示单元 8 2.2.6 数据存储单元 9 3 软件设计 10 3.1 软件设计流程图 10 3.2 计算模块 11 3.3 键盘扫描 11 3.4 显示程序 11 3.5 PWM波的生成 11 3.6 速度检测 12 3.7 程序源代码 12 4 Proteus软件仿真 13 5 课程设计体会 14 6 主要参考文献 16 致谢 17 附1 程序源代码 18 附2 系统原理图 33 1 概述
出租车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志。它关系着交易双方的利益,具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。因此,汽车计价器的研究也是十分有应用价值和现实意义的。
出租车计价是根据车所行驶的路程以及乘客乘车的方式综合决定的。出租车行驶总路程可以通过车轮的周长乘车轮旋转圈数得到。即可计算得到车轮旋转几周出租车能行驶一公里的路程。使用霍尔传感器方便地计量车轮旋转的圈数。输出的脉冲信号被接入到AT89S52单片机系统中,通过计算接收到的脉冲个数,计算出当前所行驶的路程,并且可以计算实时的速度,在速度低于5公里每小时是进入等待计费。于此同时,根据不同的收费标准,通过选择相应的起步价、单价等收费标准进行计算。通过键盘能够实现往返设置,启动、暂停、停止计价器以及切换显示当前的行驶里程和需支付的车费。
本设计硬件电路分为六个单元:电源电路单元,系统控制单元,驱动电路单元,信号检测单元,显示单元和数据存储单元。软件系统分为五个大的模块为:总初始化模块,按键扫描模块,中断与定时模块,数据计算模块,数码管显示模块。其中,键盘扫描和数码管显示采用查询方式,转速信号接收与等待记时采用中断方式。这些软硬件系统构成了最终的设计。系统总体方案及硬件设计 2.1系统总体方案 本设计以AT89S52单片机为中央控制芯片,通过按键控制实现计价器的启动、停止、暂停、等待时间显示、单返程等功能;因为单片机的I/O无法直接驱动直流电机转动,所以通过L298N为驱动芯片驱动电路来驱动直流电机转动;通过光电对管检测直流电机的转速,并利用电压比较器将整理后的信号送给给单片机;通过数码管来显示里程、总价格、等待时间等信息;通过AT24C02来存储信息,防止系统掉电信息丢失。系统设计总框图,如图2.1所示。
图2.1系统设计总框图 2.2 硬件电路设计单元
本设计硬件电路分为六个单元:电源电路单元,系统控制单元,驱动电路单元,信号检测单元,显示单元和数据存储单元。
2.2.1 电源电路单元
电源是由7805芯片,变压器和整流桥组成的一个5V稳压电源。变压器将220V交流电转变为12V交流电,经过整流桥和滤波电容后变为直流,经过7805芯片后输出5V稳压电源。电源电路原理图,如图2.2所示。
图2.2电源电路原理图 2.2.2 系统控制单元
系统控制单元主要有单片机最小系统和独立按键组成。2.2.2.1 单片机最小系统
单片机采用了Atmel 公司生产的 AT89S52单片机,它含有256 字节数据存储器,内置8K 的电可擦除FLASH ROM,可重复编程,大小满足主控机软件系统设计。
AT89S52芯片的主要引脚功能分别为: VCC 电源电压。GND 接地。
RST 复位输入。当RST变为高电平并保持2个机器周期时,将使单片机复位。WDT溢出将使该引脚输出高电平,设置SFR AUXR的DISRTO位(地址8EH)可打开或关闭该功能。DISKRTO位缺省为RESET输出高电平打开状态。
ALE/PROG: 当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
XTAL1 反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2 来自反向振荡放大器的输出。
P0口:一组8位漏极开路型双向I/O口。也即地址/数据总线复用口。作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。Flash编程和程序校验期间,P1接收低8位地址。
P2口:一个带内部上拉电阻的8位双向I/O口。P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。在访问外部程序存储器或16位地址的外部数据存储器时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器时,P2口线上的内容在整个访问期间不改变。Flash编程和程序校验期间,P2亦接收低8位地址。
P3口:一个带内部上拉电阻的8位双向I/O口。P3的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写“1”时,它们被内部的上拉电阻把拉到高电并可作输入端口。作输入端口使用时,被外部拉低的P3口将用上拉电阻输出电流。P3口除了作为一般的I/O口线外,还作特殊功能口。P3口的第二功能引脚分配如下:
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所示。图2.3 单片机最小系统原理图 2.2.2.2 独立按键
本设计按照功能要求设置了六个按键。按键接线图,如图2.4所示。按键功能分别为:
key0:系统启动,用来启动计价器,使计价器开始工作; key1:系统停止/复位,用来关闭计价器,是计价器停止工作并复位;
key2:单程双程,用来设置是单程计费还是往返计费;
key3:系统暂停,用来将整个计费系统暂停; key4:等待时间显示,当按下不放时 图2.4按键接线图
数码管为显示等待的时间。
Key5:调速按钮,用来调整电机的转速,使测试时可控制电机转速。2.2.3 驱动电路单元
LM298N是SGS公司的产品,内部包含4通道逻辑驱动电路。是一种二相和四相电机的专用驱动器,即内含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动46V、2A一下的电机。LM298N的管脚图,如图2.5所示。通过单片机的I/O输入改变芯片控制端的电平,即可以对电机进行正反转,停止的操作,LM298N的逻辑功能表,如图2.6所示。
图2.5 LM298N的管脚图 图2.6 LM298N的逻辑功能表
LM298N有两路电源分别为逻辑电源和动力电源,图中6V为逻辑电源,12V为动力电源。J4接入逻辑电源,J6接入动力电源,J1与J2分别为单片机控制两个电机的输入端,J3与J5分别与两个电极的正负极相连。ENA与ENB直接接入AVR单片机的PWM输出口;控制电机的正反转通过J1与J2两个接口,控制电机的转速的通过ENA和ENB的口输入的PWM波的占空比。由于我们使用的电机是线圈式的,在从运行状态突然转换到停止状态和从顺时针状态突然转换到逆时针状态时会形成很大的反向电流,在电路中加入二极管的作用就是在产生反向电流的时候进行泄流,保护芯片的安全。LM298N电机驱动原理图,如图2.7所示。
图2.7 LM298N电机驱动原理图 2.2.4 信号检测单元
电机转速的检测模块是由对射式光电传感器及其配套电路组成的,对射式光电传感器原理图,如图2.8所示。
对射式光电传感器由红外发光二极管与光敏三极管组成,主要检测发射管与接收管之间有无物体存在。如上图所示,当发射管与接收管之间没有物体存在时,光敏三极管接收到红外光后导通,out输出低电平;当发射管与接收管之间有物体存在时,光敏三极管无法接收到足够的强的红外光所以截止,out输出高电平。
但是上述电路存在缺陷,当直流电机高速旋转时,out输出的信号就容易失真,很难被单片机检测识别。为了能够让单片机准确识别光电传感器输出地信号,需在传感器的输出端连接一个比较器。
电压比较器可以看作是放大倍数接近“无穷大”的运算放大器。电压比较器的功能:比较两个电压的大小 用输出电压的高或低电平,表示两个输入电压的大小关系 :当”+”输入端电压高于”-”输入端时,电压比较器输出为高电平;当”+”输入端电压低于”-”输入端时,电压比较器输出为低电平。LM393是双电压比较器集成电路
图2.8对射式光电传感器原理图 图2.9 LM393引脚图
速度检测电路原理图,如图2.10所示。由原理图可知, 当发射管与接收管之间没有物体存在时,光敏三极管接收到红外光后导通,out输出高电平;当发射管与接收管之间有物体存在时,光敏三极管无法接收到足够的强的红外光所以截止,out输出低电平。经过整理后的电路能输出比较标准的高低电平信号,很容易被单片机识别。图2.10 速度检测电路原理图 2.2.5 显示单元 2.2.5.1 数码管显示
显示单元采用两个四位8段数码管显示信息,一组显示金额,另一组显示路程配合按键来切换显示。用锁存器来驱动数码管显示,数据位连接单片机P0口,片选端和段选端分别用单片机的P2.6和P2.7端口。如图2.11所示为数码管显示接线图。
图2.11 数码管显示接线图 2.2.5.1 LED指示灯
本设计按照功能要求设置了五个LED灯。接线图如图2.12所示。各个LED灯的功能分别为:
DS0:等待指示灯,车速小于5Km/h时指示灯亮; DS1:暂停指示灯,当暂停键按下,计价器暂停计价时亮; DS2:空车指示,当计价器停止工作也就是空车时,此指示灯亮; DS3:启动指示灯,当按下启动键,计价器开始计价时亮; DS4:单双程指示灯,默认为单程,当选 图2.12 LED指示灯接线图
择双程时亮。2.2.6 数据存储单元
本设计使用了24C02作为外部存储芯片。24C02是串行2K的EEPROM,是基于I2C-BUS 的存储器件,遵循二线制协议,具有接口方便,体积小,数据掉电不丢失等特点。计价器能将里程和总价格实时的存储到24C02中,当计价器因掉电停止工作,24C02会存储掉电前一刻的数据,使系统从新上电时能够恢复里程和总价格。当计价器是被手动正常停止时,将会对24C02相应的地址写0,以使下次启动时,计价器从初始化数据开始计价。24C02的接线图,如图2.13所示。
图2.13 24C02的接线图 3 软件设计 3.1 软件设计流程图
软件系统可以大致分为几个大的模块为:初始化模块,按键扫描模块,中断与定时模块,数据计算模块,数码管显示模块,IIC总线通信模块等。其中,键盘扫描和数码管显示采用查询方式,转速信号接收采用中断方式。软件设计流程图,如图3.1所示。
图3.1 软件设计流程图 3.2 计算模块
计算程序根据里程数分别进入不同的计算公式。如果里程大于3公里,则执行公式:总金额 起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:总金额 起步价+等待时间*等待单价。
对于速度的判断及等待时间的记录采用定时器零中断,设定10ms一个中断,然后判断车速,小于5公里/小时时,则开始记录等待时间。
3.3 键盘扫描
键盘扫描才用查询方式,当有按键按下时就对相应的标志进行取反,或调用其他子函数,在消抖过程中,这里将数码管显示程序潜入以保证显示的稳定。
3.4 显示程序
显示程序利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示
3.5 PWM波的生成
在AT89系列单片机中,由于没有PWM控制器,要输出PWM信号就需通过软件的方式在I/O口上模拟PWM的输出。PWM软件设计一般可以利用软件延时的方式或利用单片机内部的定时器/计数器作为时钟信号。
本设计是利用软件延时获得PWM信号的,在软件中设计一个基准的软件延时程序,通过反复调用这个延时程序,从而获得不同的时间长度,为了电机速度稳定,我们选择使用同周期,不同占空比的PWM进行调速。
若频率为1kHZ,则每个方波的周期为1ms,占空比从0变化到100%,最小的变化量为10%,即高电平维持时间的最小值是100us,所以只要设计出100us的延时程序作为基准即可。具体程序如下: #define uchar unsigned char sbit PWM P3^4;//定义PWM输出口为P3.4 void PWMout uchar q //生成同周期的PWM波
PWM 1;delay q;PWM 0;delay 10-q;
void delay uchar a //100us延时函数
uchar b;for;a 0;a--
for b 29;b 0;b--
_nop_;
_nop_;
3.6 速度检测
经检测模块得到的信号输入到单片机内,因为输入的是低电平信号,所以我把信号输入到了中断0端口,每接收一个低电平信号程序就会进入中断函数里面,中断0函数如下: void int0 interrupt 0
sudu++;
这样就完成了速度测量。3.7 程序源代码 程序源代码见附录2。4 Proteus软件仿真
将整个系统原理图在Proteus连接好后,下载如编写好的程序仿真如下:如图4.1显示的状态设置为:单程,车速大于5km/h,当路程等于40.4km时的显示情况。
图4.1 Proteus软件仿真图 5 课程设计体会
本次单片机课程设计,我们选的题目是出租车计价器的设计。通过仿真、焊接、调试等不断的努力,我们的出租车计价器实现了基本要求的全部功能和发挥部分的部分功能。比如能显示里程、金额数、总等待时间,可设定单程价格和双程价格,按暂停键,计价器可暂停计价,按查询键,可显示总等待时间,空车指示、信息存储等。
经过这些天有关于出租车计价器的课程设计,使我们对MCS-51系列单片机的应用有了更深的了解。从前的学习过程过于浮浅,只是流于表面的理解,而现在要做课程设计,就不得不要求我们对所用到的知识有更深层次的理解。因为课程设计的内容比及书本中的理论知识而言,更接近于现实生活,而理论到实践的转化往往是一个艰难的过程,它犹如一只拦路虎,横更在我们的面前。但是我们毫不畏惧,因为我们相信我们能行。
事情并不总是一帆风顺的,我们总会遇到困难和险阻。在此次课程设计的过程中,我们碰到了许多的问题。比如,对于数码管动态扫描显示和键盘的延时防抖的综合编程不能较好地解决;对于代码的前后顺序及调用掌握得还不够好;对于一些相关的应用软件 KEIL、PROTEUS、Altium esigner 没能熟练掌握。当然,问题并不可怕,只要我们怀着一颗不服输的心,勇往直前,那么胜利将不会离我们太远。通过上网查找资料、与同学老师交流、小组成员间的讨论、不断实践与探索,我们总能找到解决问题的方法,最后得到良好的效果。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
总之,本次课程设计让我们更加深刻的掌握了MCS-51系列单片机的工作原理和编程语言,更加熟练的掌握了KEIL、PROTEUS、Altium designer等专业软件的使用,熟悉了产品开发的大致流程,深刻的体会到了团队协作精神的重要性,培养了我们发现问题、独立思考问题、多种途径解决问题的能力,锻炼并提高了了我们的动手实践能力和理论与实践相结合的能力。
我以后做一个动手能力强的大学生。http://www.xiexiebang.com.致谢
在课程设计即将完成之际,我想向给予我帮助和支持的人表示衷心的感谢!感谢高老师和王老师给我们提供这次难得的课程设计机会,让我们有机会把理论
得以应用到实践上。
感谢我们的指导老师王莉,课程设计是在老师的亲切关怀和悉心指导下完成的。严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。老师不仅在学业上给我以精心指导,同时还在思想、上给我以无微不至的关怀,在此谨向老师致以诚挚的谢意和崇高的敬意。我还要感谢在一起愉快的度过的同学们,正是由于你们的帮助和支持,我才能克服一个一个的困难和疑惑,直至本文的顺利完成。最后,再次对关心、帮助我的老师和同学表示衷心地感谢!#include
//头文件
#include
#include
//IIC总线通信 #include
//数码管显示 #define uint unsigned int
#define uchar unsigned char sbit key0 P1^0;//启动 sbit key1 P1^1;//停止 sbit key2 P1^2;//单返程 sbit key3 P1^3;//暂停 sbit key4 P1^4;//显示等待时间 sbit key5 P1^5;//调速 sbit led0 P2^2;//暂停指示灯 sbit led1 P2^3;//空车指示灯 sbit led2 P2^4;//启动指示灯 sbit led3 P2^5;//双程指示灯 sbit led4 P2^1;//等待指示灯 sbit PWM P3^4;//PWM输出口
uchar sudu,sudu0,shi,fen,miao,shi0 12,fen0 30,miao0;uchar danfanflag 0,flag 0,speedflag 1,stopflag 0;uint licheng 0,maichong,r 0,money 0;uint t,t1,t2;uchar num1,num2,num3,num4,lichenga,lichengb,moneya,moneyb;long licheng0;void init0;//系统初始化函数 void delay uint a;//延时函数 void PWMout uchar q;//PWM产生函数 void anjian;//按键扫描函数 void jisuan;//路程、价钱计算函数 void chuli;void main
num1 read_add 25;num2 read_add 26;delay 5;licheng num1*100+num2;licheng0 150*licheng-300*fen;init0;while 1
anjian;chuli;lichenga licheng/100;lichengb licheng%100;
write_add 25,lichenga;delay 5;write_add 26,lichengb;
void init0
TH0 0x3c;TL0 0xb0;EA 1;
//初始化
TMOD 0x01;EX0 0;IT0 1;ET0 1;TR0 1;P0 0xff;P1 0xff;P2 0xff;P3 0xfe;
void chuli
if speedflag 1 PWMout 12;else if speedflag 2 PWMout 20;else PWMout 6;if flag 1 led2 0;
led3 1;jisuan;
if key4 0
display0 shi,fen,miao;
else
display licheng,money;
if flag 2
led2 0;led3 1;display 1,2;
if flag 0
display0 shi0,fen0,miao0;led3 0;led2 1;
if danfanflag 1 led1 0;if danfanflag 0 led1 1;if stopflag 1
led0 0;
else led0 1;
void jisuan
r maichong;licheng0+ r;licheng licheng0/150+ fen/5 *10;sudu0+ r;maichong 0;if t2 10
t2 0;
sudu sudu0;
sudu0 0;
if licheng 30
money 50;else
if danfanflag 1
money 50+1.5* licheng-30;
else
money 50+2* licheng-30;
void anjian
if key0 0
EX0 1;
flag 1;
stopflag 0;
if key1 0 EX0 0;maichong 0;
licheng0 0;licheng 0;flag 0;
shi 0;
fen 0;
miao 0;write_add 25,0;delay 5;write_add 26,0;
if key2 0
delay 5;
if key2 0
if flag 1
danfanflag++;
if danfanflag 2
danfanflag 0;
while!key2;delay 5;while!key2;
if key3 0
if flag 1
EX0 0;
stopflag 1;
if key5 0
delay 5;
if key5 0
speedflag++;
if speedflag 3
speedflag 0;
while!key5;delay 5;while!key5;
void int0 interrupt 0 数
maichong++;
void timer0 interrupt 1
TH0 0x3c;TL0 0xb0;t++;t1++;t2++;if t1 20
t1 0;
miao0++;
//检测与计定时器50ms
//
if miao0 60
miao0 0;
fen0++;
if fen0 60
fen0 0;
shi0++;
if shi0 24
shi0 0;
if sudu 50&&flag 1&&stopflag 0 led4 0;if t 20
t 0;
miao++;
if miao 60
miao 0;
fen++;
if fen 60
fen 0;
shi++;
if shi 24
shi 0;
else led4 1;
void PWMout uchar q
PWM 1;delay q;
//生成PWM波
PWM 0;delay 20-q;
IIC.h IIC通信
#define uint unsigned int
#define uchar unsigned char sbit sda P1^6;sbit scl P1^7;void delay0;;void start
sda 1;delay0;scl 1;delay0;sda 0;delay0;
void stop
sda 0;delay0;scl 1;delay0;sda 1;delay0;
void respons
uchar i;scl 1;delay0;while sda 1 && i 250 i++;scl 0;delay0;
void init
sda 1;scl 1;
void write_byte uchar date uchar i,temp;temp date;scl 0;delay0;for i 0;i 8;i++
temp temp 1;
sda CY;
delay0;
scl 1;
delay0;
scl 0;
delay0;
sda 1;
delay0;
uchar read_byte
uchar i,j,k;scl 0;delay0;sda 1;delay0;for i 0;i 8;i++
scl 1;
delay0;
j sda;
k k 1 |j;
scl 0;
delay0;
return k;
void write_add uchar address,uchar date
start;write_byte 0xa0;//器件地址;
respons;write_byte address;//存储器地址;
respons;write_byte date;//写数据
respons;stop;
uchar read_add uchar address
uchar date;start;write_byte 0xa0;respons;write_byte address;respons;start;write_byte 0xa1;respons;date read_byte;stop;return date;
display.h 数码管显示#define uint unsigned int
#define uchar unsigned char sbit dula P2^7;//端口
定义段选
sbit wela P2^6;//定义位选端口
uchar code table[]
//数码管编码 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71;void delay uint c
//延时100us
uint a,b;for a c;a 0;a--for b 40;b 0;b--;
void display uint shu,uint shu1 //显示函数
uchar qian,bai,shi,ge,qian1,bai1,shi1,ge1;qian shu/1000;bai shu/100%10;shi shu%100/10;ge shu%10;qian1 shu1/1000;bai1 shu1/100%10;shi1 shu1%100/10;ge1 shu1%10;dula 1;P0 table[qian];dula 0;wela 1;P0 0xfe;wela 0;delay 2;dula 1;P0 table[bai];dula 0;wela 1;P0 0xfd;wela 0;delay 2;dula 1;P0 table[shi]|0x80;dula 0;wela 1;P0 0xfb;wela 0;delay 2;dula 1;P0 table[ge];dula 0;wela 1;P0 0xf7;wela 0;delay 2;dula 1;P0 table[qian1];dula 0;wela 1;P0 0xef;wela 0;delay 2;dula 1;P0 table[bai1];dula 0;wela 1;P0 0xdf;wela 0;delay 2;dula 1;P0 table[shi1]|0x80;dula 0;wela 1;P0 0xbf;wela 0;delay 2;dula 1;P0 table[ge1];dula 0;wela 1;P0 0x7f;wela 0;delay 2;
void display0 uchar shi,uchar fen,uchar miao 示时间函数
uchar aa,bb,cc,dd,ee,ff;aa shi/10;bb shi%10;cc fen/10;
显 // dd fen%10;ee miao/10;ff miao%10;dula 1;P0 table[aa];dula 0;wela 1;P0 0xfe;wela 0;delay 4;dula 1;P0 table[bb]|0x80;dula 0;wela 1;P0 0xfd;wela 0;delay 4;dula 1;P0 table[cc];dula 0;wela 1;P0 0xfb;wela 0;delay 3;dula 1;P0 table[dd]|0x80;dula 0;wela 1;P0 0xf7;wela 0;delay 4;dula 1;P0 table[ee];dula 0;wela 1;P0 0xef;wela 0;delay 4;dula 1;P0 table[ff];dula 0;wela 1;P0 0xdf;wela 0;delay 4;
附2 系统原理图
河南理工大学本科课程设计报告河南理工大学本科课程设计报告按 键
AT89S52单片机 L298N驱动 数码管显示 信号检测 24C02 指示灯 直 流 电 机 开始 初始化 按键扫描 是否启动 结束 是否暂停
速度是否小于5Km/h 是 否
1.5元/公里 2元/公里 数码管显示 是否双程 暂停计价 是 是 否
每5分钟加1公里 是 否 查询 处理计算
第五篇:出租车计价器 硬件课程设计
硬件课程设计报告
题目:出租车计价器
目录
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