您现在的位置:首页 > >

基于51系列单片机的出租车计价器控制系统设计

发布时间:

仅供个人参考

编号:

本科毕业设计
基于 51 系列单片机的出租车计价器控制系统设计

系 (院):信息工程学院 姓 名: 学 号: 专 业:通信工程 年 级: 指导教师: 职 称: 完成日期:
不得用于商业用途

仅供个人参考

摘要

随着社会的进步,电子类产品也得到了广泛的发展,尤其是单片机的发展异 常迅速。由于单片机的特殊结构形式,在某些应用领域中,它承担了一些通用的 微型计算机无法完成的工作,它是一种高性能,低价格的处理器,集成度高,体 积小,可靠性又高,控制功能强,电压低。由于单片机具有这些特点,人类的生 活应用中十分广泛。
本电路以 AT89C51 单片机为中心,附加 A44E 霍尔传感器测距(本电路中 用模拟开关替代),实现对出租车计价,采用 FM24C02 实现在系统掉电的时候 保存单价,输出采用 8 段数码显示管,显示行驶总里程和总金额。
模拟出租车计价器设计:进行里程显示,预设起步价和起步公里数;行程按 全程收费,有复位功能和启动功能,启动后,开始计价。我们采用单片机进行设 计,可以用较少的硬件和适当的软件相互配合来实现设计要求,且灵活性强,可 以通过软件编程来完成更多的附加功能,应用前景广阔。
关键词:计价器;;霍尔传感器;断电保存

不得用于商业用途

仅供个人参考

Abstract

As society advances, electronic products have been widely developed. Exceptionally rapid development of the microcontroller. Due to the special structure of the microcontroller, in some applications, it bears some of the common micro-computer could not be done, it is a high performance, low price processor. High integration, small size, high reliability, and control functions, low voltage. Microcontroller with these characteristics, a wide range of application of human life.
The AT89C51 microcontroller circuit as the center, add A44E Hall sensor distance (instead of the circuit using analog switches), to achieve the taxi meter, using FM24C02 achieve when stored in the system power-down unit, 8-segment LED output display tube shows the total mileage and total amount of driving.
Taximeter analog design: the mileage display, the default starting price and the starting mileage; travel by full fare, a reset and start, start, start pricing. We use single chip design, you can use less hardware and appropriate software to meet the design requirements of mutual cooperation, and flexibility, through software programming to accomplish more additional features, a bright future.

Keywords: taxi meter;Hall sensors;save power

不得用于商业用途

仅供个人参考
目录
1 绪 论........................................................................................错误!未定义书签。 1.1 课题背景与意义 ...............................................................错误!未定义书签。 1.2 计价器的现状 ...................................................................错误!未定义书签。
2 出租车计价系统的设计要求与设计方案..............................错误!未定义书签。 2.1 出租车计价器概述 ...........................................................错误!未定义书签。 2.2 系统主要功能 ...................................................................错误!未定义书签。 2.3 方案论证与比较 ...............................................................错误!未定义书签。
3 系统硬件设计..........................................................................错误!未定义书签。 3.1 设计方案与硬件说明 .......................................................错误!未定义书签。 3.2 硬件设计说明 ...................................................................错误!未定义书签。 3.3 硬件电路组成 ...................................................................错误!未定义书签。 3.3.1 驱动电路.....................................................................错误!未定义书签。 3.3.2 显示电路.....................................................................错误!未定义书签。 3.3.3 复位电路.....................................................................错误!未定义书签。 3.3.4 掉电保护电路.............................................................错误!未定义书签。 3.3.5 时钟电路.....................................................................错误!未定义书签。 3.3.6 按键电路.....................................................................错误!未定义书签。
4 系统软件设计..........................................................................错误!未定义书签。 4.1 软件总体设计 ...................................................................错误!未定义书签。 4.2 系统程序设计 ...................................................................错误!未定义书签。
5 系统调试..................................................................................错误!未定义书签。 5.1 软件调试 ...........................................................................错误!未定义书签。 5.1.1 编程工具—C51 语言.................................................错误!未定义书签。 5.1.2 程序调试工具—KEIL ...............................................错误!未定义书签。 5.1.3 单片机仿真软件在线调试—PROTEUS...................错误!未定义书签。 5.2 系统仿真 ...........................................................................错误!未定义书签。
总结.............................................................................................. 错误!未定义书签。
不得用于商业用途

仅供个人参考
致谢.............................................................................................. 错误!未定义书签。 参考文献...................................................................................... 错误!未定义书签。 附录.............................................................................................. 错误!未定义书签。
不得用于商业用途

