当前位置:文档之家› 出租车计价器系统完整版

出租车计价器系统完整版

智能电子产品设计与制作课程设计(论文)题目: 《出租车计价器系统设计》学院:电气与电子信息工程学院专业名称:学号:学生姓名:同组成员:指导教师:课设时间:2011年5月23日—2011年6月10日目录一.设计目的 (2)二.设计要求 (2)三.系统结构 (2)四.功能模块设计 (3)五.软件设计 (5)六.电路组装与调试 (6)七.电路仿真 (7)八.总结 (8)八.附录 (9)出租车计价器课程设计一、设计目的随着出租车行业的发展,出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。

而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。

而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。

本设计采用AT89S52单片机为主控器,以红外对管测转速,对实际里程的模拟,实现对出租车的多功能的计价设计,并采用AT24C01实现在系统掉电的时候保存单价等信息,输出采用8段数码显示管。

本电路设计的计价器不但能实现基本的计价,而且还能根据白天,黑夜和中途等待来调节单价。

二、设计要求出租车计价器根据乘客乘坐汽车行驶距离和等候时间的多少进行计价,并在行程中同步显示车费值。

从起步价开始,当汽车程行驶未满3公里时,均按起步价计算。

过3公里后,实现每1公里单价收费,中间遇暂停时,计程数不再增加,开始计时收费,测距收费和测时收费的和便构成了一位乘客的车费。

同时,白天和夜晚价格不同,可以进行切换。

白天单价、夜晚单价、等待单价和起步价格都可通过独立键盘进行调节。

(默认起步价为5元/3公里,里程单价白天为1.5元/公里,夜晚为1.8元/公里,等待计时单价为0.5元/5分钟)三、系统结构根据设计的要求选择实验的方案:采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。

设计采用AT89S51单片机为主控器,以红外对管和电机测转速(按键替代),实现对出租车的基本的计价设计,并采用AT24C02实现在系统掉电的时候保存单价等信息,输出采用8段数码显示管,相对液晶显示价格便宜,利用单片机丰富的I/O端口,及其控制的灵活性,实现基本的计价功能。

器系统结构图如下:四、功能模块1、单片机模块Flash 存储器。

使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。

片上Flash允许程序存储器在系统可编程,亦适于常规编程器。

在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

AT89S52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。

另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

2、模拟里程原理图测转速原理图红外对管测转速的电路图采用外部中断进行计数,红外对接管每受到一次发射管发来的红外,就产生一次中断,计数器加1,计数超过1000次时,里程加1,计数清零,从新开始计数.3、掉电保护模块AT24C02存储单元AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。

AT24C02有一个16字节页写缓冲器。

该器件通过IIC总线接口进行操作,有一个专门的写保护功能。

功能简介AT24C02支持IC,总线数据传送协议IC,总线协议规定任何将数据传送到总线的器件作为发送器。

任何从总线接收数据的器件为接收器。

数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。

主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上。

只有一片时,A0\A1\A2要接地。

工作参数工作温度工业级-55℃ +125℃ 商业级0 ℃+75℃贮存温度-65℃ +150℃ 各管脚承受电压-2.0 Vcc+2.0VVcc管脚承受电压-2.0 +7.0V 封装功率损耗(Ta=25℃) 1.0W焊接温度(10 秒) 300℃ 输出短路电流100mA芯片图封装图和引脚功能存储单元电路原理图4、键盘调整单元当单价等信息需要进行修改时,就要用到键盘进行修改。

由于调节信息不多,故采用4个独立键盘即可,分别实现清零、切换、增大、减小和功能等作用。

S1:接P1.0口,对上一次的计费进行清零,为下次载客准备S2:接P1.1口,实现白天和夜晚单价的切换;当功能键S4按下时,S2可对数据进行增大。

S3:接P1.2口,当功能键S4按下时,S3可对数据进行减小。

S4:接P1.3口,按1次,进入调整白天单价;按2次,进入调整夜晚单价;按3次,进入调整等待单价;按4次,进入调整起步价;按5次,返回。

5、显示单元显示单元由7个8段共阳数码管组成,采用动态扫描进行显示。

前三个数码管分别接P3.0、P3.1和P3.2,用于显示总金额;中间两个分别接P3.4和P3.5,用于显示里程;后边两个分别接P3.6和P3.7,用于显示单价。

数码管显示图五、软件设计(1)系统主程序在主程序模块中,需要完成对各参量和接口的初始化、出租车起价和单价的初始化以及中断、计算、循环等工作。

另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。

然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。

当电机运行起来时,就启动计价,根据里程寄存器中的内容计算和判断行驶里程是否已超过起步价公里数。

若已超过,则根据里程值、每公里的单价数和起步价数来计算出当前的总金额,并将结果存于总金额寄存器中;中途等待时,无脉冲输入,不产生中断,当时间超过等待设定值时,开始进行计时,并把等待价格加到总金额里,然后将总金额、里程和单价送数码管显示出来。

