找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 4056|回复: 1
打印 上一主题 下一主题
收起左侧

用单片机实现汽车行驶状态记录仪系统设计资料

[复制链接]
跳转到指定楼层
楼主
ID:77446 发表于 2015-4-19 18:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
摘  要

汽车行驶状态记录仪是一种安装在汽车上的特殊的数字式电子记录装置。它可以全程记录汽车行驶数据,并通过对所记录的行驶信息数据进行分析,精确掌控汽车的各种状况。利用它,可有效预防驾驶员违章驾驶、遏制重大交通事故,约束驾驶员的不良驾驶习惯,为执法人员进行事故的分析、处理提供科学的原始数据,因此在交通运输管理中发挥着十分重要的作用。针对目前汽车行驶记录仪的研究现状,本文设计并实现了一种基于51单片机的汽车行驶状态记录仪,该汽车行驶状态记录仪具有准确性、可靠性、高效性、易读性和价格低廉等特点。
关键词:汽车行驶状态记录仪;单片机;C51;液晶显示;

ABSTRACT

Vehicle traveling data recorder(VTDR) is a special digital electronic recorder which used to acquire and store vehicle’s traveling speedtime-distance and other related status informationand then display data via LCD and RS232 interfaceThe use of vehicle travel- ling data recorder carol not merely halt the break in traffic rules and regulations, restrain the drivers from being drive at bad habitand call prevent the traffic accident effectively, it can also offer scientific initial data for the tipstaffs carries on the accidentsSo it plays a very important role in transportation managementAiming at the actuality of the VTDR researcha VTDR is designed in this paper which bases on the 51 MCUIt also has some characteristics such as real-time,reliable,high dependability, read-easy and less cost
Key words: Vehicle Traveling Data RecorderSingle Chip MicrocomputerC51LCD Display


目  录

1  绪论        1
1.1国内外汽车行驶状态记录仪发展的状况        1
1.2本课题的目的和意义        2
1.3本课题的主要研究内容        3
2  汽车行驶状态记录仪总体方案设计        3
2.1汽车行驶记录仪的功能和技术指标        3
2.2汽车行驶状态记录仪的系统结构        4
2.2.1设计思路分析        4
2.2.2面板介绍和使用方法        5
3  汽车行驶状态记录仪硬件设计与实现        6
3.1 记录仪的供电        6
3.2 信息采集模块        7
3.3单片机模块        8
3.4可编程逻辑器件        9
3.5日历时钟芯片        12
3.6液晶显示模块LCD        14
3.7信息的存储        15
4  汽车行驶状态记录仪软件设计与实现        16
4.1 软件流程        16
4.2中断子程序        18
4.3 获取状态信息        20
4.4 时间信息的设置和获取        21
4.5 键盘输入        22
4.6 液晶显示        25
4.7 IC卡操作        26
5  分析与结论        28
6  后续研究与发展前景        29
附  录        30
参考文献        31
致  谢        32







