用8031单片机控制出租车计价系统.docx

上传人:b****3 文档编号:3853167 上传时间:2022-11-25 格式:DOCX 页数:20 大小:235.87KB
下载 相关 举报
用8031单片机控制出租车计价系统.docx_第1页
第1页 / 共20页
用8031单片机控制出租车计价系统.docx_第2页
第2页 / 共20页
用8031单片机控制出租车计价系统.docx_第3页
第3页 / 共20页
用8031单片机控制出租车计价系统.docx_第4页
第4页 / 共20页
用8031单片机控制出租车计价系统.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

用8031单片机控制出租车计价系统.docx

《用8031单片机控制出租车计价系统.docx》由会员分享,可在线阅读,更多相关《用8031单片机控制出租车计价系统.docx(20页珍藏版)》请在冰豆网上搜索。

用8031单片机控制出租车计价系统.docx

用8031单片机控制出租车计价系统

桂林电子科技大学

单片机最小应用系统

指导老师:

吴兆华

学生:

严天祥

学号:

092011104

机电工程学院

2010年6月

 

单片机最小应用系统设计报告

一、设计题目和要求3

二、设计目的3

三、系统硬件图3

四、程序流程图4

五、系统说明与分析5

5.1最小系统控制部分5

5.2单片机的I/O接口6

5.3单片机使用的外围电路7

5.4中断控制9

5.5数码管显示模块11

5.6电路板的制作13

5.7系统连线说明分析14

5.8系统调试15

六、源程序15

七、总结19

八、参考文献19

 

一、设计题目和要求

题目:

出租车计价系统。

要求:

用8031单片机控制出租车计价系统。

要求价格=速度*时间*单价。

并要求用单片机的定时/计数器控制LED数码管显示总价格和行驶时间。

(本例中速度为36km/h,即0.01km/s,单价为白天1元/km,晚上2元/km)

二、设计目的

1、进一步熟悉和掌握单片机的结构及工作原理,加深对单片机理论知识的理解;

2、掌握单片机内部功能模块。

如定时/计数器、中断系统、存储器、I/O口等;

3、掌握单片机的编程方法,调试方法;

4、掌握单片机应用系统的构建和使用,为以后设计和实现单片机应用系统打下良好的基础。

5、提高处理实际问题的能力和独立分析思考的能力。

三、系统硬件图

1、出租车计价系统的硬件电路原理图如下:

图1电路原理图

2、出租车计价系统的硬件电路PCB图如下:

图2PCB图

四、程序流程图

出租车计价系统程序框图如下:

五、系统说明与分析

5.1最小系统控制部分

最小系统的控制器由单片机AT89S51实现,它是单片机MCS-51高性能8位机系列的一种,广泛应用于各种小型控制系统中,其引脚图如图4所示。

图4

AT8S51包含128字节RAM、32条I/O口线、3个16位定时/计数器、6输入4优先级嵌套中断结构、1个串行I/O口(可用于多机通信I/O扩展或全双工UART以及片内振荡器和时钟电路)。

功能结构如图5所示:

图5AT89S51单片机功能结构图

5.2单片机的I/O接口

接口电路是单片机必不可少的组成部分,并行输入输出接口是CPU和外部进行信息交换的主要通道。

MSC-51系列单片有4个8位并行双向I/O口P0~P3,共32根I/O线。

单片机可以外接键盘、显示器等外围设备.还可以进行系统扩展,以解决硬件资源不足问题。

4个并行口都是双向口,既可以输入又可以输出。

P0、P2口经常作外部扩展存储器时的数据、地址线,P3口除作I/O口外,每一根都有第二功能。

现简要介绍P0,P2口的电路如下:

(1)P0口:

P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

图6P0口的位结构

(2)P2口的位结构比P1多了一个控制转换部分,结构与P0口基本相似,如图7所示。

P2口改P0推拉式输出驱动电路为上拉电阻式,当控制信号s为低电平,作I/O口使用时,多路开关MUX使锁存器输出端Q与输出驱动输入端接通,构成一个准双向口。

此外,当外部扩展存储器时,P2口常做高8位地址线使用。

图7P2口的位结构

5.3单片机使用的外围电路

单片机应用系统中,除了基本计算机系统单元电路外.还需配备完整的外围电路、以完成复位、掉电保护、提供时钟、节电等功能。

(1)时钟电路:

单片机内部有一个高增益的反相放大器,通过XTAL1和XTAL2引脚外接石英振于或陶瓷振子、微调电容组成振荡器如图8所示。

