摘 要
汽車行駛狀態(tài)記錄儀是一種安裝在汽車上的特殊的數(shù)字式電子記錄裝置。它可以全程記錄汽車行駛數(shù)據(jù),并通過(guò)對(duì)所記錄的行駛信息數(shù)據(jù)進(jìn)行分析,精確掌控汽車的各種狀況。利用它,可有效預(yù)防駕駛員違章駕駛、遏制重大交通事故,約束駕駛員的不良駕駛習(xí)慣,為執(zhí)法人員進(jìn)行事故的分析、處理提供科學(xué)的原始數(shù)據(jù),因此在交通運(yùn)輸管理中發(fā)揮著十分重要的作用。針對(duì)目前汽車行駛記錄儀的研究現(xiàn)狀,本文設(shè)計(jì)并實(shí)現(xiàn)了一種基于51單片機(jī)的汽車行駛狀態(tài)記錄儀,該汽車行駛狀態(tài)記錄儀具有準(zhǔn)確性、可靠性、高效性、易讀性和價(jià)格低廉等特點(diǎn)。 關(guān)鍵詞:汽車行駛狀態(tài)記錄儀;單片機(jī);C51;液晶顯示;
ABSTRACT
Vehicle traveling data recorder(VTDR) is a special digital electronic recorder which used to acquire and store vehicle’s traveling speed,time-distance and other related status information,and then display data via LCD and RS232 interface.The 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 habit,and call prevent the traffic accident effectively, it can also offer scientific initial data for the tipstaffs carries on the accidents.So it plays a very important role in transportation management.Aiming at the actuality of the VTDR research,a VTDR is designed in this paper which bases on the 51 MCU.It also has some characteristics such as real-time,reliable,high dependability, read-easy and less cost. Key words: Vehicle Traveling Data Recorder;Single Chip Microcomputer;C51;LCD Display
目 錄
1 緒論 1 1.1國(guó)內(nèi)外汽車行駛狀態(tài)記錄儀發(fā)展的狀況 1 1.2本課題的目的和意義 2 1.3本課題的主要研究?jī)?nèi)容 3 2 汽車行駛狀態(tài)記錄儀總體方案設(shè)計(jì) 3 2.1汽車行駛記錄儀的功能和技術(shù)指標(biāo) 3 2.2汽車行駛狀態(tài)記錄儀的系統(tǒng)結(jié)構(gòu) 4 2.2.1設(shè)計(jì)思路分析 4 2.2.2面板介紹和使用方法 5 3 汽車行駛狀態(tài)記錄儀硬件設(shè)計(jì)與實(shí)現(xiàn) 6 3.1 記錄儀的供電 6 3.2 信息采集模塊 7 3.3單片機(jī)模塊 8 3.4可編程邏輯器件 9 3.5日歷時(shí)鐘芯片 12 3.6液晶顯示模塊LCD 14 3.7信息的存儲(chǔ) 15 4 汽車行駛狀態(tài)記錄儀軟件設(shè)計(jì)與實(shí)現(xiàn) 16 4.1 軟件流程 16 4.2中斷子程序 18 4.3 獲取狀態(tài)信息 20 4.4 時(shí)間信息的設(shè)置和獲取 21 4.5 鍵盤(pán)輸入 22 4.6 液晶顯示 25 4.7 IC卡操作 26 5 分析與結(jié)論 28 6 后續(xù)研究與發(fā)展前景 29 附 錄 30 參考文獻(xiàn) 31 致 謝 32
2 汽車行駛狀態(tài)記錄儀總體方案設(shè)計(jì)2.1汽車行駛記錄儀的功能和技術(shù)指標(biāo)汽車行駛狀態(tài)記錄儀的主要功能及技術(shù)指標(biāo)應(yīng)包括以下幾個(gè)方面。 (1) 能夠?qū)崟r(shí)監(jiān)督并記錄汽車行駛的各種狀態(tài)信息,包括速度、里程等重要數(shù)據(jù)。 (2) 為每個(gè)駕駛員提供單獨(dú)的可移動(dòng)存儲(chǔ)卡式設(shè)備,用于記錄駕駛員信息(如姓名、工號(hào)等)和汽車(如車號(hào)等),為有關(guān)部門(mén)檢查提供必要的信息;同時(shí),還需要提供存儲(chǔ)發(fā)車站和終點(diǎn)站的功能。 (3) 安裝在汽車上的行駛狀態(tài)記錄儀要提供方便、靈活的操作界面,可進(jìn)行輸入信息的提示,同時(shí)還要有實(shí)時(shí)信息的顯示,并可根據(jù)用戶要求或設(shè)置,另外還要具備汽車超速時(shí)的報(bào)警功能。 (4) 安裝在計(jì)算機(jī)上的汽車行駛信息分析軟件應(yīng)該提供方便的圖形用戶界面,支持鼠標(biāo)和鍵盤(pán)操作,能統(tǒng)計(jì)分析任何時(shí)段的行駛速度、行駛里程、停車次數(shù)、停車時(shí)間、超速次數(shù)、超速時(shí)間、發(fā)車以及到站時(shí)間,并能用圖形顯示速度、里程的變化情況;在汽車正常行駛或發(fā)生交通事故時(shí),可向管理部門(mén)提供詳實(shí)的汽車行駛數(shù)據(jù),幫助管理人員全面了解汽車的行駛情況,同時(shí)也可提供故障診斷功能,便于汽車維護(hù)和維修人員判斷及修理。 所開(kāi)發(fā)的汽車行駛狀態(tài)記錄儀作為產(chǎn)品使用還需要滿足下面的要求: l 合適的數(shù)據(jù)記錄頻率:速度的采樣周期可設(shè)置為1次/ s~0.2次/s。 l 一定的數(shù)據(jù)記錄容量:0~240h。 l 較長(zhǎng)的數(shù)據(jù)存儲(chǔ)時(shí)間:掉電情況下可至少保存10年以上。 l 監(jiān)測(cè)汽車行駛速度范圍:0~240km/h。 l 記錄需要的汽車行駛數(shù)據(jù),包括速度、里程、超速度及時(shí)間、停車次數(shù)及時(shí)間。 l 存儲(chǔ)卡還要可以存儲(chǔ)駕駛員信息、汽車信息、發(fā)車時(shí)間和到站時(shí)間、起始站和終點(diǎn)站。 l 要能夠抗電磁干擾、防火、防潮、抗沖擊。 l 尺寸要合適,便于在汽車上安裝。 2.2汽車行駛狀態(tài)記錄儀的系統(tǒng)結(jié)構(gòu)2.2.1設(shè)計(jì)思路分析本系統(tǒng)包括數(shù)據(jù)采集、控制、鍵盤(pán)輸入、液晶顯示、日歷、數(shù)據(jù)存儲(chǔ)等功能模塊,其中采集、控制、鍵盤(pán)及“屏顯”都屬于51單片機(jī)的應(yīng)用范疇。 本課題研究的汽車行駛狀態(tài)記錄儀的總體結(jié)構(gòu)框圖如圖2-1: file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5C1E.tmp.png 圖2-1汽車行駛狀態(tài)記錄儀總體結(jié)構(gòu)框圖
在圖2-1中,單片機(jī)系統(tǒng)是整個(gè)系統(tǒng)的核心,通過(guò)硬件和內(nèi)部軟件的配合控制整個(gè)系統(tǒng)的運(yùn)行。 供電單元的作用是將汽車內(nèi)部配電模塊提供的電壓轉(zhuǎn)換成記錄儀可以正常工作的電壓,這其中為了避免汽車內(nèi)部電機(jī)的干擾,需要進(jìn)行屏蔽。 信號(hào)采集模塊是指將汽車內(nèi)部霍爾傳感器傳過(guò)來(lái)的一對(duì)分差信號(hào)經(jīng)過(guò)適當(dāng)?shù)淖儞Q變成一個(gè)脈沖信號(hào)提供給單片機(jī)系統(tǒng)。這其中需要用光耦模塊進(jìn)行隔離,來(lái)避免強(qiáng)脈沖信號(hào)對(duì)電路板的干擾。 信息儲(chǔ)存是指單片機(jī)系統(tǒng)將采集到的信息經(jīng)過(guò)適當(dāng)?shù)倪\(yùn)算處理之后存儲(chǔ)到智能IC卡中,IC 卡中的信息可以長(zhǎng)時(shí)間保存,可以用讀卡設(shè)備讀出其中的信息然后進(jìn)行分析。 設(shè)計(jì)這樣的單片機(jī)系統(tǒng)當(dāng)然還要用到可編程邏輯器件,它可以靈活方便地產(chǎn)生譯碼、控制等信號(hào)。 鍵盤(pán)輸入和液晶顯示是常用的單片機(jī)輸入/輸出模塊,為用戶提供友好方便的人機(jī)操作界面,用戶可以輸入特定的信息,也可以看到實(shí)時(shí)的速度、里程及時(shí)間等信息,可以做出實(shí)時(shí)判斷。 2.2.2面板介紹和使用方法本論文中介紹的汽車行駛狀態(tài)記錄儀最終會(huì)作為車載設(shè)備在汽車上,它需要具有有好的用戶操作界面,和一般的儀器儀表開(kāi)發(fā)一樣,需要有用戶操作面板,可設(shè)計(jì)類似于圖2-2所示的操作界面。 file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5C2F.tmp.jpg 圖 2-2 汽車行駛狀態(tài)記錄儀面板圖
主屏為系統(tǒng)的顯示界面,由液晶模塊實(shí)現(xiàn),它的功能是顯示實(shí)時(shí)速度、里程等信息;鍵盤(pán)主要用于輸入車號(hào)、站號(hào)等信息;面板的右下方是IC卡插座,用戶(此處實(shí)際就是司機(jī))由此插入自己的智能IC卡,IC卡記錄此次行駛的信息。面板中間區(qū)域是兩個(gè)指示燈,左邊為電源指示燈,正常情況下接通電源后亮綠燈,右邊為超速報(bào)警燈,超速時(shí)亮紅燈。 3 汽車行駛狀態(tài)記錄儀硬件設(shè)計(jì)與實(shí)現(xiàn)3.1 記錄儀的供電電源系統(tǒng)是任何汽車電子設(shè)計(jì)中最重要的子系統(tǒng)之一,電源設(shè)計(jì)非常重要,如果電源設(shè)計(jì)比較糟糕的話,其它單元設(shè)計(jì)無(wú)論多么完美,系統(tǒng)也不能正常發(fā)揮作用。整體功耗、電磁干擾等都是必須考慮的因素。 目前汽車內(nèi)部產(chǎn)生的供電是+12V,記錄儀本身需要的是+5V供電,所以系統(tǒng)需要供電模塊來(lái)實(shí)現(xiàn)+12V~+5V的電源變換,其工作原理如圖3-1(a)、3-1(b)所示。 file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5C4F.tmp.jpg 圖3-1(a) 汽車行駛狀態(tài)記錄儀電源部分原理圖 file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5C5F.tmp.jpg 圖3-1(b) 汽車行駛狀態(tài)記錄儀電源部分原理圖
由于汽車行駛狀態(tài)記錄儀電源部分原理圖畫(huà)出來(lái)比較大,故分成3-1(a)、3-1(b)顯示。 汽車內(nèi)部會(huì)提供一條屏蔽線PB,它的作用是屏蔽汽車內(nèi)部產(chǎn)生的干擾,它被引入到光耦模塊,光耦模塊起到光耦隔離作用,屏蔽線和光耦電路一起可以使得采集到的信號(hào)波形盡可能干凈,信號(hào)采集電路受汽車內(nèi)部電動(dòng)機(jī)產(chǎn)生的干擾盡可能小。 3.2 信息采集模塊此部分的硬件設(shè)計(jì)較為簡(jiǎn)單,因?yàn)樾枰杉男盘?hào)很少,而且汽車內(nèi)部有自己的傳感器,實(shí)際上也就是有現(xiàn)成的信號(hào)提供給記錄儀。汽車輪子每轉(zhuǎn)一周,會(huì)通過(guò)車子內(nèi)部的霍爾傳感器傳送一對(duì)差分信號(hào),此差分信號(hào)經(jīng)過(guò)信號(hào)采集模塊變成滿足要求的計(jì)數(shù)脈沖,此脈沖信號(hào)經(jīng)過(guò)一定的處理即可用來(lái)得到速度、里程等信息。 信號(hào)采集模塊的電路原理圖如圖3-2所示 file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5C70.tmp.jpg 圖3-2汽車行駛狀態(tài)記錄儀信號(hào)采集電路原理圖
圖 3-2中U8是東芝公司的單光耦芯片TLP521-2,實(shí)際上它的內(nèi)部就是兩組光敏三極管,如圖3-3所示。
光敏三極管也是利用硅PN結(jié)的光電效應(yīng)制成的。光敏三極管使用時(shí),其基極通常開(kāi)路,基極—集電極產(chǎn)生的光敏感生電流反饋入基極,并被光敏三極管自己所放大,因此光敏三極管的靈敏度比光敏二極管大得多,通常要大100多倍。光敏三極管的最大工作頻率只有幾百KHz。 光耦模塊主要就是通過(guò)電光電的變換將電信號(hào)隔離開(kāi)來(lái)的,它可以避免一側(cè)對(duì)另一側(cè)產(chǎn)生的干擾。記錄儀上的+5V工作系統(tǒng)是弱電電路,汽車內(nèi)部提供的脈沖信號(hào)在送入記錄儀之前必須經(jīng)過(guò)光耦隔離的處理。 圖3-2中HP和FP是汽車輪子轉(zhuǎn)一周內(nèi)部提供的差分信號(hào),它在通過(guò)系統(tǒng)的信號(hào)采集模塊后產(chǎn)生狀態(tài)記錄儀系統(tǒng)可以使用的信號(hào)SIG;圖3-2中PB為屏蔽線,由它構(gòu)成了屏蔽網(wǎng)絡(luò),有效地屏蔽了汽車電動(dòng)機(jī)等對(duì)硬件電路的干擾。 通過(guò)屏蔽和光耦隔離,得到波形干凈的SIG信號(hào),信號(hào)采集功能完成。采集到的SIG信號(hào)需要送到可編程邏輯器件中進(jìn)一步處理,由單片機(jī)系統(tǒng)對(duì)處理后的結(jié)果進(jìn)行相應(yīng)的運(yùn)算,可以得到速度、里程等狀態(tài)信息。 file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5C81.tmp.jpg 圖3-3 單光耦芯片(TLP521內(nèi)部工作框圖) 3.3單片機(jī)模塊對(duì)于整個(gè)汽車行駛狀態(tài)記錄儀而言,起到控制和樞紐作用的單片機(jī)模塊無(wú)疑是其中最重要的部分。其工作原理圖如圖3-4所示。 file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5C91.tmp.jpg 圖3-4 汽車行駛狀態(tài)記錄儀單片機(jī)模塊原理圖
圖3-4中U4為12M晶振,它為單片機(jī)提供穩(wěn)定的12MHz工作時(shí)鐘。 系統(tǒng)選用Atmel公司的帶有8KB Flash的8位微控制器AT89S8252作為單片機(jī)芯片,它完全與MCS-51系列單片機(jī)兼容(從指令集到引腳)。 和51單片機(jī)相比AT89S8252還具有一些增強(qiáng)型的功能。因?yàn)橛涗泝x最終需要將記錄的車輛行駛狀態(tài)信息存入IC卡,本系統(tǒng)選用的IC卡是通過(guò)SPI口存儲(chǔ)的,所以本文選用帶有SPI接口功能的單片機(jī)芯片AT89S8252。 由于單片機(jī)AT89S8252芯片各管腳的功能與作用和80C51芯片的基本一樣,在文中將不做詳細(xì)介紹。 3.4可編程邏輯器件可編程邏輯器件(Programmable Logic Device,PLD)技術(shù)是目前電子設(shè)計(jì)領(lǐng)域中最具活力和發(fā)展前途的一項(xiàng)技術(shù),在PLD上,工程師可以通過(guò)傳統(tǒng)的原理圖輸入法,或是硬件描述語(yǔ)言自由地設(shè)計(jì)一個(gè)數(shù)字系統(tǒng)。通過(guò)軟件仿真,可以事先驗(yàn)證設(shè)計(jì)的正確性。在印刷電路板PCB完成以后,還可以利用可編程邏輯器件的在線修改能力,隨時(shí)修改設(shè)計(jì)而不必改動(dòng)硬件電路。使用可編程邏輯器件來(lái)開(kāi)發(fā)數(shù)字電路,可以大大縮短設(shè)計(jì)時(shí)間,減少PCB面積,提高系統(tǒng)的可靠性。可編程芯片和單片機(jī)的配合使用已成為單片機(jī)系統(tǒng)的最常用開(kāi)發(fā)模式。 本文中可編程邏輯器件主要完成的功能包括:脈沖信號(hào)的計(jì)數(shù)、定時(shí)器和產(chǎn)生芯片選擇信號(hào)。實(shí)現(xiàn)的功能比較簡(jiǎn)單,使用端口不多,選用Altera公司的EPM7032S44可以達(dá)到要求。EPM7032S44屬于MAX7000S系列,此系列是Altera公司的主流芯片,采用5V/3.3V工藝,價(jià)格便宜。 可編程邏輯器件設(shè)計(jì)的常用方法有圖形輸入法和文本輸入法。圖形輸入法類似于數(shù)字電路設(shè)計(jì),只是它是通過(guò)器件模型而不是具體器件搭建的;文本輸入法則是通過(guò)編程的方法從已知輸入得到需要的輸出。相比之下文本輸入法更為靈活,在實(shí)現(xiàn)復(fù)雜電路的設(shè)計(jì)時(shí)常采用它。本文中可編程邏輯器件實(shí)現(xiàn)的功能采用了圖形輸入和文本輸入結(jié)合的方式,比較簡(jiǎn)單。 本文中選用了Altera公司的開(kāi)發(fā)軟件Maxplus來(lái)設(shè)計(jì)的GDF文件如圖3-5所示。 由圖3-5可知,液晶顯示模塊和日歷時(shí)鐘芯片的片選信號(hào)由讀、寫(xiě)信號(hào)及最高位地址線A15經(jīng)過(guò)簡(jiǎn)單的邏輯電路搭建而成。圖中另外一部分電路由兩個(gè)子模塊timer和sigcounter構(gòu)成,它們的作用是對(duì)信號(hào)采集到的信號(hào)SIG進(jìn)行計(jì)數(shù),結(jié)果通過(guò)系統(tǒng)的地址/數(shù)據(jù)復(fù)用總線送給單片機(jī)處理。 file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5CB1.tmp.jpg 圖3-5汽車行駛狀態(tài)記錄儀可編程邏輯器件頂層圖形輸入設(shè)計(jì)(GDF文件)
Timer模塊用VHDL語(yǔ)言實(shí)現(xiàn),代碼如下: 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模塊的輸入信號(hào)為日歷時(shí)鐘芯片產(chǎn)生的方波信號(hào),輸出為計(jì)數(shù)器模塊sigcounter需要的鎖存信號(hào)“suocun”。 計(jì)數(shù)器模塊sigcounter也采用VHDL編程實(shí)現(xiàn),代碼如下:
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; 至此本設(shè)計(jì)中可編程邏輯電路的設(shè)計(jì)已經(jīng)完成。在調(diào)試過(guò)程中若發(fā)現(xiàn)需要更改設(shè)計(jì)也很方便,只需重新編寫(xiě)程序、設(shè)計(jì).gdf文件重新下載即可,不用對(duì)電路板做修改,這也是采用可編程邏輯器件的最大優(yōu)點(diǎn)。 3.5日歷時(shí)鐘芯片汽車行駛狀態(tài)記錄儀需要對(duì)狀態(tài)發(fā)生時(shí)所對(duì)應(yīng)的時(shí)間信息做相應(yīng)的記錄,以便后來(lái)的分析使用,所以需要獲取詳細(xì)的時(shí)間信息。 在2.1節(jié)中系統(tǒng)的技術(shù)指標(biāo)中提到數(shù)據(jù)記錄容量要求在0~240小時(shí),數(shù)據(jù)存儲(chǔ)時(shí)間在掉電情況下至少保存10年以上。根據(jù)這些要求,系統(tǒng)中選用了日歷時(shí)鐘芯片來(lái)提供詳細(xì)的日期和時(shí)、分、秒的時(shí)間信息。 本文中選用達(dá)拉斯半導(dǎo)體公司的芯片DS12C887.。DS12C887是一款實(shí)時(shí)時(shí)鐘芯片,內(nèi)部有鋰供電的石英晶振,它可以在無(wú)外部供電的情況下將數(shù)據(jù)保存10年以上。它內(nèi)部通過(guò)計(jì)數(shù)可以實(shí)現(xiàn)時(shí)間的記錄,時(shí)間信息可以詳細(xì)到時(shí)、分、秒、年、月、日,以及星期,時(shí)間顯示模塊可以選擇帶有“AM”和“PM”指示的12小時(shí)模式及正常的24小時(shí)模式,芯片可以提供鬧鐘的設(shè)置,在芯片內(nèi)部還有15個(gè)字節(jié)的時(shí)鐘和控制寄存器,以及113個(gè)字節(jié)的通用RAM空間。芯片DS12C887的內(nèi)部工作原理如圖3-6所示。 file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5CC2.tmp.png 圖3-6日歷時(shí)鐘芯片DS12C887的內(nèi)部工作原理框圖
DS12C887的內(nèi)存空間為128個(gè)字節(jié),其中11個(gè)字節(jié)專門(mén)用于存儲(chǔ)實(shí)時(shí)時(shí)間信息,4個(gè)字節(jié)專門(mén)用于控制和存放狀態(tài)信息,剩下的113個(gè)字節(jié)為用戶可以使用的普通RAM空間。 file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5CE2.tmp.png 圖3-7日歷時(shí)鐘芯片DS12C887內(nèi)部?jī)?nèi)存空間映射示意圖 3.6液晶顯示模塊LCD本文中液晶顯示模塊LCD(Liquid Crystal Display)選用內(nèi)含KS0108B/HD61202控制器的圖形液晶顯示模塊GXM12864,它是一種采用低功耗CMOS技術(shù)實(shí)現(xiàn)的點(diǎn)陣圖形LCD模塊,有8位微處理器接口,通過(guò)內(nèi)部的128×64位映射DDRAM(Display Data RAM)實(shí)現(xiàn)128點(diǎn)×64點(diǎn)大小的平板顯示。該液晶顯示模塊使用KS0107B為行驅(qū)動(dòng)器,同時(shí)使用KS0108B作為列驅(qū)動(dòng)器。KS0107B不與MPU發(fā)生聯(lián)系,只要提供電源就能產(chǎn)生行驅(qū)動(dòng)信號(hào)和各種同步信號(hào),比較簡(jiǎn)單。 對(duì)于用戶來(lái)說(shuō),LCD模塊的使用關(guān)鍵在于驅(qū)動(dòng)芯片的使用,驅(qū)動(dòng)芯片和LCD顯示屏的接口電路已經(jīng)做好在GXM12864的內(nèi)部,用戶使用時(shí)只需閱讀驅(qū)動(dòng)芯片的相關(guān)資料,設(shè)計(jì)出驅(qū)動(dòng)芯片和微處理器之間的接口電路,編寫(xiě)具體的驅(qū)動(dòng)程序。 前面提到行驅(qū)動(dòng)芯片KS0107B不與MPU發(fā)生聯(lián)系,只要提供電源就能產(chǎn)生行驅(qū)動(dòng)信號(hào)和各種同步信號(hào),比較簡(jiǎn)單,在此就不做介紹了。 列驅(qū)動(dòng)芯片KS0108B與KS0107B配合對(duì)液晶屏進(jìn)行行列驅(qū)動(dòng),可直接與8位微處理器相連。微處理器對(duì)液晶顯示模塊的操作是通過(guò)KS0108B支持的指令系統(tǒng)實(shí)現(xiàn)的,掌握這些命令是編寫(xiě)液晶模塊驅(qū)動(dòng)程序的關(guān)鍵。 3.7信息的存儲(chǔ)汽車行駛狀態(tài)記錄儀最終的任務(wù)是要將記錄下的信息存儲(chǔ)到智能IC卡中,以便以后對(duì)信息進(jìn)行分析。IC卡采用符合國(guó)際標(biāo)準(zhǔn)的智能卡,本系統(tǒng)選用的是ATMEL公司的AT45D041A。 AT45D041A是4M位的串行數(shù)據(jù)Flash,采用+5V供電,它支持在系統(tǒng)的頁(yè)編程,刪除操作可選擇頁(yè)或塊刪除,支持SPI接口的讀寫(xiě)操作,主要用于數(shù)字語(yǔ)音、圖像和數(shù)據(jù)的存儲(chǔ)。 AT45D041A具有4M位的內(nèi)存空間,此空間由2048頁(yè)構(gòu)成,每頁(yè)264B,除此外,它還有兩個(gè)SRAM數(shù)據(jù)緩沖,每個(gè)緩沖區(qū)的大小也是264B,緩沖區(qū)的作用使得主內(nèi)存在重新編程的時(shí)候允許接受新數(shù)據(jù)。AT45D041A的內(nèi)部結(jié)構(gòu)如圖3-8所示。 file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5CF3.tmp.png 圖3-8 IC卡芯片AT45D041A的內(nèi)部結(jié)構(gòu)框圖
與普通Flash并行的數(shù)據(jù)接入相比,AT45D041A使用SPI接口串行接入數(shù)據(jù),采用簡(jiǎn)單的串行數(shù)據(jù)接口可以增加系統(tǒng)可靠性,減小器件的封裝,減少引腳數(shù)目。AT45D041A和CPU接口的引腳主要有7個(gè):CS為低電平有效的片選腳;SCK為串行時(shí)鐘腳;SI、SO分別為串行輸入、輸出腳;WP為低電平有效的硬件頁(yè)寫(xiě)操作保護(hù)腳,低電平時(shí)主內(nèi)存空間的前256頁(yè)不允許進(jìn)行編程操作,在此可接VCC;RESET是低電平有效的芯片復(fù)位腳;RDY/BUSY是狀態(tài)指示腳,表示當(dāng)前卡的狀態(tài)是準(zhǔn)備好(高電平)或是忙(低電平)。這些引腳中SCK、SI和SO即為芯片的串行接口。 4 汽車行駛狀態(tài)記錄儀軟件設(shè)計(jì)與實(shí)現(xiàn)下面將介紹如何在前面實(shí)現(xiàn)的硬件平臺(tái)上實(shí)現(xiàn)軟件設(shè)計(jì)過(guò)程。 4.1 軟件流程本文中設(shè)計(jì)的軟件流程如圖4-1所示。 file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D03.tmp.png 圖4-1 汽車行駛狀態(tài)記錄儀軟件流程圖
從圖4-1中可以看出,軟件的流程是和汽車行駛狀態(tài)記錄儀工作時(shí)的工序相對(duì)應(yīng)的。在啟動(dòng)后,液晶顯示屏?xí)崾据斎胝咎?hào)、車號(hào)等信息,用戶可以通過(guò)鍵盤(pán)輸入,汽車開(kāi)動(dòng)以后,顯示屏?xí)@示汽車實(shí)時(shí)的速度和所行駛的里程信息,在到站以后,用戶按先功能鍵“FUN”則可以輸入到站的站號(hào),之后記錄下的行駛狀態(tài)信息被存入到IC卡中。在行駛過(guò)程中還要判斷汽車是否超速,超速要給出報(bào)警等提示。可編程邏輯器件對(duì)車輪轉(zhuǎn)一周產(chǎn)生的信號(hào)進(jìn)行計(jì)數(shù),單片機(jī)利用定時(shí)中斷定期對(duì)計(jì)數(shù)值進(jìn)行統(tǒng)計(jì)計(jì)算,從而得到速度等信息,程序中不斷將速度值和門(mén)限值做比較,如果超過(guò)就打開(kāi)超速報(bào)警紅燈。 除了定時(shí)中斷以外,本系統(tǒng)還使用了一個(gè)外部中斷INT0,汽車到站時(shí),用戶按下“FUN”鍵就會(huì)觸發(fā)此中斷。程序檢測(cè)到此中斷后會(huì)執(zhí)行到站后的相應(yīng)操作。 主程序在檢測(cè)到車子開(kāi)動(dòng)以后進(jìn)入一個(gè)無(wú)限循環(huán),循環(huán)和中斷的配合實(shí)現(xiàn)了系統(tǒng)的整個(gè)功能。 4.2中斷子程序本例中使用了定時(shí)器0中斷(工作在計(jì)時(shí)器方式)和外部中斷0。前者用于定時(shí)顯示速度、里程等信息;后者用于到站操作。主程序需要根據(jù)要求對(duì)中斷有關(guān)的寄存器進(jìn)行設(shè)置。 …… TMOD=0x06; TH0=-5; TL0=-5; IP=0x01; EA=1; ET0=1; EX0=1; TR0=1; …… 定時(shí)中斷服務(wù)程序如下: 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; } 程序中最主要的是三個(gè)變量time_count、circle和ttcy。其中circle值由CPLD計(jì)算獲得,它表示的是轉(zhuǎn)速信息;ttcy值對(duì)circle進(jìn)行累加,在主程序中由它可得到行駛里程信息;time_count變量也是一個(gè)全局變量,在定時(shí)中斷中不斷累加,它決定了主程序何時(shí)刷新速度和里程的更新顯示。 外部中斷采用的是中斷查詢的方式,也就是中斷到來(lái)的時(shí)候只做置位操作(給設(shè)定的中斷標(biāo)志位置1),主程序中不斷輪詢此標(biāo)志位,發(fā)現(xiàn)被置位后進(jìn)行相應(yīng)的處理,這樣可簡(jiǎn)化中斷服務(wù)子程序。 外部中斷服務(wù)程序如下: void int0 ( ) interrupt 0 using 2 { EA=0; int0flag=1; EA=1; } 上述程序完成對(duì)int0flag的置位操作。 在主程序中需要輪詢int0flag變量。 void main (void) { …… while (1) { …… if ( int0flag) { …… } } } 4.3 獲取狀態(tài)信息硬件電路中,車輪每轉(zhuǎn)一周都會(huì)提供一個(gè)脈沖信號(hào)SIG,然后可編程邏輯器件EPM7032會(huì)算出轉(zhuǎn)速信息通過(guò)P0口送給單片機(jī)。 單片機(jī)獲取狀態(tài)信息的程序如下: 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 時(shí)間信息的設(shè)置和獲取主程序流程圖中,初始化部分要包括時(shí)間信息的初始化。首先屏幕會(huì)顯示提示信息,比如“請(qǐng)輸入年”,然后用戶通過(guò)鍵盤(pán)輸入正確信息,比如“2008”,此時(shí)程序記錄此信息并顯示在液晶屏上,這樣依次根據(jù)屏幕提示輸入所有的時(shí)間信息,包括年、月、日、時(shí)、分、秒。具體程序如下: 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_h(yuǎn)our=hour; dispfen; min=getkey( ); time_min=min; dispmiao; sec=getkey( ); time_sec=sec; timeregb=0x0e; } 設(shè)置初始時(shí)間主要是對(duì)實(shí)時(shí)時(shí)鐘芯片DS12C887的操作,程序通過(guò)獲取鍵盤(pán)輸入的值,寫(xiě)入芯片內(nèi)部的6種時(shí)間寄存器。芯片內(nèi)部還有4個(gè)控制寄存器,在此設(shè)計(jì)中只用了A、B寄存器。此外,程序中還用到了鍵盤(pán)掃描和液晶顯示相關(guān)的函數(shù)。 4.5 鍵盤(pán)輸入記錄儀的輸入通過(guò)鍵盤(pán)來(lái)實(shí)現(xiàn),使用的鍵盤(pán)掃描函數(shù)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); ) 鍵盤(pán)讀取函數(shù)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); } 在鍵盤(pán)讀取函數(shù)getkey()中除了讀取了鍵值以外還調(diào)用了數(shù)字顯示函數(shù),將數(shù)字顯示了出來(lái)。由于鍵盤(pán)讀取函數(shù)getkey()程序較長(zhǎng),文中只寫(xiě)出了程序的框架,但不影響調(diào)試等操作。 4.6 液晶顯示液晶顯示包括屏幕提示、鍵盤(pán)輸入值的顯示及行駛中狀態(tài)信息的顯示。要編寫(xiě)正確的液晶顯示程序,就必須熟悉所用液晶模塊的指令集。本設(shè)計(jì)中使用的液晶模塊是GXM12864,它所用的控制驅(qū)動(dòng)器是2片KS0108B和1片KS0107B,其中和單片機(jī)直接進(jìn)行連接的是KS0108B,KS0108B共有7種指令。 1、顯示開(kāi)關(guān)指令 R/W | | DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 | | | |
當(dāng)DB0=1時(shí),LCD顯示RAM中的內(nèi)容;DB0=0時(shí),關(guān)閉顯示。 2、顯示起始行(ROW)設(shè)置指令 R/W | | DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 | | | |
該指令設(shè)置了對(duì)應(yīng)液晶屏最上一行的顯示RAM的行號(hào),有規(guī)律地改變顯示起始行,使LCD實(shí)現(xiàn)顯示滾動(dòng)的效果。 3、頁(yè)(PAGE)設(shè)置指令 R/W | | DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 | | | 1 0 1 1 1 頁(yè)號(hào)(0~7) |
顯示RAM共64行,分8頁(yè),每頁(yè)8行。 4、列地址(Y Address)設(shè)置指令 R/W | | DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 | | | |
設(shè)置了頁(yè)地址和行地址,就唯一確定了顯示RAM中的一個(gè)單元,這樣MPU就可以用讀、寫(xiě)指令讀出該單元中的內(nèi)容或向該單元寫(xiě)進(jìn)一個(gè)字節(jié)數(shù)據(jù)。 5、讀狀態(tài)指令 R/W | | DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 | | | BUSY 0 ON/OFF RESET 0 0 0 0 |
該指令用來(lái)查詢液晶顯示模塊內(nèi)部控制器的狀態(tài),各參量含義為: BUSY:1—內(nèi)部在工作,0—正常狀態(tài) ON/OFF:1—顯示關(guān)閉,0—顯示打開(kāi) RESET:1—復(fù)位狀態(tài),0—正常狀態(tài) 在BUSY和RESET狀態(tài)中,除讀狀態(tài)指令外,其它指令不對(duì)液晶顯示模塊產(chǎn)生作用。在對(duì)液晶顯示模塊操作之前要查詢BUSY狀態(tài),以確定是否可以對(duì)液晶顯示模塊進(jìn)行操作。 6、寫(xiě)數(shù)據(jù)指令 R/W | | DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 | | | |
7、讀數(shù)據(jù)指令 R/W | | DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 | | | |
4.7 IC卡操作 前面介紹了IC卡中有主內(nèi)存和兩塊緩沖區(qū),IC芯片AT45D041提供專門(mén)的讀寫(xiě)指令對(duì)它們進(jìn)行操作。圖4-2和圖4-3是寫(xiě)操作和讀操作的流程圖。 file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D43.tmp.png 圖4-2 AT45D041寫(xiě)操作流程圖 file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D53.tmp.png 圖4-3 AT45D041讀操作流程圖 5 分析與結(jié)論本文詳細(xì)介紹了汽車行駛狀態(tài)記錄儀的整個(gè)設(shè)計(jì)過(guò)程。本文中設(shè)計(jì)的汽車行駛信息記錄儀體積小巧,攜帶安裝均很方便,應(yīng)用廣泛,可安裝使用在各種12V或24V直流電源的車輛上。記錄儀的數(shù)據(jù)記錄和分析分離,駕駛?cè)藛T無(wú)法對(duì)記錄下來(lái)的數(shù)據(jù)進(jìn)行任何修改,只有管理部門(mén)可以對(duì)數(shù)據(jù)進(jìn)行分析。 汽車行駛狀態(tài)記錄儀的操作使用過(guò)程中的注意事項(xiàng): file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D54.tmp.png 系統(tǒng)數(shù)據(jù)采集模塊的入口處應(yīng)該使用屏蔽線進(jìn)行屏蔽。 file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D65.tmp.png 實(shí)時(shí)時(shí)鐘芯片DS12C887是內(nèi)部自帶電池的芯片,使用前最好測(cè)試其電池電量,電量不足會(huì)出現(xiàn)異常的讀數(shù)和操作。 file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D66.tmp.png 在程序控制液晶顯示模塊GXM1286的顯示時(shí)要注意左右的選擇,不同液晶模塊左右區(qū)選擇可能不同。 file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D67.tmp.png LCD在清屏后再顯示之前先做一次初始化操作,這樣可避免顯示時(shí)出現(xiàn)顯示屏的閃動(dòng)問(wèn)題。 下圖5-1為汽車行駛狀態(tài)記錄儀的軟件部分調(diào)試結(jié)果: file:///C:\Users\admin\AppData\Local\Temp\ksohtml\wps5D87.tmp.jpg 圖5-1 汽車行駛狀態(tài)記錄儀的軟件部分調(diào)試結(jié)果
附 錄設(shè)計(jì)的數(shù)據(jù)顯示圖和電路圖: 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 |