2  汽车行驶状态记录仪总体方案设计2.1汽车行驶记录仪的功能和技术指标
汽车行驶状态记录仪的主要功能及技术指标应包括以下几个方面。
(1) 能够实时监督并记录汽车行驶的各种状态信息,包括速度、里程等重要数据。
(2) 为每个驾驶员提供单独的可移动存储卡式设备,用于记录驾驶员信息(如姓名、工号等)和汽车(如车号等),为有关部门检查提供必要的信息;同时,还需要提供存储发车站和终点站的功能。
(3) 安装在汽车上的行驶状态记录仪要提供方便、灵活的操作界面,可进行输入信息的提示,同时还要有实时信息的显示,并可根据用户要求或设置,另外还要具备汽车超速时的报警功能。
(4) 安装在计算机上的汽车行驶信息分析软件应该提供方便的图形用户界面,支持鼠标和键盘操作,能统计分析任何时段的行驶速度、行驶里程、停车次数、停车时间、超速次数、超速时间、发车以及到站时间,并能用图形显示速度、里程的变化情况;在汽车正常行驶或发生交通事故时,可向管理部门提供详实的汽车行驶数据,帮助管理人员全面了解汽车的行驶情况,同时也可提供故障诊断功能,便于汽车维护和维修人员判断及修理。
所开发的汽车行驶状态记录仪作为产品使用还需要满足下面的要求:
l 合适的数据记录频率:速度的采样周期可设置为1次/ s~0.2次/s。
l 一定的数据记录容量:0~240h。
l 较长的数据存储时间:掉电情况下可至少保存10年以上。
l 监测汽车行驶速度范围:0~240km/h。
l 记录需要的汽车行驶数据,包括速度、里程、超速度及时间、停车次数及时间。
l 存储卡还要可以存储驾驶员信息、汽车信息、发车时间和到站时间、起始站和终点站。
l 要能够抗电磁干扰、防火、防潮、抗冲击。
l 尺寸要合适,便于在汽车上安装。
2.2汽车行驶状态记录仪的系统结构2.2.1设计思路分析
本系统包括数据采集、控制、键盘输入、液晶显示、日历、数据存储等功能模块,其中采集、控制、键盘及“屏显”都属于51单片机的应用范畴。
本课题研究的汽车行驶状态记录仪的总体结构框图如图2-1:
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5C1E.tmp.png
图2-1汽车行驶状态记录仪总体结构框图

在图2-1中,单片机系统是整个系统的核心,通过硬件和内部软件的配合控制整个系统的运行。
供电单元的作用是将汽车内部配电模块提供的电压转换成记录仪可以正常工作的电压,这其中为了避免汽车内部电机的干扰,需要进行屏蔽。
信号采集模块是指将汽车内部霍尔传感器传过来的一对分差信号经过适当的变换变成一个脉冲信号提供给单片机系统。这其中需要用光耦模块进行隔离,来避免强脉冲信号对电路板的干扰。
信息储存是指单片机系统将采集到的信息经过适当的运算处理之后存储到智能IC卡中,IC 卡中的信息可以长时间保存,可以用读卡设备读出其中的信息然后进行分析。
设计这样的单片机系统当然还要用到可编程逻辑器件,它可以灵活方便地产生译码、控制等信号。
键盘输入和液晶显示是常用的单片机输入/输出模块,为用户提供友好方便的人机操作界面,用户可以输入特定的信息,也可以看到实时的速度、里程及时间等信息,可以做出实时判断。
2.2.2面板介绍和使用方法
本论文中介绍的汽车行驶状态记录仪最终会作为车载设备在汽车上,它需要具有有好的用户操作界面,和一般的仪器仪表开发一样,需要有用户操作面板,可设计类似于图2-2所示的操作界面。
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5C2F.tmp.jpg
                 图 2-2 汽车行驶状态记录仪面板图

主屏为系统的显示界面,由液晶模块实现,它的功能是显示实时速度、里程等信息;键盘主要用于输入车号、站号等信息;面板的右下方是IC卡插座,用户(此处实际就是司机)由此插入自己的智能IC卡,IC卡记录此次行驶的信息。面板中间区域是两个指示灯,左边为电源指示灯,正常情况下接通电源后亮绿灯,右边为超速报警灯,超速时亮红灯。
3  汽车行驶状态记录仪硬件设计与实现3.1 记录仪的供电
电源系统是任何汽车电子设计中最重要的子系统之一,电源设计非常重要,如果电源设计比较糟糕的话,其它单元设计无论多么完美,系统也不能正常发挥作用。整体功耗、电磁干扰等都是必须考虑的因素。
目前汽车内部产生的供电是+12V,记录仪本身需要的是+5V供电,所以系统需要供电模块来实现+12V+5V的电源变换,其工作原理如图3-1a)、3-1b)所示。
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5C4F.tmp.jpg
图3-1a 汽车行驶状态记录仪电源部分原理图
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5C5F.tmp.jpg
图3-1b 汽车行驶状态记录仪电源部分原理图

