《微机原理单片机课程设计例子.doc》由会员分享,可在线阅读,更多相关《微机原理单片机课程设计例子.doc(29页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、单片机应用和仿真训练设计报告出租车计价器 28 / 29摘要随着出租车行业的发展,出租车行业已经是城市交通的重要组成部分,从加强行业管理以及减少和乘客的纠纷出发,以单片机为核心的智能出租车计价系统的开发就显得尤其重要。本设计采用89C51单片机为主控器,以霍尔传感器测距,实现对出租车的多功能的计价设计。并且还添加有其他的附加设计,使司机师傅操作起来更加方便,例如,按暂停键,计价器可暂停计价,按查询键,可显示总等待时间等。关键词:89C51,霍尔传感器目录一、概论31、前言32、设计的意义33、设计任务34、设计的目的和要求4二、系统总体方案及硬件设计51、系统总体方案52、霍尔传感器检测单元5
2、3、键盘调整单元6三、软件设计81、系统主程序82、中断程序92.1、里程计数中断程序92.2、中途等待中断程序92.3、计算程序92.4、显示程序92.5、键盘程序10四、Proteus软件仿真11五、实物图12六、程设计心得体会13参考文献13附1:源程序代码14附2:系统原理图22一 概述1、前言计价器是出租汽车的经营者和乘坐出租汽车的消费者之间用于公平贸易结算的工具,因而计价器计价准确和否,直接关系到经营者和消费者的经济利益。依据国家有关法律、法规,出租汽车计价器是列入国家首批强制检定的工作计量器具之一,也是近年来国家质量技术监督部门强化管理的六类重点计量器具之一。在出租车是城市交通的
3、重要组成部分,行业健康和发展也获得越来越多的关注。汽车计价器是乘客和司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。它关系着交易双方的利益。具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。出租车已经成为我国城市公共交通的重要组成部分和现代化城市必备的基础设施,成为人们工作、生活中补课缺少的交通工具。而出租车计价器在出租汽车服务行业中占着极为重要的地位,因为出租车必须安装出租车计价器才能投入正常的运营。出租车计价器是一种能根据乘客乘坐汽车行驶距离和等候时间的多少进行计价,并直接显示车费值得计量器具。计价器是出租汽车经营者和乘坐出租汽车的消费者之间
4、用于公平贸易结算的工具,因而计价器准确和否,直接关系到经营者和消费者的经济利益。依据国家有关法律、法规,出租车计价器是列入国家首批强制检定的工作计量器具之一,也是近年来国家质量技术监督部门强化管理的的六类重点计量器具之一。2、设计的意义在出租车时城市交通的重要组成部分的大环境下,行业的健康和发展也获得越来越多的关注。汽车计价器是乘客和司机双方的交易准则,它是出租车行业发展的重要标志,是出租车种最重要的工具。她关系着交易双方的利益。具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。因此,汽车计价器的研究也是十分有应用价值的,尤其是对于出租车行业有着极其重要的意义。3、设计任
5、务本设计是采用AT89C51单片机为主控器,以霍尔传感器测距,实现对出租车的多功能的计价设计,输出采用8段数码显示管。本电路设计的计价器不但能实现基本的计价,而且还能根据单程,返程和起步来调节单价,并实现了暂停和等待时间查询的功能。4、设计的目的和要求目的:通过单片机课程设计,熟练掌握c语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力。通过出租车计价器系统的设计,掌握单片机个资源的使用方法,和简单程序的编写,最终提高我们的逻辑抽象能力。基本要求:(1)能显示里程,单位为公里,最后一位为小数位。(2)能显示金额数,单位为元,最后一位为小数位。(3)可设定单程价格和往返价格,单程价
6、格为2元/公里,往返价格为1.5元/公里。(4)车速5公里/小时的时间累积为总等待时间,每5分钟等待时间相当于里程数增加1公里。(5)起步公里数为3公里,价格为5元,若实际距离大于3公里,按规则3计算价格。(6)按暂停键,计价器可暂停计价,按查询键,可显示总等待时间。二 系统总体方案及硬件设计1、系统总体方案模拟计数器系统主要由四大模块组成:霍尔传感器、AT89C51单片机、独立键盘。霍尔传感器安装在车轮的旁侧,主要检测汽车行进的公里数,并产生一系列相应的脉冲输出,脉冲送到单片机进行处理,单片机根据程序设定通过计算脉冲数换算出行驶公里数,再根据价格等相关数据进行金额的计算,计算好的金额、里程都
7、实时地显示在数码管上。独立键盘可以调节价格等相关数据,按下相应的按钮,产生信号交由单片机处理并实时显示出来。总体方案结构图如下:独立键盘调整切换AT89C51单片机数码管 显示电路脉冲输入 霍尔传感器计算输出 图2.1 系统总体结构框图2、霍尔传感器检测单元属于开关型的霍尔器件,其工作电压范围比较宽(4.518V),其输出的信号符合TTL电平标准,可以直接接到单片机的IO 端口上,而且其最高检测频率可达到1MHZ。集成霍耳开关由稳压器A、霍耳电势发生器(即硅霍耳片)B、差分放大器C、施密特触发器D和OC门输出E五个基本部分组成。在输入端输入电压Vcc,经稳压器稳压后加在霍尔电势发生器的两端,根
8、据霍尔效应原理,当霍尔片处在磁场中时,在垂直于磁场的方向通以电流,则和这二者相垂直的方向上将会产生霍尔电势差VH输出,该VH信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC门输出。当施加的磁场达到工作点(即Bop)时,触发器输出高电压(相对于地电位),使三极管导通,此时OC门输出端输出低电压,三极管截止,使OC门输出高电压,这种状态为关。这样两次电压变换,使霍尔开关完成了一次开关动作。 霍尔传感器原理如图5所示。P3.2霍尔传感器小磁铁AT89C51单片机图2.2 传感器测距示意图里程计算是通过安装在车轮上的霍尔传感器检测到的脉冲信号,送到单片机产生中断,单片机再根据程序设定,计
9、算出里程。其原理如图2.4所示。本系统选择了将霍尔传感器的脉冲输出口接到P3.3口外部中断1作为信号的输入端(这样可以减少程序设计的麻烦),车轮每转一圈(设车轮的周长是5米),霍尔开关就检测并输出信号,引起单片机的中断,对脉冲计数,当计数达到200次时,即1公里,单片机就控制将金额自动增加,如图2.5(霍尔传感器)。图2.3 霍尔传感器 3、键盘调整单元当单价等信息需要进行修改时,就要用到键盘进行修改。由于调节信息不多,故采用4个独立键盘即可,分别实现清零、切换、增大、减小和功能等作用。电路原理如图所示。 图2.4 键盘调整模块S1:接P1.1口,实现路程和单价的切换。S2:接P1.2口,实现
10、单程和往返程的切换。S3:接P1.3口,实现清零功能(在按下查询总价键之后实现)。S4:接P1.4口,暂停功能。S5:接P1.5口,对等待时间进行查询。S6:接P1.6口,查询总价。三 软件设计1、系统主程序在主程序模块中,需要完成对各参量和接口的初始化、出租车起步价和单价的初始化以及中断、计算、循环等工作。另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。 3.1 主程序流程图当汽车运行起来时,就启动计价,根据里程寄存器中的内容计算和判断行驶里程是否已超过起步价公里
11、数。若已超过,则根据里程值、每公里的单价数和起步价数来计算出当前的总金额,并将结果存于总金额寄存器中;中途等待时,脉冲输入小于设定值时,当时间超过等待设定值时,开始进行计时,并把等待价格加到总金额里,然后将总金额、里程送数码管显示出来。程序流程如图所示。2、中断程序2.1、里程计数中断程序每当霍尔传感器输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满1500次时,进入里程计数中断服务程序中,里程变量加一。主函数中总金额也相应地变化。在中途等待中断程序中,每1ms产生一次中断,将由当前里程计算出速度值送入某个缓存变量。把当前速度值和预先设定的速度值相比较,当小于设定的车速时,进入
12、等待计时。等待时间5分钟相当于里程增加一公里。流程如图3.4所示:图3.2 中断流程2.2、中途等待中断程序在中途等待中断程序中,每1ms产生一次中断,将当前里程值送入某个缓存变量,每5分钟将缓存变量中的值和当前里程值比较,当汽车车速小于5公里/小时,将存储器里面的值和实时测量的值比较,当行进的里程小于5公里每分钟时,则进入等待计时,每5分钟记一次价格。2.3、计算程序计算程序根据里程数分别进入不同的计算公式。如果里程大于3公里,则执行公式:总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:总金额=起步价+等待时间*等待单价。程序流程图如图所示。 3.3 计算程序流程图2
13、.4、显示程序程序利用定时器每1ms产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/段码表示0-9图3.4 显示子程序流程2.5、键盘程序键盘实质上是一组按键开关的集合,均利用机械触点的合、断作用。按键在闭合及断开的瞬间均伴随有一连串的抖动,抖动反应在电压上就是呈现出高电平或低电平,为了确保CPU对一次按键动作只确认一次,必须消除抖动的影响。去抖通常有硬件去抖和软件去抖两种方法,本程序使用软件延
14、时去抖。 图3.5 按键抖动信号波形对于独立式键盘判键,首先看有键按下不,如果有键按下则延时一会儿,在判断是否真的有键按下,如果确实有键按下,再判键释放,最后执行键功能程序。判键子函数的流程框图如图3.5所示:图3.6 判键子程序流程图四 Proteus软件仿真Proteus软件是来自英国Labcenter electronics公司的EDA工具软件,它组合了高级原理布图、混合模式SPICE仿真,PCB设计以及自动布线来实现一个完整的电子设计系统。此系统受益于15年来的持续开发,被电子世界在其对PCB设计系统的比较文章中评为最好产品“The Route to PCB CAD”。Proteus
15、产品系列也包含了我们革命性的VSM技术,用户可以对基于微控制器的设计连同所有的周围电子器件一起仿真。用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真。 其功能模块:个易用而又功能强大的ISIS原理布图工具;PROSPICE混合模型SPICE仿真;ARES PCB设计。PROSPICE 仿真器的一个扩展PROTEUS VSM:便于包括所有相关的器件的基于微处理器设计的协同仿真。此外,还可以结合微控制器软件使用动态的键盘,开关,按钮,LEDs甚至LCD显示CPU模型。支持许多通用的微控制器,如PIC,AVR,HC11以及89C51。最新支持ARM。交互
16、的装置模型包括:LED和LCD显示,RS232终端,通用键盘,I2C,SPI器件。强大的调试工具,包括寄存器和存储器,断点和单步模式。IAR C-SPY 和Keil uVision2等开发工具的源层调试。应用特殊模型的DLL界面-提供有关元件库的全部文件。五 实物图 实物展示图六 程设计心得体会通过这次课程设计,我掌握了数码管的识别和测试;熟悉了霍尔传感器的工作原理,了解了独立按键的分配方法;以及如何提高计时精度的性能等等,掌握了proteus应用的方法和技术,通过查询资料,也了解了出租车计价器的工作原理。课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门
17、辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。在这次课程设计中,我一开始是在上网找资料,根据找到的霍尔传感器电路资料。我们直接按照资料焊了元件,由于我们考虑到了原件的限制,所以对电路做了一些改动。我们根据实际需要对我们的电路进行改动,而且可以很自信的进行焊接。但是我们对仿真软件不熟悉,焊电路时没有仿真的支持,出了几次错误。我把所有可能出错的地方查了一边,结果是电位器出了问题,看来不仿真就不能百分之百的成功,还需要实践来检验。通过这次课程设计使我懂得了理论和实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识和实践相
18、结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。动手能力有待提高,对计算机有关软件的使用也应该熟练。通过本次课程设计,又使我学到了许多书本上无法学到的知识,也使也深该体会到单片机技术应用领域的广泛,不仅使我对学过的单片机知识有了很多的巩固,同时也对单片机这一门课程产生了更大的兴趣。在本次课程设计过程中,我学会了在网络上查找有关本设计的各硬件的资源,其中包括:AT89S51单
19、片机及其引脚说明、AT24C02引脚图及其引脚功能等,为本次课程设计提供了一定的资料。由于平时很少进行课程设计,所以对于课程设计报告的格式也是近期才接触到,经过这两次的设计,为我们以后毕业设计的制作也奠定了一定的基础。参考文献 【1】模拟电子技术基础艾永乐 付子义编. 北京:中国电力出版社,2008【2】王晓明.单片机接口技术.北京航空航天大学出版社,2007【3】电子技术实践 阎有运 编. 北京:中国矿业大学出版社。【4】实用电子电路200例 张庆双 等编 北京:机械工业出版社,2003。【5】王晓敏.传感器检测技术及应用.北京大学出版社,2010.附1:源程序代码#include#incl
20、ude #define uchar unsigned char#define uint unsigned intuchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;sbit deng1=P11; /暂停sbit deng2=P12; /白天黑夜sbit deng3=P13; /单双程sbit key0=P14; /功能键切换sbit key1=P15; /白天黑夜sbit key2=P16; /单双程sbit key4=P17; /确认 sbit p11=P21; /数码管各位位选,里程数,总金额 ,单价sbit
21、 p12=P22;sbit p13=P23;sbit p21=P25;sbit p22=P26; sbit p23=P27;sbit p31=P20;sbit p32=P24;uint zongjine,licheng,licheng_1,zanting,licheng_2;uint lunquan,aa,bb,dengdai;uint temp_1,temp_2,shezhi_1;uchar danjia1,danjia2,danjia,qiehuan;uchar miao,fen;void display(void); /* 延时时基为1ms */void delay_ms(uint x)
22、 int i,j; for(i=x;i0;i-) for(j=110;j0;j-);/* 按键消抖*/uchar read_key(uchar xuanze) uchar shezhi=0,key_wei=0; key_wei=xuanze; P1|=0xf0; if(key_wei=1) /读取白天,黑夜键值 while(1) if(!key1) delay_ms(5); if(!key1) while(!key1) ; shezhi+; if(shezhi=2) shezhi=0; if(!key4) delay_ms(80); if(!key4) while(!key4) ; break
23、; if(shezhi=1) deng2=0; else if(shezhi=0) deng2=1; else if(key_wei=2) /读取单程,双程键值 while(1) if(key2=0) delay_ms(5); if(key2=0) while(!key2) ; shezhi+; if(shezhi=2) shezhi=0; if(key4=0) delay_ms(80); if(key4=0) while(!key4) ; break; if(shezhi=1) deng3=0; else if(shezhi=0) deng3=1; else if(key_wei=3) /读
24、取显示数据键值 if(key0=0) display(); display(); if(key0=0) while(!key0) display(); shezhi_1+; if(shezhi_1=2) shezhi_1=0; shezhi=shezhi_1; return shezhi; /* 函数初始化 */void init() P1=0xff; P2=0x00; P0=table0; zongjine=0; licheng=0; dengdai=0; qiehuan=0; danjia1=read_key(1); /读取白天,黑夜 danjia2=read_key(2); /读取单程,
25、双程 danjia=20-(5*danjia2); EA=1; /开总中断 EX0=1; /开外部中断0 EX1=1; /开外部中断1 IT0=1; /触发方式下降沿 IT1=1; /触发方式下降沿 PX1=1; /外部中断1,暂停设为高优先级 TMOD=0x11; TH0=(65536-1000)/256; TL0=(65536-1000)%256; /填入1ms初值 ET0=1; /开定时器T0中断 TR0=1; /开定时器T0 /* 总金额计算 */ void jisuan() uint a; if(licheng=3) a=licheng_2-60; zongjine=(danjia*
26、a)/20+50; /金额计算 else zongjine=50; /起步公里内金额计算 /* 数码管显示 总金额、里程数 */void display_1(uint zongjine_0,uint licheng_0) uchar jbai,jshi,jge,lshi,lge,lxiao; jbai=zongjine_0/100; /数码管位置分配 jshi=(zongjine_0%100)/10; jge=zongjine_0%10; lshi=licheng_0/100; lge=(licheng_0%100)/10; lxiao=licheng_0%10; P0=0xff; /数码管动
27、态显示 P2=0xff; p11=0; P0=tablejbai; delay_ms(1); p11=1; p12=0; P0=tablejshi|0x80; delay_ms(1); p12=1; p13=0; P0=tablejge; delay_ms(1); p13=1; p21=0; P0=tablelshi; delay_ms(1); p21=1; p22=0; P0=tablelge|0x80; delay_ms(1); p22=1; p23=0; P0=tablelxiao; delay_ms(1); p23=1; /* 数码管显示时间、单价 */void display_2(u
28、char fen_0,uchar miao_0,uchar danjia_0) uchar sfen,gfen,smiao,gmiao; uchar dshi,dge; dshi=danjia_0/10; dge=danjia_0%10; sfen=fen_0/10; gfen=fen_0%10; smiao=miao_0/10; gmiao=miao_0%10; P0=0xff; P2=0xff; p31=0; P0=tablesfen; delay_ms(1); p31=1; p11=0; P0=tablegfen|0x80; delay_ms(1); p11=1; p12=0; P0=t
29、ablesmiao; delay_ms(1); p12=1; p13=0; P0=tablegmiao; delay_ms(1); p13=1; p22=0; P0=tabledshi|0x80; delay_ms(1); p22=1; p23=0; P0=tabledge; delay_ms(1); p23=1; /* 显示内容选择 */void display() if(qiehuan=0) display_1(zongjine,licheng_1); else if(qiehuan=1) display_2(fen,miao,danjia); /* 主函数*/void main() in
30、it(); qiehuan=0; while(1) licheng_1=licheng_2/2; jisuan(); /计算总金额 qiehuan=read_key(3); display(); void int0(void) interrupt 0 using 0 /外中断0的中断编号为0 lunquan+; licheng_2+; licheng_1=licheng_2/2; if(lunquan=20) lunquan=0; licheng+; void int1(void) interrupt 2 using 2 /外中断1的中断编号为2 暂停 EA=0; zanting+; disp
31、lay(); if(zanting=2) zanting=0; if(zanting=1) deng1=0; EA=1; ET0=0; TR0=0; EX0=0; else deng1=1; EA=1; EX0=1; TH0=(65536-1000)/256; TL0=(65536-1000)%256; ET0=1; TR0=1; void timer0() interrupt 1 /定时器中断0 TH0=(65536-1000)/256; TL0=(65536-1000)%256; if(temp_2=0) aa=licheng_2; temp_2+; if(temp_2=1000) /1s无反应进入等待计费 bb=licheng_2; temp_2=0; if(aa=bb) miao+; if(miao=60) miao=0; fen+; if(dengdai=10) dengdai=0; licheng+; licheng_2+=20; licheng_1+=10; 附2:系统原理图
限制150内