ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:282.82KB ,
资源ID:12159975      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12159975.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(单片机出租车计价器课程设计报告.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

单片机出租车计价器课程设计报告.docx

1、单片机出租车计价器课程设计报告单片机原理及系统课程设计评语:考勤10分守纪10分过程30分设计报告30分答辩20分总成绩(100分)专 业: 自动化 班 级: 动1102 姓 名: 学 号: 201108645 指导教师: 林海香 兰州交通大学自动化与电气工程学院2014 年 1 月 17 日 基于单片机的出租车计价系统设计1 设计目的,要求和设计方法1.1设计目的(1)学习基本理论在实践中综合运用的初步经验,掌握电路设计的基本方法、设计步骤,培养综合设计与调适能力,进一步提高综合运用所学知识和设计能力的的目的。(2)掌握C语言程序设计方法。(3)培养实践技能,提高分析和解决实际问题的能力,并

2、具备一定程度的设计能力。1.2基本设计要求本出租车自动计费,上电后显示最初的起步价,里程计费单价,等待时间计费单价,通过按键可以调节起步价,里程计费单价,等待时间计费单价。同时具有运行,等待,暂停等状态,可以显示暂停的时间。出租车停止后能够显示行驶的总费用。1.3性能指标 1、费用的计算是按行驶里程收费。设起步价为7.00元。2、当里程3km时,每公里按1.7元计费。4、等待累计时间2min时,按1.5元/min计费。1.4显示功能1、显示行驶里程:用两位数字显示,显示方式为“XX”,单位为km。计程范围0-99km,精确到1km。2、显示等候时间:用两位数字显示,显示方式为“XX”,单位为m

3、in。计时范围0-59min,精确到1min。3、显示总费用:用四位数字显示,显示方式为“XXX.X”,单位为元。计价范围0-999.9元,精确到0.1元。1.3 设计方法 本设计采用AT89C51单片机为主控器,并用开关或者频率信号发生器模拟车速,利用AT89C51的定时器工作在方式1下定时实现对出租车的计时及计价设计,输出采用LCD液晶显示屏显示。2 设计方案及原理2.1 设计方案本设计,利用单片机丰富的端口和控制的灵活性,采用AT89C51单片机为主控器,并用开关或频率信号发生器模拟车速,通过石英振荡器,LCD液晶显示和发光二级管以及单片机内部程序构成完整的出租车计价系统,基本可以实现了

4、按运行状态计价的功能,价格调整功能。2.2 设计原理出租车计价是根据车所行驶的路程以及乘客乘车的里程综合决定的。出租车行驶总路程可以通过车轮的周长乘车轮旋转圈数得到。即可计算得到车轮旋转几周出租车能行驶一公里的路程。通过计数接收到的脉冲个数,计算出当前所行驶的路程。同时,通过LCD液晶显示器显示当前的行驶里程、等待时间和需支付的车费。出租车计价器用于记录里程、起步公里数与价格的关系。模拟出租车计价器能根据总里程数、起步公里数的情况作出相应报价等。3 出租车计价器系统的硬件设计3.1 出租车硬件框图图2-1系统的硬件框图3.2 出租车计价器硬件连接图AT89C51的最小系统:时钟电路是单片机内部

5、有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。通过这两个引脚在芯片外并接石英晶体振荡器和两只电容(电容和一般取30pF)。这样就构成一个稳定的自激振荡器。复位操作是按键复位,按键复位具有上电复位功能外,若要复位,只要按图中的RESET键,电源VCC经电阻R1、R2分压,在RESET端产生一个复位高电平。AT89C51的最小系统硬件图如图3.2(a)所示。图3.2(a) AT89C51的最小系统硬件图液晶显示和LED灯指示电路:显示电路对于现实电路我们采用液晶显示,液晶又分字符型和点阵型,我们使用的液晶是字符型液晶,并且带字符库的,不需要查找代码,英文字符就可以

6、。运行状态指示电路采用发光二级管对运行方式进行指示,可清楚看到计价器的运行状态。液晶显示和LED灯指示电路如图3.2(b)所示。图3.2(b) 液晶显示和LED灯指示电路 按键电路:按键电路是通过按键去调节初始选择、调节,模式选择,开始运行,终止等功能。霍尔传感器里程计算是通过安装在车轮旁的霍尔传感器检测到的信号,送到单片机,经处理计算,送给显示单元的。而由于本次实验室的局限不能利用霍尔传感器,所以我们利用按键来代替霍尔传感器,通过按一次键代表汽车行驶了1公里,当在行驶过程中通过按键来选择运行状态。按键电路如图3.2(c)所示。图3.2(c) 按键电路4 出租车计价器系统的软件设计4.1系统流

7、程图出租车计价器系统流程图如附录1所示。4.2源程序代码 根据设计的要求,在本系统中主要有主程序和延时程序,主程序中包括中断服务程序和键盘显示子程序、计算子程序等。现在应用更广泛的是单片机C语言,因其简单明了,故此次课程设计采用单片机C语言编程。程序源代码如附录2所示。4.3程序调试域运行结果在Keil C51 uvision4中对系统建立项目,选定合适的单片机AT89C51,创建一个计价器的新文件,并将上述的源程序进行编辑和选项操作进行编译,以生成计价器的HEX文件。5 系统仿真及实际调试5.1运行图示仿真开始后,首先按动初始选择按钮, 则可以在运行单价,等待单价,起步价之间切换,每按一次切

8、换一个量,选定后可以按动初始调节按钮进行调节,调节完成后,按下开始运行按钮则开始运行,选择运行模式后开始计费,不同的运行模式会有不同的指示灯亮起,在运行过程中液晶屏会随时显示走过的路程和等待的时间,以及总的费用。仿真图如附录3所示。5.2仿真问题分析问题需要改进,例如本设计经过多次的调试与改正,最终达到了设计方案中的结果。在仿真试验中各种设计要求都能够得到验证。但由于设计的原因,本系统仍然总在一些自动化程度不够,运行模式还需要手动选择。6 总结出租车计费器系统的设计已经全部完成,能利用AT89C51单片机对出租车启动,停止,暂停等运行状态进行选择和显示,能将单价和费用适时通过LCD显示出来。本

9、款出租车计价器包括单价输出、单价调整、显示当前的总费用等功能。虽然达到了基本的设计目的,但仍然存在一些问题,策划的不够全面,对单片机不够熟悉,系统编写不够简洁完善,使得计价器计费不够细致,不够人性化。经过这次课程设计让我学会了很多的东西。经过自己努力,基本上完成了设计要求的内容,在系统可行性分析、原理图设计等方面都作了一些实际工作,同时也遇到了一些问题,存在一些不足。学会了怎么去查找些资料,把所找到的东西与自己的问题所结合起来并给予解决。这次设计使我学会把以前学到的理论知识应用于实践,使我认识到理论知识与实践之间有一定的差距,只有通过不断的努力学习和实践才能很好的把理论知识应用到实践当中,也只

10、有通过不断的实践才能加深对理论知识的理解。 参考文献1 王思明,张金敏,张鑫等.单片机原理及应用系统设计.北京:科学出版社,20122 张金敏,董海棠,高博等.单片机原理与应用系统设计.成都:西南交通大学出版社, 20103 李华,王思明,张金敏.单片机原理及应用.兰州:兰州大学出版社,2001附录1附录2 #include#define uchar unsigned char#define uint unsigned int /*定义1602读写使能端口*/sbit rw=P21;sbit rs=P20;sbit en=P22;sbit b=P07;sbit gl=P10;void lcd_

11、init(); /lcd设置函数void wr_com(uchar command); /命令函数void wr_data(uchar data0); /数据函数void lcd_clear(); /清屏函数void lcd_set(); /屏幕设置函数void busy(); /测忙函数void display(); /启动前显示函数void printstring(uchar *s);void display1(); /启动后显示函数void key1(); /启动前按键sbit K=P30;sbit K1=P31;sbit K2=P35; /开始计价sbit K3=P33; /模式选择(

12、行程/等待)sbit K4=P34; /复位sbit g=P27; sbit aa=P23; /运行sbit bb=P24; /等待sbit cc=P25; /暂停/sbit led_run=P30;/sbit led_await=P31;/sbit led_stop=P32;bit f_start;bit jump_in;bit jump_out;void key(); /启动后按键/*定义液晶显示地址数组*/uchar code table=0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x70;uchar dispbuf=0,0,0,

13、0,0,0,0,0,0,0,0,0,0,0,0;uchar dispbuf1=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;uchar v,v1; uchar i,m=0;void init();void chuli();void chuli1();void delay(uchar t); /延时函数void clear(); /终止函数void set(uchar x);void set1(uchar y); uchar command;uchar count,count1;uchar second,minite,second1,minite1;unsigned int tt,

14、tt1;unsigned char value1=70,value2=17,value3=15; /value1=起步价,value2=超出每公里价格,value3=等待价格unsigned int money; void main()/ Init_Timer1(); /定时器中断函数 EX0=1;/开外部中断0 IT0=1;/采用跳变沿触发方式 init(); lcd_init(); while(1) key1(); chuli(); display(); if(jump_in=1) jump_in=0; lcd_init(); while(1) key(); chuli1(); displ

15、ay1(); if(jump_out=1) lcd_init(); jump_out=0; clear(); break; void clear() TR0=0; TR1=0; money=0; second=0; second1=0; minite=0; minite1=0; value1=70; value2=17; value3=15; / led_run=1; /led_await=1; / led_stop=1; v=0; v1=0; for(i=0;i15;i+) dispbufi=0; dispbuf1i=0; m=0;void init() /中断定时 TMOD=0x11; T

16、H0=(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 t0_(void) interrupt 1 using 0 /中断1模式0 用来计时 秒、分 count+; if(count=20) count=0; second+; if(second=60) second=0; minite+; if(minite=99) minite=0; TH0=(65536-50000)/256; TL0=(

17、65536-50000)%256; dispbuf10=m/10; dispbuf11=m%10; dispbuf12=second/10; dispbuf13=second%10;void t1_(void) interrupt 3 using 3 /中断3模式3用来计时 秒、分 count1+; if(count1=20) count1=0; second1+; if(second1=60) second1=0; minite1+; if(minite1=99) minite1=0; TH1=(65536-50000)/256; TL1=(65536-50000)%256; dispbuf

18、14=minite1/10; dispbuf15=minite1%10; dispbuf16=second1/10; dispbuf17=second1%10; void lcd_init() wr_com(0x3c); wr_com(0x06); wr_com(0x0c); wr_com(0x01);void wr_com(uchar command) /命令 busy(); rs=0; rw=0; P0=command; en=1; en=0;void wr_data(uchar data0) /数据 busy(); rs=1; rw=0; P0=data0; en=1; en=0;voi

19、d busy() /测忙函数 while(1) en=0; rs=0; rw=1; P0=0xff; en=1; if(b!=1)break; en=0;void chuli() /分离出百位十位个位 dispbuf0=value1/100%10; dispbuf1=value1/10%10; dispbuf2=value1%10; dispbuf3=value2/100%10; dispbuf4=value2/10%10; dispbuf5=value2%10; dispbuf6=value3/100%10; dispbuf7=value3/10%10; dispbuf8=value3%10

20、;void display() /初始显示函数 set(0); printstring(step :); wr_data(tabledispbuf0); wr_data(tabledispbuf1); printstring(.); wr_data(tabledispbuf2); set(16); printstring(mileage :); wr_data(tabledispbuf3); wr_data(tabledispbuf4); printstring(.); wr_data(tabledispbuf5); set1(0); printstring(await :); wr_data

21、(tabledispbuf6); wr_data(tabledispbuf7); printstring(.); wr_data(tabledispbuf8); set1(16); printstring(run : ); wr_data(tabledispbuf10); wr_data(tabledispbuf11); printstring(:); wr_data(tabledispbuf12); wr_data(tabledispbuf13);void chuli1() if(f_start=1) tt=minite*60+second; tt1=minite1; if(m3) mone

22、y=value1+value2*(m-3)+value3*tt1; else if(f_start=0) money=0; dispbuf18=money/100%10; dispbuf19=money/10%10; dispbuf110=money%10;void display1() /运行后显示函数 set(0); printstring(run: );/ wr_data(tablem);wr_data(tabledispbuf10);wr_data(tabledispbuf11);/ printstring(:);/ wr_data(tabledispbuf12);/ wr_data(

23、tabledispbuf13); set(14); printstring(await:); wr_data(tabledispbuf14); wr_data(tabledispbuf15); printstring(:); wr_data(tabledispbuf16); wr_data(tabledispbuf17); set1(0); printstring(sum is: ); wr_data(tabledispbuf18); wr_data(tabledispbuf19); printstring(.); wr_data(tabledispbuf110);void printstri

24、ng(uchar *s) /输出显示函数 while(*s) wr_data(*s+); void key() /启动按键 if(K3=0) delay(50); /延时消抖动 if(K3=0) while(K3=0); v1+; if(v1=4) v1=1; switch(v1) case 1:f_start=1;TR0=1;TR1=0;/*led_run=0;led_await=1;led_stop=1*/;aa=0;bb=1;cc=1;break; /运行 case 2:TR0=0;TR1=1;/*led_run=1;led_await=0;led_stop=1*/;aa=1;bb=0;

25、cc=1;break; /等待 case 3:TR0=0;TR1=0;/*led_run=1;led_await=1;led_stop=0*/;aa=1;bb=1;cc=0;break; /暂停 if(K4=0) /跳出运行 delay(50); if(K4=0) while(K4=0); jump_out=1; void delay(uchar t) while(-t);void set(uchar x) command=0x80+x; wr_com(command);void set1(uchar y) command=0xc0+y; wr_com(command);void key1()

26、 /初始调节按键 if(K=0) delay(100); if(K=0) while(K=0); v+; if(v=4) v=0; switch(v) case 0:break; case 1:if(K1=0)while(K1=0);value1=value1+10;break; case 2:if(K1=0)while(K1=0);value2=value2+5;break; case 3:if(K1=0)while(K1=0);value3=value3+5;break; if(K2=0) delay(50); if(K2=0) while(K2=0); jump_in=1; void mode( ) interrupt 0 /外部中断0控制选位 m+;附录3

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1