基于AT89C51的计价器设计

目 录
第1章 概 述 1
1.1 设计目的 1
1.2 课题背景 1
1.3 课题意义 2
1.4 国内外研究现状 2
1.5 主要内容 3
第2章 方案分析 4
2.1 方案论证与比较 4
2.2 硬件设计说明 5
2.3 系统的工作原理 6
2.4 本章小结 6
第3章 硬件系统设计 7
3.1 单片机的简介 7
3.2 时钟电路 9
3.3 复位电路 9
3.4 液晶显示电路 10
3.5 掉电存储单元设计 12
3.6 按键设计 13
3.7 空车牌模块 14
3.8 电机模块 15
3.9 红外传感器电路 15
3.10 本章小结 16
第4章 软件设计 17
4.1 软件设计方案选择 17
4.2 系统程序设计 17
4.3 主程序模块 17
4.4 掉电保护模块 19
4.6 显示模块 21
4.8 几个关键模块设计 23
4.9本章小结 25
第5章 改进方案、仿真和调试 26
5.1 电路元件检测 26
5.2 软件仿真步骤 26
5.3 硬件检测 27
5.4 系统联调 28
5.5 改进方案 28
5.6 实物图片 29
5.7本章小结 30
结 论 31
参考文献 32
致 谢 33
附录1 34
附录2 44
附录3 45
1.5 主要内容
本设计介绍了一种以AT89C52单片机为核心的,具有计时、计价、性能可靠、电路简单、成本低等特点的多功能出租车计价器,能够很好的满足市场对出租车计价器的要求。本设计的目的就是通过对现有计价器的分析,从而解决计价器的现存问题,同时完成具有单价输出、单价调整、路程输出等功能的新型计价器的硬件及软件设计。
本文结构如下:
第一章主要介绍了课题的背景、意义,国内外现状和本文主要研究内容。
第二章主要介绍了课题的方案选择、工作原理以及实物照片。
第三章主要介绍了系统各个模块的硬件设计原理。
第四章主要介绍了系统各个模块软件的设计原理。
第五章主要展示了系统仿真、实物制作过程以及还有可以改进的地方。
第2章 方案分析
2.1 方案论证与比较
通过需求分析可以初步对系统的设计方案进行三种构架:
1、GPS 全球定位系统,两点一线,计算距离方案。
2、基于DSP的油箱计量器系统,通过使用油量计算距离。
3、基于单片机的红外传感器模拟系统。
4、模拟电路和数字电路设计的计价器整体电路设计系统。
5、基于MAX+PLUSII的PLD计价器系统。
方案一:采用GPS模块将起点和目的地的坐标采集到单片机中,通过运算,计算出两点的直线距离,再根据出租车地区内单价以计算本次行驶金额。
方案二:本方案是从加油站加油时油枪喷油计费的思路来通过路程消耗的油量来计量行驶金额,通过计算油箱内汽油的消耗量,根据出租车的百公里油耗换算成公里数,然后在折算出本次行驶金额。
方案三:采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。采用数字电路控制,采用传感器件,输出脉冲信号,经过放大整形作为移位寄存器的脉冲,实现计价。
方案四:采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。设计采用AT89C52单片机为主控器,以WYC H105光电传感器配合直流电机加旋转叶片模拟测距,实现对出租车的基本的计价设计,并采用AT24C02实现在系统掉电的时候保存单价等信息,输出采用LCD1602显示模块。利用单片机丰富的I/O端口,及其控制的灵活性,实现基本的计价功能。
方案五:利用可编程逻辑器件,以及相应编程软件制作出租车计价器,可编程逻辑器件由以下几部分组成:一个二维的逻辑块阵列,构成了PLD器件的逻辑组成核心;输入/输出块,连接逻辑块的互连资源;连线资源,由各种长度的连线线段组成,其中也有一些可编程的连接开关,它们用于逻辑块之间、逻辑块与输入/输出块之间的连接。
方案一由于只是计算直线距离,对于城市路段来说,出租车司机往往不能直线到达目的地,没有考虑到司机师傅的收益,所以排除方案一;方案二考虑到油箱吸出油后还在油管处还多出一段汽油。多算了这部分汽油,对乘客来说是不公平的,所以排除了方案二。方案三考虑到这种电路设计过于复杂,对于模式的切换需要用到机械开关,机械开关时间久了会造成接触不良,功能不易实现,性能不够稳定,电路也不实用。方案四采用了单片机作为主要控制元器件,单片机具有小巧、功能强、开发速度快、节能、电池下也好工作、可靠性高,成本极低等优势、外延电路可以随意添加;方案五直接利用PLD可编程逻辑器件进行控制,但是由于本设计模式很多,需要中断较多,所以不选择方案五。
通过比较以上五种方案,我们采用方案四实现出租车计价器的功能。本电路设计的计价器能实现基本的计价功能,单片机计算总价的公式为:总价=起步价+单价*(总里程-起步里程)。AT89C52作为一个单片微型计算系统,灵活性高,其强大的控制处理功能和可扩展功能设计电路提供了很好的选择。
2.2 硬件设计说明
单片机是单片微型计算机的简称,单片机以其卓越的性能,得到广泛的应用,已经深入到各个领域。P0口为8位三态I/O口,此口为地址总线及数据总线分时复用;P2口为8位准双向口,与地址总线高八位复用;P0口和P2口都有一定的驱动能力,P0口的驱动能力较强。
设计电路时,考虑到用里程传感器价格昂贵,且不便于试验检测,在设计中采用一个光电开关来代替。光电开关一端接单片机12管脚,另一端接地,通过直流电机带动叶片改变光电开关之间的光通量,测量出叶片转过多少圈,模拟车轮转动,经过一定圈数(本实验用200转代替一公里),通过在程序中设置的里程和金额的信息,就可以在液晶显示屏上分别显示总金额和总里程。试验中为了提供掉电保护,还应用了AT24C02芯片。
在显示方面,可以用液晶显示,也可以用数码管进行显示。由于在这次设计中显示里程和金额信息,我们采用液晶屏进行显示。这样简化了程序,也可以达到简化电路的目的。此外,用LCD1602显示模块显示直观,操作简单。相比数码管的应用要方便许多。
我们还设计了控制按键,能够很好的对出租车计价器控制,如空车牌,等待模式按键,复位按键等。
在这里插入图片描述

