基于单片机的出租车计价系统设计 论文

上传人:仙*** 文档编号:29510406 上传时间:2021-10-07 格式:DOC 页数:27 大小:107.88KB
收藏 版权申诉 举报 下载
基于单片机的出租车计价系统设计 论文_第1页
第1页 / 共27页
基于单片机的出租车计价系统设计 论文_第2页
第2页 / 共27页
基于单片机的出租车计价系统设计 论文_第3页
第3页 / 共27页
资源描述:

《基于单片机的出租车计价系统设计 论文》由会员分享,可在线阅读,更多相关《基于单片机的出租车计价系统设计 论文(27页珍藏版)》请在装配图网上搜索。

1、本科毕业论文毕业设计(论文)题目 出租车计价系统设计 专业班级 计算机通信工程08级 学号 姓名 指导教师姓名 指导教师职称 讲师 2011年 12 月 2 日摘 要摘 要:出租车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。它关系着交易双方的利益。具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。因此,汽车计价器的研究也是十分有一个应用价值的。 而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试,对于模式的切换需要用到机械开关,机械开关时间久了会造成接触不良,功能不易实现。而采用单片机进行

2、的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易的实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。针对计费模式的切换,通过软件编程就可以轻易而举的实现。避免了机械开关带来的不稳定因素。关键词: 出租车计价器; 单片机 ; 控制ABSTRACTAbstract: Taximeter is both passengers and drivers of the transaction criteria, it is the taxi industry an important symbol, a taxi is the most important tools.

3、It relates to the interests of both transactions. Has a good performance regardless of the meter is a vast number of taxi drivers or passengers are very necessary. Therefore, the car meter is also very much a study of value. The use of analog circuits and digital circuit design of the meter as a who

4、le circuit of a larger scale, using the device, a failure rate is high and difficult to debug, the pattern of switching need to use mechanical switches, mechanical switch will cause a long-time contacts Bad, functions not easy to achieve. SCM used for the design, a relatively powerful, with less har

5、dware and appropriate software can easily coordinate with each other to achieve the design requirements, flexibility and strong, can be programmed by software to complete more of the additional Function. Pricing model for the switch, software programming and can easily cite the achievement. To avoid

6、 a mechanical switch the destabilizing factors.Keywords: Taximeter ; 89 S51 MCU ; control目 录摘要 .第 1章 引言 .1. 1 出租车计价器概述 .1. 2 本设计任务 . 1.2.1 设计任务 . 1.2.2 设计要求 .1. 3 系统主要功能 .第2章 系统主程序设计 .第3章 定时中断程序设计.第4章 中断服务程序设计.4. 1 里程计数中断服务程序. 4. 2 中断等待服务程序概述.第5章 键盘服务程序设计 .第6章 显示子程序服务程序设计.第7章 设计源程序 .致谢.参考文献.第1章 引 言本

7、次课程设计利用单片机技术来实现一台多功能出租车计价器,具有性能可靠、电路简单、成本低等特点。1.1 出租车计价器概述计价器显示的营运金额是营运里程与价格的函数(等候时间一般折算成一定比例的里程来计算)。出租车计价器通过传感器与行驶车辆连接。出租汽车的实际里程通过传感器的脉冲信号在计价器里折算成一定的计价营运里程。目前市场上出租车计价器功能主要有具有数据的复位功能、白天/晚上转换功能、数据输出功能、计时计价功能等等,但能够进行语音播报数据信息的出租车计价器还是比较少见的,针对这一点我们来设计一款多功能出租车计价器,在原有功能的基础上增加单价输出、单价调整、路程输出、显示当前的系统时间、语音播报数

8、据信息等功能。1.2 本设计任务1.2.1 设计任务 设计一款基于AT89S51单片机,霍尔传感器的出租车计价器。1.2.2 设计要求1 不同情况具有不同的收费标准。l 白天l 晚上l 途中等待(10min 开始收费)2能进行手动修改单价。3具有数据的复位功能。(1) IO 口分配的简易要求。l 距离检测使用霍尔开关A44El 白天/晚上收费标准的转换开关l 数据的清零开关l 单价的调整(最好使用和按键)(2) 数据输出(采用LCM103)。l 单价输出 2 位l 路程输出 2 位l 总金额输出 3 位4.按键。l 启动计时开关l 数据复位(清零)l 白天/晚上转换1.3 系统主要功能 本课程