仅供个人参考

1绪论

1.1 课题背景与意义
随着出租车行业的发展,出租车已经是城市交通的重要组成部分,从加强行 业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和 乘客来说都是很必要的。
我们知道,只要乘坐的出租车启动,随着行驶里程的增加,就会看到司机旁 边的计价器里程数字显示的读数从零逐渐增大,而当行驶到某一值时(如 2KM) 计费数字显示开始从起步价(如 4 元)增加。当乘客到站时,按下停止按键,计 费数字显示总里程和总金额,它可以很直观的反映用户使用情况。
出租车是城市交通的重要组成部分,行业健康和发展也获得越来越多的关 注。汽车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志, 是出租车中最重要的工具。它关系着交易双方的利益。具有良好性能的计价器无 论是对广大出租车司机朋友还是乘客来说都是很必要的,因此,汽车计价器的研 究也是十分有一个应用价值的。
通过本次设计,可以增进对单片机的感性认识,加深对其理论方面的理解, 掌握单片机的内部功能模块的应用,了解掌握单片机的软硬件设计过程、方法及 实现。
1.2 计价器的现状
出租车计价器是出租车营运收费的专用智能仪表,目前市面所使用的计价器 大都功能较少。随着人们生活水平的不断提高,出租车的使用频率也越来越高, 出租车行业也以高质量的服务给人们带来了出行的享受。但是由于行业的特殊 性,出租车行业总存在着买纠纷,困扰着行业的发展。给服务质量及管理带来一 定影响。随着电子技术的发展,出租车计价器技术也在不断进步和提高。
国内出租车计价器已经经历了 4 个阶段的发展。从传统的全部由机械元器件 组成的机械式到半电子式,即用电子线路代替部分机械元器件的出租车计价器。 而功能齐全的计价器大都采用双 CPU 结构,这就提高了计价器的生产成本。
在考虑成本和使用的基础上,本设计介绍了一种以 AT89C51 单片机为核心 的,具有计时、计价、性能可靠、电路简单、成本低等特点的多功能出租车计价 器,能够很好的满足市场对出租车计价器的要求。本设计的目的就是通过对现有

不得用于商业用途

仅供个人参考
计价器的分析,解决计价器的问题,同时完成具有单价输出、单价调整、路程输 出等功能的新型计价器的硬件和软件设计。
不得用于商业用途

仅供个人参考

2 出租车计价系统的设计要求与设计方案

2.1 出租车计价器概述
计价器显示的营运金额是营运里程与价格。出租车计价器通过传感器与行驶 车辆连接,但在此次课程设计中,因没有传感器,所以用键盘取代,用按键的次 数来代表里程数。该课程设计的出租车计价器功能主要有具有数据的复位功能、 单价修改功能、数据输出功能、计价功能等。
2.2 系统主要功能
本课程设计所设计的出租车计价器的主要功能有:数据的复位、单价修改、 数据输出、计价、单价输出及调整、路程输出等功能。输出采用 8 段数码显示管。 本电路设计的计价器不但能实现基本的计价,而且还能手动来调节单价。
2.3 方案论证与比较
方案一:采用数字电路控制 采用传感器件,输出脉冲信号,经过放大整形作为移位寄存器的脉冲,实现 计价,但是考虑到这种电路过于简单,性能不够稳定,而且不能调节单价,也不 能根据天气调节计费标准,电路不够实用。 方案二:采用单片机控制 利用单片机丰富的 I/O 端口,及其控制的灵活性,实现基本的里程计价功能 和价格调节、时钟显示功能。通过比较以上两种方案,单片机方案有较大的活动 空间,不但能实现所要求的功能,而且能在很大的程度上扩展功能,而且还可以 方便的对系统进行升级,所以采用后一种方案更好些。

不得用于商业用途

仅供个人参考
3 系统硬件设计
3.1 设计方案与硬件说明 采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相
互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多 的附加功能。设计采用 AT89C51 单片机为主控器,以 A44E 霍尔传感器测距(按 键替代),实现对出租车的基本的计价设计,并采用 FM24C02 实现在系统掉电 的时候保存单价等信息,输出采用 8 段数码显示管。利用单片机丰富的 I/O 端口, 及其控制的灵活性,实现基本的计价功能。其系统结构图如图 3.1 所示:

按 键 控 制
复位电路
掉电保护
时钟电路

89C51 单 片 机

显示总里程和总金额 显示模块