由于汽车行驶状态记录仪电源部分原理图画出来比较大,故分成3-1a)、3-1b)显示。
汽车内部会提供一条屏蔽线PB,它的作用是屏蔽汽车内部产生的干扰,它被引入到光耦模块,光耦模块起到光耦隔离作用,屏蔽线和光耦电路一起可以使得采集到的信号波形尽可能干净,信号采集电路受汽车内部电动机产生的干扰尽可能小。
3.2 信息采集模块
此部分的硬件设计较为简单,因为需要采集的信号很少,而且汽车内部有自己的传感器,实际上也就是有现成的信号提供给记录仪。汽车轮子每转一周,会通过车子内部的霍尔传感器传送一对差分信号,此差分信号经过信号采集模块变成满足要求的计数脉冲,此脉冲信号经过一定的处理即可用来得到速度、里程等信息。
信号采集模块的电路原理图如图3-2所示
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5C70.tmp.jpg
图3-2汽车行驶状态记录仪信号采集电路原理图

图 3-2中U8是东芝公司的单光耦芯片TLP521-2,实际上它的内部就是两组光敏三极管,如图3-3所示。


光敏三极管也是利用硅PN结的光电效应制成的。光敏三极管使用时,其基极通常开路,基极—集电极产生的光敏感生电流反馈入基极,并被光敏三极管自己所放大,因此光敏三极管的灵敏度比光敏二极管大得多,通常要大100多倍。光敏三极管的最大工作频率只有几百KHz。
光耦模块主要就是通过电光电的变换将电信号隔离开来的,它可以避免一侧对另一侧产生的干扰。记录仪上的+5V工作系统是弱电电路,汽车内部提供的脉冲信号在送入记录仪之前必须经过光耦隔离的处理。
图3-2中HP和FP是汽车轮子转一周内部提供的差分信号,它在通过系统的信号采集模块后产生状态记录仪系统可以使用的信号SIG;图3-2中PB为屏蔽线,由它构成了屏蔽网络,有效地屏蔽了汽车电动机等对硬件电路的干扰。
通过屏蔽和光耦隔离,得到波形干净的SIG信号,信号采集功能完成。采集到的SIG信号需要送到可编程逻辑器件中进一步处理,由单片机系统对处理后的结果进行相应的运算,可以得到速度、里程等状态信息。
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5C81.tmp.jpg
图3-3  单光耦芯片(TLP521内部工作框图)
3.3单片机模块
对于整个汽车行驶状态记录仪而言,起到控制和枢纽作用的单片机模块无疑是其中最重要的部分。其工作原理图如图3-4所示。
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5C91.tmp.jpg
图3-4 汽车行驶状态记录仪单片机模块原理图