9、设计所设计的出租车计价器的主要功能有:数据的复位、白天/晚上转换、数据输出、计时计价、单价输出及调整、路程输出、语音播报数据信息、实现在系统掉电的时候保存单价和系统时间等信息等功能。输出采用8 段数码显示管。本电路设计的计价器不但能实现基本的计价,而且还能根据白天、黑夜、中途等待来调节单价,同时在不计价的时候还能作为时钟为司机同志提供方便。 第2章 系统主程序设计2.1 初始化程序系统上电时,初始化程序将R1R5储存单元清0.2.2 主程序主程序中通过循环判断是否等待计价和车轮计数进行总体计价的实现。在等计价中,调用等待计价子程序,每4秒调用计数子程序对计数器加1,在车轮计中,车轮每转过1周调

10、用计数子程序对计数器加1。通过计数器中的累加值,判断数值并调用显示。计数子程序是通过对工作寄存器的循环累加实现的。 秒定时子程序通过2000循环调用定时器的2毫秒定时实现,对应调用相应子程序。 码管显示子程序通过动态扫描实现。 毫秒定时是通过软件延时来实现的。系统初始化后,判断P1.1口,是否等待计价.若是则进入等待计价处理,若否,则进入下一步,判断是否进行车轮计数,若没有进行车轮计数则返回等待计价处理,若进行车轮计数,则由计数器加1,然后判断计数器是否加到50,若不到50,则由数码管显示,若到了50则由到50方式处理,最后由数码管显示计算的价钱。2.3 主程序流程图开始初始化是否等待计价是否

11、车轮计数计数器加1是否计数到50到50处理不到50处理数码管显示等待计价处理是否否否是是第3章 定时中断程序设计 3.1 程序概述在定时中断服务程序中,每100ms 产生一次中断,当产生10 次中断的时候,也就到了一秒,送数据到相应的显示缓冲单元,并调用显示子程序实时显示。3.2定时中断程序流程图开始保护现场重置计数初值否中断10次?是数据送显示缓冲单元调用显示子程序恢复现场并中断返回 定时中断服务程序第4章 中断服务程序设计4.1里程计数中断服务程序概述每当霍尔传感器输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满1000 次时,使微机进入里程计数中断服务程序中。在该程序中,

12、需要完成当前行驶里程数和总额的累加操作,并将结果存入里程和总额寄存器中4.2中断等待服务程序概述当在计数状态下霍尔开关没有输出信号,片内的T1 定时器便被启动,每当计时到达10分钟,就对当前金额加上中途等待的单价,以后每十分钟都自动加上中途等待的单价。当中途等待结束的时候,也就自动切换到正常的计价。第5章 键盘服务程序设计5.1键盘服务程序概述键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦有按键按下,便转向相应的子程序处理,处理结束再返回。第6章 显示子程序服务程序设计6.1显示子程序服务程序概述由于是分屏显示数据,所以就要用到4 个显示子程序,分别是:时分秒显

13、示子程序(HMS_DIS)、金额单价显示子程序(CP_DIS)、路程单价显示子程序(DP_DIS)、单价调节子程序(PA_DIS)。第7章 设计源程序#include#include#include #include #define uchar unsigned char#define uint unsigned int/* DS12887实时时钟时间地址设置 */#define second XBYTE 0x6000 /* 秒寄存器地址 */#define sec_alarm XBYTE 0x6001#define minute XBYTE 0x6002 /* 分寄存器地址 */#defin

14、e min_alarm XBYTE 0x6003#define hour XBYTE 0x6004 /* 小时寄存器地址 */#define week XBYTE 0x6006 /* 星期寄存器地址 */#define date XBYTE 0x6007 /* 日期寄存器地址 */#define month XBYTE 0x6008 /* 月寄存器地址 */#define year XBYTE 0x6009 /* 年寄存器地址 */#define rega XBYTE 0x600A /* A寄存器地址 */#define regb XBYTE 0x600B /* B寄存器地址 */#defin

15、e regc XBYTE 0x600C /* C寄存器地址 */#define regd XBYTE 0x600D /* D寄存器地址 */* RT12864HZ汉字图形点阵液晶地址设置 */#define w_c_add XBYTE0x2070 /* 写命令字地址 */#define w_d_add XBYTE0x2071 /* 写数据地址 */#define r_s_add XBYTE0x2072 /* 读状态字地址 */ #define r_d_add XBYTE0x2073 /* 读数据地址 */#define COM XBYTE0x2021 /*8279命令口 */#define D

