出租车计价器调试报告

上传人:痛*** 文档编号:138723525 上传时间:2022-08-22 格式:DOC 页数:42 大小:81KB
返回 下载 相关 举报
出租车计价器调试报告_第1页
第1页 / 共42页
出租车计价器调试报告_第2页
第2页 / 共42页
出租车计价器调试报告_第3页
第3页 / 共42页
点击查看更多>>
资源描述
出租车计价器调试报告正文 第一篇:出租车计价器调试报告出租车计价器调试报告本设计可分为单片机主控模块、键盘、显示器、温度检测、状态指示、时钟日历、语音收录播报、分频器电路、脉冲信号发生器等9部分。仔细分析系统的工作原理,分别按照模块在系统中的作用,对各个模块分别单独调试,最后形成该系统的用户程序,实现功能要求。一、接通电源调试要求:1. 首先仔细检查该系统板的电源和地是否有短路问题,在未接入电源轻快下,使用万用表检验电源和地检查是否短路,如果没有短路,再仔细核查电源极性后予以通电,观察电源指示灯D1是否点亮。如果电源指示的灯不亮应立即关闭电源,并用手触摸各个芯片,检查是否用某芯片发热。如果没有发热的器件,很可能是电源指示二极管极性安装错误,或者是该发光二极管的串联电阻阻值偏大。2. 黑板上调试要求:(1) 焊接好电路板加电前,用万用表测量板上Vcc 和GND之间的电阻,应大于1K(2) 加电后测量电路板上各电压,应大于4.2V 调试结果:1. 经万用表检验,电路板无短路问题。2. 通电后,D1指示灯点亮。3. 测量Vcc 与 地之间的电阻,1.14K 1K4. 测量Vcc与 地之间的电压:4.28V 4.2021 二、测试状态指示本系统中状态指示二极管共有3个,它们分别是D1、D2、D3。D1是指示电源的,可以在电源接通时直接看到,D2用于指示语音芯片的工作状态,留作语音模块调试时观察。D3是可以由单片机的引脚控制的。编写测试D3的程序: #include #includesbit a_c=P10; extern serial_initial();main() serial_initial(); a_c=0; while(1); 测试结果: 1.2.三、脉冲信号发生器测试测试要求:该模块由5G555芯片构成一个多谐振荡器,使用示波器观察该芯片的第3引脚的波形,并调节电位器W1,观察输出波形及频率变化。测试结果:调整W1前,f=147.1Hz调整W1后,f=130.5Hz四、分频电路测试测试要求:该模块由一个4位二进制计数器74HC161和一个多路选择器74HC153构成。调试时可以利用由5G555芯片构成一个多谐振荡器的输出,或信号发生器作为计数器74HC161的计数输入信号。值得注意的是控制多路选择器74HC153的S0、S1与单片机调试时所使用的引脚复用,要采取特殊措施才能正确试验检测。测试结果:利用函数信号发生器生成一个方波,周期/频率如图:其在输出端输出的波形为:f1=3.881kHzf2 =1.235kHz 分频功能无误。五、键盘测试测试要求:本系统相对比较简单,仅有5个按键,其中4个为系统功能键,它们分别是S1、S2、S3、S4,另一个是系统复位按键S6。对于系统复位按键S6可以在上电之后,使用万用表予以检查,按下该按键,单片机的第9脚应该为高电平,释放后应该为点电平。对于系统功能键,编写如下程序予以测试检查:#include #include #include #include #define SEGMENT XBYTE0x0c000#define BIT_LED XBYTE0x0a000 void display(); sbit k1=P10; sbit k2=P11; sbit k3=P12; sbit k4=P13; unsigned char a; unsignedchar table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x40,0x00,0x63,0x39,; void delay(unsigned int i); main() while(1) if(k1=0)a=0x06; if(k2=0)a=0x5b; if(k3=0)a=0x4f; if(k4=0)a=0x66; display(); 测试结果:对于复位键S6,按下前应为低电平,按下后应为高电平按下前按下后对于S1S4,按下前为高电平,按下后为低电平。 其测试结果均符合预期。六、动态数码管测试测试要求:本系统中的数码管的原理采用的是动态扫描方式,即某一时刻只用一个数码管在显示,利用人的视觉暂留特性,让数码管高速轮流显示,达到完整显示的目的。编写如下程序进行测试: #include #include #include #include #define SEGMENT XBYTE0x0c000#define BIT_LED XBYTE0x0a000 void displayhello(); sbit k1=P10; sbit k2=P11; sbit k3=P12; sbit k4=P13; unsigned char a; unsigned char table=0x06,0x06,0x3f,0x3e,0x79,0x6e,0x3f,0x3e,0x7f,0x67,0x40,0x00,0x63,0x39,; void delayms(unsigned int i); main() while(1) displayhello(); void displayhello() unsigned char BIT=1;unsigned int i;BIT_LED=1;for(i=0;i0) i-;TMDAT = 1;i = 4; while (i0) i-; void tmpre (void) unsigned int i;while (TMDAT);while (TMDAT);i = 4; while (i0) i-; bit tmrbit (void) / ds182021/ Reset TXunsigned int i;bit dat;TMDAT = 0; i+;TMDAT = 1; i+; i+;dat = TMDAT;i = 8; while (i0) i-;return (dat); unsigned char tmrbyte (void) unsigned char i,j,dat;dat = 0;for (i=1;i 1);return (dat); void tmwbyte (unsigned char dat) unsigned int i;unsigned char j;bit testb;for (j=1;j 1;if (testb) TMDAT = 0;i+; i+;TMDAT = 1;i = 8; while (i0) i-;else TMDAT = 0;i = 8; while (i0) i-;TMDAT = 1;i+; i+; void tmstart (void) tmreset ();tmpre ();/ ds182021displaytemper();/delay(100);tmwbyte (0xcc);tmwbyte (0x44);void tmrtemp (void) unsigned char a,xiao,b,y1,y2,y3;tmreset ();tmpre ();delay (1);tmwbyte (0xcc);tmwbyte (0xbe);a = tmrbyte ();b = tmrbyte ();xiao=a&0x0f;/小数部分y1=a4;y2=b1; data_ds1302=0x80;IO_ds1302=0; for(i=1;i1; void open_write_bit()/open write unsigned int i; SCL_ds1302=0; _nop_();/打开写保护/关闭写保护RST_ds1302=1; _nop_();_nop_(); data_ds1302=0x8e; for(i=1;i1; data_ds1302=0x00;/0x00,书上为0x80 IO_ds1302=0; for(i=1;i1; void initial_ds1302()/初始化函数 unsigned int i; SCL_ds1302=0; _nop_(); RST_ds1302=1; _nop_();_nop_(); data_ds1302=0x8e;for(i=1;i1; IO_ds1302=0; data_ds1302=0x00;for(i=1;i1; RST_ds1302=0; SCL_ds1302=0; _nop_(); RST_ds1302=1; _nop_(); _nop_(); data_ds1302=0x90;for(i=1;i1; data_ds1302=0x0a4;for(i=1;i1; RST_ds1302=0; _nop_(); SCL_ds1302=0; _nop_(); RST_ds1302=1;data_ds1302=0x8e;for(i=1;i1; data_ds1302=0x80;for(i=1;i1; RST_ds1302=0; _nop_(); SCL_ds1302=0; unsigned char read_ds1302(char command)/read函数 unsigned int i; data_ds1302=command; SCL_ds1302=0; _nop_(); RST_ds1302=1; for(i=1;i1; SCL_ds1302=1; for(i=1;i1)|0x80;/送入到data_ds1302中,准备送出else data_ds1302=1; SCL_ds1302=1; RST_ds1302=0; _nop_(); SCL_ds1302=0; return (data_ds1302); void write_ds1302(unsigned char address,unsigned char numb) unsigned int i;SCL_ds1302=0;RST_ds1302=0;RST_ds1302=1;data_ds1302=address; for(i=1;i1; data_ds1302=numb; for(i=1;i1; void read_time() unsigned char second,minte,hour,d,date,month,year,zhou; second=0x81;/读秒d=read_ds1302(second); display_buffer5=d&0x0f; display_buffer4=d4; minte=0x83;/读分d=read_ds1302(minte); display_buffer3=d&0x0f; display_buffer2=d4; hour=0x85;/读时d=read_ds1302(hour); display_buffer1=d&0x0f; display_buffer0=d4; year=0x8d;/读年d=read_ds1302(year); display_buffer7=d&0x0f; display_buffer6=d4; month=0x89;/读月d=read_ds1302(month); display_buffer9=d&0x0f; display_buffer8=d4;/送入写的内容zhou=0x8b;/读周d=read_ds1302(zhou); display_buffer12=d; date=0x87;/读日期d=read_ds1302(date); display_buffer11=d&0x0f; display_buffer10=d4; void set_time() unsigned char data temp; unsigned char data hour_address=0x84,minte_address=0x82,second_address=0x80,date_address=0x86,month_address=0x88,zhou_address=0x8a,year_address=0x8c;/各个时间量的地址open_write_bit();temp=(display_buffer00); /向cpu读回或发送数据unsigned char ISD_SendData(unsigned char dat) unsigned char i,j,BUF_ISD=dat; SCK=1; SS=0; for(j=4;j0;j-) ; for(i=0;i0;j-) ; if(BUF_ISD&0x01)MOSI=1; elseMOSI=0; BUF_ISD=1; if(MISO)BUF_ISD|=0x80; SCK=1; for(j=6;j0;j-) ; MOSI=0; return(BUF_ISD); void ISD_PU(void) ISD_SendData(0x01);ISD_SendData(0x00);SS=1; void ISD_Rd_Status(void) unsigned char i; ISD_SendData(0x05); ISD_SendData(0x00); ISD_SendData(0x00); SS=1; for(i=2;i0;i-) ; SR0_L=ISD_SendData(0x05); SR0_H=ISD_SendData(0x00); SR1=ISD_SendData(0x00); SS=1; void ISD_WR_APC2(unsigned char apcdatl,apcdath) ISD_SendData(0x65); ISD_SendData(apcdatl); ISD_SendData(apcdath); SS=1; void ISD_SET_PLAY(unsigned char Saddl,Saddh,Eaddl,Eaddh) ISD_SendData(0x80); ISD_SendData(0x00); ISD_SendData(Saddl); ISD_SendData(Saddh); ISD_SendData(Eaddl); ISD_SendData(Eaddh); ISD_SendData(0x00); SS=1; void ISD_SET_Rec(unsigned char Saddl,Saddh,Eaddl,Eaddh) ISD_SendData(0x81); ISD_SendData(0x00); ISD_SendData(Saddl); ISD_SendData(Saddh); ISD_SendData(Eaddl); ISD_SendData(Eaddh); ISD_SendData(0x00); SS=1; void ISD_SET_Erase(unsigned char Saddl,Saddh,Eaddl,Eaddh) ISD_SendData(0x82); ISD_SendData(0x00); ISD_SendData(Saddl); ISD_SendData(Saddh); ISD_SendData(Eaddl); ISD_SendData(Eaddh); ISD_SendData(0x00); SS=1; void delay(unsigned int t) for(;t0;t-) TH0=0xfc; TL0=0x18; TR0=1; while(TF0!=1) ; TF0=0; TR0=0; 测试结果:需要在程序中设置断点,完成录音,放音再录音放音的循环操作。测试功能正常。十、单片机模块调试测试要求:该模块的调试很复杂,牵扯面也很多。其实通过前面各个模块的调试,已经大部分得到了间接地验证。例如在“动态数码管测试”和“串行通讯测试”中就是用到了定时器。如有必要可以再编写一些测试程序。例如检测单片机的某一口线的功能是否正常、测试某段程序运行时间,等等。测试结论:因单片机大部分功能在前调试方案中大部分已使用过,此处不再进行其余调试。第二篇:第二组_出租车计价器课程设计调试报告电子设计与制作课程设计报告题目:出租车计价器课程设计学年:2021学年学期:上学期专业:信息电子班级:H09-1组别2 姓名:曾磊指导教师:刘锐老师小组成员: 曾磊 刘毅 朱亮时间:2021年2月21日2021年3月18日出租车计价器课程设计一、设计目的随着出租车行业的发展,出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。本设计采用AT89S52单片机为主控器,以A44E霍尔传感器测距,实现对出租车的多功能的计价设计,并采用AT24C01实现在系统掉电的时候保存单价等信息,输出采用8段数码显示管。本电路设计的计价器不但能实现基本的计价,而且还能根据白天,黑夜和中途等待来调节单价。二、设计要求(1)设计指标出租车计价器根据乘客乘坐汽车行驶距离和等候时间的多少进行计价,并在行程中同步显示车费值。从起步价开始,当汽车程行驶未满3公里时,均按起步价计算。过3公里后,实现每1公里单价收费,中间遇暂停时,计程数不再增加,开始计时收费,测距收费和测时收费的和便构成了一位乘客的车费。同时,白天和夜晚价格不同,可以进行切换。白天单价、夜晚单价、等待单价和起步价格都可通过独立键盘进行调节。(默认起步价为5元/3公里,里程单价白天为1.5元/公里,夜晚为1.8元/公里,等待计时单价为0.5元/5分钟)(2)设计要求 画出电路原理图(或仿真电路图); 元器件及参数选择; 电路仿真与调试; 实物图。(3)制作要求:自行装配和调试,并能发现问题和解决问题。(4)编写设计报告,写出设计与制作的全过程,附上有关资料和图纸,有心得体会。三、元器件1自制PCB板1块 2镊子1把 3剪刀1把4共阳四合一八段数码管2个 5导线若干6AT89S52单片机1块7A44E霍尔传感器集成块1块 8AT24C010集成块1块 9. 9015三极管7个 101K电阻8个 114.7K电阻2个1211.0592M时钟晶体1个 13. 22uF电解电容 1个 14. 22P瓷片电容 2个 15. 轻触开关5个A44E霍尔传感器检测单元A44E 属于开关型的霍尔器件,其工作电压范围比较宽(4.518V),其输出的信号符合TTL电平标准,可以直接接到单片机的IO 端口上,而且其最高检测频率可达到1MHZ。A44E 集成霍耳开关由稳压器A、霍耳电势发生器(即硅霍耳片)B、差分放大器C、施密特触发器D和OC门输出E五个基本部分组成。在输入端输入电压Vcc,经稳压器稳压后加在霍尔电势发生器的两端,根据霍尔效应原理,当霍尔片处在磁场中时,在垂直于磁场的方向通以电流,则与这二者相垂直的方向上将会产生霍尔电势差VH输出,该VH信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC门输出。当施加的磁场达到工作点(即Bop)时,触发器输出高电压(相对于地电位),使三极管导通,此时OC门输出端输出低电压,三极管截止,使OC门输出高电压,这种状态为关。这样两次电压变换,使霍尔开关完成了一次开关动作。A44E霍尔传感器原理 里程计算是通过安装在车轮上的霍尔传感器检测到的脉冲信号,送到单片机产生中断,单片机再根据程序设定,计算出里程。传感器测距示意图AT24C01存储单元存储单元的作用是在电源断开的时候,存储当前设定的单价信息。AT24C01 是Ateml公司的1KB的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10uA(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8 脚的DIP 封装,使用方便。存储单元电路连接如图存储单元电路原理图四、键盘调整单元当单价等信息需要进行修改时,就要用到键盘进行修改。由于调节信息不多,故采用4个独立键盘即可,分别实现清零、切换、增大、减小和功能等作用。键盘调整单元接线图S1:接P1.0口,对上一次的计费进行清零,为下次载客准备S2:接P1.1口,实现白天和夜晚单价的切换;当功能键S4按下时,S2可对数据进行增大。S3:接P1.2口,当功能键S4按下时,S3可对数据进行减小。S4:接P1.3口,按1次,进入调整白天单价;按2次,进入调整夜晚单价;按3次,进入调整等待单价;按4次,进入调整起步价;按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产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。(六)键盘程序键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结束再返回。流程图如图键盘程序流程图七、电路的组装与调试首先将数码管安装到事先焊好的插槽上,然后,对照电路图确定好各芯片所在的位置,按照对应的引脚插到插槽上,最后接好合适的电源。调试时按照以下步骤进行调试: n 调试动态显示电路。查看数码管是否显示正常。n 首先调试A44E霍尔传感器检测单元。用示波器观察多谐振荡器输出波形,确定是否正常工作。n 调试AT24C01存储单元。尝试写入读出指定数据看是否符合要求。 n 调试键盘控制电路。结合程序调试按键抖动,查看是否符合程序要求。 n 整体调试。结合实际效果对程序进行优化。附件 A八、总结l 原理图经过这些天有关于出租车计价器的课程设计,使我对单片机的应用有了更深的了解。在课程设计的过程中,还是碰到了许多的问题。比如,对于数码管动态扫描显示和键盘的延时防抖的综合编程不能较好地解决;对于代码的前后顺序及调用掌握得还不够好;对于一些相关的应用软件没能熟练掌握。通过这几天晚上的苦想和反复调试,以及参考网上的程序,最终还是把问题解决了。通过这次课程设计,我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,也充分体会到了自己设计东西的乐趣、学会查阅资料和对别人的东西融会变通的重要性,也明白了很多知识光靠趴在书本上学是学不到其中的精髓的,必须亲自去试着实践,亲自去经历才能对它们真正的掌握,凡事都要自己去动下手,去实践一下,遇到困难,永远不要沮丧气馁。在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识;这次设计给了我极大的鼓舞和信心,相信在以后的学习中可以通过不断的摸索和实践来提高其他方面的知识。l PCB附件 B 系统源程序#include #include #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=P33;/外部中断 sbit key0=P10;/清零 sbit key1=P11;/切换/+ sbit key2=P12;/- sbit key3=P13;/功能键sbit P3_0=P30;/数码管各位控制 sbit P3_1=P31; sbit P3_2=P32; sbit P3_4=P34; sbit P3_5=P35; sbit P3_6=P36; sbit P3_7=P37;sbit SDA=P23;/IIC引脚 sbit SCL=P22;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;ifor(j=0;j3)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; 第三篇:出租车计价器设计出租车计价器课程设计(1)(2021-07-20212:10:25)转载标签: 杂谈 分类:技术资料目录前言1、 系统工作原理 1.1 功能说明 1.2 基本原理2、 硬件设计2.1 单片机最小系统单元 2.2 A44E霍尔传感器检测单元 2.3 AT24C01存储单元 2.4 键盘调整单元 2.5 显示单元3、 软件设计 3.1 系统主程序 3.2 中断程序3.2.1 里程计数中断程序 3.2.2 中途等待中断程序 3.3 计算程序 3.4 显示程序 3.5 键盘程序4、 总结 参考文献附录A 系统原理图 附录B 系统源程序前言随着出租车行业的发展,出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。本设计采用AT89S52单片机为主控器,以A44E霍尔传感器测距,实现对出租车的多功能的计价设计,并采用AT24C01实现在系统掉电的时候保存单价等信息,输出采用8段数码显示管。本电路设计的计价器不但能实现基本的计价,而且还能根据白天,黑夜和中途等待来调节单价。第一章 系统工作原理1.1 功能说明出租车计价器根据乘客乘坐汽车行驶距离和等候时间的多少进行计价,并在行程中同步显示车费值。从起步价开始,当汽车程行驶未满3公里时,均按起步价计算。过3公里后,实现每1公里单价收费,中间遇暂停时,计程数不再增加,开始计时收费,测距收费和测时收费的和便构成了一位乘客的车费。同时,白天和夜晚价格不同,可以进行切换。白天单价、夜晚单价、等待单价和起步价格都可通过独立键盘进行调节。(默认起步价为5元/3公里,里程单价白天为1.5元/公里,夜晚为1.8元/公里,等待计时单价为0.5元/5分钟)1.2 基本原理计数器系统主要由五部分组成:A44E霍尔传感器、AT89S52单片机、独立键盘、EEPROM AT24C01和显示数码管。霍尔传感器安装在车轮上,主要检测汽车行进的公里数,并产生一系列相应的脉冲输出,脉冲送到单片机进行处理,单片机根据程序设定通过计算脉冲数换算出行驶公里数,再根据从EEPROM中读取的价格等相关数据进行金额的计算,计算好的金额、里程和单价都实时地显示在数码管上。独立键盘可以调节价格等相关数据,按下相应的按钮,产生信号交由单片机处理并实时显示出来,调节好的数据存储到EEPROM中,掉电后可以使调好的数据不丢失,下次得电后直接从EEPROM读到单片机,系统结构图如图1。图1 系统结构图第二章 硬件设计2.1 单片机最小系统单元主控机系统采用了Atmel 公司生产的 AT89S52单片机,它含有256 字节数据存储器,内置8K 的电可擦除FLASH ROM,可重复编程,大小满足主控机软件系统设计,所以不必再扩展程序存储器。复位电路和晶振电路是AT89S52 工作所需的最简外围电路。单片机最小系统电路图如图2所示。图2 单片机最小系统图AT89S52 的复位端是一个史密特触发输入,高电平有效。RST端若由低电平上升到高电平并持续2个周期,系统将实现一次复位操作。在复位电路中,按一下复位开关就使在RST端出现一段时间的高电平,外接11.0592M 晶振和两个30pF 电容组成系统的内部时钟电路。2.2 A44E霍尔传感器检测单元A44E 属于开关型的霍尔器件,其工作电压范围比较宽(4.518V),其输出的信号符合TTL电平标准,可以直接接到单片机的IO 端口上,而且其最高检测频率可达到1MHZ。 A44E 集成霍耳开关由稳压器A、霍耳电势发生器(即硅霍耳片)B、差分放大器C、施密特触发器D和OC门输出E五个基本部分组成。在输入端输入电压Vcc,经稳压器稳压后加在霍尔电势发生器的两端,根据霍尔效应原理,当霍尔片处在磁场中时,在垂直于磁场的方向通以电流,则与这二者相垂直的方向上将会产生霍尔电势差VH输出,该VH信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC门输出。当施加的磁场达到工作点(即Bop)时,触发器输出高电压(相对于地电位),使三极管导通,此时OC门输出端输出低电压,三极管截止,使OC门输出高电压,这种状态为关。这样两次电压变换,使霍尔开关完成了一次开关动作。A44E霍尔传感器原理如图3所示。图3 A44E霍尔传感器原理里程计算是通过安装在车轮上的霍尔传感器检测到的脉冲信号,送到单片机产生中断,单片机再根据程序设定,计算出里程。其原理如图4所示。图4 传感器测距示意图本系统选择了将A44E的脉冲输出口接到P3.3口外部中断1作为信号的输入端(这样可以减少程序设计的麻烦),车轮每转一圈(设车轮的周长是1米),霍尔开关就检测并输出信号,引起单片机的中断,对脉冲计数,当计数达到1000次时,即1公里,单片机就控制将金额自动增加,如图5。图5 A44E霍尔元件接线图2.3 AT24C01存储单元存储单元的作用是在电源断开的时候,存储当前设定的单价信息。AT24C01 是Ateml公司的1KB的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10uA(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8 脚的DIP 封装,使用方便。 AT24C02芯片引脚配置如图6所示。存储单元电路连接如图7所示。图 7 存储单元电路原理图图中R4、R5 是上拉电阻,其作用是减少AT24C01 的静态功耗。由于AT24C01的数据线和地址线是复用的,采用串口的方式传送数据,所以只用两根线SCL(时钟脉冲)和SDA(数据/地址)与单片机P2.2和P2.3口连接,进行传送数据。每当设定一次单价,系统就自动调用存储程序,将单价信息保存在芯片内;当系统重新上电的时候,自动调用读存储器程序,将存储器内的单价等信息,读到缓存单元中,供主程序使用。2.4 键盘调整单元当单价等信息需要进行修改时,就要用到键盘进行修改。由于调节信息不多,故采用4个独立键盘即可,分别实现清零、切换、增大、减小和功能等作用。电路原理如图8所示。图8 键盘调整单元接线图S1:接P1.0口,对上一次的计费进行清零,为下次载客准备S2:接P1.1口,实现白天和夜晚单价的切换;当功能键S4按下时,S2可对数据进行增大。 S3:接P1.2口,当功能键S4按下时,S3可对数据进行减小。S4:接P1.3口,按1次,进入调整白天单价;按2次,进入调整夜晚单价;按3次,进入调整等待单价;按4次,进入调整起步价;按5次,返回。2.5 显示单元显示单元由7个8段共阳数码管组成,采用动态扫描进行显示。前三个数码管分别接P3.0、P3.1和P3.2,用于显示总金额;中间两个分别接P3.4和P3.5,用于显示里程;后边两个分别接P3.6和P3.7,用于显示单价。电路如图9所示。图9 数码管显示图第三章 软件设计3.1 系统主程序在主程序模块中,需要完成对各参量和接口的初始化、出租车起价和单价的初始化以及中断、计算、循环等工作。另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。当汽车运行起来时,就启动计价,根据里程寄存器中的内容计算和判断行驶里程是否已超过起步价公里数。若已超过,则根据里程值、每公里的单价数和起步价数来计算出当前的总金额,并将结果存于总金额寄存器中;中途等待时,无脉冲输入,不产生中断,当时间超过等待设定值时,开始进行计时,并把等待价格加到总金额里,然后将总金额、里程和单价送数码管显示出来。程序流程如图10所示。图10 主程序流程图 图11 计算程序流程图3.2 中断程序3.2.1 里程计数中断程序每当霍尔传感器输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满1000次时,进入里程计数中断服务程序中,里程变量加一。主函数中总金额也相应地变化。3.2.2 中途等待中断程序在中途等待中断程序中,每1ms产生一次中断,将当前里程值送入某个缓存变量,每5分钟将缓存变量中的值和当前里程值比较,当汽车停止,霍尔传感器5分钟没有输出信号,当前里程值和缓存变量内的值相同,则进入等待计时,每5分钟记一次价格。3.3 计算程序计算程序根据里程数分别进入不同的计算公式。如果里程大于3公里,则执行公式:总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:总金额=起步价+等待时间*等待单价。程序流程图如图11所示。3.4 显示程序显示程序利用定时器每1ms产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。3.5 键盘程序键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结束再返回。流程图如图12。图12 键盘程序流程图第四章 总结经过这些天有关于出租车计价器的课程设计,使我对单片机的应用有了更深的了解。在课程设计的过程中,还是碰到了许多的问题。比如,对于数码管动态扫描显示和键盘的延时防抖的综合编程不能较好地解决;对于代码的前后顺序及调用掌握得还不够好;对于一些相关的应用软件没能熟练掌握。通过这几天晚上的苦想和反复调试,以及参考网上的程序,最终还是把问题解决了。通过这次课程设计,我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,也充分体会到了自己设计东西的乐趣、学会查阅资料和对别人的东西融会变通的重要性,也明白了很多知识光靠趴在书本上学是学不到其中的精髓的,必须亲自去试着实践,亲自去经历才能对它们真正的掌握,凡事都要自己去动下手,去实践一下,遇到困难,永远不要沮丧气馁。在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识;这次设计给了我极大的鼓舞和信心,相信在以后的学习中可以通过不断的摸索和实践来提高其他方面的知识。参考文献1 马淑华,王凤文,张美金编著. 单片机原理与接口技术(第二版). 北京:北京邮电大学出版社,2021. 2 谭浩强著. C程序设计(第三版). 北京:清华大学出版社,2021.源程序#include #include#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=P33; /外部中断sbit key0=P10; /清零 sbit key1=P11; /切换/+ sbit key2=P12; /- sbit key3=P13; /功能键sbit p30=P30; /数码管各位控制 sbit p31=P31; sbit p32=P32; sbit p34=P34; sbit p35=P35; sbit p36=P36; sbit p37=P37; sbit SDA=P23; /IIC引脚 sbit SCL=P22;uint inter,aa,bb,temp,temp1; uint zongjine,licheng,dengdai; uint key3num,qiehuantemp,delaytemp; uchar danjia1,danjia2,danjia3,danjia,qibu;void delay(uint x) /延时时基为1ms int i,j; for(i=x;i0;i-) for(j=340;j0;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)&(i3) zongjine=qibu+(licheng-3)*danjia+dengdai*danjia3; /金额计算 else zongjine=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; 测试是否进入等待 无反应进入等待计费矩阵键盘及程序(2021-08-20212:40:21)转载标签: 杂谈 分类:技术资料自己做了一个矩阵键盘,初次做,焊得还是比较丑和简陋的。 矩阵键盘程序是从一个大的函数中截取的,基本思路可以看明白 /P1.0-P1.3是行线,P1.4-P1.7是列线 uchar keyscan() uchar cord_h,cord_l,key_code; P1=0x0f; /行线输出全为0 if(P1&0x0f)!=0x0f) delay(10); if(P1&0x0f)!=0x0f) cord_h=P1&0x0f; P1=cord_h|0xf0; /输出当前列线值 cord_l=P1&0xf0; key_code=cord_h|cord_l; delay(2021 else key_code=0xff; return key_code; /返回键值 void get_code(uchar key_code) switch(key_code) case 0xee: key_temp=1;unit_price=read_price(1);break;/1 case 0xde: key_temp=2;unit_price=read_price(7);break;/2 case 0xbe: key_temp=3;unit_price=read_price(13);break;/3 case 0x7e: key_temp=4;unit_price=read_price(19);break;/4 case 0xed: key_temp=5;unit_price=read_price(25);break;/5 case 0xdd: key_temp=6;unit_price=read_price(31);break;/6 case 0xbd: key_temp=7;unit_price=read_price(37);break;/7 case 0x7d: key_temp=8;unit_price=read_price(43);break;/8 case 0xeb: key_temp=9;unit_price=read_price(49);break;/9 case 0xdb: key_temp=0;unit_price=rea
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 成人自考


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

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


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