图 3.1 系统结构图
本电路设计的计价器能实现基本的计价功能,单片机计算总价的公式为:总 价=起步价+单价*(总里程-起步里程)+1。AT89C51 作为一个单片微型计算系 统,灵活性高,其强大的控制处理功能和可扩展功能设计电路提供了很好的选择。
3.2 硬件设计说明
单片机是单片微型计算机的简称,单片机以其卓越的性能,得到广泛的应用, 已经深入到各个领域。在这次设计中,我们用到 P0 口和 P2 口,P0 口为 8 位三 态 I/O 口,此口为地址总线及数据总线分时复用;P2 口为 8 位准双向口,与地 址总线高八位复用;P0 口和 P2 口都有一定的驱动能力,P0 口的驱动能力较强。
设计中,为了能够让数码管更好的正常显示,我们采用了驱动电路来驱动。 在本次硬件设计中,我们考虑采用芯片 74LS245 来驱动数码管显示。
设计电路时,考虑到用里程(霍尔)传感器价格昂贵,且不便于试验检测,
不得用于商业用途

仅供个人参考
在设计中采用一个模拟开关来代替。模拟开关一端接在 P3.4 口,另一端接地, 通过来回高低电平的变化,每按两次,对应的里程数加一。通过在程序中设置的 里程和金额的信息,在加上驱动电路的设计,就可以在数码管上分别显示总金额 和总里程。
在显示方面,可以用液晶显示,也可以用数码管进行显示。由于在这次设计 中只需要显示里程和金额信息,我们采用数码管进行显示。这样既节约了成本, 又可以达到显示的目的。同时为了减少硬件的复杂度,我们采用了动态显示方式, 选用了共阴极数码管。为了焊接方便,我们选用了集成在一起的数码管。
我们还设计了控制按键,能够很好的对出租车计价器控制,如启动/停止按 键,清零按键等。
AT89C51 单片机简介: AT89C51 是美国 ATMEL 公司生产的低功耗,高性能 CMOS 8 位单片机, 片内含 4KB 的可系统编程的 Flash 只读程序存储器,器件采用 ATMEL 公司的高 密度、非易失性存储技术生产,兼容标准 8051 指令系统及引脚。它集 Flash 程 序存储器既可在线编程(ISP)也可用传统方法进行编程及通用 8 位微处理器于 单片芯片中,具有高性价比,其引脚配置如图 3.2 所示。

不得用于商业用途

图 3.2 AT89C51 引脚配置

仅供个人参考

AT89C51 芯片的 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 口部分端口引脚及功能如表 3.1 所示。
表 3.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 口线外,更重要的用途是 它的第二功能,如表 3.2 所示。P3 口还接收一些用于 Flash 闪速存储器编程和程 序校验期间的控制信号。

表 3.2 P3 口特殊功能

P3 口引脚

特殊功能

P3.0

RXD(串行输入口)

P3.1

TXD(串行输出口)

P3.2

(外部中断 0)

P3.3

(外部中断 1)

P3.4

T0(定时器 0 外部输入)

P3.5

T1(定时器 1 外部输入)

P3.6

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

P3.7

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

硬件系统设计说明: 按下计价按键时,显示起步价和起步里程范围,这些在程序中设置;当等于 或超过两公里后,按计算总价的公式为:总价=起步价+单价*(总里程-起步里程) +1 进行计价。本设计中,起步价为 4 元,起步里程为 2 公里,当然这些数据可 以在程序中改写,以满足不同时期价格调整的需要。

3.3 硬件电路组成

不得用于商业用途

仅供个人参考
硬件组成主要包括:驱动电路、显示电路、复位电路、掉电保护电路、时钟 电路、按键电路。其整体电路图 3.3 所示:

图 3.3 计价器整体电路图
3.3.1 驱动电路
74LS245 是我们常用的芯片,用来驱动 led 或者其他的设备。总线驱动器 74LS244 和 74LS245 经常用作三态数据缓冲器,74LS244 为单向三态数据缓冲器, 而 74LS245 为双向三态数据缓冲器。本设计用 74LS245 作为驱动芯片,双向总 线发送器/接收器(3S),管脚图如图 3.4 所示。

不得用于商业用途

图 3.4 驱动芯片管脚图

仅供个人参考

74LS245 主要电器特性的典型值如下:

引出端符号:

A A 总线端

B B 总线端

G 三态允许端(低电平有效)

DIR 方向控制端

功能表如表 3.3 所示:

Enable

表 3.3 功能表
Direction

G

Control

DIR

L

L

L

H

H

X

Operation
B data to A bus A data to B bus
Isolation

