基于单片机出租车计价器课题的设计(c语言编写).doc

上传人:牧羊曲112 文档编号:4957966 上传时间:2023-05-26 格式:DOC 页数:38 大小:469.50KB
返回 下载 相关 举报
基于单片机出租车计价器课题的设计(c语言编写).doc_第1页
第1页 / 共38页
基于单片机出租车计价器课题的设计(c语言编写).doc_第2页
第2页 / 共38页
基于单片机出租车计价器课题的设计(c语言编写).doc_第3页
第3页 / 共38页
基于单片机出租车计价器课题的设计(c语言编写).doc_第4页
第4页 / 共38页
基于单片机出租车计价器课题的设计(c语言编写).doc_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《基于单片机出租车计价器课题的设计(c语言编写).doc》由会员分享,可在线阅读,更多相关《基于单片机出租车计价器课题的设计(c语言编写).doc(38页珍藏版)》请在三一办公上搜索。

1、大连民族学院2007级电子信息工程专业单片机系统课程设计报告单片机系统课程设计报告完成日期:2010年12月28日系:电子信息工程系专 业:通信工程班 级:071班设计题目:出租车计价器学生姓名:谢明七 王勉指导教师:董玉华、许爽 37目 录一、设计任务和性能指标31.1设计任务31.2性能指标3二、设计方案42.1任务分析42.2系统设计5三 系统硬件设计73.1电源电路73.2单片机的最小系统83.3 DS1302时钟电路93.4显示电路的设计103.5按键控制的设计113.7复位电路13四、系统软件设计144.1主程序设计144.2 子程序设计154.2.1 DS1302子程序154.2

2、.1 DS1302子程序流程图154.2.2 显示子程序174.2.2 显示子程序流程图194.3 修改时间子程序20五、调试及性能分析215.1调试步骤215.1.1硬件调试215.1.2软件调试:215.2性能分析21六、心得体会23七、参考文献24八、附录25附录1、程序清单25附录2 系统硬件电路图35一、设计任务和性能指标1.1设计任务出租车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。它关系着交易双方的利益。具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。出租车计价器的主要功能是计价显示、时钟显示、根据白天、黑夜、途

3、中等待来调节营运参数、计量数据查询等。要求用Protel 画出系统的电路原理图(要求以最少组件,实现系统设计所要求的功能),印刷电路板(要求布局合理,线路清晰),绘出程序流程图,并给出程序清单(要求思路清晰,尽量简洁,主程序和子程序分开,使程序有较强的可读性)。1.2性能指标1. 不同情况具有不同收费标准:白天、晚上、途中等待(10min开始收费);2. 数据输出:单价输出、路程输出、总金额输出;3. 按键:启动计时开关、数据显示切换、白天/晚上切换、复位;4. 能手动进行修改单价,但单价设定需密码进入。二、设计方案2.1任务分析出租车计价器基本功能部分是根据里程数来完成总金额的输出。实现方法

4、有两种。方案一:采用数字电路控制。其原理方框图如图2.1所示。采用传感器件,输出脉冲信号,经过放大整形作为移位寄存器的脉冲,实现计价,但是考虑到这种电路过于简单,性能不够稳定,而且不能调节单价,也不能根据天气调节计费标准,电路不够实用。图2.1 数字电路实现框图方案二:采用单片机控制。利用单片机丰富的IO端口,及其控制的灵活性,实现基本的里程计价功能和价格调节、时钟显示功能。本方案有较大的活动空间,不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级,所以我们采用后一种方案。2.2系统设计键盘电路掉电保护单片机显示电路里程输入图2.1电路系统构成框图主控芯片使用5

5、1系列AT89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片DS1302。采用DS1302作为主要计时芯片、可以做到计时准确。更重要的是,DS1302可以在很小的电流的后备电源(2.55.5V电源,在2.5V时耗电小于300nA)下继续计时,并可编程选择多种充电电流对后备电源进行慢速充电,可以保证后备电源基本不耗电。采用串行数据传输,与单片机硬件连接简单,如果使用时钟芯片DS12887,将采用并行数据传