图3-4中U4为12M晶振,它为单片机提供稳定的12MHz工作时钟。
系统选用Atmel公司的带有8KB Flash的8位微控制器AT89S8252作为单片机芯片,它完全与MCS-51系列单片机兼容(从指令集到引脚)。
和51单片机相比AT89S8252还具有一些增强型的功能。因为记录仪最终需要将记录的车辆行驶状态信息存入IC卡,本系统选用的IC卡是通过SPI口存储的,所以本文选用带有SPI接口功能的单片机芯片AT89S8252。
由于单片机AT89S8252芯片各管脚的功能与作用和80C51芯片的基本一样,在文中将不做详细介绍。
3.4可编程逻辑器件
可编程逻辑器件(Programmable Logic Device,PLD)技术是目前电子设计领域中最具活力和发展前途的一项技术,在PLD上,工程师可以通过传统的原理图输入法,或是硬件描述语言自由地设计一个数字系统。通过软件仿真,可以事先验证设计的正确性。在印刷电路板PCB完成以后,还可以利用可编程逻辑器件的在线修改能力,随时修改设计而不必改动硬件电路。使用可编程逻辑器件来开发数字电路,可以大大缩短设计时间,减少PCB面积,提高系统的可靠性。可编程芯片和单片机的配合使用已成为单片机系统的最常用开发模式。
本文中可编程逻辑器件主要完成的功能包括:脉冲信号的计数、定时器和产生芯片选择信号。实现的功能比较简单,使用端口不多,选用Altera公司的EPM7032S44可以达到要求。EPM7032S44属于MAX7000S系列,此系列是Altera公司的主流芯片,采用5V/3.3V工艺,价格便宜。
可编程逻辑器件设计的常用方法有图形输入法和文本输入法。图形输入法类似于数字电路设计,只是它是通过器件模型而不是具体器件搭建的;文本输入法则是通过编程的方法从已知输入得到需要的输出。相比之下文本输入法更为灵活,在实现复杂电路的设计时常采用它。本文中可编程逻辑器件实现的功能采用了图形输入和文本输入结合的方式,比较简单。
本文中选用了Altera公司的开发软件Maxplus来设计的GDF文件如图3-5所示。
由图3-5可知,液晶显示模块和日历时钟芯片的片选信号由读、写信号及最高位地址线A15经过简单的逻辑电路搭建而成。图中另外一部分电路由两个子模块timer和sigcounter构成,它们的作用是对信号采集到的信号SIG进行计数,结果通过系统的地址/数据复用总线送给单片机处理。
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5CB1.tmp.jpg
图3-5汽车行驶状态记录仪可编程逻辑器件顶层图形输入设计(GDF文件)

Timer模块用VHDL语言实现,代码如下:
SUBDESIGN timer
(
            clk                : INPUT ;
            suocun        : OUTPUT;
)
VARIABLE
            f[3..0] : DFF;
            suocun        : DFF;
BEGIN
            f[].clk=clk;
            suocun.clk=clk;
            f[].d=(!suocun)&(f[]+1);
            suocun.d=f[3] & !f[2] & !f[1] & !f[0];
END;

Timer模块的输入信号为日历时钟芯片产生的方波信号,输出为计数器模块sigcounter需要的锁存信号“suocun”。
计数器模块sigcounter也采用VHDL编程实现,代码如下:

SUBDESIGN sigcounter
(
            sig, lrst,suocun,oe                : INPUT ;
            ad[7..0]        : OUTPUT;
)
VARIABLE
            cnt0[7..0]                :DFF;
            cnt1[7..0]                :DFF;
            reg[4..0]                :DFF;
            tnode[7..0] : TRI_STATE_NODE;
BEGIN
            reg0.clk=suocun;
            reg0.d=!reg0;
            reg1.clk=!oe;
            reg1.d=!reg0;
            reg2.clk=!suocun;
            reg2.d=reg0;
            reg3.clk=!oe;
            reg3.d=reg0;
            reg4.clk=!suocun;
            reg4.d=!reg0;
