智能速度里程表設計
摘要:給出了以AT89C2051為核心,利用單片機的運算和控制功能,并采用串口液晶顯示模塊實(shí)時(shí)顯示所測速度和里程的速度里程表設計方案。該方案由于使用了串口液晶顯示模塊和E2PROM,以及高效快速算法,因而可在節約系統資源和簡(jiǎn)化程序設計的基礎上保證測量精度和系統實(shí)時(shí)性。
關(guān)鍵詞:速度里程測量;單片機;串行液晶顯示;串行數據存儲;實(shí)時(shí)數據處理
1 系統概述
1.1 系統組成
本速度里程表由信號預處理電路、AT89C2051單片機、串口液晶顯示電路、串口數據存儲電路和系統軟件組成。其中信號預處理電路包含信號放大、波形變換和波形整形。系統硬件框圖如圖1所示。信號預處理電路中的放大器用于對待測信號進(jìn)行放大,以降低對待測信號的幅度要求;波形變換和波形整形電路則用來(lái)將放大的信號轉換成可與單片機接口的TTL信號;通過(guò)單片機的設置可使INT0引腳能夠對內部定時(shí)器T0的工作進(jìn)行控制,這樣能精確地測出加到INT0引腳的正脈沖寬度(即測出脈沖信號的周期);速度顯示部分采用串口液晶顯示模塊,所得的數據采用I2C總線(xiàn)并通過(guò)E2PROM來(lái)存儲,因而節省了所需單片機的口線(xiàn)和外圍器件,同時(shí)也簡(jiǎn)化了顯示部分的軟件編程。
系統軟件包括單片機和液晶模塊的初始化模塊、液晶模塊的寫(xiě)數據/命令子模塊、周期測量模塊、速度里程計算模塊、數據存儲模塊、速度和里程顯示數據轉BCD碼模塊、顯示數據消多余零模塊、數據顯示模塊以及實(shí)時(shí)中斷服務(wù)模塊等。
1.2 系統工作原理
該設計能實(shí)時(shí)地將所測的速度顯示出來(lái),同時(shí)也能夠累計顯示總里程數。該速度里程表能將傳感器輸入到單片機的脈沖信號的寬度(傳感器將車(chē)速轉變成相應寬度的脈沖信號)實(shí)時(shí)地測量出來(lái),然后通過(guò)單片機計算出速度和里程,再將所得的數據存儲到串口數據存儲器,并由串口液晶顯示模塊實(shí)時(shí)顯示出所測速度。本設計用兩個(gè)按鍵來(lái)控制顯示速度或里程??紤]到信號的衰減、干擾等影響,在信號送入單片機前應對其進(jìn)行放大整形,然后再輸入到單片機進(jìn)行測速。單片機利用定時(shí)器T0的控制功能測出輸入信號的周期后,再利用單片機的算術(shù)運算功能將周期轉換成速度,同時(shí)每秒鐘進(jìn)行一次里程累計,從而計算出總里程。最后將得出的速度、里程值存儲在E2PROM中,并根據兩個(gè)按鍵的選擇情況來(lái)顯示速度或里程。為了方便計算要顯示數據值的段碼,可再將其轉換成壓縮的BCD碼,然后通過(guò)查表將要顯示的數據值中每一位的壓縮BCD碼轉換成8段碼送到顯示緩沖區,最后經(jīng)串口送至液晶顯示模塊以顯示所測的速度或里程。
設計時(shí),應綜合考慮測速精度和系統反應時(shí)間。本設計用測量脈沖頻率來(lái)計算速度,因而具有較高的測速精度。為了保證系統的實(shí)時(shí)性,系統的速度轉換模塊和顯示數據轉BCD碼模塊都采用快速算法。另外,還應盡量保證其它子模塊在編程時(shí)的通用性和高效性。本設計的速度和里程值采用8位顯示,并包含兩個(gè)小數位。
2 系統硬件設計
2.1 信號預處理電路
系統的信號預處理電路如圖2所示。它由二級電路構成,第一級是由開(kāi)關(guān)三極管組成的零偏置放大器,采用開(kāi)關(guān)三極管可以保證放大器具有良好的高頻響應。當輸入信號為零或負電壓時(shí),三極管截止,電路輸出高電平;而當輸入信號為正電壓時(shí),三極管導通,此時(shí)輸出電壓隨著(zhù)輸入電壓的上升而下降,這使得速度里程表既可以測量任意方波信號的頻率,也可以測量正弦波信號的頻率。由于放大器的放大功能降低了對待測信號的幅度要求,因此,系統能對任意大于0.5V的正弦波和脈沖信號進(jìn)行測量。預處理電路的第二級采用帶施密特觸發(fā)器的反相器CT74LS14來(lái)把放大器生成的單相脈沖轉換成與COMS電平相兼容的方波信號同時(shí)將輸出信號加到單片機的P3.2口上。
2.2 單片機的選擇
速度里程測量電路選用AT89C2051作為頻率計的信號處理核心。AT89C2051包含2kB閃存、128B的RAM、15根I/O口線(xiàn)、2個(gè)16位定時(shí)計數器、5個(gè)向量二級中斷結構和1個(gè)全雙工的串行口,同時(shí)還具有加密陣列的二級程序存儲器加鎖功能。設計中用到了AT89C2051的T0、T1 定時(shí)器和INT0引腳,以及P1端口的6個(gè)口線(xiàn)。由于該單片機與89C51相兼容,因此在硬件電路設計和軟件編程方面更加方便??紤]到AT89C2051本身固有的特點(diǎn),設計時(shí)需注意以下幾點(diǎn):首先,它的程序存儲器空間為2kB,因此所有的跳轉和分支轉移指令都要限制在這個(gè)范圍內。其次,它沒(méi)有MOVX指令,也就是說(shuō),它不支持外部存儲器操作,這一點(diǎn)設計時(shí)一定要考慮到。此外,AT89C2051自身還有一些其它特點(diǎn),譬如可以使用命令使其工作在低功耗模式等。單片機利用T0定時(shí)器和INT0引腳來(lái)測量輸入方波信號的周期,而使用外部中斷0來(lái)控制定時(shí)器T0是否開(kāi)始定時(shí)。當定時(shí)器T0的運行控制位復位時(shí),不管P3.2引腳是何值,定時(shí)器都不工作。只有當定時(shí)器T0的運行控制位置位后,才能根據P3.2引腳狀態(tài)來(lái)決定定時(shí)器是否工作。當P3.2引腳出現高電平時(shí),定時(shí)器T0開(kāi)始定時(shí);而在其出現低電平時(shí),定時(shí)器T0停止工作,并將測量信號的周期保存在定時(shí)器的16位寄存器中。系統初始化時(shí),可通過(guò)設置使T0 和T1定時(shí)器工作在模式1方式。T1定時(shí)器主要用于形成1秒鐘定時(shí)信號,用以為測量里程提供時(shí)間條件。
2.3 液晶顯示電路和數據存儲電路
本設計的顯示部分采用液晶顯示模塊LCM0825該模塊與單片機的接口電路如圖3所示。LCM0825是8位段碼式液晶顯示模塊,它內部集成有LCD控制器、LCD驅動(dòng)器和RAM,因而可方便顯示數據的編程。液晶顯示模塊采用3~4線(xiàn)串行數據輸入,可直接與單片機接口。由于串行接口方式節省了所需的口線(xiàn)和系統資源,因而使系統具有較高的資源利用率。該模塊可在2.7V~5.2V電壓下工作,其低功耗及背光可調特性使得設計更具有經(jīng)濟性和通用性。LCM0825能夠顯示8位數據,每一個(gè)數據均以8段碼的形式放在其內部顯示RAM區,并用模塊內RAM的兩個(gè)存儲地址來(lái)放置一個(gè)數據的8段碼。8位數據共占用內部16個(gè)地址。每一個(gè)數據位的8段碼存放形式及高低地址存放段碼的順序都和表1所列的第8位數據的8段碼存放格式一樣,只是段碼的存放地址不同。所以,編程時(shí)一定要考慮數據的存放地址和形式。在使用該液晶顯示模塊時(shí),VCC與VLCD之間可用一個(gè)50kΩ的電位器來(lái)調整背光。
表1 第8位數據段碼與LCM0825內部RAM的對應關(guān)系
D3 | D2 | D1 | D0 | ADDR |
8A | 8B | 8C | DP8 | 00000 |
8F | 8G | 8E | 8D | 00001 |
數據存儲電路采用I2C總線(xiàn)的E2PROM存儲器24C64。24C64是串行的E2PROM存儲器,其存儲容量為8kBSCL為時(shí)鐘線(xiàn),SDA為數據線(xiàn)。里程數據保存在24C64,因此中可保證掉電時(shí)數據不丟失。此外,使用串口也節省了數據口線(xiàn)。
3 系統軟件設計
3.1 數據處理過(guò)程
待測信號經(jīng)預處理電路后加至單片機的P3.2(INT0)引腳可為單片機測量信號周期提供有效的輸入信號。單片機通過(guò)檢測P3.2引腳電平來(lái)決定是否啟動(dòng)測量周期程序。當該引腳為高電平時(shí)系統處于等待狀態(tài),要一直到該引腳出現低電平時(shí)才開(kāi)始測周期。測量時(shí)首先將零賦給THO、TL0兩個(gè)寄存器,以將定時(shí)器T0的運行控制位TR0置位,同時(shí)也將ET0置位以允許定時(shí)器T0中斷。然后再判斷P3.2引腳是否還為低電平,如為低電平則等待,直到出現高電平再開(kāi)始判斷P3.2引腳是否為低電平,當其不是低電平時(shí)再等待。一旦出現低電平,則立即復位TR0以終止定時(shí)器,以結束測周期程序。測周期過(guò)程中可能會(huì )發(fā)生定時(shí)器T0的中斷,每發(fā)生一次中斷則將R0寄存器加一,因此R0實(shí)際上是周期值的高字節。測出的周期值存儲在R0、TH0、TL0三個(gè)寄存器中,然后將其轉換成速度。速度是用車(chē)輪的周長(cháng)除以脈沖周期得到的。由于所測周期的單位是μs,因此在相除轉換時(shí)應將被除數擴大106倍,以保證得出正確的速度。每秒進(jìn)行一次里程數累加時(shí),可用當前的速度值加上一秒前的里程數得出當前的總里程數,得出的速度和總里程值放到E2PROM中。通過(guò)k1、k2鍵可顯示速度或里程值,k1鍵為速度鍵,k2鍵為里程鍵,兩個(gè)鍵可以隨時(shí)設置。要顯示的速度或里程放到R1、R2、R3三個(gè)寄存器后即可調用轉換BCD代碼模塊,以將數據值轉換成壓縮的BCD代碼并顯示處理??紤]到對響應時(shí)間的要求,BCD代碼模塊采用快速算法。數據轉變成相應的壓縮BCD代碼后,可調用顯示消多余零和顯示數據存儲模塊,并將要顯示的數據值通過(guò)查表轉換成相應數據的8段碼放到顯示緩沖區以備顯示。當然,編程時(shí)要把十進(jìn)制數據的相應8段碼放在表格中,這樣才能進(jìn)行查表以得到相應數值的段碼。此過(guò)程的另一個(gè)重要目的是消除最高有效位前面的多余零,以使多余零的段碼處于不顯示狀態(tài),從而保證數據以正常的格式顯示出來(lái)。最后,將顯示緩沖區的8位8段碼經(jīng)串口送至液晶顯示模塊進(jìn)行顯示。
3.2 系統軟件框圖
本系統軟件采用模塊化設計方法。整個(gè)系統由初始化模塊、周期測量模塊、速度轉換模塊、里程計算和存儲模塊、數據轉BCD碼模塊、顯示數據處理模塊、數據顯示模塊、定時(shí)器中斷服務(wù)模塊以及其它功能模塊組成,圖4給出了其軟件框圖。上電后,首先進(jìn)入系統初始化模塊,此后系統軟件將開(kāi)始運行,以實(shí)時(shí)地將所測數值顯示在液晶模塊上。
3.3 液晶顯示模塊的初始化
?。蹋茫停埃福玻凳谴校肝唬付我壕э@示模塊。使用時(shí),要在上電后對該模塊進(jìn)行初始化。在初始化之前,應延時(shí)200ms以上再送命令。它的初始化工作過(guò)程如下:首先定義液晶模塊(當其命令代碼為:00101001),其次定義振蕩器方式(當其命令代碼為00011000時(shí),將模塊定義為內部RC振蕩方式,命令代碼為00010100時(shí),定義為外部晶體振蕩方式)。然后分別用命令代碼00000001和00000011開(kāi)振蕩器和開(kāi)顯示器。以上命令送入后,便可以在需要顯示數據時(shí)將相應的段碼直接送入模塊內部的顯示RAM中。在送顯示數據的段碼數據時(shí),要考慮到顯示RAM 的高和低地址所對應的數據段碼的存放形式。其第8位數據的段碼與LCM0825內部的RAM地址的對應關(guān)系見(jiàn)表1。以后隨地址的增加依次存放第7位至第1位數據段碼。為了正確地顯示數據,應使要顯示的8位字符在顯示屏幕中為左起第一位,右止第8位。
另外,寫(xiě)命令和寫(xiě)數據程序應分別編寫(xiě),因為它們的命令格式及時(shí)序不同,見(jiàn)圖5。
由時(shí)序圖可見(jiàn),編寫(xiě)傳輸子程序時(shí),所傳數據的高位先移入模塊,否則模塊不能正常工作或顯示。同樣,為了能正確讀/寫(xiě)命令或數據,必須在時(shí)序中加入相應的延時(shí);此外,為保證系統的低功耗,每次讀/寫(xiě)命令或數據之后,都應將CS、RD、WR、DATA 置高電平。
4 結束語(yǔ)
本文介紹了一種基于單片機AT89C2051的速度里程表的設計方法。由于該方案中使用了串口段碼液晶顯示模塊E2PROM儲存器,因而節省了硬件資源,提高了系統性?xún)r(jià)比。同時(shí),也有益于在此電路基礎上利用單片機的資源擴展其它功能。
評論