6、输,占用更多的硬件资源。因此为节省单片机端口,时钟芯片采用DS1302。它们可以检测磁场及其变化,可在各种与磁场有关的场合中使用。霍尔器件以霍尔效应为其工作基础。霍尔器件具有许多优点,它们的结构牢固,体积小,重量轻,寿命长,安装方便,功耗小,频率高(可达1MHZ),耐振动,不怕灰尘、油污、水汽及盐雾等的污染或腐蚀。活儿现行器件的精度高、线性度好;霍尔开关器件无触点、无磨损、输出波形清晰、无抖动、无回跳、无知重复精度高(可达Im级)。采用了各种步长和保护措施的霍尔器件的工作温度范围宽,可达-55摄氏度150摄氏度。数据显示模块采用的是LED数码管显示,LCD虽然也能实现显示功能,但在距屏幕1米之

7、外就无法看清数据,不能满足要求,而且在白天其对比度也不能满足要求,因此建议采用LED数码管显示。数码管总共用了12个,其中第一行显示小时和分钟,第二行第一个显示单价,后面3个显示里程数,最后一行显示总价。 按键控制模块使用了3个脉冲开关,其中一个开关负责换位,另一个负责改数,第三个按键负责切换至等待时间。三 系统硬件设计3.1电源电路因为出租车上的电压时12V,而芯片所需供电电压是5V,所以选择LM7805的经典电路电源电路完成12V转5V的目的。电源电路图如下图3.1所示:图3.1电源电路图3.2单片机的最小系统单片机最小系统采用的是STC89C54芯片,STC89C54是一种低功耗、高新能

8、CMOS 8为微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51铲平指令和引脚完全兼容。偏上FLASH允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有平桥的8为CPU何在系统可编程Flash,使得STC89C54为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。STC89C54具有以下标准功能:8K字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16为定时器/计数器,一个6向量2级终端结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0HZ静态逻辑操作,支持2中软

9、件可选择节点模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、终端继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。单片机最小系统电路图如下图3.2所示:图3.2单片机最小系统电路图3.3 DS1302时钟电路若采用单片机计时,一方面需要采用计数器,占用阴间资源,另一方面需要设置终端、查询等,同样耗费单片机的资源,并且使用单片机的时钟误差比较大,当长时间使用后会,会出现很大错误,而在系统中采用DS1302则能很好的解决这个问题。DS1302时钟电路图如图3.3所示: 图3.3 DS1302时钟电路图3.4显示电路的设计

10、在显示模块需要对时间、单价、总价、路程、等待时间进行显示,采用的是数码管,数码管总共用了12个,其中第一行显示小时和分钟,第二行第一个显示单价,后面3个显示里程数,最后一行显示总价。显示电路图(一个数码管)如下图3.4所示:图3.4 显示电路图3.5按键控制的设计按键的设置是为了能够手动更改时间和单价,还有就是手动切换到等待时间的地方,按键采用的是脉冲按键。按键设置电路图如图3.5所示:图3.5按键控制电路图3.6掉电保护掉电存储单元的作用是在电源断开的时候,存储当前设定的单价信息。掉电保护的芯片较多,如AT24C02 是ATMEL 公司的2KB 字节的电可擦除存储芯片,采用两线串行的总线和单