cnt0[].clk=sig & reg0;
            cnt1[].clk=sig & !reg0;
            cnt0[].clrn=lrst & (reg3.q # reg4.q);
            cnt1[].clrn=lrst & (reg1.q # reg2.q);
cnt0[].d=cnt0[]+1;
            cnt1[].d=cnt1[]+1;
            tnode[7]=TRI(cnt0[7].q,oe & !reg0);
            tnode[7]=TRI(cnt1[7].q,oe & reg0);
            tnode[6]=TRI(cnt0[6].q,oe & !reg0);
            tnode[6]=TRI(cnt1[6].q,oe & reg0);
            tnode[5]=TRI(cnt0[5].q,oe & !reg0);
            tnode[5]=TRI(cnt1[5].q,oe & reg0);
            tnode[4]=TRI(cnt0[4].q,oe & !reg0);
            tnode[4]=TRI(cnt1[4].q,oe & reg0);
            tnode[3]=TRI(cnt0[3].q,oe & !reg0);
            tnode[3]=TRI(cnt1[3].q,oe & reg0);
            tnode[2]=TRI(cnt0[2].q,oe & !reg0);
            tnode[2]=TRI(cnt1[2].q,oe & reg0);
            tnode[1]=TRI(cnt0[1].q,oe & !reg0);
            tnode[1]=TRI(cnt1[1].q,oe & reg0);
            tnode[0]=TRI(cnt0[0].q,oe & !reg0);
            tnode[0]=TRI(cnt1[0].q,oe & reg0);
            ad[]=tnode[];
        END;
至此本设计中可编程逻辑电路的设计已经完成。在调试过程中若发现需要更改设计也很方便,只需重新编写程序、设计.gdf文件重新下载即可,不用对电路板做修改,这也是采用可编程逻辑器件的最大优点。
3.5日历时钟芯片
汽车行驶状态记录仪需要对状态发生时所对应的时间信息做相应的记录,以便后来的分析使用,所以需要获取详细的时间信息。
在2.1节中系统的技术指标中提到数据记录容量要求在0~240小时,数据存储时间在掉电情况下至少保存10年以上。根据这些要求,系统中选用了日历时钟芯片来提供详细的日期和时、分、秒的时间信息。
本文中选用达拉斯半导体公司的芯片DS12C887.。DS12C887是一款实时时钟芯片,内部有锂供电的石英晶振,它可以在无外部供电的情况下将数据保存10年以上。它内部通过计数可以实现时间的记录,时间信息可以详细到时、分、秒、年、月、日,以及星期,时间显示模块可以选择带有“AM”和“PM”指示的12小时模式及正常的24小时模式,芯片可以提供闹钟的设置,在芯片内部还有15个字节的时钟和控制寄存器,以及113个字节的通用RAM空间。芯片DS12C887的内部工作原理如图3-6所示。
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5CC2.tmp.png
图3-6日历时钟芯片DS12C887的内部工作原理框图

DS12C887的内存空间为128个字节,其中11个字节专门用于存储实时时间信息,4个字节专门用于控制和存放状态信息,剩下的113个字节为用户可以使用的普通RAM空间。
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5CE2.tmp.png
图3-7日历时钟芯片DS12C887内部内存空间映射示意图
3.6液晶显示模块LCD
本文中液晶显示模块LCD(Liquid Crystal Display)选用内含KS0108B/HD61202控制器的图形液晶显示模块GXM12864,它是一种采用低功耗CMOS技术实现的点阵图形LCD模块,有8位微处理器接口,通过内部的128×64位映射DDRAM(Display Data RAM)实现128点×64点大小的平板显示。该液晶显示模块使用KS0107B为行驱动器,同时使用KS0108B作为列驱动器。KS0107B不与MPU发生联系,只要提供电源就能产生行驱动信号和各种同步信号,比较简单。
对于用户来说,LCD模块的使用关键在于驱动芯片的使用,驱动芯片和LCD显示屏的接口电路已经做好在GXM12864的内部,用户使用时只需阅读驱动芯片的相关资料,设计出驱动芯片和微处理器之间的接口电路,编写具体的驱动程序。
前面提到行驱动芯片KS0107B不与MPU发生联系,只要提供电源就能产生行驱动信号和各种同步信号,比较简单,在此就不做介绍了。
列驱动芯片KS0108B与KS0107B配合对液晶屏进行行列驱动,可直接与8位微处理器相连。微处理器对液晶显示模块的操作是通过KS0108B支持的指令系统实现的,掌握这些命令是编写液晶模块驱动程序的关键。
3.7信息的存储
汽车行驶状态记录仪最终的任务是要将记录下的信息存储到智能IC卡中,以便以后对信息进行分析。IC卡采用符合国际标准的智能卡,本系统选用的是ATMEL公司的AT45D041A。
AT45D041A是4M位的串行数据Flash,采用+5V供电,它支持在系统的页编程,删除操作可选择页或块删除,支持SPI接口的读写操作,主要用于数字语音、图像和数据的存储。
AT45D041A具有4M位的内存空间,此空间由2048页构成,每页264B,除此外,它还有两个SRAM数据缓冲,每个缓冲区的大小也是264B,缓冲区的作用使得主内存在重新编程的时候允许接受新数据。AT45D041A的内部结构如图3-8所示。
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5CF3.tmp.png
图3-8   IC卡芯片AT45D041A的内部结构框图

与普通Flash并行的数据接入相比,AT45D041A使用SPI接口串行接入数据,采用简单的串行数据接口可以增加系统可靠性,减小器件的封装,减少引脚数目。AT45D041A和CPU接口的引脚主要有7个:CS为低电平有效的片选脚;SCK为串行时钟脚;SI、SO分别为串行输入、输出脚;WP为低电平有效的硬件页写操作保护脚,低电平时主内存空间的前256页不允许进行编程操作,在此可接VCC;RESET是低电平有效的芯片复位脚;RDY/BUSY是状态指示脚,表示当前卡的状态是准备好(高电平)或是忙(低电平)。这些引脚中SCK、SI和SO即为芯片的串行接口。
4  汽车行驶状态记录仪软件设计与实现
下面将介绍如何在前面实现的硬件平台上实现软件设计过程。
4.1 软件流程
本文中设计的软件流程如图4-1所示。
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D03.tmp.png
图4-1   汽车行驶状态记录仪软件流程图

从图4-1中可以看出,软件的流程是和汽车行驶状态记录仪工作时的工序相对应的。在启动后,液晶显示屏会提示输入站号、车号等信息,用户可以通过键盘输入,汽车开动以后,显示屏会显示汽车实时的速度和所行驶的里程信息,在到站以后,用户按先功能键“FUN”则可以输入到站的站号,之后记录下的行驶状态信息被存入到IC卡中。在行驶过程中还要判断汽车是否超速,超速要给出报警等提示。可编程逻辑器件对车轮转一周产生的信号进行计数,单片机利用定时中断定期对计数值进行统计计算,从而得到速度等信息,程序中不断将速度值和门限值做比较,如果超过就打开超速报警红灯。
除了定时中断以外,本系统还使用了一个外部中断INT0,汽车到站时,用户按下“FUN”键就会触发此中断。程序检测到此中断后会执行到站后的相应操作。
主程序在检测到车子开动以后进入一个无限循环,循环和中断的配合实现了系统的整个功能。
4.2中断子程序
本例中使用了定时器0中断(工作在计时器方式)和外部中断0。前者用于定时显示速度、里程等信息;后者用于到站操作。主程序需要根据要求对中断有关的寄存器进行设置。
……
TMOD=0x06;
TH0=-5;
TL0=-5;
IP=0x01;
EA=1;
ET0=1;
EX0=1;
TR0=1;
……
定时中断服务程序如下:
void timer0 ( ) interrupt 1 using 1
{
EA=0;
time_count++;
circle=P0;
P1_4=0;
ttcy+ =circle;
P3_1=0;
P1_7=1;
……
……
……
EA=1;
}
程序中最主要的是三个变量time_count、circle和ttcy。其中circle值由CPLD计算获得,它表示的是转速信息;ttcy值对circle进行累加,在主程序中由它可得到行驶里程信息;time_count变量也是一个全局变量,在定时中断中不断累加,它决定了主程序何时刷新速度和里程的更新显示。
外部中断采用的是中断查询的方式,也就是中断到来的时候只做置位操作(给设定的中断标志位置1),主程序中不断轮询此标志位,发现被置位后进行相应的处理,这样可简化中断服务子程序。
外部中断服务程序如下:
void  int0 ( )  interrupt  0  using 2
{
      EA=0;
      int0flag=1;
      EA=1;
}
上述程序完成对int0flag的置位操作。
在主程序中需要轮询int0flag变量。
void  main (void)
{
    ……
    while  (1)
    {
        ……
        if ( int0flag)
        {
           ……
}
}
}
4.3 获取状态信息
硬件电路中,车轮每转一周都会提供一个脉冲信号SIG,然后可编程逻辑器件EPM7032会算出转速信息通过P0口送给单片机。
单片机获取状态信息的程序如下:
if (time_count>=120)
{
time_count=0;
hi=36*circle/35;
mid=hi/100;
disp1(mid);
lo=(hi-mid*100)/10;
disp2(lo);
disp2(hi-mid*100-lo*10);
mid=(36*circle-35*hi)*10/35;
disp3(mid);
j=ttcy/700;
mid=j/100;
disp4(mid);
lo=(j-mid*100)/10;
disp5(lo);
disp5(j-mid*100-lo*10);
mid=(ttcy-700*j)*10/700;
disp6(mid);
}
4.4 时间信息的设置和获取
主程序流程图中,初始化部分要包括时间信息的初始化。首先屏幕会显示提示信息,比如“请输入年”,然后用户通过键盘输入正确信息,比如“2008”,此时程序记录此信息并显示在液晶屏上,这样依次根据屏幕提示输入所有的时间信息,包括年、月、日、时、分、秒。具体程序如下:
void presettime  ( )
{
    unsigned char year,month,day,hour,min,sec;
    timereg_b=0x8e;
    timereg_a=0x2f;
    dispnian( );
    year=getkey( );
    time_year=year;
    dispyue( );
    month=getkey( )
time_month=month;
    dispri( );
    day=getkey( );
    time_day=day;


dispshi;
hour=getkey( );
time_hour=hour;
dispfen;
min=getkey( );
time_min=min;
dispmiao;
sec=getkey( );
time_sec=sec;
timeregb=0x0e;
}
设置初始时间主要是对实时时钟芯片DS12C887的操作,程序通过获取键盘输入的值,写入芯片内部的6种时间寄存器。芯片内部还有4个控制寄存器,在此设计中只用了A、B寄存器。此外,程序中还用到了键盘扫描和液晶显示相关的函数。
4.5 键盘输入
记录仪的输入通过键盘来实现,使用的键盘扫描函数keyscan()如下:
unsigned char keyscan(void)
(
    unsigned char sccode,recode;
    P1=0x78;
    if  ((P1&0x78)!=0x78)
    {
        d110ms( );
        if  ((P1&0x78)!=0x78)
{
sccode=0xfe;
          while ((sccode&0x08)!=0)
{
     P1=sccode;
     if  ((P1&0x78)!=0x78)
     {
        recode =(P1&0x78)︱0x78;
        return ((~sccode)+(~recode));
}
else sccode=(sccode<<1)︱0x01;
}
}
}
return (0);
)
键盘读取函数getkey()如下:
unsigned char getkey(void)
{
    unsigned char num1,num2,num;
    num1=0; num2=0; num=0;
    while (key!=0x44)
{
   num1=keyscan( );
   switch(num1)
   {
       case 0x09:
            num1=0;
            num2=num2*10;
            num=num+1;
            if (num==2)   
{disp2(num1);}
else {disp1(num1);}
break;
               case 0x11:
                    num1=1;
                    num2=num1*10+num1;
                    num=num+1;
if (num==2)   
{disp2(num1);}
else {disp1(num1);}
break;
              case  0x21:
                    ……
              case  0x41:
                    ……
              case  0x0a:
                    ……
              case  0x12:
                    ……
              case  0x22:
                    ……
              case  0x42:
                    ……
              case  0x0c:
                    ……
              case  0x14:
                    ……
              case  0x24:
                    ……
              case  0x44:
                    break;
}
return(num2);
}
在键盘读取函数getkey()中除了读取了键值以外还调用了数字显示函数,将数字显示了出来。由于键盘读取函数getkey()程序较长,文中只写出了程序的框架,但不影响调试等操作。
4.6 液晶显示
液晶显示包括屏幕提示、键盘输入值的显示及行驶中状态信息的显示。要编写正确的液晶显示程序,就必须熟悉所用液晶模块的指令集。本设计中使用的液晶模块是GXM12864,它所用的控制驱动器是2片KS0108B和1片KS0107B,其中和单片机直接进行连接的是KS0108B,KS0108B共有7种指令。
1、显示开关指令
R/W
D/I
DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0
0
0
0     0     1    1     1     1     1    0/1
当DB0=1时,LCD显示RAM中的内容;DB0=0时,关闭显示。
2、显示起始行(ROW)设置指令
R/W
D/I
DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0
0
0
1     1           显示起始行(0~63)
该指令设置了对应液晶屏最上一行的显示RAM的行号,有规律地改变显示起始行,使LCD实现显示滚动的效果。
3、页(PAGE)设置指令
R/W
D/I
DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0
0
0
1     0     1    1     1       页号(0~7)
显示RAM共64行,分8页,每页8行。
4、列地址(Y Address)设置指令
R/W
D/I
DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0
0
0
0     1              显示列地址(0~63)
设置了页地址和行地址,就唯一确定了显示RAM中的一个单元,这样MPU就可以用读、写指令读出该单元中的内容或向该单元写进一个字节数据。
5、读状态指令
R/W
D/I
DB7  DB6  DB5   DB4   DB3  DB2  DB1  DB0
1
0
BUSY  0  ON/OFF RESET  0     0    0    0
该指令用来查询液晶显示模块内部控制器的状态,各参量含义为:
BUSY:1—内部在工作,0—正常状态  
ON/OFF:1—显示关闭,0—显示打开        
RESET:1—复位状态,0—正常状态
在BUSY和RESET状态中,除读状态指令外,其它指令不对液晶显示模块产生作用。在对液晶显示模块操作之前要查询BUSY状态,以确定是否可以对液晶显示模块进行操作。
6、写数据指令
R/W
D/I
DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0
0
1
              写数据
7、读数据指令
R/W
D/I
DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0
1
1
             读显示数据

4.7 IC卡操作
   前面介绍了IC卡中有主内存和两块缓冲区,IC芯片AT45D041提供专门的读写指令对它们进行操作。图4-2和图4-3是写操作和读操作的流程图。
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D43.tmp.png
图4-2  AT45D041写操作流程图
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D53.tmp.png
图4-3  AT45D041读操作流程图
5  分析与结论
本文详细介绍了汽车行驶状态记录仪的整个设计过程。本文中设计的汽车行驶信息记录仪体积小巧,携带安装均很方便,应用广泛,可安装使用在各种12V或24V直流电源的车辆上。记录仪的数据记录和分析分离,驾驶人员无法对记录下来的数据进行任何修改,只有管理部门可以对数据进行分析。
汽车行驶状态记录仪的操作使用过程中的注意事项:
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D54.tmp.png 系统数据采集模块的入口处应该使用屏蔽线进行屏蔽。
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D65.tmp.png 实时时钟芯片DS12C887是内部自带电池的芯片,使用前最好测试其电池电量,电量不足会出现异常的读数和操作。
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D66.tmp.png 在程序控制液晶显示模块GXM1286的显示时要注意左右的选择,不同液晶模块左右区选择可能不同。
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D67.tmp.png LCD在清屏后再显示之前先做一次初始化操作,这样可避免显示时出现显示屏的闪动问题。
下图5-1为汽车行驶状态记录仪的软件部分调试结果:
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D87.tmp.jpg
图5-1  汽车行驶状态记录仪的软件部分调试结果

附  录
设计的数据显示图和电路图:
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D98.tmp.jpg
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5DA8.tmp.jpg
file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5DB9.tmp.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

举报

沙发
ID:1 发表于 2015-4-19 20:38 | 只看该作者
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表