《单片机与嵌入式系统课程设计出租车计价器设计——毕业设计.doc》由会员分享,可在线阅读,更多相关《单片机与嵌入式系统课程设计出租车计价器设计——毕业设计.doc(26页珍藏版)》请在三一办公上搜索。
1、华北电力大学单片机原理与嵌入式系统课程设计题 目: 基于51单片机的出租车计价器设计学 院: 控制与计算机工程学院专 业: 测控技术与仪器学 号: 学生姓名: 指导教师: 摘要 随着生活水平的提高,人们已不再满足于衣食住的享受,出行的舒适已受到越来越多人的关注。于是,出租车行业以低价高质的服务给人们带来了出行的享受。但是总存在着买卖纠纷困扰着行业的发展。而在出租车行业中解决这一矛盾的最好方法就是改良计价器。用更加精良的计价器来为乘客提供更加方便快捷的服务。单片机具有体积小、功能强可靠性高、价格低廉等一系列优点,不仅已成为工业测控领域普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角
2、落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔。 本课设主要了解应用单片机的定时器/计数器,以及中断。这是一个比较小的系统,故采用汇编语言来编辑。汇编语言是一种编译型程序设计语言,它具有编译速度快,占用系统空间小,具有一定的助记可读性等特点。关键字:出租车计价器 电子线路 51单片机 目录1.出租车计价器的方案设计及实现 1.1 设计方案及电路61.1.1 AT89C51单片机及最小系统 6 1.1.2 振荡电路5 1.1.3 按键单元51.1.4 显示单元6 1.1.5 存储单元7 1.1.6里程测试单元8 1.3 系统总程序9 1.3.1系统总程序 1.3.2 行驶路程子程
3、序9 1.3.3 等待时间子程序101.4主要电路图及工作原理122. 仿真结果分析133. 分析测试数据144.收获、体会、建议145.元器件清单15 5.1单片机主板BOM 清单15 5.2 显示部分器件176.主要参考文献资料27附录191.出租车计价器的方案设计及实现出租车计价器是利用单片机计算总价并送显示端显示的智能仪器。89S51作为一个单片微型计算系统,灵活性高,其强大的控制处理功能和可扩展功能为设计电路提供了很好的选择。此设计可分为五部分考虑,显示用驱动后的数码管,主控制用单片机芯片,掉电保护用E2PROM24C02,外加复位电路,霍尔感应电路即可完成功能的分配。在对显示的控制
4、上,我采取的是按钮扫描控制,不同的按钮对应不同的显示模式,分别显示等候时间、里程以及总金额。1.1方案的设计及电路1.1.1 51单片机及最小系统51单片机:51具有如下特点:40个引脚,8k Bytes Flash片内程序存储器, 256bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,3个16位可编程定时计数器,全双工串行口,看门狗(WDT)电路,片内时钟振荡器。1、 单片机最小系统:复位电路和晶振电路是51单片机工作所需的最简外围电路。单片机最小系统电路图如图所示。51单片机的复位端是一个史密特触发输入,高电平有效。RST端若由低电平上升到高电平并持续2个周
5、期,系统将实现一次复位操作。在复位电路中,按一下复位开关就使在RST端出现一段时间的高电平,外接11.0592M 晶振和两个30pF 电容组成系统的内部时钟电路。图(1-3)单片机最小系统 1.1.2振荡电路 单片机内部有一个高增益、反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。通过这两个引脚在芯片外并接石英晶体振荡器和两只电容(电容和一般取33pF)。这样就构成一个稳定的自激振荡器。 振荡电路脉冲经过二分频后作为系统的时钟信号,再在二分频的基础上三分频产生ALE信号,此时得到的信号时机器周期信号。振荡电路如图所示:图(1-3)振荡电路1.1.3 按键单元 本次课设采用三
6、个按键来控制显示单元,S1为启动按钮,S2为等待按钮,S3为调整计费按钮。每个按键占用一个IO口线,每个按键电路相对独立,IO端口通过按键与地相连,IO口有上拉电阻,无按键按下时,引脚端为高电平,有按键按下时,引脚电平被拉低。电路图如下所示:图(1-4)按键单元电路 1.1.4 显示单元显示单元为数码管,四个数码管,其中每位数码管是由8个发光二极管演变而来,其中7个发光二极管构成7笔字形,另一个构成小数点,称为8段数码管。8段数码管是利用7个LED(发光二极管)外加一个小数点的LED组合而成的显示设备,可以显示09等10个数字和小数点,使用非常广泛,它的外观如图所示:图(1-5)数码管这类数码
7、管可以分为共阳极(8个发光二极管的阳极接在起)与共阴极(8个发光二极管阴极连在一起)两种,共阳极就是把所有LED的阳极连接到共同接点,而每个LED的阴极分别为a、b、c、d、e、f、g及dp(小数点);共阴极则是把所有LED的阴极连接到共同接点,而每个LED的阳极分别为a、b、c、d、e、f、g及dp(小数点),如图所示 图(1-6) 共阳和共阴数码管结构通过控制这个公共端,可使该位亮或暗。如共阴极端接地或共阳极接高电平,则该位显示器有效,反之无效。本设计采用共阴数码管。 图(1-7)显示单元1.1.5 存储单元存储单元的作用是储存上一次的里程、金额和等待时间。采用NE555芯片,作为速度检测
8、,并且能够输出方波。开关的断开,显示器能够锁存行驶里程、暂停时间和所需金额。开关闭合,显示器继续显示里程、暂停时间和所需金额。图(1-8)存储单元1.1.6里程测试部分里程计算是通过安装在车轮旁的霍尔传感器检测到的信号,送到单片机,经处理计算,送给显示单元的。而由于用里程(霍尔)传感器价格昂贵而且本次实验室的局限不能利用霍尔传感器,所以我们利用按键来代替霍尔传感器,通过按一次键代表汽车行驶了1公里,当在行驶过程中,停止按键代表行驶进入了等待时间。通过在程序中设置的里程和金额的信息,在加上驱动电路的设计,就可以在数码管上分别显示总金额和总里程。1.3 系统总程序本系统的软件设计主要分为系统主程序
9、、里程计算子程序和等待时间子程序三个模块,下面对每一块进行介绍。 1.3.1 系统主程序本设计中,软件设计采用模块化操作,利用各个模块之间的相互联系,在设计中采用主程序调用各个子程序的方法,使程序通俗易懂,我们设计了整体程序流程图。在main函数编写开始,要进行初始化,包括对系统初始化和对硬件设备进行初始化,并使硬件处于就绪状态。在主程序模块中,需要完成对各接口芯片的初始化、出租车起价和单价的初始化、中断向量的设计以及开中断、循环等待等工作。系统流程图如下图。数据处理数码显示结束开始初始化开始初始化 图(1-9)系统主程序流程图 1.3.2 行驶里程计费子程序 每当NE555芯片构成输出一个低
10、电平信号就使单片机中断一次,在计数中断服务程序,里程和金额都相应变化,计算程序根据里程数分别进入不同的计算公式。程序流程图如图所示:开始Y=3.0,计算路程路程3.5kmY=8+(s-3.5)/(0.5)Y=3+1*(s-1)/(0.5)显示金额结束否是 图(1-10)行驶里程计费子程序1.3.3 等待时间计时子程序 当结算时停止计时和计费并显示金额,当有查询键按下时显示等待时间,当有清零键按下时存储本次金额。如图:开始开始计时,并显示停止计时,开始显示路程停止计时,计费,显示金额显示等待时间存储本次金额结算按键按下?查询键按下?清零键按下?是否是否图(1-11)等待时间计时子程序1.4主要电
11、路图图(1-12)电路总图在protues中导入源程序,运行电路,即可得出结果。2 仿真结果分析 以上图就是在车启动后没有暂停时间的费用变化情况,与实际要求完全相符合。 图(2-1)仿真结果 以上图为在车行驶里程为7.3km时、停留时间为5.01min时的费用为14.3元。与实际结果完全相符和。 由以上仿真结果可以得出仿真正确。3 安装调试分析测试数据 按照电路图,焊接好实物,焊接的过程中出现了各种走线的情况,很容易短路和虚焊,焊接好后,用万用表测试排查故障,最终检查好好电路,完成调试。 用所焊接电路测的如下数据:实测次数时间(分)里程(公里)总价(元)理论总价(元)110512.212.22
12、15716.416.43201021.321.34251326.926.95301632.532.5表(3-1)测试表 实物测得的结果与理论的完全相同,由此可以得出实物的正确性。本次设计方案可以完成设计要求。4收获、体会、建议总结在本次设计中,我们采用AT89C51芯片为核心器件,设计出了简单的出租车计价器,能够实现显示时间、等待时间、金额和里程,按键控制,空车指示。选题后,我们便开始复习单片机方面的知识,也查阅、搜索了很多相关资料,进行总体设计与具体设计,同时也学习仿真软件Proteus和编程软件Keil uVision3。由于以前都采用汇编语言实现编程,对用C语言来实现单片机的编程不太习惯
13、,花费了一些时间来熟悉C语言的编程。在设计开始,要形成流程图,它可以使设计有一定的逻辑性与严密性,使得设计思路明确。采用模块化的设计思想很重要,它方便编写、修改与调试,另外加上必要的注释,便于交流与理解。通过这次设计不仅学会了如何去查找相关资料,更重要的是通过查找资料和翻阅书籍学到了不少知识,扩大了知识面,提高了知识水平。经过单元设计和系统设计巩固了以前所学的专业知识,自己真正认识到理论联系实际的重要性,为以后的学习和工作提供了很多有价值的经验。通过这次设计不仅增强了自己的动脑能力和动手能力,也提高了我思考问题、分析问题、解决问题的能力,更重要的是学会用工程化的思想来解决问题。这在以前的学习过
14、程中是不曾学到的。 这次设计是我认真认识到完整、严谨、科学分析问题、解决问题的思想是多么的重要,只有拥有了科学的态度才能设计出有用的产品。另外通过本次设计,是我认识到自己理论知识的应用能力有很大的欠缺,需要在以后的学习中进一步提高。 这次课程设计设计完成后,体会颇多,在学与做的过程中,取长补短,不断学习新的知识,吸取经验,达到进步的目的。通过自身的努力以及相关图书资料的帮助,逐渐熟悉了Keil uVision3、PROTEUS和C语言等软件的使用以及硬件焊接与检测过程中的一些小技巧。本次设计我学习到不少单片机的知识,但由于自己的理论知识水平有限,实践知识和设计经验不足,在设计过程中难免存在一些
15、问题。所焊实物尚有许多不足,个别功能还不能很好的实现,主要原因是考虑问题不周全,电路设计经验少,实际动手能力不足。恳请各位老师批评指正,以使我在以后的学习和实践中加以改进和提高。5.元器件清单 5.1单片机主板BOM 清单序号名称数量备注1DC3.5 电源插座1电源供电接口,输入7-9V23LED(绿)133LED(黄)143LED(红)1578M05161N400717瓷片电容(104)98100uF/16V 电解电容1910uF/16V 电解电容110直插电阻(1K)311直插电阻(10 欧)112直插电阻(10K)113MAX232(DIP16)1146X6X5 按键5153X2 排针1
16、16瓷片电容(30pF)217蓝白可调电阻(10K)21820X2 排针2199P 排阻(10K)1203X1 排针121跳线帽12216P 排插12320P 排插124HX1838 红外接收头125DS18B20 温度传感器126DIP40 锁紧座127STC89C52 单片机128晶振12MHz129晶振11.0592MHz130晶振24MHz1316X6 自锁开关132DIP16 IC 插座133红外遥控器134铜柱+螺帽435串口弯孔插座136USB-A 插座137Mini51KitPCB1 5.2 显示部分器件38七段八位数码管43974LS48440开关36 主要参考文献资料 1.
17、刘可文,刘泉。数字电子技术基础。科学出版社,2013 2.李玉梅. 基于MCS-51系列单片机原理的应用设计. 国防工业出版社,20063.楼然苗,胡佳文,李光飞等.单片机实验与课程设计. 浙江大学出版社,2010.104.戴佳, 陈斌, 苗龙. 51单片机应用系统开发典型实例. 中国电力出版社,2005 5.李群芳,肖看.单片机原理接口与应用.清华大学出版社,2005 附录一:电路图附录二:程序*名称:出租车计价器 *功能:统计出租车行驶的里程数以及出租车停行时间,并进行计算输出价格。里程,时间, 价格可以用按键的形式进行切换。 */#include /定义和初始部分sbit drive=P
18、17; /发动机运行信号sbit model0=P20;/第一列第1个按键,里程显示sbit model1=P21;/第一列第2个按键,时间显示sbit model2=P22;/第一列第3个按键,价格显示sbit buttonlist=P24; /第一列按键的总选端char code Bite=0x08,0x04,0x02,0x01; /0为最高位,以从左到右顺序排序,方便使用char code Number=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /对应的共阳极数码管数字编码09int i,model=2; /model用于显示模
19、式选择,0为里程,1为等待时间,2为价格unsigned char minute=0,s=0;long int length,timeprice=0,price=0,ms=0;/里程和价格分别以米和角为单位int th1=0,tl1=0;/用于存储计时的历史值,完成断点计时功能char LengthData4,TimeData4,PriceData4;/定义三个数组分别为三个模式的显示缓冲序列/* 延时子程序*/void delay(int z) /利用for循环通过z值选取实现延时char x,y;for(x=100;x0;x-) for(y=z;y0;y-);/* 显示数据处理函数* 分别
20、置入里程数、时间、价格显示的个位数据*/void Displaypro(void)length = (TH0*256+TL0);LengthData0=Numberlength/100000; /单位为km的百位LengthData1=Number(length%100000)/10000; /十位LengthData2=Number(length%10000)/1000 ; /个位LengthData3=Number(length%1000)/100; /小数点后第一位TimeData0=Numberminute/10; /显示十位分TimeData1=Numberminute%10;/显示
21、个位分TimeData2=Numbers/10; /显示秒TimeData3=Numbers%10;timeprice = (minute/3)*7;/等待时间造成的价格增值if(length1000) price = 30+timeprice;else if(length1500) price = 40+timeprice;else if(length2000) price = 50+timeprice;else if(length2500) price = 60+timeprice;else if(length3000) price = 70+timeprice;else price =
22、70+(length-3000)/500)*7+timeprice; /起步价3元,三公里内每公里2元,三公里外每公里1.4元。时间造成的价格增值每三分7角。PriceData0=Numberprice/1000; /单位为元的百位PriceData1=Number(price%1000)/100; /十位PriceData2=Number(price%100)/10; /个位PriceData3=Numberprice%10; /小数点后第一位/* 显示三模式子程序*/void DisplayLength(void)/显示里程数 for(i=0;i4;i+) P1 = Bitei; /位选。
23、P0 = LengthDatai; /段选。delay(2); /时间稍作延迟。 void DisplayTime(void)/显示时间值。 for(i=0;i4;i+) P1 = Bitei;P0 = TimeDatai; delay(2); /时间稍作延迟。void DisplayPrice(void) /显示价格 for(i=0;i4;i+) P1 = Bitei; P0 = PriceDatai; delay(2); /时间稍作延迟。/* 模式选择并显示程序*/void Display(void)switch (model)case 0:DisplayLength(); /模式0显示里
24、程数break;case 1:DisplayTime(); /模式1显示等待时长break;case 2:DisplayPrice(); /模式2显示价格break;/* 中断初始化子程序*/void Initial(void)TMOD=0x05; /定时器0在方式1下用于方波计数即里程统计TH0=0; /初值TL0=0;ET0=1;TR0=1; /启动定时器0 TMOD=0x10; /定时器1在方式1下用于停车计时TH1=(65536-1000)/256; /初值为1000,取高八位TL1=(65536-1000)%256; /取低八位ET1=1; /开启定时器1中断TR1=0; /启动定时
25、器1/* 中断子程序INT0*/void int0(void) interrupt 3 /中断计时器1,用于计时中断TH1 = (65536-1000)/256; /初值为1000,取高八位TL1 = (65536-1000)%256; /取低八位ms+; /毫秒进位if(ms=865)ms = 0;s+;/秒进位if(s=60)s = 0;minute+;/分进位if(minute=60)minute = 0;/* 停车检测程序* 功能:当停车,即方波停止输入时,定时器1开始计时;车子启动时,计时停止。*/void StopTest(void)if(drive=0) TR1 = 1;else
26、 TR1 = 0;/* 按键检测程序* 功能:在单片机相应按键按下时,实时显示当前对应的三个模式*/void ButtonTest(void)buttonlist = 0;if(!model0) /开始逐一检测,检测里程按钮delay(50); /除抖动处理if(!model0) model = 0;else if(!model1)delay(50);if(!model1) model = 1; /检测时间按钮else if(!model2) /检测价格按钮delay(50);if(!model2) model = 2;/* 主函数*/void main() TR1=0; EA =1; /开启总中断TH0=0; / 方波计数器初值TL0=0;while (1) Initial(); /计数器、计时器初始化StopTest(); /检测是否停车,若停车则开始计数器1Displaypro();/显示缓冲置数ButtonTest();/检测按键模式选择Display();/显示