16、AT XBYTE0x2020 /*8279数据口 */ #define L 1 /*长度系数 */#define TI 50 /*分度数 */#define HN 30 /*孔个数 */ #define LOW 30 /*最低速度 */uchar xdata key; /*键值 */uint idata num=0; /*计数值 */ uint xdata a=1,b=0; /*单价 */uint idata len,fa; /*路程 费用中间参数*/uint idata COUT; /*低速计数*/uint idata h1,h2,m1,m2,s1,s2; /*时钟参数*/ uint ida

17、ta price=10,fate=00,length=0,leng; /*显示参数*/uint idata m,n,o,p,q,r,s,t; /*显示中间参数 */uint idata state=0,clear=1,begin=0,pri,tim,tt=0,cc=0;nn=0;/*几个状态标志位*/ /*设置,清除,开始计价,单价修改,时间修改,两位数监视,六位数监视,数字标志*/unsigned char bdata status; /* lcd可位寻址片内数据存储器,允许位与字节混合访问 */sbit busy=status7; /*lcd“忙”线的第7位*/uchar bdata st

18、a_8279; /*8279*/sbit du=sta_82797; /* 8279方式设置命令字 */unsigned char rflag; unsigned char bdata sta_ds; sbit uip=sta_ds7; uchar ds_h,ds_m,ds_s,ds_t; unsigned char bdata ds_time; unsigned char code NO10=0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9;/* 09LCD*/uchar code tab16=0x3f,0x06,0x5B,0x4F,0x66

19、,0x6D,0x7D,0x07,0x7F,0x6F, 0x71,0x7C,0x39,0x73,0x31,0x71;/* 0F的字型编码*/*LCD显示数组 第一行为时钟占用*/uchar xdata hz216=0xB5,0xA5,0xBC,0xDB,0xA3,0xBA,0x20,0x20,0x20,0x20, /* 单 价 : 空 空 */ 0xA3,0xB0,0xA3,0xB0,0xD4,0xAA; /* N N 元 */ uchar xdata hz316=0xBE,0xE0,0xC0,0xEB,0xA3,0xBA,0xA3,0xB0,0xA3,0xB0, /* 距 离 : 空 N */

20、 0xA3,0xB0,0xA3,0xB0,0x4B,0x4D; /* N N k m */uchar xdata hz416=0xBC,0xDB,0xC7,0xAE,0xA3,0xBA,0xA3,0xB0,0xA3,0xB0, /* 价 格 : N N */ 0xA3,0xB0,0xA3,0xB0,0xD4,0xAA; /* N N 元 */ uchar xdata hz516=0x20,0x20,0xCA,0xE4,0xC8,0xEB,0xC1,0xBD,0xCE,0xBB, /* 空 输 入 两 位 */ 0xB5,0xA5,0xBC,0xDB,0x20,0x20; /* 单 价 空 */

21、uchar xdata hz616=0x20,0x20,0x20,0x20,0xA3,0xBA,0xA3,0xB0,0xA3,0xB0, /* 空 空 : N N */ 0xD4,0xAA,0xA3,0xAF,0x4B,0x4D; /* 元 / k m */ void initial (void); /*初始化子程序*/void delay(void); /*延时子程序*/void check_lcd(void); /*LCD设置子程序*/void show_lcd(uchar *,uchar *,uchar *); /*LCD显示子程序*/void lcd_busy(void); /*LCD

22、忙状态检测函数 */void compute(void); /*路程 费用数字位拆分子程序*/void change_pri(void); /*单价修改子程序*/void change_time(void); /*时间修改子程序*/void clock(void); /*时钟显示子程序*/void check_ds12887(void); /*时钟设置子程序*/main() /*主函数*/ uint inf=0; /*第一次标志位*/ initial(); show_lcd(hz2,hz3,hz4); while(1) clock(); if(begin=1)/开始计价 if(inf=0) f

23、ate=20; /第一次加上起价费 inf=1; if(state=0) /不是设置状态 if(num=LOW) /大于最低速度 COUT=0; /低速计数清零 price=a*10+b; /单价 len+=num*L/HN; /本次路程加上上次剩余 if(len/TI=0) /达到千位 leng=len/TI; /千位增加 len%=TI; /去除千位 fa=leng*price; /临时费用 length+=leng; /全部路程 leng=0; fate+=fa; /全部费用 else if(COUT)=60)/低速计数 length+; fate+=(10*a+b); COUT=0;