程序流程如图(2)里程计数中断程序每当红外接收端输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满1000次时,进入里程计数中断服务程序中,里程变量加一。

主函数中总金额也相应地变化。

(3)中途等待中断程序在中途等待中断程序中,每1ms产生一次中断,将当前里程值送入某个缓存变量,每5分钟将缓存变量中的值和当前里程值比较,当汽车停止,霍尔传感器5分钟没有输出信号,当前里程值和缓存变量内的值相同,则进入等待计时,每5分钟记一次价格。

(4)计算程序计算程序根据里程数分别进入不同的计算公式。

如果里程大于3公里,则执行公式:总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:总金额=起步价+等待时间*等待单价。

(5)显示程序显示程序利用定时器每1ms产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。

(6)键盘程序键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结束再返回。

流程图如图键盘程序流程图六、电路的组装与调试先按照电路图从小而且低的元器件开始安装,然后焊接然后依次焊接其他由小到大,由低到高的元器件,直到全部安装完毕再次进行电路检测和调试调试时按照以下步骤进行调试:1、调试动态显示电路。

查看数码管是否显示正常。

2、调试AT24C02存储单元。

尝试写入读出指定数据看是否符合要求。

3、调试键盘控制电路。

结合程序调试按键抖动,查看是否符合程序要求。

4、整体调试。

结合实际效果对程序进行优化七、电路的仿真八、总结这次课程设计给我最大的启迪就是,一定要对知识点熟悉并且十分熟练才有可能完全正确的做出自己的产品。

协同工作很重要,一个人不可能很好的完成完整的项目。

对于这次出租车计价器的,使我更加清晰的掌握单片机的各种功能,特别是外部中断的应用,还有就是单片机对I/O口对数码管的控制功能,通过对数码管的动态扫描和键盘的防抖的综合编程,能过很好的实现数据的动态显示。

在实际的操作过程中还是遇到和很多问题,主要体现在对单片机外部中断的的应用理解的不够深刻,以及在程序调用方面的欠缺,而导致功能不能完全实现;还有是关于默写硬件应用不够了解,而在编程中出现了很大麻烦。

通过最终的调试和苦想,以及同学的帮助下,还是解决了问题。

通过这次课程设计,我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,也充分体会到了自己设计东西的乐趣、学会查阅资料和对别人的东西融会变通的重要性,也明白了很多知识光靠趴在书本上学是学不到其中的精髓的,必须亲自去试着实践,亲自去经历才能对它们真正的掌握,凡事都要自己去动下手,去实践一下,遇到困难,永远不要沮丧气馁。

在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识;这次设计给了我极大的鼓舞和信心,相信在以后的学习中可以通过不断的摸索和实践来提高其他方面的知识。

