51单片机出租车计价器的设计.docx
《51单片机出租车计价器的设计.docx》由会员分享,可在线阅读,更多相关《51单片机出租车计价器的设计.docx(36页珍藏版)》请在冰豆网上搜索。
51单片机出租车计价器的设计
摘要
出租车计价器是出租车营运收费的专用只能化仪表,随着电子技术的发展,出租车计价器技术也在不断进步和提高。
国内出租车计价器已经经历了4个阶段的发展。
从传统的全部由机械元器件组成的机械式,到半电子式即用电子线路代替部分机械元器件的出租车计价器;再从集成电路式到目前的单片机系统设计的出租车计价器。
出租车计价器计费是否准确是乘客最关心的问题,而计价器营运数据的管理是否方便才是出租车司机最关注的。
在随着科技的发展,现在各大中城市出租车行业都已普及自动计价器,所以计价器技术的发展已成定局。
而部分小城市尚未普及,但随着城市建设日益加快,象征着城市面貌的出租车行业也将加速发展,计价器的普及也是毫无疑问的,所以未来汽车计价器的市场还是十分有潜力的。
本次设计是采用AT89C52单片机为中心,外加霍尔传感器行对里程进行测距,由于实验室的限制的问题所以改用按键代替霍尔传感器,实现对出租车计价统计,输出采用LCD1602A的出租车计价器。
关键字:
51系列单片机,霍尔传感器,LCD1602A
前言
随着生活水平的提高,人们已不再满足于衣食住的享受,出行的舒适已受到越来越多人的关注。
于是,出租车行业以低价高质的服务给人们带来了出行的享受。
但是总存在着买纠纷困扰着行业的发展。
而在出租车行业中解决这一矛盾的最好方法就是改良计价器。
用更加精良的计价器来为乘客提供更加方便快捷的服务。
凡乘过出租车的人都知道,只要汽车开动,随着行驶里程的增加,就会看到汽车前面的计价器里程数字显示的读数从零逐渐增大,而当行驶到某一值时(如5KM)计费数字显示开始从起步价(如5元)增加。
当出租车到达某地需要在那里等候时,司机只要按一下“计时”键,每等候一定时间,计费显示就增加一个该收的等候费用。
汽车继续行驶时,停止计算等候费,继续增加里程计费。
到达目的地,便可按显示的数字收费。
汽车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。
它关系着交易双方的利益。
具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。
因此,汽车计价器的研究也是十分有一个应用价值的。
第一章出租车计价系统的设计要求与设计方案
1.1基本设计要求
本出租车自动计费,上电后显示最初的起步价,里程计费单价,等待时间计费单价,通过按键可以调节起步价,里程计费单价,等待时间计费单价。
同时具有运行,暂停,停止等状态,可以显示运行的时间,同时可以显示暂停的时间,具有累加功能,暂停和运行时间在暂停和运行前一次的状态上计时。
出租车停止后能够显示行驶的总费用。
1.2性能指标
费用的计算是按行驶里程收费。
设起步价为5.00元。
1、当里程<3km时,按起价计算费用
2、当里程>3km时,每公里按1.3元计费
3、等待累计时间>2min时,按1.5元/min计费
1.3显示功能
1、显示行驶里程:
用四位数字显示,显示方式为“XXXX”,单位为km。
计程范围0-99km,精确到1km。
2、显示等候时间:
用两位数字显示,显示方式为“XX”,单位为min。
计时范围0-59min,精确到1min。
3、显示总费用:
用四位数字显示,显示方式为“XXX.X”,单位为元。
计价范围0-999.9元,精确到0.1元。
第二章出租车计价器系统的硬件设计
2.1出租车硬件框图
图2-1系统的硬件框图
2.2AT89C52单片机及引脚说明
图2-2AT89C52引脚配置
AT89C52是51系列单片机的一个型号,它是ATMEL公司生产的。
AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,但不可以在线编程(S系列的才支持在线编程)。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
AT89C52有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。
芯片的40个引脚功能为:
VCC电源电压。
GND接地。
RST复位输入。
当RST变为高电平并保持2个机器周期时,将使单片机复位。
WDT溢出将使该引脚输出高电平,设置SFRAUXR的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口部分端口引脚及功能如表2.1所示。
表2.1P1口特殊功能
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口线外,更重要的用途是它的第二功能,如表2.2所示。
P3口还接收一些用于Flash闪速存储器编程和程序校验期间的控制信号。
表2.2P3口特殊功能
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
(外部数据存储器读选通)
PSEN/程序储存允许输出是外部程序存储器的读先通信号,当AT89S51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN/有效,即输出两个脉冲。
当访问外部数据存储器,没有两次有效的PSEN/信号。
EA/VPP外部访问允许。
欲使CPU仅访问外部程序存储器,EA端必须保持低电平,需注意的是:
如果加密位LB1被编程,复位时内部会锁存EA端状态。
Flash存储器编程时,该引脚加上+12V的编程电压VPP。
2.3LCD1602A的简介
字符型液晶1602主要技术参数如表2.3所示:
表2.3字符型液晶1602主要技术参数
显示容量:
16*2个字符
芯片工作电压:
4.5—5.5V
工作电流:
2.0mA(5.0V)
模块最佳工作电压:
5.0V
字符尺寸:
2.95*4.35(W*H)mm
接口信号说明如表2.4所示:
表2.41602接口信号说明
编号
符号
引脚说明
编号
符号
引脚说明
1
Vss
电源地
9
D2
DataI/O
2
VDD
电源正极
10
D3
DataI/O
3
VL
液晶显示偏压信号
11
D4
DataI/O
4
Rs
数据/命令选择端(H/L)
12
D5
DataI/O
5
R/W
读/写选择端(H/L)
13
D6
DataI/O
6
E
使能信号
14
D7
DataI/O
7
D0
DataI/O
15
BLA
背光源正极
8
D1
DataI/O
16
BLK
背光源负极
控制器接口说明(HD44780及兼容芯片)
基本操作时序
a读状态:
输入:
Rs=L,Rw=H,E=H输出:
D0—D7=状态字
b写指令:
输入:
Rs=L,Rw=L,D0—D7=指令码输出:
无
E=高脉冲
C读数据:
输入:
Rs=H,Rw=L,E=H输出:
D0—D7=数据
d写数据:
输入:
Rs=H,Rw=L,D0—D7=数据输出:
无
E=高脉冲
状态字说明如表2.5所示:
表2.5状态字说明(a)
STA7
D7
STA6
D6
STA5
D5
STA4
D4
STA3
D3
STA2
D2
STA1
D1
STA0
D0
表2.6状态字说明(b)
STA0--6
当前数据地址指针的数值
STA7
读写操作使能
1:
禁止0:
允许
注:
对控制器进行读写操作之前,都必须进行读写检测,确保STA7为0
RAM地址映射图
控制器内部带有80*8位(80字节)的RAM缓冲区,对应关系如下图2.7所示:
表2.7RAM地址映射图LCD16字*2行
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
…
27
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
…
67
指令说明
初始化设置
显示模式设置如表2.8所示:
表2.8显示模式设置
指令码
功能
0
0
1
1
1
0
0
0
设置16*2显示,5*7点阵,8位数据接口
显示开关及光标设置如表2.9所示:
表2.9显示开关及光标设置
指令码
功能
0
0
0
0
1
D
C
B
D=1开显示;D=0关显示
C=1显示光标;C=0不显示光标
B=1光标闪烁;B=0光标不显示
0
0
0
0
0
1
N
S
N=1当读或写一个字符后地址指针加一,且光标加一
N=0当读或写一个字后地址指针减一,且光标减一
S=1当写一个字符后,整屏显示左移(N=1)或右移(N=0),以得到光标不移动而屏幕移动的效果
S=0当写一个字符,整屏显示不移动
数据控制
控制器内部没有一个数据地址指针,用户可通过它们来访问内部的全部80字节RAM。
数据指针设置如表2.10所示
表2.10数据指针设置(a)
指令码
功能
80H+地址码(0—27H,40—67H)
设置数据地址指针
读数据:
见c
写数据:
见d
其它设置如表2.11所示
表2.11数据指针设置(b)
指令码
功能
01H
显示清屏:
1.数据指针清零
2.所有显示清零
02H
显示回车:
1.数据指针清零
2.4时钟电路
单片机内部有一个高增益、反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。
通过这两个引脚在芯片外并接石英晶体振荡器和两只电容(电容和一般取33pF)。
这样就构成一个稳定的自激振荡器。
振荡电路脉冲经过二分频后作为系统的时钟信号,再在二分频的基础上三分频产生ALE信号,此时得到的信号时机器周期信号。
如图2-4所示:
图2-4AT89C52的时钟电路
2.5复位电路设计
图如图2-5所示。
复位操作有两种基本形式:
一种是上电复位,另一种是按键复位。
按键复位具有上电复位功能外,若要复位,只要按图中的RESET键,电源VCC经电阻R1、R2分压,在RESET端产生一个复位高电平。
上电复位电路要求接通电源后,通过外部电容充电来实现单片机自动复位操作。
上电瞬间RESET引脚获得高电平,随着电容的充电,RERST引脚的高电平将逐渐下降。
RERST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。
按键复位电路
图2-5AT89C52的按键复位电路
2.6显示电路
对于现实电路我们可以采用数码管,也可以采用液晶显示,液晶又分字符型和点阵型,我们使用的液晶是字符型液晶,并且带字符库的,不需要查找代码。
英文字符就可。
液晶电路使用时,如果发现液晶不亮可以调节连接液晶的点位器,改变液晶的亮度。
显示电路如图2-6所示:
图2-6显示电路
2.7键盘接口技术
独立式键盘:
独立式键盘中,每个按键占用一根I/O口线,每个按键电路相对独立。
I/O口通过按键与地相连,I/O口有上拉电阻,无键按下时,引脚端为高电平,有键按下时,引脚电平被拉低。
I/O口内部有上拉电阻时,外部可不接上拉电阻。
键盘接口电路如图2-7所示:
图2-7按键电路
2.8霍尔传感器设计
里程计算是通过安装在车轮旁的霍尔传感器检测到的信号,送到单片机,经处理计算,送给显示单元的。
而由于本次实验室的局限不能利用霍尔传感器,
所以我们利用按键来代替霍尔传感器,通过按一次键代表汽车行驶了1公里,当在行驶过程中,停止按键代表行驶进入了等待时间。
霍尔传感器的连接如图2-8所示
图2-8霍尔传感器的连接
第三章出租车计价器系统的软件设计
3.1系统整体程序流程
图3-1主流程图
在主程序模块中,需要完成对各接口芯片的初始化、出租车起价和单价的初始化、中断向量的设计以及开中断、循环等待等工作。
另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。
然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。
主程序流程图如图3-1
3.2中断子函数
于中断程序,只要定时器计数满就会产生中断50ms中断一次,共计20次,秒钟加1,秒钟计满再分钟加,当分钟加到99时全部清零。
以下是中断子函数的流程图如图3-2所示:
图3-2中断子程序流程图
3.3按键判断方式
对于独立式键盘判键,首先看有键按下不,如果有键按下则延时一会儿,在判断是否真的有键按下,如果确实有键按下,在判键释放,最后执行键功能程序。
判键子函数的流程框图如图3-3所示
图3-3按键判断程序流程图
3.4LCD1602显示的判断
1602液晶是字符型液晶,它的内部自带字符库,它可以写两行的字符,同时每行可以写40个字符,在写显示程序的时候,我们先写命令,再设定字符显示,最后写数据,在每写一次命令或数据都需要判断液晶是否忙。
液晶显示程序流程图如图3-4所示
3-4LCD1602A显示子程序
第四章出租车系统的安装与调试
4.1硬件调试
进行通电调试,检查开发板是否正常。
1)当LCD1602A液晶背光亮,但无任何显示,就进行调节对比度后按复位键;当LCD1602A液晶发光,有一排白色方框,就把LCD1602A拔出重新插紧液晶,插正单片机,按复位或重新下载程序;当LCD1602A液晶没有反映,则要算开电源,检查各引脚的问题。
2)当LCD1602A都能不会有问题,可开发板还是不能正常使用,先检查下开发板的电源是否正常,不正常则进行调试。
电源正常,则使用万用表检查AT89C52单片机芯片是否正常,要是短路则换一个新的单片机芯片。
3)当键盘的按键失效,则换过一排按键,或修好按键在进行实验验证。
4.2软件调试
输入程序并检查无误,经编译、连接后烧入开发板运行,观察现象。
要是没有现象就查看下是否烧写软件出了问题。
1)查看STC-ISP软件的地址上没有显示出地址,这说明开发板和烧写软件没有连接上,换个数据线在进行连接烧写。
2)看是不是单片机的型号选错看或忘记选择,改后在下载过观察结果。
3)观察下是否串行口选错了,查看我的电脑属性的硬件管理查看对应的串行口,错了改正,改后下载过在观察结果。
4)在打开文件是没有看到所要的文件.hex,则重新按确步骤编写程序。
第五章设计体会与小结
出租车计费器系统的设计已经全部完成,能按预期的效果进行模拟汽车启动,停止,暂停等功能,并能够通过LCD显示车费数目。
本款出租车计价器包括单价输出、单价调整、显示当前的系统时间等功能。
同过了5周的课程设计让我学会了很多的东西。
经过自己努力,基本上完成了设计要求的内容,在系统可行性分析、原理图设计等方面都作了许多实际工作,取得了一些成绩,同时也遇到了一些问题,存在一些不足。
学会了怎么去查找些资料,把所找到的东西与自己的问题所结合起来并给予解决。
这次设计很好的把以前学到的理论知识应用于实践,使我认识到理论知识与实践之间有一定的差距,只有通过不断的努力学习和实践才能很好的把理论知识应用到实践当中,也只有通过不断的实践才能对理论知识的理解。
凡事都要自己去动下手,去实践一下,遇到困难,永远不要沮丧气馁,只有这样才能让自己进一步的去学会新的东西和知识。
在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识;这次设计给了我极大的鼓舞和信心,相信在以后的学习中可以通过不断的摸索和实践来提高其他方面的知识。
书上学来中觉潜,只有实践与理论的结合才能让自己学会跟多的东西掌握更多的理论。
参考文献
1李群芳,张士军,黄建.单片微型计算机与接口技术.北京:
电子工业出版,2008.
2丁元杰、吴大伟.《单片微机实题集与实验指导书》[M].机械工业出版社,2004.
3张友德,赵志英,涂时亮.单片微型机原理、应用与实验.上海:
复旦大学出版社2005,12.
4胡辉,单片机原理及应用设计—21世纪高等院校规划教材[M],水利水电出版社,2005.7;
5张迎新.单片微型计算机原理、应用及接口技术.北京:
国防工业出版社,1999.
6李广弟,朱月秀,冷祖祁.单片机基础[M].第3版.北京航空航天大学出版社,2007年1月
附录
一源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitrw=P2^1;
sbitrs=P2^0;
sbiten=P2^2;
sbitb=P0^7;
voidlcd_init();
voidwr_com(ucharcommand);
voidwr_data(uchardata0);
voidlcd_clear();
voidlcd_set();
voidbusy();
voiddisplay();
voidprintstring(uchar*s);
voiddisplay1();
voidkey1();
sbitK=P1^0;
sbitK1=P1^1;
sbitK2=P1^2;
sbitK3=P1^3;
sbitK4=P1^4;
sbitg=P2^7;
sbitaa=P2^3;
sbitbb=P2^4;
sbitcc=P2^5;
sbitled_run=P3^0;
sbitled_await=P3^1;
sbitled_stop=P3^2;
bitf_start;
bitjump_in;
bitjump_out;
voidkey();
ucharcodetable[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x70};
uchardispbuf[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uchardispbuf1[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
ucharv,v1;uchari;
voidinit();
voidchuli();
voidchuli1();
voiddelay(uchart);
voidclear();
voidset(ucharx);
voidset1(uchary);ucharcommand;
ucharcount,count1;
ucharsecond,minite,second1,minite1;
unsignedinttt,tt1;
unsignedcharvalue1=50,value2=25,value3=15;
unsignedintmoney;voidmain()
{
init();
lcd_init();
while
(1)
{
key1();
chuli();
display();
if(jump_in==1)
{
jump_in=0;
lcd_init();
while
(1)
{
key();
chuli1();
display1();
if(jump_out==1)
{
lcd_init();
jump_out=0;
clear();
break;
}
}
}
}
}
voidclear(){
TR0=0;
TR1=0;
money=0;
second=0;
second1=0;
minite=0;
minite1=0;
value1=50;
value2=25;
value3=15;
led_run=1;
led_await=1;
led_stop=1;
v=0;
v1=0;
for(i=0;i<15;i++)
{
dispbuf[i]=0;
dispbuf1[i]=0;
}
}
voidinit(){
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ET0=1;
ET1=1;
EA=1;
TR0=0;
TR1=0;
}
void