利用 74LS245 来驱动数码管显示,单片机的 P2.0 到 P2.5 分别接 A0 到 A5 管脚,进行数据的传送,其中 AB/BA 接高电平,控制数据从 A 到 B 进行传送, B0 到 B5 分别接数码管的位选端,驱动数码管依次显示。P2.0 到 P2.5 的数据通 过 A 传送到 B 中的数据送到数码管,以达到显示数据信息的目的。

3.3.2 显示电路

多数的应用系统都要配输入和输出,外设 LED 显示器和 LCD 显示器,虽然 LCD 显示效果比较好,已经成为了一种发展趋势,但为了节约成本,我们选用 了 LED 显示器(图 3.5)。

图 3.5 集成数码管
在显示方面,我们选用了动态显示。静态显示虽然亮度较高,接口编程容易, 但是每位的段码线分别与一个 8 位的锁存器输出相连。占用的 I/O 口线比较多,
不得用于商业用途

仅供个人参考
在显示位数较多的情况下,一般都采用动态显示方式。利用动态显示的方法,由 于 LED 显示器的余辉和人眼的视觉暂留现象,只要每位显示的时间间隔足够短, 就仍能感觉到所有的数码管都在显示。为了简化硬件,通常将所有位的段码线相 应段并联在一起,由一个 8 位 I/O 口控制,在同一时刻,只让一位选通,如此循 环,就可以使各位显示出将要显示的字符。
LED 数码有共阳和共阴两种,把这些 LED 发光二极管的正极接到一块(一 般是拼成一个 8 字加一个小数点)而作为一个引脚,就叫共阳的,相反的,就叫 共阴的,那么应用时这个脚就分别的接 VCC 和 GND。再把多个这样的 8 字装在 一起就成了多位的数码管了。在本设计仿真中使用的是 6 个一组的共阴 8 段数码 管(图 3.6)。
图 3.6 LED 数码管
找公共共阴和公共共阳的方法:首先我们找个电源稳压器(3 到 5 伏)和 1 个 1K(几百欧的也行)的电阻,VCC 串接 1 个电阻后和 GND 接在任意 2 个脚 上,组合有很多,但总有一个 LED 会发光的,找到一个就够了,然后用 GND 不动,VCC(串电阻)逐个碰剩下的脚,如果有多个 LED(一般是 8 个),那 它就是共阴的了。共阴极数码管,阴极接地,当某个发光二极管的阳极为高电平 时,发光二极管点亮,对应的段就显示。
3.3.3 复位电路 单片机的复位是由外部的复位电路实现的,复位电路通常采用上电自动复位
和按钮复位两种方式。上电自动复位是通过外部复位电路的电容充电来实现的。 除了上电复位外还需要按键手动复位(图 3.7)。按键手动复位有电平方式和脉 冲方式两种。其中电平复位是通过 RST 端经电阻与电源 VCC 接通而实现的。单 片机的复位速度比外围 I/O 接口电路快,为能够保证系统可靠的复位,在初始化 程序中应安排一定的复位延迟时间。
不得用于商业用途

仅供个人参考
图 3.7 复位电路
3.3.4 掉电保护电路 掉电保护电路中采用了存储芯片 FM24C02。 FM24C02 是一个 CMOS 标准的 EEPROM 存储器,是 FM24CXX 系列
(FM24C01/02/04/08/16)成员之一,这些 EEPROM 存储器的特点是功耗小、成 本低、电源范围宽,静态电源电流约 30uA~110uA,具有标准的 I2C 总线接口, 是应用广泛的小容量存储器之一。
图 3.8 FM24C02 引脚图
图 3.8 是 FM24C02 的引脚图,这个芯片是一个 8 脚芯片,内部存储器有 256 字节。
引脚功能介绍如下: A0(引脚 1):器件地址的 A0 位,是器件地址的最低位,器件地址排列是 A6 A5 A4 A3A2 A1 A0 R/W。 A1(引脚 2):器件地址的 A1 位。 A2(引脚 3):器件地址的 A2 位。 GND(引脚 4):地线。 SDA(引脚 5):数据总线引脚。 SCL(引脚 6):时钟总线引脚。 TEST(引脚 7):测试引脚。 Vcc(引脚 8):电源线引脚。
不得用于商业用途

