当前位置:文档之家› 简易出租车里程计费器

简易出租车里程计费器

测控08级综合课程设计题目:简易出租车里程计费器摘要:本系统以STC89C52RC单片机为控制核心,辅以键盘调节、12864显示、蜂鸣器报警、车速模拟、车速检测及信息存储电路,实现了出租车计价器的行车里程和车速的实时检测与显示、计价金额显示以及价格预置等功能,满足了题目中基本部分及发挥部分的要求。

在此基础上,还增加了断电保护、蜂鸣器警示、行驶里程等功能。

该系统功能齐全,实用性强。

经测试,计价器的各项显示指标均满足题目要求。

关键词:出租车里程计费器;STC89C52RC+;MOC70T2;;掉电保护;Abstract: This system uses STC89C52 microcontroller as control core. With the keyboard control circuit, digital display circuit, beep alarm circuit, speed measureement circuit, speed detection circuit and information storage circuit,this system realizes function of the meter taxi driving mileage ,display and detection of real-time speed, valuation display and price set in advance, it meets all essential and additional requirement. Additional function such as power-off protection , beep alarm the print of mileage and consumption is added. This system is fully functioned and easy to implement. The measurement results show that all indicators of this taxi meter meet the requirement.Key words: Taxi Meter; STC89C52; Price Set in Advance; Power-off Protection目录第一章出租车里程计费器的设计要求与设计方案 (1)1.1 出租车计价器系统组成 (1)图1-1 系统功能图 (1)1.2 系统主要功能 (1)1.3 方案论证与比较 (1)第二章出租车里程计费器的硬件设计 (2)2.1 出租车的硬件框图 (2)2.2 主控制器STC89C52RC+ (2)2.3 按键扫描模块 (2)2.4 显示模块 (3)2.5 掉电保护 (3)2.6 车速模拟和检测模块 (4)第三章出车里程计费器的软件设计 (5)3.1 系统主程序流程图 (5)3.2 里程和费率计算程序流程图 (5)第四章设计体会与小结 (6)参考文献 (6)附录 (7)一.源程序 (7)二.12864驱动程序 (12)第一章出租车里程计费器的设计要求与设计方案1.1出租车计价器系统组成此出租车计费系统以单片机为系统核心,利用STC89C52RC单片机配合12864液晶屏的显示模块及键盘模块等,实现基本的出租车计价器功能。

本系统是由STC89C52RC+单片机、12864液晶显示模块、模拟出租车、复位电路及键盘等模块组成。

系统框图如图1-1所示:图1-1 系统功能图1.2系统主要功能本课程设计所设计的出租车计价器的主要功能有:里程计量及费用计算功能、车速测量、按键功能。

1.3方案论证与比较1.3.1方案一:采用数字电路控制。

采用传感器件,输出脉冲信号过放大整形作为移位寄存器的脉冲,实现计价,但是考虑到这种电路过于简单,性能不稳定,而且不能调节单价,也不能根据需要调节计费标准,电路不够实用。

1.3.2方案二:采用单片机控制。

利用单片机丰富的I/O端口,及其控制的灵活性,实现基本的里程计价功能,车速测量和价格调节、液晶显示功能。

通过比较以上两种方案,单片机方案有较大的活动空间,不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级,所以我们采用后一种方案。

1第二章出租车里程计费器的硬件设计2.1出租车的硬件框图图2-2 单片机控制方案2.2主控制器STC89C52RC+STC89C52RC是一种带8K FLASH程序存储器,512B SRAM,4K EEPROM,高性能CMOS 8位微处理器,俗称单片机。

主要特性:与MCS-51兼容、8K字节可编程闪烁存储器、512字节的SRAM 最高工作频率:80MHz、4K字节EEPROM、32可编程I/O线、三个16位定时器/计数器、8个中断源、内置硬件看门狗、在线可编程和在系统可编程、可编程串行通道、低功耗的闲置和掉电模式、片内振荡器和时钟电路。

2.3按键扫描模块(1)按键扫描模块电路图及说明:整个系统有四个按键,四个功能调整按键;本模块功能:扫描按键功能,返回扫描。

图2-32.4显示模块本设计是用12864液晶屏来实现计价的显示。