24、compute(); /将数字按位拆分 用以显示 show_lcd(hz2,hz3,hz4); else /设置状态 调用修改子程序 if(pri=1) change_pri(); if(tim=1) change_time(); if(clear=1) /清零 length=0; fate=0; inf=0; COM=0xd1; /* 清除LED显示*/ compute(); show_lcd(hz2,hz3,hz4); if(pri=1) change_pri(); if(tim=1) change_time(); /while(1)/main /*以下是子程序代码(包括中断)*/void

25、 keybord(void) interrupt 0 using 1 /*按键中断服务程序*/ uchar keyboard=0; EX0=0; /关中断 COM=0x50; keyboard=DAT; keyboard &=0x0f; /* 保留低四位 */ switch(keyboard) /键值转换为可用数据 并且修改相应标志位 case 0x0: key=0; tt+;nn=1;cc+; break; case 0x1: key=1; tt+;nn=1;cc+; break; case 0x2: key=2; tt+;nn=1;cc+; break; case 0x3: key=3;

26、tt+;nn=1;cc+; break; case 0x4: key=4; tt+;nn=1;cc+; break; case 0x5: key=5; tt+;nn=1;cc+; break; case 0x6: key=6; tt+;nn=1;cc+; break; case 0x7: key=7; tt+;nn=1;cc+; break; case 0x8: key=8; tt+;nn=1;cc+; break; case 0x9: key=9; tt+;nn=1;cc+; break; case 0x0B: key=11; begin=1;clear=0;nn=0;break; /*B

27、begin*/ case 0x0C: key=12; clear=1;begin=0;nn=0;break; /*C clear*/ case 0X0D: key=13; state=1;pri=1;tim=0;nn=0;break; /*D set price*/ case 0x0E: key=14; state=1;tim=1;pri=0;nn=0;break; /*E set time*/ default: key=15; nn=0;break; /*F finish*/ keyboard=tabkeyboard; /按键后 在LED上显示 if(pri=1) if(nn=0) /字母

28、是功能键 在第一位上显示 COM=0x80+8; else /数字 在后面依次显示 COM=0x80+4+tt; if(tim=1) if(nn=0) COM=0x80+8; else COM=0x80+1+cc; DAT=keyboard; EX0=1; /开中断void clockserve() interrupt 2 using 2 /*时钟中断服务程序*/ unsigned char temp2;COUT+: /低速计数加一EX1=0; /关中断rflag=1;sta_ds=rega; /取数据 (小时、分钟、秒)while(uip);ds_h=hour;ds_m=minute;ds_

29、s=second;temp2=regc;rflag=0;EX1=1; /开中断void timer(void) interrupt 3 using 3 /*定时器中断服务程序*/ TR1=0; TR0=0; /关定时器 关中断 num=TH0*256+TL0; /取计数值 TH0=0; /计时器清零 TL0=0; TH1=-(50000/256); /重新赋定时常数 TL1=-(50000%256); TR1=1; TR0=1; /开定时器 开中断void initial(void) /*初始化子程序*/ COM=0xd1; /* LED设置 : 清除显示*/ ACC=DAT; if(ACC1

30、); /* P奇偶标志。若值为1的位数为奇数,则P置位,否则清除 */ COM=0x00; /* 8字符显示左入口 */ COM=0x34; /* 34次分频*/ TMOD=0X15; /定时/计数器置标志位 TH0=0; TL0=0; /计数器清零 TH1=-(50000/256); TL1=-(50000%256); /定时常数赋初值 TR0=1; TR1=1; /开定时器 计数器 EA=1; /开中断 EX0=1; EX1=1; ET1=1; check_ds12887(); /时钟初始化 void delay(void) /*延时子程序*/ unsigned char i,j; for