仅供个人参考
本设计采用掉电存储电路图如图 3.9:
图 3.9 掉电存储电路
3.3.5 时钟电路 MCS-51 单片机的各功能部件都是以时钟控制信号为基准,内部电路在时钟
信号的控制下,严格地按时序执行指令进行工作,单片机本身如同一个复杂的同 步时序电路,为了保证其各个部分同步工作,电路要在唯一的时钟信号控制下, 严格地按照时序进行工作。其实只需在时钟引脚连接上外围的定时控制元件,就 可以构成一个稳定的自激振荡器。为更好地保证振荡器稳定可靠地工作,谐振器 和电容应尽可能安装得与单片机芯片靠近。
本设计中使用的振荡电路,由 12MHZ 晶体振荡器和两个约 30PF 的电容组 成,在 XTAL1 和 XTAL2 两端跨接晶体,电容的大小不会影响振荡频率的高低。 在整个系统中为系统各个部分提供基准频率,以防因其工作频率不稳定而造成相 关设备的工作频率不稳定,晶振可以在电路中产生振荡电流,发出时钟信号。如 图 3.10 所示。
图 3.10 时钟电路
3.3.6 按键电路 按键控制电路中,单片机的 P1.0 管脚接启动/停止按键,通过软件编程,当
按下按键计数器开始工作,开始计价;当弹起按键时,计数器停止工作,停止计 价,启动/停止按键带自锁功能。按下启动按键,开关处于导通状态,这时给 P1.0 送低电平信号,这时 TR0=1,计数器开始工作,调用计价子程序开始计价。清零 按键接单片机的 P1.3 管脚,按下清零按键,P1.3 为低电平,调用清零子程序,
不得用于商业用途

仅供个人参考
用于将显示数据清零,在程序中给各位赋 0 代码(0x3f),以达到清零的目的, 方便下次计价。另外为功能键,控制价格调整,这个按键是在没有按下启动/停 止按键时有作用,计价过程中无效,按键电路如图 3.11 所示。
图 3.11 按键电路
不得用于商业用途

仅供个人参考
4 系统软件设计
4.1 软件总体设计 51 单片机的程序设计语言主要有两种:一是汇编程序设计;二是 C 语言编
程设计,两种程序设计语言都有各自的优点。用汇编语言编写和高级语言(C 语 言)比较起来节省空间,这样对于存储空间仅 4Kb 的芯片来说是极之有利的,51 单片机能更高速的运行。C 语言编写的程序,虽然不象汇编那样速度快、但程序 简单易行、并且需要较小的存储空间。C 语言作为一种编译型程序设计语言,它 兼顾了多种高级语言的特点,并具备汇编语言的功能。此外,C 语言程序还具有 完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的 保障。因此,使用 C 语言进行程序设计已成为软件开发的主流。
本设计就是采用 C 语言编写的,由于采用模块化操作,使得程序在修改, 执行的时候显得方便易行。
4.2 系统程序设计 本设计中,软件设计采用模块化操作,利用各个模块之间的相互联系,在设
计中采用主程序调用各个子程序的方法,使程序通俗易懂,我们设计了整体程序 流程图:
在 main 函数编写开始,要进行初始化,包括对系统初始化和对存储器初始 化,要对硬件设备进行初始化,并使硬件处于就绪状态。
通过判断是否计费,调价,清零等状态,来分别调用不同的子程序,使程序 在设计之前,就有了很强的逻辑关系。
这些对应于硬件就是通过按下各个控制开关,来分别进行不同的动作,最后 数码管根据输入的信息,来显示不同的数据信息,这就达到了软件控制硬件,同 时输入信息控制输出信息的目的。
整个程序的流程图如图 4.1 所示:
不得用于商业用途

仅供个人参考
N N

初始化 开始显示
N 判断是否进入调价模式
Y 进入调价模式
判断是否开始计费 Y
调用计费子程序
判断是否停止键按下
Y 结果显示
清显示单价复位 图 4.1 系统程序流程图

不得用于商业用途

仅供个人参考
5 系统调试
系统调试包括软件调试和硬件调试。硬件调试的任务是排除所焊接电路故 障。软件调试是利用开发工具进行在线仿真调试。调试的一般过程如图 5.1 所示:
系统调试
硬件调试
软件调试
系统联调
现场调试
调试结束
图 5.1 系统调试流程图
系统调试的一般过程是上电运行后观察其运行状态,数码管是否点亮等。软 件调试先是各个模块、各个子程序分别调试,最后进行系统联机调试。 5.1 软件调试
5.1.1 编程工具—C51 语言 8051 单片机的应用程序设计,使用 C51 语言进行程序设计虽然相对于汇编
语言代码效率有所下降,但可以方便地实现程序设计模块化,代码结构清晰、可 读性强,易于维护、更新和移植,适合较大规模的单片机程序设计。近年来,随 着 C51 语言的编译器性能的不断提高,在绝大多数应用环境下,C51 程序的执行 效率已经非常接近汇编语言,因此,使用 C51 进行单片机程序设计已经成为单 片机程序设计的主流选择之一。
5.1.2 程序调试工具—KEIL 本设计的软件都是在 Keil u Vision 7.5 上进行编写,编译,调试以及运行操
作。
不得用于商业用途

