基于51单片机的出租车计价器Word文件下载.docx
《基于51单片机的出租车计价器Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于51单片机的出租车计价器Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
关键词:
时钟芯片DS1302;
语音芯片ISD1420;
单片机AT89C51;
掉电保护芯片24C02;
前言
出租车行业在我国是八十年代初兴起的一项新兴行业,随着出租车行业的发展,出租车已经是城市交通的重要组成部分,出租车计费器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。
它关系着交易双方的利益。
具有良好性能的计费器无论是对广大出租车司机朋友还是乘客来说都是很必要的。
因此,汽车计价器的研究也是十分有一个应用价值的。
要将出租车计价系统产品化,应该根据客户不同的需求进行不同的设计,应该在程序中增加一些可以人为改变的参数,以便客户根据不同的需要随时调节单价以及计价方式。
因此,研究出租车计价器及扩大其应用,有着非常现实的意义。
多年来国内普遍使用的计价器只具备单一的计量功能。
目前全世界的计价器中有90%为台湾所生产。
现今我国生产计价器的企业有上百家,主要是集中在北京,上海,沈阳和广州等地。
我国第一家生产计价器的是重庆市起重机厂,最早的计价器全部采用机械齿轮构,只能完成简单的计程功能,可以说,早期的计价器就是个里程表。
随着科学技术的发展,产生了第二代计价器。
它采用了手摇计算机与机械结构相结合的方式,实现了半机械半电子化。
此时它在计程的同时还可完成计价的工作。
大规模集成电路的发展又产生了第三代计价器,也就是全电子化的计价器。
它的功能也在不断完善。
出租汽车计价器是一种专用的计量仪器,它安装在出租汽车上,能连续累加,并指示出行程中任一时刻乘客应付费用的总数,其金额值是计程和计时时间的函数。
出租车计价器在最初使用时具备的主要功能是根据行驶里程计价,要求精度高,可靠性好。
随着电子技术的发展以及对计价器的不断改进和完善,便产生了诸多的附加功能。
例如:
(1)LED显示功能,数码管的使用让计价器实现多屏显示的功能,可同时显示各项营运数据,使乘客一目了然;
(2)永久时钟功能,在非营运状态下,日历时钟芯片的使用使计价器可以显示永久时钟;
(3)存储功能,可存储多项营运数据,便于查询。
新型数据存储器的应用使得计价器的营运数据在掉电情况下还可以保存10年。
第一章出租车计价系统的设计要求与设计方案
1.1出租车计价器系统组成
此出租车计费系统以单片机为系统核心,利用89C51单片机配合六个数码管组成的显示模块及ISD1420语音模块等,实现基本的出租车计价器功能。
本系统是由89C51单片机、数码管显示模块、计数脉冲发生器、系统实时时钟及语音等模块组成。
系统框图如图1-1所示:
图1-1系统功能图
1.2系统主要功能
本课程设计所设计的出租车计价器的主要功能有:
里程计量及费用计算功能、实时时钟功能、按键功能。
1.3方案论证与比较
方案一:
采用数字电路控制。
采用传感器件,输出脉冲信号过放大整形作为移位寄存器的脉冲,实现计价,但是考虑到这种电路过于简单,性能不稳定,而且不能调节单价,也不能根据天气调节计费标准,电路不够实用。
方案二:
采用单片机控制。
利用单片机丰富的I/O端口,及其控制的灵活性,实现基本的里程计价功能和价格调节、时钟显示功能。
通过比较以上两种方案,单片机方案有较大的活动空间,不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级,所以我们采用后一种方案。
第二章出租车计价系统的硬件设计
4.1出租车的硬件框图
图2-2单片机控制方案
4.2AT89C51单片机的电路图及说明
AT89C51是一个低电压,高性能CMOS8位单片机,片内含4kbytes的可反复擦写的Flash只读程序存储器和128bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,内置功能强大的微型计算机AT89C51提供了高性价比的解决方案。
AT89C51是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,AT89C51可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
图2-2AT89C51引脚配置
4.3按键扫描模块
(1)按键扫描模块电路图及说明:
整个系统只有五个按键,一个“启动/停止”,四个功能调整按键;
本模块功能:
扫描按键功能,返回扫描。
图2-3-1
图2-3-2
4.4显示模块
本设计是用六个七段数码管动态扫描来实现的时钟与计价的显示。
图2-4数码管封装图及数据线与数码管管脚关系
4.5掉电保护模块
(1)本电路掉电保护采用了24C02芯片来完成此部分功能。
掉电存储单元的作用是在电源断开的时候,存储当前设定的单价信息。
AT24C02是ATMEL公司的2KB字节的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10Ua(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8脚的DIP封装,使用方便。
其电路如图2-5所示。
图2-5掉电存储电路原理图
图中R8、R10是上拉电阻,其作用是减少AT24C02的静态功耗,由于AT24C02的数据线和地址线是复用的,采用串口的方式传送数据,所以只用两根线SCL(移位脉冲)和SDA(数据/地址)与单片机传送数据。
每当设定一次单价,系统就自动调用存储程序,将单价信息保存在芯片内;
当系统重新上电的时候,自动调用读存储器程序,将存储器内的单价等信息,读到缓存单元中,供主程序使用。
4.6脉冲发生器模块
图2-6脉冲发生器模块
NE555定时器具有定时精度高、工作速度快、可靠性好、电源电压范围宽(3-18V)、输出电流大(可高达200mA)等优点,可组成各种波形的脉冲振荡电路、定时延时电路、是一种电路结构简单、使用方便灵活、用途广泛的多功能中规模集成电路。
只需在外部配接适当的阻容元件,便可组成施密特触发器、单稳态触发器和多谐振荡器等多种应用电路,在这个电路中是多谐振荡器,它电路简单、性能稳定,波形标准。
4.7时钟模块
图2-7时钟模块
1DS1302功能
内含有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM指示决定采用24或12小时格式DS1302与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线1RES复位2I/O数据线3SCLK串行时钟时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信DS1302工作时功耗很低保持数据和时钟信息时功率小于1Mw。
②特性:
1、实时时钟具有能计算2100年之前的秒分时日日期星期月年的能力还有闰年调整的能力;
2、318位暂存数据存储RAM;
3、串行I/O口方式使得管脚数量最少;
4、宽范围工作电压2.05.5V;
5、工作电流2.0V时,小于300nA;
6、读/写时钟或RAM数据时有两种传送方式单字节传送和多字节传送字符组方式;
7、8脚DIP封装或可选的8脚SOIC封装根据表面装配;
8、简单3线接口;
9、与TTL兼容Vcc=5V;
10、可选工业级温度范围-40℃+85℃;
11、与DS1202兼容;
12、在DS1202基础上增加的特性;
13、对Vcc1有可选的涓流充电能力,双电源管用于主电源和备份,电源供应备份,电源管脚可由电池或大容量电容输入。
③DS1302的管脚排列及描述如下图2-8及表所示
图2-8管脚配置和管脚功能说明
④DS1302内部寄存器:
CH:
时钟停止位寄存器2的第7位12/24小时标志
CH=0振荡器工作允许bit7=1,12小时模式
CH=1振荡器停止bit7=0,24小时模式
WP:
写保护位寄存器2的第5位:
AM/PM定义
WP=0寄存器数据能够写入AP=1下午模式
WP=1寄存器数据不能写入AP=0上午模式
TCS:
涓流充电选择DS:
二极管选择位
TCS=1010使能涓流充电DS=01选择一个二极管
TCS=其它禁止涓流充电DS=10选择两个二极管
DS=00或11,即使TCS=1010,充电功能也被禁止
4.8语音模块
图2-8ISD1420管脚图和管脚描述
ISD1420系列单片录放时间8至20秒,音质好。
芯片采用CMOS技术,内含震荡器、话筒前置放大、自动增益控制、防混淆滤波器、平滑滤波器、扬声器驱动及EEPROM阵列。
最小的录放系统仅需麦克风、喇叭、两个按钮、电源及少数电阻电容。
在录放操结束后,芯片自动进入低功耗节电模式、功耗仅0.5uA。
ISD1420系列有唯一的录音控制和边缘/电平触发两种放音控制。
不分段时外围线路最简,也可按最小段长为单位任意组合分段,芯片提供若干操作模式,大大提高了控制的灵活性。
芯片采用多电平直接模拟量存储专利技术,每个采样直接存储在片内单个EEPROM单元中,因此能够非常真实、自然地再现语音、音乐、音调各效果,避免了一般固体录音电路因量化和压缩造成的量化噪声和“金属声”。
采样频率从5.3,6.4到8.0KHz,对音质仅有轻微影响。
片内信息可保存100年(无需后备电源),EEPROM单片可反复录音十万次。
特点:
1、使用方便的单片录放系统,外部元件最少;
2、重现优质原声,没有常见的背景噪音;
3、放音可由边沿或电平触发;
4、无耗电信息存储,省掉备用电池;
5、信息可保存100年,可反复录放10万次;
6、无需专用编程或开发系统;
7、较强的分段选址能力可处理多达160段信息;
8、具有自动节电模式;
9、录或放后立即进入维持状态,仅需0.5μA电流;
10、单一5伏电源供电;
第三章出租车计价系统的软件设计
3.1系统主程序流程图
3.2里程和费率计算程序流程图
第四章设计体会与小结
经过这次出租车计价器的课程设计,我收益非浅,从中我学到了很多东西.课程设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。
通过这次设计使我明白了自己原来知识还比较欠缺。
自己要学习的东西还太多,以前老是觉得自己什么东西都会,什么东西都懂,有点眼高手低。
通过这次课程设计,我才明白学习是一个长期积累的过程,另外,还学会了在网络上查找有关本设计的各硬件的资源,其中包括:
AT89S51单片机及其引脚说明,为本次课程设计提供了一定的资料。
在这次课程设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。
总之,不管学会的还是学不会的的确觉得困难比较多,真是万事开头难,不知道如何入手。
最后终于做完了有种如释重负的感觉。
此外,还得出一个结论:
知识必须通过应用才能实现其价值!
有些东西以为学会了,但真正到用的时候才发现是两回事,所以我认为只有到真正会用的时候才是真的学会了。
经过这次的课程设计,也为我们以后毕业设计的制作奠定了一定的基础。
参考文献
[1]刘苗生、潘宗预.单片机测控系统设计.中国物质出版社,2006年
[2]欧伟明、何静.单片机原理与应用系统设计.电子工业出版社,2009年
附录
一.源程序
#include<
reg51.h>
//头文件
#include<
intrins.h>
typedefunsignedcharuchar;
//定义一个无符号的字符型的简写
codeuchartab[]={0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
bitflag=0;
//定义标量初值为零
floaty;
//定义一个浮点型的全局常量
floaty1;
floatcount_price=0;
//定义一个浮点型的全局变量
inta;
//定义两个无符号的全局变量
floats;
//定义一个浮点型的全局变量
#definetime_num100//宏定义时间为100us
sbitCLK=P3^5;
//DS1302的时钟控制线
sbitDAT=P3^6;
//DS1302的数据线
sbitRST=P3^7;
//DS1302的复位信号
#definedelay_time60//宏定义时间为60us
sbitSCL=P3^6;
//24c02的时钟控制线
sbitSDA=P3^7;
//24c02的数据线
sbits2=P2^1;
//时间设置开关
sbits1=P3^3;
//日期设置开关
sbits3=P2^2;
//数据加/日期时间显示方式设置
sbits4=P2^3;
//********************************************************
voidEX_INT0(void)interrupt0//外部中断0函数
{
staticucharnum;
ucharmybyte;
Write_One_Byte(0x20,0xb0);
//设定单价存入缓冲器
_nop_();
mybyte=Read_One_Byte(0x20);
//上电保护
num++;
//一个计数器自增1
IT0=1;
//边沿触发方式
if(num==10)//判断是否有10个脉冲
{
num=0;
//清零
count_price++;
//另一个计数器计数
if(count_price<
=4)//不足40个脉冲
{
s=s+0.5;
//里程加0。
5公里
y1=mybyte+a;
//金额为默认价与等待金额之和
}
else//否则大于40个脉冲
{
s=s+0.5;
5公里
y1=(s-2)*y+mybyte+a;
//金额为里程减2公里乘单价加默认价加等待金额
}
main()/*主函数*/
ucharkey;
Cpu_Init();
key=scankey();
ds1302_write_time();
while
(1)
{
if(key==8)
EX0=1;
Y=1.8;
flag=1;
}
if(key==7)
Y=2;
if(flag)
ET1=0;
DP_DIS();
key=scankey();
switch(key)
case5:
EX0=1;
P1=0xf0;
delay2(5);
TR0=0;
break;
case6:
P1=0x00;
delay2
(1);
Cpu_Init();
EX0=0;
TR0=1;
while
(1)
{
ET1=0;
if(s1==0||s4==0)
break;
}
break;
else
ds1302_read_time();
just_tm();
if(key==4)
ET1=1;
flag=0;
EX0=0;
s=0;
y1=0;
count_price=0;
}
二.系统硬件原理图