11、片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10Ua(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8 脚的DIP 封装,使用方便。掉电保护电路图如下图3.6所示:图3.6 掉电保护电路图3.7复位电路复位功能采用的是MAX813L芯片。MAX813L是具有监控电路的微处理芯片,它具有4个功能:1具有独立的看门狗计时器,如果看门狗输入在1.6秒内无变化,就会产生看门狗输出;2掉电或电源电压低于1.25V时,产生掉电输出;3上电时能自动产生200ms宽的复位脉冲;4具有人工复位功能,当人工复位端输入低电平时,产生复位信号输出。复位电路如图3.7所示:图3.7复

12、位电路图四、系统软件设计4.1主程序设计程序的难度主要就是在数码管的显示和外部脉冲的采集部分,分别采用74LS273芯片对数码管进行段选,使数码管显示对应的数,另外使用74LS154对数码管进行位选,选择哪个数码管亮,采用的是动态显示。还有外部脉冲的收集,需要对里程数进行显示,所以必须要先进行脉冲的采集。程序流程图如图4.1所示:图4.1程序流程图4.2 子程序设计4.2.1 DS1302子程序4.2.1 DS1302子程序流程图显示单价、总价、路程、时间等数据,循环扫描进行显示。(如果在一分钟内没有脉冲,开启终端,显示秒分子程序。DS1302子程序流程图如4.2.1所示:开始写入实参数add

13、rCE=1 SCLK=0I=0取ADDR低位Addr右移一位Sclk上升沿是否是上升沿Y等待上升沿Ni+;i8 ?结束YN图4.2.1 DS1302子程序流程图4.2.2 显示子程序void sett() /显示等待时间及单价、总价、路程子程序TAB0=Read1302(0x83)/10;TAB1=Read1302(0x83)%10;TAB7=Read1302(0x81)/10;TAB6=Read1302(0x81)%10;TAB8=3;TAB2=Coo/100;TAB3=Coo/10%10;TAB4=Coo%10;if(TAB4=3&TAB2=0&TAB3=0)TAB11=8;elseTAB

14、11=(8+(Coo-3)*TAB8)%10;TAB5=TAB2*TAB8/10;TAB9=Coo/100*TAB8+Coo%100*TAB8/100;TAB10=(Coo/10*TAB8+Coo%10*TAB8/10)%10;void mmm() /显示时间子程序 TAB0=Read1302(0x85)/10; TAB1=Read1302(0x85)%10; TAB7=Read1302(0x83)/10; TAB6=Read1302(0x83)%10;TAB8=3;TAB11=(8+(Coo-3)*TAB8)%10;TAB5=TAB2*TAB8/10;TAB9=Coo/100*TAB8+Co

15、o%100*TAB8/100;TAB10=(Coo/10*TAB8+Coo%10*TAB8/10)%10;void mm() /非计价时的显示时间TAB0=Read1302(0x85)/10;TAB1=Read1302(0x85)%10;TAB7=Read1302(0x83)/10;TAB6=Read1302(0x83)%10;TAB8=3;TAB2=Coo/100;TAB3=Coo/10%10;TAB4=Coo%10;if(TAB4 12 ?结束YN图4.2.2 显示子程序流程图4.3 修改时间子程序修改TAB数组里的前5位数据,分别为小时、分钟、单价.五、调试及性能分析5.1调试步骤5.1

16、.1硬件调试错误1:LM7805封装时2脚和3脚弄混解决办法:1、将LM78052脚和3脚手工矫正 2、利用飞线重新手工焊接错误2:进行原理图设计时,电源网络标号不一致(74LS14、74HC154电源网络标号与其他的不一致)解决办法:利用飞线,将错误的网络标号和正确的网络标号进行手工焊接。错误3:1K*9排阻焊反解决办法:手工拔出,重新焊接错误四:在焊接时,由于焊接时间过长,造成三极管烧坏解决办法:手工拔出重新焊接错误5:有些器件焊接次数过于频繁,造成印刷板上焊盘和导线脱落解决办法:利用飞线将对应的网络标号进行连接5.1.2软件调试:在软件编程时,应充分利用原理图,不然会在编程时导致硬件与软

17、件不能对应起来,使程序无法实现功能,还有在编程时子程序的名称应与其功能对应,否则会使别人在读程序的时候不能及时理解程序含义,而且在软件调试时逻辑一定要清晰,不然在找错时会浪费很多时间,5.2性能分析通过软件调试后,最终能实现实时时钟显示、里程数的显示、单价的显示、总价的显示、时间的调整、等待时间的显示。时间显示模块使用的是时钟芯片DS1302,它精确度高,功能强大,使用它能降低单片机的负荷,减小误差。里程数收集模块由于条件限制,所以我们使用一个外部脉冲信号作为里程数的收集,用一个脉冲表示一公里,最大的里程数可达256公里。电源模块部分由于经验问题,没有在PCB板上加上串口和USB口,使得电源不

18、稳,只能用导线在外部加一个5V电压,而且由于7805的封装引脚分配有错误,导致在最初调试的时候芯片烧坏,所以最终放弃7805的电压转换,而直接使用+5V电压。显示模块使用LED数码管,通过软件调试,12个数码管能显示时间、总路程、单价、总价及等待时间的自动切换。六、心得体会由于初次进行硬件电路设计,出现了很多简单又致命的错误(见硬件调试)。5个错误在一块线路密集并且已经焊好器件的电路板上无疑是大海捞针。像器件焊反之类的错误还比较好排除。而器件损坏和网络标号不一致这样的错误就很让人头疼。仅仅只是网络标号不一致这个错误就让我们整整测试了一天才发现。所以下次设计硬件电路的时候一定要找几个人仔细检查电

19、路图,不能再轻易犯这样的错误。像印刷板上导线断裂这样的错误也比较难找。而这种错误往往是焊接时温度过高或者是焊接过于频繁造成的,所以以后焊接的时候一定不会再犯这样的错误了。而且由于当初设计USB口和串行口,为软件调试造成了很大的麻烦(每天不停地拔单片机)。再做学生实验的时候不能太过于追求趋近于真实产品。过于追求真实会让你的实验过程变得极其困难。真的是后悔不已。当初想利用以前做的单片机最小系统开发板上的串行口进行程序下载,但是到真正实行的时候在发现并不是那么回事。由于对单片机的要求达不到,虽然理论上天衣无缝,但实际上根本不可能实现。虽然出租车上提供的电源是12V,即便在实验板上设计了电源电路也应该

20、再加上一个USB口提供5V电源。因为除了在实验室其他地方是并不太容易找到12V电源。由于对USB口的省略,对软件调试工作造成了很大的麻烦。七、参考文献1 徐维祥、刘旭敏. 单片微型机原理及应用. 大连:大连理工大学出版社,1996戴胜华,蒋大明单片机原理与应用北京:清华大学出版社2005李刚新概念单片机教程天津:天津大学出版社2004王宗和单片机实验与综合训练北京高等教育出版社 2000八、附录附录1、程序清单#includereg51.h#include intrins.h#define uchar unsigned charuchar tmp;uchar det;uchar Coo;int

21、 m;int f;uchar code DispTab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0; /字形码uchar TAB24;sbit P00=P00;sbit P01=P01;sbit P02=P02;sbit P03=P03;sbit P04=P04;sbit P05=P05;sbit P10=P10;sbit P27=P27;sbit P14=P14;sbit SCLK =P13; /*DS1302的SCLK脚脉冲*/sbit DIO=P12; /*DS1302的IO脚数据*/sbit CE=P11; /*DS13

22、02的RST脚片选*/sbit P15=P15;sbit P23=P23;sbit P21=P21;sbit P16=P16;sbit P35=P35;sbit P22=P22;sbit P17=P17;sbit P20=P20;sbit P26=P26;sbit P24=P24;sbit ACC7=ACC7;sbit ACC0=ACC0;void time() interrupt 1 /等待计时中断int i,j;TH0=0x15;TL0=0xa0;i+;if(i=100)i=0;j+;if(j=10)j=0;f=Coo;void mDelay(unsigned int Delay) /延时

23、子程序 unsigned int I;for(;Delay0;Delay-) for(I=0;I0; i- ) /循环8次移位 temp = addr; DIO = (bit)(temp&0x01); /每次传输低字节 addr = 1; SCLK = 0; /右移一位 SCLK = 1; /发送数据 for ( i=8; i0; i- ) temp = dat; DIO = (bit)(temp&0x01); dat = 1; SCLK = 0; SCLK = 1; CE = 0; unsigned char Read1302 ( unsigned char addr ) /数据读取子程序

24、unsigned char i,temp,dat1,dat2; CE=0; SCLK=0; CE = 1; /发送地址 for ( i=8; i0; i- ) /循环8次移位 temp = addr; DIO = (bit)(temp&0x01); /每次传输低字节 addr = 1; SCLK = 0; SCLK = 1; /右移一位 /读取数据 for ( i=8; i0; i- ) ACC7=DIO; ACC=1; SCLK = 1; SCLK = 0; CE=0; dat1=ACC; dat2=dat1/16; /数据进制转换 dat1=dat1%16; /十六进制转十进制 dat1=

25、dat1+dat2*10; return (ACC);void Initial() /初始化DS1302 Write1302 (0x8E,0x00); /禁止写保护 Write1302 (0x80,0x00); /秒位初始化 Write1302 (0x82,0x20); /分钟初始化 Write1302 (0x84,0x10); Write1302 (0x86,0x23); Write1302 (0x88,0x05); Write1302 (0x8c,0x10); /小时初始化 Write1302 (0x8E,0x80); /允许写保护void set() /修改时间 Write1302 (0

26、x8E,0x00); /禁止写保护 Write1302 (0x82,TAB7*16+TAB6); /分钟初始化 Write1302 (0x84,TAB0*16+TAB1); Write1302 (0x8E,0x80);void ss()/显示子程序int i;uchar *p;p=TAB;for(i=0;i1;i+)det=*p;tmp=DispTabdet;P0=tmp;P20=0;P20=1;P14=0;P15=0;P16=0;P17=0;p+;det=*p;tmp=DispTabdet;P0=tmp;P20=0;P20=1;P14=1;P15=0;P16=0;P17=0;p+;det=*

27、p;tmp=DispTabdet;P0=tmp;P20=0;P20=1;P14=0;P15=1;P16=0;P17=0;p+;det=*p;tmp=DispTabdet;P0=tmp;P20=0;P20=1;P14=1;P15=1;P16=0;P17=0;p+;det=*p;tmp=DispTabdet;P0=tmp;P20=0;P20=1;P14=0;P15=0;P16=1;P17=0;p+;det=*p;tmp=DispTabdet;P0=tmp;P20=0;P20=1;P14=1;P15=0;P16=1;P17=0;p+;det=*p;tmp=DispTabdet;P0=tmp;P20=

28、0;P20=1;P14=0;P15=1;P16=1;P17=0;p+;det=*p;tmp=DispTabdet;P0=tmp;P20=0;P20=1;P14=1;P15=1;P16=1;P17=0;p+;det=*p;tmp=DispTabdet;P0=tmp;P20=0;P20=1;P14=0;P15=0;P16=0;P17=1;p+;det=*p;tmp=DispTabdet;P0=tmp;P20=0;P20=1;P14=1;P15=0;P16=0;P17=1;p+;det=*p;tmp=DispTabdet;P0=tmp;P20=0;P20=1;P14=0;P15=1;P16=0;P1

29、7=1;p+;det=*p;tmp=DispTabdet;P0=tmp;P20=0;P20=1;P14=1;P15=1;P16=0;P17=1;p+;det=*p;tmp=DispTabdet;P0=tmp;P20=0;P20=1;P14=0;P15=0;P16=1;P17=1;p+;void sett() /显示等待时间及单价、总价、路程子程序TAB0=Read1302(0x83)/10;TAB1=Read1302(0x83)%10;TAB7=Read1302(0x81)/10;TAB6=Read1302(0x81)%10;TAB8=3;TAB2=Coo/100;TAB3=Coo/10%10

30、;TAB4=Coo%10;if(TAB4=3&TAB2=0&TAB3=0)TAB11=8;elseTAB11=(8+(Coo-3)*TAB8)%10;TAB5=TAB2*TAB8/10;TAB9=Coo/100*TAB8+Coo%100*TAB8/100;TAB10=(Coo/10*TAB8+Coo%10*TAB8/10)%10;void mmm() /显示时间子程序 TAB0=Read1302(0x85)/10; TAB1=Read1302(0x85)%10; TAB7=Read1302(0x83)/10; TAB6=Read1302(0x83)%10;TAB8=3;void qie(int

31、 j) /修改时间、单价子程序uchar i;switch(j) case 4:ss();if(P22=0)for(i=0;i!=1;)i=P22;ss();TAB8+;if(TAB8=10)TAB8=0;break;case 3:ss();if(P22=0)for(i=0;i!=1;)i=P22;ss();TAB6+;if(TAB6=10)TAB6=0;break;case 2:ss();if(P22=0)for(i=0;i!=1;)i=P22;ss();TAB7+;if(TAB7=6)TAB7=0;break;case 1:ss();if(P22=0)for(i=0;i!=1;)i=P22

32、;ss();TAB1+;if(TAB0=2&TAB1=4)|TAB1=10)TAB1=0;break;case 0:ss();if(P22=0)for(i=0;i!=1;)i=P22;ss();TAB0+;if(TAB0=3)TAB0=0;break; default:break;Void die() /修改单价位、时间位子程序int x;for(m=0;m5;)ss();qie(m);if(P21=0)for(x=0;x1;)ss();x=P21;m+;set();void mm() /非计价时的显示时间TAB0=Read1302(0x85)/10;TAB1=Read1302(0x85)%1

33、0;TAB7=Read1302(0x83)/10;TAB6=Read1302(0x83)%10;TAB8=3;TAB2=Coo/100;TAB3=Coo/10%10;TAB4=Coo%10;if(TAB4=3&TAB2=0&TAB3=0)TAB11=8;elseTAB11=(8+(Coo-3)*TAB8)%10;TAB5=TAB2*TAB8/10;TAB9=Coo/100*TAB8+Coo%100*TAB8/100;TAB10=(Coo/10*TAB8+Coo%10*TAB8/10)%10;void count() /计价子程序int x;EA=1;if(f=Coo)sett();ss();e

34、lsemm();if(P35=0)for(x=0;x1;)ss();x=P35;Coo+;void main()int i,j;TMOD=0x01;TH0=0x15;TL0=0xa0;TR0=1;ET0=1;Initial();P27=0;for(;)if(P23=0)for(i=0;i1;)ss();i=P23;for(j=0;j1;)count();ss();if(P23=0)for(i=0;i1;)ss();i=P23;EA=0;j+;TAB2=TAB3=TAB11=TAB5=TAB9=TAB10=TAB4=0; else mmm();ss();if(P21=0)for(i=0;i1;)

35、ss();i=P21;die();附录2 系统硬件电路图命令代码含义X00011测量温度X00101测量湿度X00111读内部状态寄存器X00110写内部状态寄存器X11110复位命令其他保留名称型态电平功能描述并口串口VCCI.模块电源输入GNDI.电源地V0I.对比度调节VEEI.液晶驱动电压PSBIH/L并口/串口选择RSTIH/L复位信号低有效RS(CS)IH/LH数据L指令片选低有效R/W(SID)IH/LH读L写串行数据线EIH/L使能信号串行时钟输D0-D3I/OH/L数据总线低四位空接D4-D7I/OH/L数据总线高四位空接AI.背光正KI.背光负按键处理子程序LCD显示子程序数据储存报警判断SHT11温湿度读取子程序SHT11忙?气体检测子程序定时中断时间到有键按下?开始系统初始化

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号