仅供个人参考
5.1.3 单片机仿真软件在线调试—PROTEUS
1.打开 Proteus 软件。 2.选择 file 菜单下的 open design 选项,找到所需的元器件,元器件上单击 右键选中,再单击左键对其进行命名和赋值,接着在编辑器左边的一栏中,找出 并绘制设计所要的各种元器件,按照电路图连接后并保存。 3.将用 keil 编译产生的 hex 文件下载到单片机中:双击 51 单片机,在对话 框中把保存过的 hex 文件打开,再单击确定。 4.单击左下角运行按钮,进行软件仿真调试,直到出现正确的结果。 图 5.2 为软件的仿真窗口图:

vcc

R7

C3

20

1uF

R1
1k

U2
19 XTAL1 18 XTAL2
9 RST

29 30 31

PSEN ALE EA

1 2 3 4 5 6 7 8

P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7

AT89C51

P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7

39 38 37 36 35 34 33 32

P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15

21 22 23 24 25 26 27 28

P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD

10 11 12 13 14 15 16 17

U1

2 3 4 5 6 7 8 9

A0 A1 A2 A3 A4 A5 A6 A7

B0 B1 B2 B3 B4 B5 B6 B7

18 17 16 15 14 13 12 11

19 1

CE AB/BA

74LS245

R3
10k

RP1
1
2 3 4 5 6 7 8 9

U3

6 5

SCL A0 SDA A1
A2

1 2 3

FM24C02

R2
10k

图 5.2 Proteus 仿真图
5.2 系统仿真 下图是通过在 Keil C 中编译通过,并生成 Hex 文件,在 PROTEUS 中仿真
通过的整体硬件原理图如图 5.3 所示:

不得用于商业用途

仅供个人参考

此位为多功能位,当为1时,可以调整单价,由最后两位显示

计价(3位)

公里数

vcc

R7

C3

20

1uF

R1
1k
KEY1 KEY2 KEY3 KEY4

U2
19 XTAL1 18 XTAL2
9 RST

29 30 31

PSEN ALE EA

1 2 3 4 5 6 7 8

P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7

AT89C51

P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7

39 38 37 36 35 34 33 32

P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15

21 22 23 24 25 26 27 28

P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD

10 11 12 13 14 15 16 17

U1

2 3 4 5 6 7 8 9

A0 A1 A2 A3 A4 A5 A6 A7

B0 B1 B2 B3 B4 B5 B6 B7

18 17 16 15 14 13 12 11

19 1

CE AB/BA

74LS245

R3

KEY5

10k

RP1
1
2 3 4 5 6 7 8 9

U3

6 5

SCL A0 SDA A1
A2

1 2 3

FM24C02

R2
10k

图 5.3 仿真结果
图中五个按键的作用 KEY1:按下时系统开始计价,抬起后系统计价暂停; KEY2:功能调节按钮,当此按键触发第 4 位数码管显示为 1 时,进入单价 调节模式; KEY3:与 KEY2 配合使用,当进入单价调节模式时,此按键触发增加单价; KEY4:按下时,计价器显示清零,单价恢复到初始状态; KEY5:1 号中断触发按键,当连续按两下时,车量记录的行驶公里数加 1。

不得用于商业用途

仅供个人参考
总结
在本次设计中,我们采用 AT89C51 芯片为核心器件,设计出了简单的出租 车计价器,能够实现显示总金额和总里程,按键控制清零、调价。
选题后,我便开始复习单片机方面的知识,也查阅、搜索了很多相关资料, 进行总体设计与具体设计,同时也学习仿真软件 Protues 和编程软件 KeilC。由 于以前都采用汇编语言实现编程,对用 C 语言来实现单片机的编程不太习惯, 花费了一些时间来熟悉 C 语言的编程。在设计开始,要形成流程图,它可以使 设计有一定的逻辑性与严密性,使得设计思路明确。采用模块化的设计思想很重 要,它方便编写、修改与调试,另外加上必要的注释,便于交流与理解。
这次毕业设计完成后,体会颇多,在学与做的过程中,取长补短,不断学习 新的知识,吸取经验,达到进步的目的。通过自身的努力以及相关图书资料的帮 助,逐渐熟悉了 KEIL、PROTEUS 和 C 语言等软件的使用以及硬件检测过程中 的一些小技巧。本次设计我学习到不少单片机的知识,但由于自己的理论知识水 平有限,实践知识和设计经验不足,在设计过程中难免存在一些问题。恳请各位 老师批评指正,以使我在以后的学习和实践中加以改进和提高。
不得用于商业用途