原理图如图2-4所示。

图2-4 12864液晶屏显示模块2.5掉电保护掉电保护功能采用了STC89C52RC+单片机内部EEPROM来实现。

掉电存储单元的作用是在电源断开的时候,存储当前设定的单价信息。

STC89C52内部自带了4K大小的EEPROM,地址是从2000H~2FFFH。

写操作主要是编程和擦除。

2.6车速模拟和检测模块以电机为驱动,将电机的转子与码盘连接在一起,用码盘的转动模拟出租车车轮的转动,码盘的转速即为出租车的车速。

采用MOC70T2凹槽光电开关作为车速检测器。

MOC70T2凹槽光电开关灵敏度高、实用性强、安装方便。

MOC70T2凹槽光电开关检测码盘转动的圈数,将检测得到的信号送至单片机外部中断引脚,单片机运用算法处理接收到的信号,从而得到出租车的实时车速。

MOC70T2凹槽光电开关的电路图如图2-6所示。

图2-6 车速模拟和检测模块第三章出车里程计费器的软件设计3.1系统主程序流程图3.2里程和费率计算程序流程图第四章设计体会与小结经过这次出租车计价器的课程设计,我收益非浅,从中我学到了很多东西.课程设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。

通过这次设计使我明白了自己原来知识还比较欠缺。

自己要学习的东西还太多,以前老是觉得自己什么东西都会,什么东西都懂,有点眼高手低。

通过这次课程设计,我才明白学习是一个长期积累的过程,另外,还学会了在网络上查找有关本设计的各硬件的资源,其中包括:STC89C52单片机及其引脚说明,为本次课程设计提供了一定的资料。

在这次课程设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。

总之,不管学会的还是学不会的的确觉得困难比较多,真是万事开头难,不知道如何入手。

最后终于做完了有种如释重负的感觉。

此外,还得出一个结论:知识必须通过应用才能实现其价值!有些东西以为学会了,但真正到用的时候才发现是两回事,所以我认为只有到真正会用的时候才是真的学会了。

经过这次的课程设计,也为我们以后毕业设计的制作奠定了一定的基础。