图2-1 系统结构图
2.3 系统的工作原理
本设计重点是设计主机模块,并将各个硬件的功能显示在选定的显示器上。其中硬件和显示部分是由主机模块控制,各种功能的显示由显示电路来完成。设计中选用时钟模块来保证基本的时间和日期显示的正确性,掉电存储来存储基础设置信息,显示电路作为基本的输出设备。在出租车转轴上加装传感器,以便获得“行驶里程信号”。利用单主机模块行计数,从而计算出里程及所需要的金额。然后传送给显示电路显示所有的信息。本系统可以实现单价、里程及金额,并能对所有的基础数据进行设置。

设计源程序:
#include <reg52.h>
#include "AT24C02.h"
#include "LCD1602.h"
sbit LED       = P1^2;
sbit MOTOR     = P1^7;
sbit IsBoby    = P1^3;
sbit IsGo      = P1^4;
sbit IsDay     = P1^1;
unsigned int count;
unsigned int kmCount;
unsigned char TimeOneCount;
unsigned char CarStopTime;
unsigned char DayAndNig;	
unsigned char FLAG = 3;
void InitExterZero(void)
{
	EA=1;//开总中断
	EX0=0;//开外部中断0
	IT0 = 1;
}
void Init_Time(void)
{
	TMOD = 0x11;						//设置定时器模式
	TH1 = (65536-50000)/256;			//装初值
	TL1 = (65536-50000)%256;
	TR1 = 0;							//开定时器
	ET1 = 1;						   	//定时器中断
	EA = 1;								//开总中断	
}
void main(void)
{
	Init_LCD();
	Init_Time();
	init_eeprom();
	InitExterZero();
	DayAndNig   = read_add(0x01);
	delay_LCD(5);	   
	kmCount     = read_add(0x02)*256;
	delay_LCD(5);
	kmCount    += read_add(0x03);
	delay_LCD(5);
	CarStopTime = read_add(0x04);
	delay_LCD(5);
	while(1)
	{		
		if(IsBoby == 0)
		{  
			LED = 0;
			TR1 = 0;
			EX0 =1;	
			MOTOR = 0;
			FLAG = 1;
			DisplaySomebobyOpen();
		}
		if(FLAG == 1)
		{	 
			DisplaySomebobyOpenData(DayAndNig,kmCount,CarStopTime);
			write_add(0x01,DayAndNig);	 	delay_LCD(5);
			write_add(0x02,kmCount/256);  	delay_LCD(5);
			write_add(0x03,kmCount%256);   	delay_LCD(5);
			write_add(0x04,CarStopTime);   	delay_LCD(5);
		}
		if(FLAG == 1 && IsGo == 0)
		{
			TR1 = 1;
			EX0 =0;	
			MOTOR = 1;
			FLAG = 2;
			DisplaySomebobyClose();
		}
		if(FLAG ==2)
		{
			if(kmCount < 4)
				CarStopTime = 0;
			DisplaySomebobyCloseData(DayAndNig,kmCount,CarStopTime);
			write_add(0x01,DayAndNig);	   	delay_LCD(5);
			write_add(0x02,kmCount/256);	delay_LCD(5);
			write_add(0x03,kmCount%256);	delay_LCD(5);
			write_add(0x04,CarStopTime);	 delay_LCD(5);
		}
		if(IsDay == 0)
		{
			EX0 =0;	
			TR1 = 0;
			FLAG =3;
			MOTOR = 1;
			LED = 1;
			DayAndNig =0;
			kmCount = 0;
			CarStopTime = 0;
			Init_LCD();	
						write_add(0x01,0);		  	delay_LCD(5);
			write_add(0x02,0);		  	delay_LCD(5);
			write_add(0x03,0);		  	delay_LCD(5);
			write_add(0x04,0);		  	delay_LCD(5);
		}
		if(FLAG ==3 && IsGo == 0)
		{
			while(IsGo == 0);
			if(DayAndNig == 0)
			{
				write_com(0x80+0x40+0x01);
				write_date('N');
				write_date('i');	
				write_date('g');
				DayAndNig = 1;
			}
			else
			{
				write_com(0x80+0x40+0x01);
				write_date('D');
				write_date('a');	
				write_date('y');
				DayAndNig = 0;	
			}
		}	
	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shejizuopin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值