仅供个人参考
致谢
经过这学期的努力,本次毕业设计已经接近尾声。作为一个本科生的毕业设 计,由于没有足够的经验,难免有诸多考虑不周的地方,好在有导师的指导和同 学们的帮助,我才能按时完成任务。
毕业设计培养了我们独立思考问题,分析问题与解决问题的能力,在设计中 我明白了理论与实践有很大的区别,理论上可以实现的,但要做具体的实物,却 要多方面考虑。在老师的指导下,加上同学的讨论与分析,使所遇到的问题逐步 得到解决。感谢我的指导老师老师,从课题的选择到项目的最终完成,老师都给 予了我们细心的指导和不懈的支持。他严谨细致、一丝不苟的作风一直是我学习 中的榜样,并将继续影响我今后的学习和工作。在此谨向老师致以诚挚的感谢。
我们的大学即将结束,今天的成绩也一直以来关心、教导我的父母、老师密 不可分,在此祝愿他们身体健康、工作顺利、万事如意!
我再次感谢学校和老师给了我这次实践锻炼的机会,以及很多同学对我的帮 助,为此我将尽最大的努力,并以最好的心态来回报社会,服务祖国。
不得用于商业用途

仅供个人参考
参考文献
[1]谭浩强.C 程序设计(第二版)[M].清华大学出版社,2003:44-45. [2]胡泉,谢芳.C 语言程序设计[M].华中科技大学出版社,2009:17-18. [3]戴佳.51 单片机 C 语言应用程序设计实例精讲[M].电子工业出版社,2007:104-105. [4]张毅刚.单片机原理及应用[M].高等教育出版社,2004,(1):66-68. [5]马忠梅.单片机的 C 语言应用程序设计(第三版)[M].北京航空航天大学出版社,2004:30-32. [6]胡汉才.单片机原理及其接口技术[M].北京:清华大学出版社,1995:78-79. [7]潘永雄.新编单片机原理与应用[M].西安电子科技大学出版社,2010:160-163. [8]肖玲妮,袁增贵.Protel 99 SE 印刷电路板设计教程[M].清华大学出版社,2003:26-28. [9]戴梅萼,史嘉权.微型计算机技术与应用[M].清华大学出版社,2003:58-60. [10]何立民.单片机应用系统设计[M].北京:北京航空航天大学出版社,2000:13-14. [11]陈明荧.8051 单片机课程设计实训教材[M].北京:清华大学出版社,2004:303-304. [12]王卫平.电子工艺技术基础[M].电子工业出版社,2004:99-100. [13]张靖武.单片机原理应用与 PROTEUS 仿真[M].电子工业出版社,2009:130-132. [14]杨恢先,黄辉先.单片机原理及应用[M].长沙:国防科技大学出版社,2003:92-93. [15]姚凯学.单片机原理及应用[M].重庆:重庆大学出版社,1998:178-179. [16]陈启美.外设接口[J].北京:清华大学出版社,2002:65-67. [17]何小艇.电子系统设计[J].浙江:浙江大学出版社,2006:89-90.
[18]华成英.模拟电子技术基础[M].北京:高等教育出版社,2006202-203.
不得用于商业用途

仅供个人参考
附录 程序源代码 #include <AT89x51.h> //#include <stdio.h> #include <intrins.h> For personal use only in study and research; not for commercial use

#define uchar unsigned char #define uint unsigned int int xscode[6]={0x3f,0x06,0x5b,0x4f,0x66,0x6d};//显示存储区 For personal use only in study and research; not for commercial use

int zxscode[6]={0x1f,0x2f,0x37,0x3b,0x3d,0x3e};//共阴显示片选码 int codetab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极 数码

int i,j,flag;

uchar sec; int kk=0;//路程标志位 int jkk=0;//费用 int jflag=0;//费用标志位 int kflag=0;//路程标志位 int zdflag=0;//中断标志位 int kilo=0;//路程 int dj=1;//路程单价 int djflag=0;//路程单价 biaozhiwei

sbit key1=P1^0;

sbit key2=P1^1;

sbit key3=P1^2;

sbit key4=P1^3;

sbit key5=P3^4; sbit SDA=P3^0;

//IIC 引脚

sbit SCL=P3^1;

不得用于商业用途