九、附录附录1附录2:原理图附录三PCB和源程序实物图附件3实物图 模拟计程车起步:实物图: 单价 里程 金额模拟行驶3km 内: 模拟行驶4km 后附件 五 系统源程序Include<reg52.h> #include<instrins.h>#define uchar unsigned char #define uint unsigned int#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();};uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; sbit exter=P3^3; //外部中断 sbit key0=P1^0; //清零sbit key1=P1^1; //切换/+sbit key2=P1^2; //-sbit key3=P1^3; //功能键sbit P3_0=P3^0; //数码管各位控制sbit P3_1=P3^1;sbit P3_2=P3^2;sbit P3_4=P3^4;sbit P3_5=P3^5;sbit P3_6=P3^6;sbit P3_7=P3^7;sbit SDA=P2^3; //IIC引脚sbit SCL=P2^2;uint inter,aa,bb,temp,temp1; //变量的定义uint zongjine,licheng,dengdai;uint key3num,qiehuantemp,delaytemp;uchar danjia1,danjia2,danjia3,danjia,qibu;void delay(unsigned char t){unsigned char j,i;for(i=0;i<t;i++)for(j=0;j<255;j++);}void start() //IIC开始位{SDA = 1;SCL = 1;delayNOP();SDA = 0;delayNOP();SCL = 0;}void stop() // IIC停止位{SDA = 0;delayNOP();SCL = 1;delayNOP();SDA = 1;}void respons() //IIC应答位{uchar i;SCL=1;delayNOP();while((SDA==1)&&(i<250))i++;SCL=0;delayNOP();}uchar read_byte() // 从EEPROM读到MCU {uchar i,j;for(i=0;i<8;i++){SCL=1;j<<=1;j|=SDA;SCL=0;}return(j);}void write_byte(uchar date) // 从MCU写到EEPROM{uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;SCL=0;delayNOP();SDA=CY;delayNOP();SCL=1;delayNOP();}SCL=0;delayNOP();SDA=1;delayNOP();}void write_data(uchar addr, uchar date) // 在指定地址addr处写入数据date {start();write_byte(0xa0);respons();write_byte(addr);respons();write_byte(date);respons();stop();}uchar read_data(uchar addr) // 在指定地址addr读取数据{uchar date;start();write_byte(0xa0);respons();write_byte(addr);respons();start();write_byte(0xa1);respons();date=read_byte();stop();return date;}void display(uint zongjine0,uint licheng0,uint danjia0){uchar z;uint jbai,jshi,jge,lshi,lge,dshi,dge;jbai=zongjine0/100;jshi=zongjine0%100/10;jge=zongjine0%100%10;lshi=licheng0/10;lge=licheng0%10;dshi=danjia0/10;dge=danjia0%10;for(z=0;z<7;z++){P3=0xff;switch(z){case 0:P3_0=0;P0=table[jbai];break;case 1:P3_1=0;P0=table[jshi]&0x7f;break;case 2:P3_2=0;P0=table[jge];break;case 3:P3_4=0;P0=table[lshi];break;case 4:P3_5=0;P0=table[lge];break;case 5:P3_6=0;P0=table[dshi]&0x7f;break;case 6:P3_7=0;P0=table[dge];break;}delay(3);}}void keyscan() //键盘扫描{if(key3==0) //功能键调节{delay(5);if(key3==0){key3num=1;while(!key3);delay(5);while(!key3);while(key3num){if(key3num==1) //调白天单价{if(key1==0){delay(5);if(key1==0){danjia1++;if(danjia1==100)danjia1=0;while(!key1);delay(5);while(!key1);}}if(key2==0){delay(5);if(key2==0){danjia1--;if(danjia1==-1)danjia1=99;while(!key2);delay(5);while(!key2);}}display(1,0,danjia1);}if(key3num==2) //调夜晚单价{write_data(1,danjia1);if(key1==0){delay(5);if(key1==0){danjia2++;if(danjia2==100)danjia2=0;while(!key1);delay(5);while(!key1);}}if(key2==0){delay(5);if(key2==0){danjia2--;if(danjia2==-1)danjia2=99;while(!key2);delay(5);while(!key2);}}display(2,0,danjia2);}if(key3num==3) //调等待单价{write_data(2,danjia2);if(key1==0){delay(5);if(key1==0){danjia3++;if(danjia3==100)danjia3=0;while(!key1);delay(5);while(!key1);}}if(key2==0){delay(5);if(key2==0){danjia3--;if(danjia3==-1)danjia3=99;while(!key2);delay(5);while(!key2);}}display(3,0,danjia3);}if(key3num==4) //调起步价{write_data(3,danjia3);if(key1==0){delay(5);if(key1==0){qibu++;if(qibu==100)qibu=0;while(!key1);delay(5);while(!key1);}}if(key2==0){delay(5);if(key2==0){qibu--;if(qibu==-1)qibu=99;while(!key2);delay(5);while(!key2);}}display(4,0,qibu);}if(key3num==5) //退出功能键{write_data(4,qibu);key3num=0;}if(key3==0){delay(5);if(key3==0){key3num++;while(!key3);delay(5);while(!key3);}}}}}}void init(){SDA=1;SCL=1;zongjine=0;licheng=0;dengdai=0;danjia1=read_data(1);danjia2=read_data(2);danjia3=read_data(3);qibu=read_data(4);aa=0; //数码管动态扫描的定时器时基个数bb=0; //判断是否等待的时基个数inter=0;EA=1; //开总中断EX1=1; //开外部中断1IT1=1; //触发方式下降沿TMOD=0x01;TH0=(65536-1000)/256;TL0=(65536-1000)%256;ET0=1; //开定时器T0中断TR0=1; //开定时器T0P3=0x08;P0=table[0];}void jisuan(){if(licheng>3)zongjine=qibu+(licheng-3)*danjia+dengdai*danjia3; //金额计算elsezongjine=qibu+dengdai*danjia3; //起步公里内金额计算}void qiehuan(){if(key1==0) //白天夜晚切换{delay(5); //键盘防抖if(key1==0)qiehuantemp=!qiehuantemp;while(!key1);delay(5);while(!key1);}if(qiehuantemp==0)danjia=danjia2;if(qiehuantemp==1)danjia=danjia1;}void main(){init();qiehuantemp=1;key3num=0;while(1){qiehuan(); //切换白天夜晚单价jisuan(); //计算总金额display(zongjine,licheng,danjia);keyscan();if(key0==0) //清零键init();}}void inter1() interrupt 2 //脉冲中断{delay(5); //if(exter==0) //{ //IT1=1;inter++;if(inter==5){inter=0;licheng++;}} //while(!exter); //delay(5); //while(!exter); //}void timer0() interrupt 1{TH0=(65536-1000)/256;TL0=(65536-1000)%256;aa++;bb++;temp1=licheng; //测试是否进入等待if(bb==10000) //10s无反应进入等待计费{bb=0;if(temp=temp&temp1)dengdai++;temp=licheng;}}。

相关主题