参考文献1.丁跃军.单片机基础教程.北京:北航大学出版社,20042.张鑫、华臻、陈书谦.《单片机原理及应用》[M].电子工业出版社,20053.李群芳,肖看.单片机原理接口与应用.北京:清华大学出版社,20054.朱承高.电工及电子技术手册[M].北京:高等教育出版社,19905.高峰.单片微型应用系统设计及实用技术.北京:机械工业出版社,20046.廖常初.现场总线概述[J].电工技术,19997.丁元杰、吴大伟.《单片微机实题集与实验指导书》[M].机械工业出版社,2004附录一.源程#include<reg52.h>#include"12864.h"#include"eeprom.h"sbit beep=P2^0;uchar Trg,Cont;uchar StartPrice,PerPrice;uchar DisplayC;uchar code num[]="0123456789"; uchar flag,f;uint speed_count,speed_c;uchar c;uint speed;uchar beep_count;unsigned long Val;void ScanKey(void);void delay5s(void);void main(void){uint distance;uint TotalPrice;uchar price[]="元";beep=1;lcd_init();display(0,0," Welcom to you !");display(1,0,"出租车里程计费器");display(2,0," Designed by");display(3,0," 唐杰王家佳");delay5s();lcd_init();StartPrice=byte_read(0x2000);PerPrice=byte_read(0x2200);EX0=1;EA=1;IT0=1;RCAP2L=TL2=0x3C;RCAP2H=TH2=0xB0;ET2=1;TMOD = 0x01;TH0 = 0x0B1;TL0 = 0x0E0;TR0 = 1;TR2=1;while(1){ScanKey();if(f==0){display(0,0,"起步价:");if(flag==0){lcd_wdat(num[StartPrice/10]);lcd_wdat('.');lcd_wdat(num[StartPrice%10]);}if(flag==1){if(DisplayC<30){lcd_wdat(num[StartPrice/10]);lcd_wdat('.');lcd_wdat(num[StartPrice%10]);}if((30<DisplayC)&&(DisplayC<40)){lcd_wdat(' ');lcd_wdat(' ');lcd_wdat(' ');}}display(0,5,"元");display(1,0,"每公里:");if(flag==0){lcd_wdat(num[PerPrice/10]);lcd_wdat('.');lcd_wdat(num[PerPrice%10]);}if(flag==2){display(0,0,"起步价:");lcd_wdat(num[StartPrice/10]);lcd_wdat(num[StartPrice%10]);display(1,0,"每公里:");if(DisplayC<30){lcd_wdat(num[PerPrice/10]);lcd_wdat('.');lcd_wdat(num[PerPrice%10]);}if((30<DisplayC)&&(DisplayC<40)){lcd_wdat(' ');lcd_wdat(' ');lcd_wdat(' ');}}if(DisplayC>40)DisplayC=0;display(1,5,"元");}else if(f==1){speed=speed_c*36;display(1,0,"速度:");if(speed/1000!=0)lcd_wdat(num[speed/1000]);lcd_wdat(num[speed%1000/100]);lcd_wdat(num[speed%100/10]);lcd_wdat('k');lcd_wdat('m');lcd_wdat('/');lcd_wdat('h');}display(2,0,"行驶里程:");lcd_wdat(num[distance/1000]);lcd_wdat(num[distance%1000/100]);lcd_wdat(num[distance%100/10]);lcd_wdat('.');lcd_wdat(num[distance%10]);display(2,7,"km");distance=Val/100;TotalPrice=distance*PerPrice/10+StartPrice;display(3,0,"总费用:");if(TotalPrice/1000!=0)lcd_wdat(num[TotalPrice/1000]);else lcd_wdat(' ');if(TotalPrice%1000/100!=0)lcd_wdat(num[TotalPrice%1000/100]);lcd_wdat(num[TotalPrice%100/10]);lcd_wdat('.');lcd_wdat(num[TotalPrice%10]);lcd_wdat(price[0]);lcd_wdat(price[1]);}}void ScanKey(void){unsigned char ReadData;static char Ctemp;if(TF0==1){TF0=0;TH0 = 0x0B1;TL0 = 0x0E0;beep_count++;if(beep_count>=5){beep_count=0;beep=1;}DisplayC++;ReadData=P3^0xFF;Trg=ReadData&(ReadData^Cont);Cont=ReadData;if(f==0){if((Cont&(1<<7))&&(flag==0)){Ctemp++;if(Ctemp>=50){Ctemp=0;flag=1;beep=0;}}if((Trg&(1<<7))&&(flag!=0)){flag++;beep=0;}if(flag>=3){flag=0;sector_erase(0x2000);byte_program(0x2000,StartPrice);sector_erase(0x2200);byte_program(0x2200,PerPrice);}if((Trg&(1<<6))&&(flag==1)){StartPrice--;beep=0;}if((Trg&(1<<6))&&(flag==2)){PerPrice--;beep=0;}if((Trg&(1<<5))&&(flag==1)){StartPrice++;beep=0;}if((Trg&(1<<5))&&(flag==2)){PerPrice++;beep=0;}}if((Trg&(1<<4))&&(flag==0)){lcd_init();beep=0;f=!f;}}}void Count() interrupt 0{Val+=2;speed_count++;}void Timer2() interrupt 5{TF2=0;c++;if(c>=40){c=0;speed_c=speed_count;speed_count=0;}}void delay5s(void) //误差 0us{unsigned char a,b,c;for(c=165;c>0;c--)for(b=100;b>0;b--)for(a=150;a>0;a--);}二.12864驱动程序#ifndef _12864_H_#define _12864_H_#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/*TS12864A-3 端口定义*/#define LCD_data P0 //数据口sbit LCD_RS = P1^0; //寄存器选择输入sbit LCD_RW = P1^1; //液晶读/写控制sbit LCD_E = P1^2; //液晶并行使能控制sbit LCD_PSB = P2^7; //串/并方式控制#define delayNOP(); {_nop_();_nop_();_nop_();};void delay(int ms){while(ms--){uchar i;for(i=0;i<250;i++) //0.5ms{_nop_();_nop_();// _nop_();// _nop_();}}}/*写指令数据到LCD RS=L,RW=L,E=脉冲,D0-D7=指令码。

相关主题