仅供个人参考

void delay()

{;;} void delay1 (xms)//延时程序子程序

{

uint i,j;

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

for(j=110;j>0;j--);

} void start()

//IIC 开始位

{

SDA = 1;

SCL = 1;

delay();

SDA = 0;

delay();

}

void stop()

// IIC 停止位

{

SDA = 0;

delay();

SCL = 1;

delay();

SDA = 1;

} void respons()

//IIC 应答位

{

uchar i;

SCL=1;

delay();

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

i++;

SCL=0;

不得用于商业用途

仅供个人参考
delay(); } void init() { SDA=1; delay(); SCL=1; delay(); }

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)

// 从 MCU 写到 EEPROM

{

uchar i,temp;

temp=date;

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

{

temp=temp<<1;

SCL=0;

delay();

不得用于商业用途

仅供个人参考

SDA=CY; delay(); SCL=1;

delay(); } SCL=0; delay(); SDA=1; delay(); } void write_data(uchar addr, uchar date) 据 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); respons(); write_byte(addr);
不得用于商业用途

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

仅供个人参考
respons(); start(); write_byte(0xa1); respons(); date=read_byte(); stop(); return date; } void xianshi()//显示程序子程序 { for(flag=0;flag<6;flag++) { P0= xscode[flag];//送显示码 P2= zxscode[flag];// 送片选码 delay1(2); P0=0; } } void jijia()//计费子程序 { if(kk<=2)//计价方案 {jkk=4;//起步价 4 元 kk=2; } else if(kk>2&&kk<=35) { jkk=4+dj*(kk-2)+1; } else if(kk>35&&kk<900) { jkk=4+2*dj*(kk-2)+1;
不得用于商业用途

仅供个人参考
} kflag=kk/100;//路程百位 jflag=jkk/100;//路费百位 xscode[2]=codetab[kflag]; xscode[5]=codetab[jflag]; kflag=kk/10;//路程十位 jflag=jkk/10;//路费十位 xscode[1]=codetab[kflag]; xscode[4]=codetab[jflag]; kflag=kk%10;//路程个位 jflag=jkk%10;//路费个位 if(kflag==0){kflag=2;}//不足两公里时,显示两公里 xscode[0]=codetab[kflag]; xscode[3]=codetab[jflag]; } void qingling() { for(i=0;i<=5;i++)//显示码清零 {xscode[i]=0x3f;} } void main()//主程序 { init(); sec=read_data(2); if(sec>100) sec=0; TL0=(65536-2)%256 ;//计数值设置,记满两次产生中断 TH0=(65536-2)/256 ; TMOD=0x06; EA=1; ET0=1; TR0=0;//关定时器
不得用于商业用途

仅供个人参考
kilo=0; qingling(); aa: if(key1==0)//当键按下去,开始计费
{TR0=1;//开计数器 0 kk=kilo; jijia();}
if(key1==1)//当键松开,停止计费 {
TR0=0;//停计数器 1 if(key2==0)//功能调整键 { delay1(10);//延时判断键是否松开 if(key2==1) {xscode[2]=codetab[djflag++];}//当 p1.2 口的按键按下时功能标志位加 一 } if(key3==0&&djflag==2)//当功能键标志位等 1 时,改变每公里的价钱 {
delay1(10); if(key3==1) {dj++;} xscode[1]= codetab[dj/10] ;//把价钱十位送显示区,单价不能超 100 xscode[0]=codetab[dj%10]; } if(key4==0)//有键按下,清显示,单价会初始值,单价标志位清零 { qingling(); dj=1; djflag=0; }
不得用于商业用途

仅供个人参考
} xianshi();//调显示子程序 goto aa; }
void Timer0_Int() interrupt 1 using 2 // 计数器 0 中断服务 {
zdflag=zdflag+1;//中断标志位加一 if(zdflag==2)//当中断产生二次后,路程加一公里并清中断标志位 { zdflag=0; kilo=kilo+1; } }
不得用于商业用途

仅供个人参考
仅供个人用于学习、研究;不得用于商业用途。
For personal use only in study and research; not for commercial use. Nur für den pers?nlichen für Studien, Forschung, zu kommerziellen Zwecken verwendet werden. Pour l 'étude et la recherche uniquement à des fins personnelles; pas à des fins commerciales.
т о л ь к о для людей, которые используются для обучения, исследований и не должны использоваться в коммерческих целях.
以下无正文
不得用于商业用途



热文推荐
猜你喜欢
友情链接: 简历 面试求职范文 职业规划 自我管理 社交礼仪 76242百科