出租车计价器课程设计汇编.docx
《出租车计价器课程设计汇编.docx》由会员分享,可在线阅读,更多相关《出租车计价器课程设计汇编.docx(31页珍藏版)》请在冰豆网上搜索。
出租车计价器课程设计汇编
摘要
本设计的是一个基于单片机STC89C52的出租车自动计费设计,附有复位电路,时钟电路,键盘电路等。
复位电路是单片机的初始化操作,除了正常的初始化外,为摆脱困境,通过复位电路可以重新开始。
时钟电路采用12MHz的晶振,作为系统的时钟源,具有较高的准确性。
在上电时字符型液晶1602显示最初的起步价,里程收费,等待时间收费三种收费,通过按键可以调整起步价,里程收费,等待时间收费。
通过按键模拟出租车的运行,暂停,停止。
在1602液晶上可以显示运行的时间,运行时暂停的时间,通过计算可以得出总共的费用和总的路程。
在这里主要是以STC89C52单片机为核心控制器,P1口接1602液晶显示模块。
关键字STC89C52;1602液晶;出租车计费器
第一章绪论
1.1出租车计价器概述
我国在70年代开始出现出租车,但那时的计费系统大都是国外进口不但不够准确,价格还十分昂贵。
随着改革开放日益深入,出租车行业的发展势头已十分突出,国内各机械厂家纷纷推出国产计价器。
出租车计价器的功能从刚开始的只显示路程(需要司机自己定价,计算后四舍五入),到能够自主计费,以及现在的能够打一发票和语音提示、按时间自主变动单价等功能。
随着城市旅游业的发展,出租车行业已成为城市的窗口,象征着一个城市的文明程度。
本次设计的目的在于现在各大中城市出租车行业都已普及自动计价器,所以计价器技术的发展已成定局。
而部分小城市尚未普及,但随着城市建设日益加快,象征着城市面貌的出租车行业也将加速发展,计价器的普及也是毫无疑问的,所以未来汽车计价器的市场还是十分有潜力的。
1.2单片机的概述
计算机系统已明显地朝巨型化、单片化、网络化三个方向发展。
巨型化发展的目的在于不断提高计算机的运算速度和处理能力,以解决复杂系统计算和高速数据处理,比如系统仿真和模拟、实时运算和处理。
单片化是把计算机系统尽可能集成在一块半导体芯片上,其目的在于计算机微型化和提高系统的可靠性,这种单片计算简称单片机。
单片机的内部硬件结构和指令系统主要是针对自动控制应用而设计的所以单片机又称微控制器MCU(MicroControllerUnit)。
用它可以很容易地将计算机嵌入到各种仪器和现场控制设备中,因此单片机又叫做嵌入式微控制器(EmbeddedMCU)。
单片机自20世纪70年代问世以来,以其鲜明的特点得到迅猛发展,已广泛应用于家用电器、智能玩具、智能仪器仪表、工业控制、航空航天等领域,经过30多年的发展,性能不断提高,品种不断丰富,已经形成自动控制的一支中坚力量。
据统计,我国的单片机年容量已达1~3亿片,且每年以大约16%的速度增长,但相对于国际市场我国的占有率还不到1%。
这说明单片机应用在我国有着广阔的前景。
对于从事自动控制的技术人员来讲,掌握单片机原理及其应用已经成为必不可少的学习任务。
单片机的应用十分广泛,在工业控制领域、家电产品、智能化仪器仪表、计算机外部设备,特别是机电一体化产品中,都有重要的用途。
其主要的用途可以分为以下方面。
●显示:
通过单片机控制发光二极管或是液晶,显示特定的图形和字符。
●机电控制:
用单片机控制机电产品做定时或定向的动作。
●检测:
通过单片机和传感器的联合使用,用来检测产品或者工况的意外发生。
●通信:
通过RS-232串行通信或者是USB通信,传输数据和信号。
●科学计算:
用来实现简单的算法。
那么单片机是不是解决上述应用的唯一选择呢?
当然不是!
单片机最明显的优点是价格便宜,从几元人民币到几十元人民币。
这是因为这类芯片的生产量很大,技术也很成熟。
其次,单片机的体积也远小于其他两种方案。
单片机本身一般用40引脚封装,当然功能多一些的单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,有的甚至只有8只引脚。
当然,单片机无论在速度还是容量方面都小于其他两种方案,但是在实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能。
例如,控制电冰箱的控制器就不需要使用嵌入式系统,用一片51就可以轻松实现。
所以应用的关键是看能否够用,是否有很好的性能价格比。
51系列的单片机已经面世十多年,依然没有被淘汰,还在不断发展中,这就说明是它有广阔的应用前景。
第二章系统总体设计
2.1课程设计任务
基于单片机出租车模拟计价器,采用at24c02存储芯片+LCD1602液晶显示等设计而成。
用24c02来存储单价,通过按键来模拟增加里程,模拟出租车向前开。
通过液晶显示器显示当前的行驶状态、行驶公里、行驶时间时间(时、分、秒)、费用、单价、等信息。
可以设置每公里单价,以及夜间单价和白天单价的不同模式,设置后掉电无需重新设置,设置有等待/继续计时模式。
计费分行走的里程*单价+等待的时间*价格。
2.2课程设计方案
方案一:
采用数字电子技术,利用555定时芯片构成多谐振荡器,或采用外围的晶振电路作为时钟脉冲信号,采用计数芯片对脉冲尽心脉冲的计数和分频,最后通过译码电路对数据进行译码,将译码所得的数据送给数码管显示,一下是该方案的流程框图,方案一如图1.1所示:
图1方案一
方案二:
采用EDA技术,根据层次化设计理论,该设计问题自顶向下可分为分频模块,控制模块计量模块、译码和动态扫描显示模块,其系统框图如图2所示:
图2方案二
方案三:
采用MCU技术,通过单片机作为主控器,利用1602字符液晶作为显示电路,采用外部晶振作为时钟脉冲,通过按键可以方便调节,一下是方案三的系统流程图,本方案主要是必须对于数字电路比较熟悉,成本又高。
方案图如图3所示:
图3方案三
方案总结:
通过各个方案的比较本次采用方案三,不但控制简单,而且成本低廉,设计电路简单。
第三章系统硬件设计
3.1振荡电路
单片机内部有一个高增益、反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。
通过这两个引脚在芯片外并接石英晶体振荡器和两只电容(电容和一般取20pF)。
这样就构成一个稳定的自激振荡器。
振荡电路脉冲经过二分频后作为系统的时钟信号,再在二分频的基础上三分频产生ALE信号,此时得到的信号时机器周期信号。
振荡电路如图4所示:
图4振荡电路
3.2复位电路设计
复位操作有两种基本形式:
一种是上电复位,另一种是按键复位。
按键复位具有上电复位功能外,若要复位,只要按图中的RESET键,电源VCC经电阻R1、R2分压,在RESET端产生一个复位高电平。
上电复位电路要求接通电源后,通过外部电容充电来实现单片机自动复位操作。
上电瞬间RESET引脚获得高电平,随着电容的充电,RERST引脚的高电平将逐渐下降。
RERST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。
按键复位电路图如图5所示。
图5复位电路
3.3键盘接口电路
(1)独立式键盘:
独立式键盘中,每个按键占用一根I/O口线,每个按键电路相对独立。
I/O口通过按键与地相连,I/O口有上拉电阻,无键按下时,引脚端为高电平,有键按下时,引脚电平被拉低。
I/O口内部有上拉电阻时,外部可不接上拉电阻。
键盘接口电路如图6所示:
图6键盘接口电路
3.4显示电路
3.4.11602LCD的基本参数及引脚功能
1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如图7所示。
图7LM016L结构图
LCD1602主要技术参数:
容量:
16×2个字符
芯片工作电压:
4.5—5.5V
工作电流:
2.0mA(5.0V)
模块最佳工作电压:
5.0V
字符尺寸:
2.95×4.35(W×H)mm
引脚功能说明:
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表1所示:
表1引脚接口说明表
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
3.4.2显示模块采用1602液晶显示接口电路
图8显示电路
3.5单片机各引脚功能说明
下面对STC89C52各引脚的功能进行较为详细的介绍:
1)电源引脚Vcc和Vss
Vcc(40脚):
电源端为+5VVss(20脚):
接地端。
2)时钟电路引脚XTAL1和XTAL2
XTAL2(18脚):
接外部晶体和微调电容的一端。
在单片机内部它是振荡电路反向放大器的输出端,振荡电路的频率就是晶体固有频率。
若需采用外部时针电路时,该引脚输入外时钟脉冲。
要检查89C52的振荡电路是否正常工作,可用示波器查看XTAL2端是否有脉冲信号输出。
XTAL1(19脚):
接外部晶体和微调电容的另一端。
在片内,它是振荡电路反向放大器的输入端。
在采用外部时钟时,该引脚必须接地。
3)控制信号脚RSTALEPSEN和EA。
RST(9脚):
RST是复位信号输入端,高电平有效。
在此输入端保持两个机器周期(24个时钟振荡周期)的高电平时,就可以完成复位操作。
ALE/PROG(30引脚):
地址锁存允许信号端。
当STC89C52上电正常工作后,ALE引脚不断向外输出正脉冲信号。
此频率为振荡器频率fosc的1/6,当CPU访问片外存储器时,ALE输出信号作为锁存低8位地址的控制信号。
在CPU访问片外数据存储时,每取值一次(一个机器周期)会丢失一个脉冲。
平时不访问片外存储时,ALE端也以1/6的振荡频率固定输出正脉冲,因而ALE信号可以用作对外输出时钟或定时信号。
如果你想看一下STC89C52芯片的好坏,可用示波器查看ALE端是否有脉冲信号输出,如有脉冲信号输出,则STC89C52基本上是好的。
ALE的负载驱动能力为8个LS型TTL(低功耗高速TTL)。
PSEN(29脚);程序存储允许输出信号引脚,在访问片外程序存储器时,此端定时输出负脉冲作为读片外存储器的选通信号。
此引脚接ERROM的OE端。
PSEN端有效,即允许读出ERROM/ROM中的指令码。
CPU在从外部ERROM/ROM取指令期间,每个周期PSEN两次有效。
不过,在访问片外RAM时,要少产生两次PSEN负脉冲信号。
要检查一个STC89C52小系统上电后CPU能否正常到ERROM/ROM中读取指令码,也可用于示波器看PSEN端有无脉冲输出。
如有,说明基本上工作正常。
EA/VPP(31脚):
外部程序存储器地址允许输入端/固化编程电压输入端。
当EA引脚接高电平时,CPU只访问片内ERROM/ROM并执行内部程序存储器中的指令。
但在PC(程序计数器)的值超过OFFFH(对8751/8051为4k)时,将自动转向执行片外存储器的程序。
当出入信号EA引脚接低电平(接地)时,CPU只访问外部ERROM/ROM并执行外部程序存储器中的指令,而不管是否有片内程序存储器。
对于无芯片内的ROM的8031或8032,须外扩ERROM,此时必须将EA引脚接地。
如果使用有片内ROM的STC89C52,外扩ERROM也是可以的,但也要使EA接地。
4)I/O(输入/输出端口,P0,P1,P2,P3)
P0口:
P0口是一个漏极开路的8位准双向I/O端口。
P1口:
8位准双向I/O端口。
P2口:
即可以做地址总线输出地址高8位,也可以做普通I/O用,(此时为准双向口)。
P3口:
双功能口,即可以做普通I/O口用(此时为准向口,也可以按每位定义实现第二功能操作)。
见表1。
表2P3口的第二功能表
引脚
第二功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
INT0(外部中断0)
P3.3
INT1(外部中断1)
P3.4
T0(定时器0外部中断)
P3.5
T1(定时器1外部中断)
P3.6
WR(外部存储器写选通)
P3.7
RD(外部存储器读写通)
第四章系统软件设计
4.1单片机资源使用
在本次设计中像电路键盘用到了P2口,其中P2.0到P2.5口作为键盘的输
入,显示电路用到了P1和P3口,P1口为液晶的数据口。
4.2单片机软件模块设计
4.2.1中断子函数
对于中断程序,只要定时器计数满就会产生中断50ms中断一次,共计20次,秒钟加1,秒钟计满再分钟加,当分钟加到99时全部清零。
以下是中断子函数的流程图如图9所示:
图9中断子程序流程图
4.2.2判键子函数
对于独立式键盘判键,首先看有键按下不,如果有键按下则延时一会儿,在判断是否真的有键按下,如果确实有键按下,在判键释放,最后执行键功能程序。
判键子函数的流程框图如图10所示:
图10判键子程序流程图
4.2.3显示子程序
1602液晶是字符型液晶,它的内部自带字符库,它可以写两行的字符,同时每行可以写40个字符,在写显示程序的时候,我们先写命令,再设定字符显示,最后写数据,在每写一次命令或数据都需要判断液晶是否忙。
液晶显示程序流程图如图11所示:
图11显示子程序流程图
4.3总程序流程框图
整体程序的流程框图如图12所示:
图12整体程序的流程框图
第五章系统调试过程
本设计需要用KeiluVision2对C51程序进行编译,生成“.hex”文件,如下图:
图13KeiluVision2对C51程序进行编译
在Proteus软件中画出仿真电路(如图),把KeiluVision2编译后生成的“.hex”导入到单片机中,按“运行仿真”键进行仿真。
图14仿真图
第六章设计的效果(实物图或仿真效果图)
图15仿真效果图
第七章结论
总结
作为一名电信专业的大三学生,我觉得做单片机课程设计是十分有意义的,而且是十分必要的。
在已度过的大学时间里,我们大多数接触的是专业课。
我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?
如何把我们所学的专业基础课理论知识运用到实践中去呢?
我想做类似的课程设计就为我们提供了良好的实践平台。
单片机作为我们的主要专业课之一,虽然在大三开学初我对这门课并没有什么兴趣,觉得那些程序枯燥乏味,但在这次课程设计后我发现自己在一点一滴的努力中对单片机的兴趣也在逐渐增加。
通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。
我觉得作为一名电信专业的学生,单片机的课程设计是很有意义的。
更重要的是如何把自己平时所学的东西应用到实际中。
虽然自己对于这门课懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是靠着这一个多礼拜的“学习”,在小组同学的帮助和讲解下,渐渐对这门课逐渐产生了些许的兴趣,自己开始主动学习并逐步从基础慢慢开始弄懂它。
我认为这个收获应该说是相当大的。
觉得课程设计反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。
小组人员的配合﹑相处,以及自身的动脑和努力,都是以后工作中需要的。
参考文献
[1]李广弟,朱月秀,冷祖祁.单片机基础[M].第3版.北京航空航天大学出版社,2007年1月
[2]李华.MCS-51系列单片机实用接口技术[M].北京航空航天大学出版社,1996
[3]马忠梅,张凯,马岩,单片机的C语言应用程序设计,[M],北京:
北京航空航天大学出版社,2003.11;
[4]胡辉,单片机原理及应用设计—21世纪高等院校规划教材[M],水利水电出版社,2005.7;
[5]刘守义,单片机应用技术[M],西安:
西安电子科技大学出版社,1996.8;
致谢
本课程设计是在石蕊老师的悉心指导下完成的,石老师的渊博学识和丰富经验给我留下了深刻的印象。
从石老师那里我学到的不仅是专业知识与实际问题科学解决的方法,更为重要的是勤奋和严谨治学的精神以及对学生的认真负责,老师的谆谆教诲使我受益匪浅,在此向石老师表示衷心的感谢并致以崇高的敬意!
感谢家人给予我学业上和生活上的支持与照顾。
同时感谢给予我帮助的各位老师、同学以及朋友们!
附录1程序清单
#include//调用单片机头文件
#defineucharunsignedchar//无符号字符型宏定义变量范围0~255
#defineuintunsignedint//无符号整型宏定义变量范围0~65535
ucharmiao,fen=0,shi;
ucharflag_bai_hei;//白天的晚上的标志位
ucharvalue;
uintbai_3l_price=60;//白天3千米内的单价6元
uintbai_3w_price=18;//白天3千米外的单价/千米1.8元
uintbai_wait_price=5;//白天等待时的单价/分钟0.5元
uintwan_3l_price=70;//晚上3千米内的单价/千米7元
uintwan_3w_price=22;//晚上3千米外的单价/千米2.2元
uintwan_wait_price=10;//晚上等待时的单价/分钟1元
uintdistance=0;//行使的距离
uintzong_jia;//总的价
bitflag_300ms=0;
bitflag_1s;
bitflag_time_en=0;
#include"lcd1602.h"
/***********************1ms延时函数*****************************/
voiddelay_1ms(uintq)
{
uinti,j;
for(i=0;ifor(j=0;j<120;j++);
}
#include"iic.h"
voidwrite_iic_data()
{
write_24c02(0,flag_bai_hei);
write_24c02(1,bai_3l_price%256);//保存数据
write_24c02(2,bai_3l_price/256);//保存数据
write_24c02(3,bai_3w_price%256);//保存数据
write_24c02(4,bai_3w_price/256);//保存数据
write_24c02(5,bai_wait_price%256);//保存数据
write_24c02(6,bai_wait_price/256);//保存数据
write_24c02(7,wan_3l_price%256);//保存数据
write_24c02(8,wan_3l_price/256);//保存数据
write_24c02(9,wan_3w_price%256);//保存数据
write_24c02(10,wan_3w_price/256);//保存数据
write_24c02(11,wan_wait_price%256);//保存数据
write_24c02(12,wan_wait_price/256);//保存数据
}
/****************自动初始化保存的数据*******************/
voidzidong_chushifa_iic()
{
value=read_24c02(200);
value=read_24c02(200);
if(value!
=0x91)//新的单片机初始单片机内问EEPOM
{
value=0x91;
write_iic_data();
write_24c02(200,value);//保存数据
}
delay_1ms(300);
}
/****************读出来保存的数据**********************/
voidread_iic_data()
{
flag_bai_hei=read_24c02(0);
bai_3l_price=read_24c02
(2);
bai_3l_price=bai_3l_price*256+read_24c02
(1);
bai_3w_price=read_24c02(4);
bai_3w_price=bai_3w_price*256+read_24c02(3);
bai_wait_price=read_24c02(6);
bai_wait_price=bai_wait_price*256+read_24c02(5);
wan_3l_price=read_24c02(8);
wan_3l_price=wan_3l_price*256+read_24c02(7);
wan_3w_price=read_24c02(10);
wan_3w_price=wan_3w_price*256+read_24c02(9);
wan_wait_price=read_24c02(12);
wan_wait_price=wan_wait_price*256+read_24c02(11);
}
/****************独立按键处理函数************************/
#definekey_ioP2
ucharkey_can;
voidkey()
{
staticucharkey_new=0,key_old=0,key_value=0;
key_io|=0x3f;
if(key_new==0)//按键松开
{
if((key_io&0x3f)==0x3f)
key_value++;
else
key_val