该振荡器发出的脉冲直接送入内部时钟电路。

振荡器若外接的是石英扳子,微调电容通常选择30pF;外接陶瓷娠子时选样47pF。

振荡频率范围选择1.2—12M。

MCS5-51系列单片机也可以采用外接时钟,这时XTAL2脚用来输入外部时钟信号(XTAL2脚为内部时钟电路的输入端),XTALl脚则接地如图8-b所示。

对于CHM05工艺制造的80C51单片机,则应从XTALl脚输入外部时钟信号,XTAL2脚悬空。

本单片机最小系统设计时采用的是外接石英晶体震荡电路。

采用此电路的优点是不用外接时钟,手动制板比较容易制板,调试方便。

(2)复位电路:

复位使单片机处于起始状态,并从此状态开始运行MCS5-51单片机RST引脚为复位端,该引脚连续保持2个机器周期(24个时钟振荡周期)以上的高电平。

可使单片机复位。

本论文使用的是外部复位电路,单片机在启动后要从复位状态开始运行,因此上电时要完成复位工作,称上电复位,如图9-a所示。

上电瞬间电容两端的电压不能发生突变,只RST端为高电平+5v,上电后电容通过及RC电路放电RST端电压逐渐下降,直至低电平0V,如图9-c所示。

适当选择R、C的值,使RST端的高I电平维持2个机器周期以上即可完成复位。

单片机L在运行过程中,出于本身或外并干扰的原因会导致出错。

这时可按复位键以重新开始远行,按键复位可分为按键电平复位或按健脉冲复位,如图9-b所示。

按键脉冲复位和上电平复值的原理是一样的,都是利用RC电路的放电原理,如图9-d所示。

让RST端能保持一段时间的高电平,以完成复位,按键电平复位时,按键时间也应保持在两个机器周期以上。

图8(a)外接石英晶体振荡电路图8(b)外接时钟电路

(a)上电复位(b)按键电平复位

(c)RC放电过程(d)电平复位过程

图9单片机常用复位电路

本实验由于设计的系统简单且对控制系统精度的要求不高而采取了按键电路复位,电路图9(b)所示。

这种时钟电路的优点是手动复位操作可以给调试带来方便。

根据要求所最小系统所选用的器件有单片机AT89S51一个、电容30pf的两个、晶振12M一个、100pf电容一个、1K电阻一个。

最小系统原理图如图10所示:

图10最小系统控制原理图

从上图可以看到除了最基本的外围电路,在单片机PO接口处还加了一个1K上拉电阻R10,此电阻作为上拉电阻使用。

上拉电阻就是把不确定的信号通过一个电阻钳位在高电平,此电阻还起到限流的作用。

使用时将比较器LM324的输出端与P0口及上拉电阻的一端相连,上拉电阻的另一端与电源VCC相连。

上拉电阻的作用为:

