




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、电子系统设计报告出租车计价器 电气88班 李乔() 电气88班 田子瑜()一、 引言当今,随着科学技术的发展,计算机技术带来了科研和生产的许多重大的飞跃,特别是单片微型计算机的应用已经渗透到生产和生活中的各个方面,有力的推动了社会的发展。单片微机以其体积小,集成度高,价格便宜,在数据处理、实时控制等方面有着无与伦比的强大功能。其性能不断提高,应用范围愈来愈广。出租车计价器就是单片微型计算机的一个典型的应用。凡坐过出租车的人都知道,只要汽车一开动,随着行驶里程的增加,就会看到汽车前面的计价器里程数字显示的读数从零逐渐增大,而当行驶到某一值时(如2KM)计费数字显示开始从起步价(如7元)增加。当出
2、租车到达某地需要在那里等候时,司机只要按一下“计时”键,每等候一定时间,计费显示就增加一个该收的等候费用。汽车继续行驶时,停止计算等候费,继续增加里程计费。到达目的地,便可按显示的数字收费。计价器实物如下图:汽车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。它关系着交易双方的利益。具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。因此,汽车计价器的研究也是十分有一个应用价值的。采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试,对于模式的切换需要用到机械开关,机械开关时间久了会造成接触不良,功
3、能不易实现。为此我们采用了单片机进行设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易的实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。二、 设计技术要求1. 用555振荡器模拟出租车车轮转数传感器,计量出租车所走的公里数。2. 显示里程、价格和等待红灯或堵车的计时价格。3. 具有等待计时功能。4. 具有实时年月日显示与切换功能。三、 设计内容概要系统的硬件部分以AT89C52 单片机为控制核心,通过时钟芯片DS1302,语音芯片ISD25120,七段数码管构成了一个具有语音播报功能,时间日期显示功能的出租车计价器。整个系统采用8块七段数码管来显示信息,不仅可以
4、显示出租车行驶的公里数与价格,也可以通过按键切换至日期与时间显示。系统通过555振荡器模拟出租车车轮转速传感器,计算出租车走过的公里数。系统的软件设计部分全部采用C语言进行编写,具有良好的可移植性和扩展升级能力。整个软件设计部分可主要分为时间、计价两部分。四、 电路与模块的设计整个出租车计价器除单片机本体外的电路大体分为三块,即:通过74LS573和ULN2803A实现数码管动态扫描中位码与段码的传送的数码管动态显示模块;实现时钟日期信息的走时、调整和数据传送的ds1302模块;以及在出租车计价器设计过程中模拟车轮运转脉冲的由555芯片构成的脉冲发生电路模块。结构框图大概如下:89C52单片机
5、里程计算单元555构成的多谐振荡电路显示驱动电路行程金 额显 示里程显示在下一面我将就对各主要部分分别进行简要的介绍。1. 单片机主控模块主控器AT89C52单片机是一种低功耗、高性能CMOS 8位微控制器,内含256B的RAM。与AT80C51引脚和指令完全兼容。拥有1个8位CPU,1个片内振荡器及时钟电路,3个16位定时计数器,21 个特殊功能寄存器,4个8位并行IO口,共32条可编程IO端线,1个可编程全双工串行口,8个中断源,且自带8KB的电擦除E2PROM,用以保存控制程序。单片机使用了两个电容值为30pF的电容以及频率为11.0592MHz的晶振组成了外部晶振电路。阻值分别为200
6、,10k的电阻,以及一个电容值为10uF的电容组成了一个能提供复位信号的电路。按下S6,单片机复位。从单片机的P2,5,P2,6,两个输出引脚分别引出两个与非门,接入显示模块从而实现对这个模块的控制。2. 显示模块如下图所示即为本设计中实现数码管动态扫描显示的部分电路,其中之上的两个MC74HC02AN分别通过或非经过单片机实现对于两个锁存器74LS573的选择和控制,而ULN2803A则通过提供驱动电流实现对于不同位的显示。动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码
7、管的轮流点亮(数位选择)。在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。对于显示的字形码数据我们采用查表方法来完成。其中,对于数码管显示的段码和位码都必须经过锁存器74LS573实现,其特性有:三态总线驱动输出;置数全并行存取;缓冲控制输入;使能输入有改善抗扰度的滞后作用。原理:74LS573 的八个锁存器都是透明的D 型锁存器,当使能(G)为高时,Q 输出将随数据(D)输入而变。当使能为低时,输出将锁存在已建立的数据电平上。输出控制不影响锁存器的内部工作,即老数据可以保持,甚至当输出被关闭时,新的数据也可以置入。这种电路可以驱动大电容或低阻抗负载
8、,可以直接与系统总线接口并驱动总线,而不需要外接口。特别适用于缓冲寄存器,I/O 通道,双向总线驱动器和工作寄存器。而由于电路中使用的共阴极数码管并没有另外提供电源,还需要ULN2803A来提供驱动电流来点亮相应的数码管。ULN2800是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。达林顿管又称复合管。它将二只三极管适当的连接在一起,以组成一只等效的新的三极管。这等于效三极管的放大倍数是二者之积。在电子学电路设计中,达林顿接法常用于功率放大器和稳压电源中。3. 脉冲发生器模块555构成的多谐振荡器电路对里程信
9、号的采集由两部分组成。实验中我们采用555构成的多谐振荡器对计程脉冲进行模拟。实际应用中的信号采集电路时经过74HC161和74LS158分频处理后送入单片机的。当采用多谐振荡器时,我们在输出端可以得到矩形波电压,从而模拟出租车的行驶状况。多谐振荡器的输出送入单片机的T0计数。通过电路和多谐振荡器的工作原理我们可知,产生方波的频率f=1.44/(R1+2W1)C。这里我们选取R1=27k,W1最大阻值为100k,C1=0.1uF,则f的变化范围从63.44Hz到533.33Hz,可以模拟出租车车速的变化。由74HC161和74LS153构成的信号产生装置实际应用时,由P_CLK端接入汽车行驶里
10、程信号,并可由74HC161和747LS153对输入信号进行1,2,4,8分频。4. DS1302时间日期模块上图即为DS1302部分电路,DS1302包括时钟/日历寄存器和31 字节(8 位)的数据暂存寄存器,数据通信仅通过一条串行输入输出口。实时时钟/日历提供包括秒、分、时、日期、月份和年份信息。闰年可自行调整,可选择12 小时制和24 小时制,可以设置AM、PM。DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc10.2V时,Vcc2给DS1302供电。当
11、Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向)。SC
12、LK为时钟输入端。主要工作原理图如Figure 1 所示:移位寄存器,控制逻辑,晶振,时钟和RAM。在进行任何数据传输时,RST必须被制高电平(注意虽然将它置为高电平,内部时钟还是在晶振作用下走时的,此时,允许外部读写数据),在每个SCLK 上升沿时数据被输入,下降沿时数据被输出,一次只能读写一位,适度还是写需要通过串行输入控制指令来实现(也是一个字节),通过8 个脉冲便可读取一个字节从而实现串行输入与输出。最初通过8 个时钟周期载入控制字节到移位寄存器。如果控制指令选择的是单字节模式,连续的8 个时钟脉冲可以进行8 位数据的写和8 位数据的读操作,SCLK 时钟的上升沿时,数据被写入DS13
13、02,SCLK 脉冲的下降沿读出DS1302 的数据。8 个脉冲便可读写一个字节。在突发模式,通过连续的脉冲一次性读写完7 个字节的时钟/日历寄存器(注意时钟/日历寄存器要读写完),也可以一次性读写8328 位RAM 数据(可按实际情况读写一定数量的位,不必全部读写,两者的区别)。具体的运行时序将在程序设计部分更为详细地介绍。5. 控制模块当有乘客上车按下S1键,程序启动,并显示当前日期;当按下S2键,系统将里程、时间、金额寄存器中的数值全部清零并且开始计程计价;当遇到红灯或堵车的状况,司机按下S4键,计价器从计程方式转变为计时方式,再按一次又转变为计程方式;当达到目的地时,司机按下S3键,计
14、时计程计价结束,数码管上保持显示里程价格;再之中任何时刻按下S5(或S1)键,数码管可从计价显示切换到日历显示,再按一次S1可以返回计价显示。五、 系统程序设计以上介绍了出租车计价器电路的大致硬件模块分布和各部分主要的功能和特性,要具体实现所要求的功能则需要通过对于系统的中枢AT89C52单片机编程来进行实现。从产品功能的角度讲,同时与硬件对应,软件的设计同样分为几个模块,用于实现相应的功能:进行脉冲计数、等待计时、计算显示总价的计价模块;数码管动态扫描的显示模块;操作DS1302芯片实现芯片初始化上电和调整及获得当前日期的日期显示模块;同时还需要设计将以上功能连接、扫描按键的主程序。1. 主
15、程序设计主程序的作用在于将程序的各部分连接,并且完成功能的相应初始化,进行扫描键盘待命。在具体的设计中,只需调用相应的子程序完成初始化,调整好相应的定时器模式、中断的允许和优先级,再在扫描键盘时将相应的功能子程序添加即可。程序代码如下:void main()unsigned char i;EA=1;ET1=1;ET0=1;EX0=1;initial_ds1302();initialdata_DS1302();read_date();while(1) if(start_key=0) delay(10); if(start_key=0) ET0=0; for(i=2;i8;i+) read_dat
16、e();display_bufferi=date_bufferi-2; display_buffer0=2;display_buffer1=0;show();delay(20000);ET0=1;change(); if(startcharge_key=0) delay(10); if(startcharge_key=0) D_cnt=0;cnt_distance=0;cnt_time=0;cnt_cost=0;initial_charge(); showcharge(); if(stopcharge_key=0) delay(10); if(stopcharge_key=0) chargef
17、lag=2; show(); if(wait_key=0) delay(50); if(wait_key=0) waitcharge(); 2. 数码管动态扫描的显示模块数码管的动态扫描通过单片机的P0口依次送出需要显示数据的段码和位码,通过或非门MC74HC02AN的控制,依次通过573锁存器送段码和573锁存器接ULN2803A驱动电路驱动所扫描到的数码管来完成显示。在程序设计当中,通过定时器1来完成扫描之间的延时计时,通过定时器1的中断服务程序调用显示用子程序反复扫描。相应的子程序unsigned char get_code(unsigned char i)的作用为查询所显示的字符的段码
18、,运用swich-case结构将所需的段码取出。程序代码如下:void time1_int(void) interrupt 1TH0=time1_h;TL0=time1_1;display();unsigned char get_code(unsigned char i)unsigned char p;switch(i)case 0:p=0x3F;break;case 1:p=0x06;break;case 2:p=0x5B;break;case 3:p=0x4F;break;case 4:p=0x66;break;case 5:p=0x6D;break;case 6:p=0x7D;break
19、;case 7:p=0x07;break;case 8:p=0x7F;break;case 9:p=0x67;break;case 10:p=0x77;break;case 11:p=0x7C;break;case 12:p=0x39;break;case 13:p=0x5E;break;case 14:p=0x79;break;case 15:p=0x71;break;case 16:p=0xBF;break; /* 0. */case 17: p=0x86;break;/*1。*/case 18: p=0xDB;break;/*2。*/ case 19: p=0xCF;break;/*3。
20、*/case 20: p=0xE6;break;/*4。*/case 21: p=0xED;break;/*5。*/case 22: p=0xFD;break;/*6。*/case 23: p=0x87;break;/*7。*/case 24: p=0xFF;break;/*8。*/case 25: p=0xE7;break;/*9。*/case 26: p=0x00;break;default: break;return(p); void display(void)unsigned char i;switch(display_bit)case 1:i=0;break;case 2:i=1;b
21、reak;case 4:i=2;break;case 8:i=3;break;case 16:i=4;break;case 32:i=5;break;case 64:i=6;break;case 128:i=7;break;default:break;BIT_LED=0;SEGMENT=get_code(display_bufferi);BIT_LED=display_bit;if(display_bit0x64)display_bit=display_bit*2;else display_bit=0x01;void show()BIT_LED=0;TMOD=0x61;/定时器0计数器方式2定
22、时器1计时器方式1time1_times=65536-time1*f/12;time1_h=(time1_times/256);time1_1=(time1_times%256);TH0=time1_h;TL0=time1_1;TR0=1;display_bit=0x01;3. 日期模块 程序代码如下: void close_write_bit()char i;SCL_DS1302=0;_nop_();RST_DS1302=1;_nop_();_nop_();data_ds1302=0x8e;for(i=1;i1; data_ds1302=0x80;IO_DS1302=0;for(i=1;i1
23、; void open_write_bit()char i;SCL_DS1302=0;_nop_();RST_DS1302=1;_nop_();_nop_();data_ds1302=0x8e;for(i=1;i1; data_ds1302=0x00;IO_DS1302=0;for(i=1;i1; void initial_ds1302()unsigned char i;SCL_DS1302=0;_nop_();RST_DS1302=1;_nop_();_nop_();data_ds1302=0x8e;for(i=1;i1; data_ds1302=0x00; /80IO_DS1302=0;f
24、or(i=1;i1; RST_DS1302=0;_nop_();SCL_DS1302=0;SCL_DS1302=0;_nop_();RST_DS1302=1;_nop_();_nop_();data_ds1302=0x90;for(i=1;i1; data_ds1302=0xa4;for(i=1;i1; RST_DS1302=0;_nop_();SCL_DS1302=0;SCL_DS1302=0;_nop_();RST_DS1302=1;_nop_();_nop_();data_ds1302=0x8e; /80for(i=1;i1; data_ds1302=0x80;for(i=1;i1; R
25、ST_DS1302=0;_nop_();SCL_DS1302=0;unsigned char read_ds1302(char command)char i;data_ds1302=(command1)|0x81;SCL_DS1302=0;_nop_();RST_DS1302=1;for(i=1;i1; SCL_DS1302=1;for(i=1;i1;SCL_DS1302=0;_nop_();bit_data7=IO_DS1302;SCL_DS1302=1; RST_DS1302=0;_nop_();SCL_DS1302=0;return(data_ds1302);void write_ds1
26、302(unsigned char address,unsigned char numb)/写入时间char i;RST_DS1302=0;SCL_DS1302=0;RST_DS1302=0;RST_DS1302=1;data_ds1302=0x80|(address1); /写是0x80,读是81for(i=1;i1; data_ds1302=numb;for(i=1;i1; RST_DS1302=0;SCL_DS1302=1;void initialdata_DS1302() unsigned char data year_address=6,month_address=4,date_ad
27、dress=3,hour_address=2,minute_address=1,second_address=0;open_write_bit();write_ds1302(year_address,0x11);write_ds1302(month_address,0x05);write_ds1302(date_address,0x09);write_ds1302(hour_address,0x10);write_ds1302(minute_address,0x08);write_ds1302(second_address,0x30);close_write_bit();void read_d
28、ate()unsigned char year,month,day,hour,minute,second,d;second=0;d=read_ds1302(second);date_buffer11=d&0x0f;date_buffer10=(d4);minute=1;d=read_ds1302(minute);date_buffer9=d&0x0f;date_buffer8=(d4);hour=2;d=read_ds1302(hour);date_buffer7=d&0x0f;date_buffer6=(d4);day=3;/日期的寄存器d=read_ds1302(day);date_buf
29、fer5=d&0x0f;date_buffer4=(d4);month=4;/月的寄存器d=read_ds1302(month);date_buffer3=d&0x0f;date_buffer2=(d4);year=6;/年的寄存器d=read_ds1302(year);date_buffer1=d&0x0f;date_buffer0=(d4);4. 计价模块根据电路图的连接,本出租车计价器的脉冲计数模块采用通过计数器0对脉冲进行计数,通过中断程序将计数结果按轮径、脉冲数等因素计算总里程,将其置入保存总里程的变量中,再通过总里程计算总价。同时,本出租车计价器还要求完成等待计时的功能,针对这一点
30、,笔者认为有两种思路:其一,可以采用通过另一计时器进行定时,将定时结果置入一变量中,每当前述计数器收到脉冲时,则将该计时变量清零,一旦计时变量积累到指定值(如30秒),则在总价中加上相应的计费,计时器继续计时;其二,通过一司机师傅可以控制的按钮,一旦按键,则计数器停止计数,转入计时器模式,如上计时、累加、计费,再按则又切换回计程模式。很显然,第一种方式更为自然和普遍,但是第二种方式也有其优越之处,采用第二种方式时,司机可以更为自由地控制哪些情况需要开始计时,乘客也有一定地与司机协商的空间,而对于本次设计而言,由于用555定时器组建多谐震荡模拟车轮脉冲,不方便调试无脉冲的条件,故采用第二种思路。
31、通过标志位chargeflag可以判断当前的计费状态处于计里程(0)或计时间(1),从而将1号定时器调整于相应地工作状态。程序代码如下:void initial_charge()TMOD=0x61; /定时器0计数器方式2定时器1计时器方式1TH1=256-10;TL1=256-10; /计数器每十个脉冲产生一次中断,并自动重载chargeflag=0;TR1=1;void chargecount() interrupt 3 if(chargeflag=0) if(D_cnt10) D_cnt+; else /计数100次,每次10米,表示一公里 D_cnt=0; cnt_distance=c
32、nt_distance+1; if(cnt_distance29)cnt_time=0; cnt_cost=cnt_cost+10; /每等待半分钟加一元 showcharge(); void waitcharge()TR0=0;if(chargeflag=0)chargeflag=1;TMOD=0x11; /定时器0改计时器方式1time0_times=65536-time2*f/12;time0_h=(time0_times/256);time0_1=(time0_times%256);TH0=time0_h;TL0=time0_1;TR0=1; else chargeflag=0;ini
33、tial_charge(); void showcharge()display_buffer0=cnt_cost/100;display_buffer1=(cnt_cost%100)/10)+16;if(cnt_cost%10=5)display_buffer2=5;elsedisplay_buffer2=0; /每0.5元跳display_buffer3=cnt_distance/100;display_buffer4=(cnt_distance%100)/10)+16;display_buffer5=cnt_distance%10;display_buffer6=cnt_time/10;display_buffer7=cnt_time%10;show();5. 日期计价切换功能通过按键S1,调用子函数change()实现日期与计价功能的切换。程序代码如下:void change() interrupt 0 unsigned char i;if(changeflag=0)changeflag=1; TR1=0;read_date();for(i=2;i8;i+)display_bufferi=date_bufferi-2;displa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 风险管理流程优化试题及答案
- 2025年行业趋势预测试题及答案
- 安全编程实践考试考题及答案分享
- 积极法治建设对社会发展的影响试题及答案
- 现代软件开发的协作工具试题及答案
- 风险分析工具在企业文化中的应用试题及答案
- 软件开发中的团队协作工具试题及答案
- 代码质量保证与提高技巧试题及答案
- 数据库设计建模技能试题及答案
- 业务分析与产品设计试题及答案
- 十岁生日宴流程
- DB3307T 128-2023 共富工坊建设与星级评价规范
- 《推进乡村振兴中的的政府行为研究国内外文献综述》5100字
- 康养休闲旅游服务基础知识单选题及答案解析
- 公司师徒制、导师制管理办法(完整版方案)
- 解剖学公开课课件内分泌
- 家族财富管理
- 高中必修一英语单词湘教版
- 森林防火预警监测
- 银屑病临床病例讨论
- 涉密人员审查备案登记表
评论
0/150
提交评论