31、(i=0;i100;i+) for(j=0;j150;j+) ; ; void check_lcd(void) /*LCD设置子程序*/ uint i; lcd_busy();w_c_add=0x30;/* 功能设置:8位数据 */for(i=0;i255;i+)lcd_busy();w_c_add=0x0c; /* 显示状态:整体显示,游标位置无效*/lcd_busy();w_c_add=0x01;/* 清除显示:将DDRAM填满“20H”,并且设定DDRAM的地址计数器到“00”*/lcd_busy();w_c_add=0x02;/* 地址归位:设定DDRAM的地址计数器到“00”,将游标

32、移到开头原点位置 */void show_lcd (uchar *b1,uchar *c1,uchar *d1) /*LCD显示子程序*/unsigned char add;unsigned char i; check_lcd(); lcd_busy();add=0x90; /* 设置显示坐标,90H对应字符的第二行第一列 */ lcd_busy();w_c_add=add; /* 送命令 */for(i=0;i8;i+) lcd_busy(); w_d_add=b12*i; lcd_busy(); w_d_add=b12*i+1; add=0x88; /* 设置显示坐标,88H对应字符的第三

33、行第一列 */ lcd_busy();w_c_add=add; /* 送命令 */for(i=0;i8;i+) lcd_busy(); w_d_add=c12*i; lcd_busy(); w_d_add=c12*i+1; add=0x98; /* 设置显示坐标,98H对应字符的第四行第一列 */ lcd_busy();w_c_add=add; /* 送命令 */for(i=0;i8;i+) lcd_busy(); w_d_add=d12*i; lcd_busy(); w_d_add=d12*i+1; delay(); clock();void lcd_busy(void) /*LCD忙状态检

34、测函数 */do status=r_s_add; /* 读状态字地址的第7位 */while(busy);void compute(void) /*路程 费用数字位拆分子程序*/ uint f1,l1; f1=fate; l1=length; p=l1%10; /*数字位拆分*路程*/ l1/=10; o=l1%10; l1/=10; n=l1%10; l1/=10; m=l1%10; t=f1%10; /*数字位拆分*价钱*/ f1/=10; s=f1%10; f1/=10; r=f1%10; f1/=10; q=f1%10; hz211=hz213=0xB0; /*清零*/ hz39=hz

35、311=hz313=0xB0; hz49=hz411=hz413=0xB0; hz211+=a; /*赋值*/ hz213+=b; hz37+=m; hz39+=n; hz311+=o; hz313+=p; hz47+=q; hz49+=r; hz411+=s; hz413+=t; if(COUT%500=0) /分频显示 show_lcd(hz2,hz3,hz4); /*显示*/ void change_pri() /*单价修改子程序*/ show_lcd(hz2,hz5,hz6); if(key=15) /15 完成设置 COM=0xd1; /* LED清除显示*/ pri=0; stat

36、e=0; tt=0; hz211=hz67; hz213=hz69; show_lcd(hz2,hz3,hz4); /保存设置结果并显示 else if(nn) /如果是数字进行设置 if(tt=1) a=key; if(tt=2)b=key;tt=0; /单价 两位 hz67=0xB0; hz67+=a; hz69=0xB0; hz69+=b; /实时显示设置 show_lcd(hz2,hz5,hz6); void change_time(void) /*时间修改子程序*/ uint hh,mm,ss,temper; if(key=15) /如果是15 设置完成 tim=0; state=0

37、; cc=0; COM=0xd1; /* LED清除显示*/ else if(nn) /如果是数字 进行设置 if(cc=1) h1=key; if(cc=2) h2=key; if(cc=3) m1=key; if(cc=4) m2=key; if(cc=5) s1=key; if(cc=6) s2=key;cc=0; /时间设置六位 temper=h1*16; hh=temper|h2; /将两个数字合并在一个字节 便于显示 temper=m1*16; mm=temper|m2; temper=s1*16; ss=temper|s2; hour=hh; minute=mm; second=

38、ss; clock(); /显示时间 show_lcd(hz2,hz3,hz4); /显示其他 void clock() /*时钟显示子程序*/ unsigned char temp1;if (rflag=0) w_c_add=0x80; /* 写命令字:设定DDRAM地址到地址计数器(AC) */ delay(); temp1=ds_h & 0xf0; /* 小时保留高四位 */ ds_t=_cror_(temp1,4); /* 将变量temp1循环右移4位 */ lcd_busy(); w_d_add=0xA3; lcd_busy(); w_d_add=NOds_t; /* 写数据*/ d

39、s_t=ds_h & 0x0f; /* 小时保留低四位 */ lcd_busy(); w_d_add=0xA3; lcd_busy(); w_d_add=NOds_t; /* 写数据*小时*/ lcd_busy(); w_d_add=0xA3; /* 写 “ : ” */ lcd_busy(); w_d_add=0xBA; temp1=ds_m & 0xf0; ds_t=_cror_(temp1,4); lcd_busy(); w_d_add=0xA3; lcd_busy(); w_d_add=NOds_t; /* 写数据*分*/ ds_t=ds_m & 0x0f; lcd_busy(); w_d_add=0xA3; lcd_busy(); w_d_add=NOds_t; lcd_busy(); w_d_add=0xA3; /* 写 “ : ” */ lcd_busy(); w_d_add=0xBA; temp1=ds_s & 0xf0; ds_t=_cror_(temp1,4); lcd

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!