1、当TTL电路驱动COMS电路时,如果TTL电路输出的高电平低于COMS电路的最低高电平(一般3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。

2、OC门电路必须加上拉电阻,以提高输出的高电平值。

3、为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。

4、在COMS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻产生降低输入阻抗,提供泄荷通路。

5、芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限增强抗干扰能力。

6、提高总线的抗电磁干扰能力。

管脚悬空就比较容易接受外界的电磁干扰。

7、长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。

在最小系统中使用上拉电阻可以有效提高单片机的带负载能力,从而让单片机很容易的接收到比较器输出端发出的中断信号。

另外上拉电阻的选型原则包括:

1、从节约功耗及芯片的灌电流能力考虑应当足够大;电阻大,电流小。

2、从确保足够的驱动电流考虑应当足够小;电阻小,电流大。

3、对于高速电路,过大的上拉电阻可能边沿变平缓。

综合考虑以上三点,通常在1k到10k之间选取。

故本次设计采用1K的上拉电阻。

5.4中断控制

中断:

当CPU正在处理某件事情的时候,外部发生的某一件事(如一个电平的变化,一个脉冲沿的发生或定时器计数溢出等)请求CPU迅速去处理,于是CPU暂时中止当前的工作,转去处理所发生的事件。

中断服务处理完成事件以后再回到原来被中止的地方,继续原来的工作,这样的过程称为中断。

计算机的中断系统可以使CPU与外设同时工作。

AT89S51为MCS-51系统的一种单片机,其中断系统具有三类共五个中断源.两个外部中断源,分别通过引脚INT0和INT1引入中断请求信号,且都有相应的中断优先级,优先级排列顺序如下:

外中断源有两种中断触发方式:

电平触发方式和脉冲触发方式.内部有两个定时器/计数器T0和T1,用于进行定时和计数控制,是内部中断源.T0和T1在内部时钟脉冲(或者外部计数脉冲)的作用下进行定时(或者计数).定时(或者计数)结束时,由硬件产生溢出中断信号向CPU提出中断请求.由CPU对定时(或者计数)结果进行处理.AT89S51有一个全双工异步串行中,用于进行串行通信,是内部中断源.其中定时器/计数器中断被广泛用在各种控制系统中。

AT89S51为每个中断源设置了中断请求标志位.检测到中断请求信号后,为相应的中断标志置位,以便在下一个机器周期进行下一步的控制和处理。

在相应的中断标志置位后,通过中断允许控制寄存器寄存器,其中使用六位。

EA(IE.7)为中断允许总控位,其状态由用户通过程序进行控制.EA=1时中断允许,即为开中断,EA=0时中断禁止,即为关中断。

ET1(IE.3)为定时器T1的中断允许控制位,ET1=1时,允许定时器T1中断,ET1=0时,禁止定时器T1中断。

ET0(IE.1)为定时器T0的中断允许控制位,ET0=1时,允许定时器T0中断,ET0=0时,禁止定时器T0中断.IE中还有三位用于对其它三个中断源进行中断允许控制。

8051系统复位后,IE寄存器中各位均被清0,禁止所有的中断。

在应用时,由软件进行设定。

既可以使用位操作,也可以使用字节操作来实现对IE的设置。

如开放定时器T1中断,使用位操作为:

SETB   EA

SETB   ET1

本实验中当有障碍物出现时,红外线发射接收中断,比较器输出一个高电平,向单片机控制系统发送中断请求。

CPU响应中断请求、为中断源事件进行处理,是通过执行中断服务程序实现的.AT89S51在内部ROM中为五个中断源定义了固定的中断服务区,其中:

000BH—0012H为定时器T0的中断服务区,001BH—0022H为定时器T1的为断服务区.响应中断请求后,CPU按照中断源的不同,自动转到各中断区的首地址去执行程序.中断区的首地址也称中断入口地址,是中断控制的要点之一。

但8个字节的中断服务区难以存下一般的中断服务程序,解决办法是在中断区的入口地址处存放一条无条件转移指令,将流程转入中断服务程序的真正入口,开始执行中断程序。

此外需要注意的是用中断方式进行编程应遵循以下步骤:

(1)开中断

(2)设置中断优先级

(3)TMOD初始化

(4)设置定时/计数初值

(5)启动定时/计数

(6)编写定时/计数中断处理程序

5.5数码管显示模块

(1)数码管的分类

LED数码管有两种不同的形式:

一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED数码管;另一种是8个发光二极管的阴极都连在一起的,称之为共阴极LED数码管。

八段LED数码管由8个发光二极管组成。

基中7个长条形的发光管排列成“日”字形,另一个圆点形的发光管在显示器的右下角作为显示小数点用,它能显示各种数字及部份英文字母。

四位八段数码管的引脚结构如图11所示:

图11四位八段数码管的引脚结构

其中S1,S2,S3,S4为字位选择端口,A,B,C,D,E,F,G,DP为字形选择端口。

(2)数码管的显示原理

数码管在应用时首先要区分是共阳数码管还是共阴数码管,不同类别的数码管接法不同,并且数码管的显示也分为动态显示和静态显示。

静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。

当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。

这种方法的优点是占用CPU时间少,显示便于监测和控制。

缺点是硬件电路比较复杂,成本较高。

动态显示的特点是将所有位数码管的段码并联在一起,由位码控制是哪一位数码管有效。

这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路。

选亮数码管采用动态扫描显示。

所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。

动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。

在本次的最小系统设计中我们应用的是动态扫描显示。

动态扫描显示接口是单片机中应用最为广泛的一种显示方式之一。

其接口电路是把所有显示器的8个笔划段A-H同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。

CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟那个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以就可以自行决定何时显示哪一位了。

所谓动态扫描就是指我们采用分时的方法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。

在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。

(3)TTL电路的驱动电流和数码管的驱动以及关于上拉电阻的作用

使用数字集成电路时,拉电流输出和灌电流输出是一个很重要的概念,例如在使用反向器作输出显示时,拉电流输出,即当输出端为高电平时才符合发光二极管正向连接的要求,但这种拉电流输出对于反向器只能输出零点几毫安的电流用这种方法想驱动二极管发光是不合理的(因发光二极管正常工作电流为5~10mA)。

灌电流输出,即当反向器输出端为低电平时,发光二极管处于正向连接情况,在这种情况下,反向器一般能输出5~10mA的电流,足以使发光二极管发光,所以这种灌电流输出作为驱动发光二极管的电路是比较合理的。

因为发光二极管发光时,电流是由电源+5V通过限流电阻R、发光二极管流入反向器输出端,好像往反向器里灌电流一样,因此习惯上称它为“灌电流”输出。

在数字电路中我们经常可以看到上、下拉电阻。

①定义:

●上拉就是将不确定的信号通过一个电阻嵌位在高电平!

电阻同时起限流作用!

下拉同理;

●上拉是对器件注入电流,下拉是输出电流;

●弱强只是上拉电阻的阻值不同,没有什么严格区分;

●对于非集电极(或漏极)开路输出型电路(如普通门电路)提升电流和电压的能力是有限的,上拉电阻的功能主要是为集电极开路输出型电路输出电流通道。

②拉电阻作用:

●一般作单键触发使用时,如果IC本身没有内接电阻,为了使单键维持在不被触发的状态或是触发后回到原状态,必须在IC外部另接一电阻;

●数字电路有三种状态:

高电平、低电平、和高阻状态,有些应用场合不希望出现高阻状态,可以通过上拉电阻或下拉电阻的方式使处于稳定状态,具体视设计要求而定;

●一般说的是I/O端口,有的可以设置,有的不可以设置,有的是内置,有的是需要外接,I/O端口的输出类似与一个三极管的C,当C接通过一个电阻和电源连接在一起的时候,该电阻成为上C拉电阻,也就是说,如果该端口正常时为高电平,C通过一个电阻和地连接在一起的时候,该电阻称为下拉电阻,使该口平时为低电平,作用就是当一个接有上拉电阻的端口设为输入状态时,他的常态就为高电平,用于检测低电平的输入;

●上拉电阻是用来解决总线驱动能力不足时提供电流的。

一般说法是拉电流,下拉电阻是用来吸收电流的,也就是我们通常所说的灌电流;

●接电组就是为了防止输入端悬空;

●减弱外部电流对芯片产生的干扰;

●保护cmos内的二极管,一般电流不大于10mA;

●通过上拉或下拉来增加或减小驱动电流;

●改变电平的电位,常用在TTL-CMOS匹配;

●在引脚悬空时有确定的状态;

●增加高电平输出时的驱动能力;

●为OC门提供电流。

5.6电路板的制作

ProtelDXP功能强大,为我们进行电子电路原理图和印制板图的设计提供了良好的操作环境。

用ProtelDXP进行电路设计分为两大部分:

原理图的设计和电路板的设计。

原理图的设计实在SCH系统中进行的,电路原理图是印刷板电路设计的基础,只有设计好原理图才有可能进行下一步的电路板设计。

用protelDXP进行电路板设计的第一步是其原理图的设计。

显然,原理图决定整个电路的基本功能,也是接下来生成网表和设计印刷板电路的基础。

具体步骤如下:

(1)图面设置:

ProtelDXP允许用户根据电路的规模设置图面的大小,按照偏好和习惯设置图面的样式。

实际上,设置图面就是设置了一个工作平面,以后的工作就要在这个平面上进行。

所以图面应该设置得足够大,为进一步工作提供一个足够大的工作空间。

(2)放置元件:

所谓放置元件就是从元件库中选取所需得元件,将其布置到图面上合适的位置,有时还要重定义元件的编号、封装。

元件的封装很重要,要根据元件的实际尺寸和实际封装来决定,要是元件没封装好,将会给以后电路板的制作带来很大的麻烦。

这些都是下一步工作的基础。

ProtelDXP为用户提供了一个非完备的元件库,并且允许用户对这个元件库进行编辑或者新建自己的元件库。

电路板的制作过程

(1)打印:

将生成的PCB图打印到热转印纸上,需注意线不能太窄,墨要加重,否则制板时容易断线,如果在操作过程中断了线,可用电烙铁将锡带过。

(2)熨烫:

将热转印纸覆在铜板上,用电熨斗进行熨烫,关键要注意熨烫的时间,不能太久,也不能时间太短,否则,太久会把铜板烫坏,不够的话墨迹覆不上去。

(3)腐蚀:

把铜板放到三氯化铁溶液中腐蚀,需注意溶液浓度要较高,最好用热水配置,这样腐蚀更快,一般3分钟即可。

如果时间过长,需剩下的铜线也可能被腐蚀。

(4)打孔:

打孔时注意钻头尺寸,本次用的钻头大小是0.8mm的,最需注意的地方是集成块的管脚,如果打孔误差大,管座就很难插上。

(5)放置元件:

放置前应先打磨一下打孔后留下的毛刺,并均匀地涂上松香水(目的是防止铜线氧化,易于焊锡覆着焊盘,但多涂会导致焊接时焊点变黑,影响美观)。

放置元件时注意集成块的管脚,二极管和电解电容的正负,这些都是平时比较容易出错的地方。

(6)焊接:

焊接技术比较难掌握,焊锡、烙铁与焊盘的位置关系,焊锡熔化时间长短,松香水的浓度,烙铁的温度等等,都是影响焊点美观的因素。

(7)检查:

检查是否有虚焊,集成块管脚位置是否正确,电源引线位置是否恰当等。

检查完毕就能进行调试了。

5.7系统连线说明分析

在本系统中单片机的P0口与2个二位数码管的8个数据输入端相连,P2口与1个四位数码管的8个数据输入端相连,P3口与驱动电路相连,P1.0,P1.1,P1.2,P1.3分别接控制开关,EA端需要与高电平相连,以保证单片机可以在内部存储器存储信息。

5.8系统调试

调试过程:

1、保证电路板连接正确后,接上电源,打开系统手动复位。

2、首先检查各个管脚、焊点是否损坏或者虚焊,通过系统工作时电压的变化来检查。

3、按下开关,观察数码管是否工作,如果工作,看是否与希望的实验现象相符合。

4、如果系统可以按所编程序完成相应的实验现象则调试成功,否则需要重新检查硬件电路及软件编程,重新调试。

调试结果:

通过几次调试可以达到自己预先设计的结果,白天跑1s计价0.01元,晚上跑1s计价0.02元,按暂停键停止计时。

实验过程中的问题及改进方法

1、制作电路板过程中由于焊接等原因,造成电路连接不通现象,浪费了调试时间。

2、忘记把EA端与高电平相连,导致系统不能正常工作。

3、开始时比较电路中P2口的数码管显示较暗,加了上拉电阻后显示效果较好,改善了电路性能。

3、由于本次实验时间有限,实验所采用的元器件简单,计时的精确度,有效范围都有待于加强,希望在以后的设计中能够有所改进。

六、源程序

#include"reg51.h"

unsignedcharcnt_time,cnt_cost;

unsignedchardatakey_val,key_val_old,flag;

unsignedcharstate_val,timecount,speed;

unsignedintm,s,s0,s1,m0,m1;

unsignedintfen,jiao,yuan1,yuan2;

charcodecost_val[2]={1,2};

charcodeled_seg_code[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x80};

//led_seg_code[0-9]代表0-9

//-------延时-----------------

voiddelay(unsignedinti)//延时

{while(--i);}

//-------初始化变量------------------

voidinit_variant()//初始化一些变量的内容

{

cnt_time=0;//时间的计数

cnt_cost=0;//保存总价格

speed=36;

}

//-------扫描键盘-----------------

unsignedcharscan_key()

{

unsignedchari,k;

i=P1;

if(i==0xff)

{k=255;}//无键按下

else//有键按下

{delay(10);//延时去抖动

if(i!

=P1)

{k=255;}

else

{switch(i)

{case0xfe:

k=0;break;//P1.0按下,启动键

case0xfd:

k=1;break;//P1.1按下,清除键

case0xfb:

k=2;break;//P1.2按下,切换键

}

}

}

returnk;

}

//-------数码管动态扫描-------------

voidled_show()

{

s=cnt_time%60;

s0=s%10;

s1=s/10;

m=cnt_time/60;

m0=m%10;

m1=m/10;

fen=cnt_cost%10;

jiao=cnt_cost/10%10;

yuan1=cnt_cost/100%10;

yuan2=cnt_cost/1000%10;

//-----显示时间----

P3=0xfe;

P0=led_seg_code[s0];

delay(10);

P3=0xfd;

P0=led_seg_code[s1];

delay(10);

P3=0xfb;

P0=led_seg_code[m0];

delay(10);

P3=0xf7;

P0=led_seg_code[m1];

delay(10);

//-----显示总价格-----------

P3=0xef;

P2=led_seg_code[fen];

delay(10);

P3=0xdf;

P2=led_seg_code[jiao];

delay(10);

P3=0xbf;

P2=led_seg_code[yuan1];

delay(10);

P3=0xbf;

P2=led_seg_code[10];

delay(10);

P3=0x7

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

当前位置:首页 > 工程科技 > 能源化工

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

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