測試課程設(shè)計--自行車?yán)锍虦y量儀_第1頁
已閱讀1頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p><b>  目 錄</b></p><p>  一、設(shè)計背景及目的2</p><p>  二、設(shè)計任務(wù)和要求3</p><p><b>  2.1設(shè)計任務(wù)3</b></p><p><b>  2.2設(shè)計方案3</b></p><p

2、>  2.2.1控制器選擇3</p><p>  2.2.2顯示器的選擇3</p><p>  2.2.3傳感器的選擇4</p><p><b>  三、系統(tǒng)的概述4</b></p><p><b>  3.1工作原理5</b></p><p>  3.1.1

3、系統(tǒng)的硬件設(shè)計5</p><p>  3.1.2信號預(yù)處理電路6</p><p>  3.2 E2ROM AT24C02的應(yīng)用7</p><p><b>  3.3顯示模塊8</b></p><p>  3.4系統(tǒng)的軟件設(shè)計9</p><p>  3.4.1軟件設(shè)計概述9</p&

4、gt;<p>  3.4.2 軟件程序9</p><p><b>  四、結(jié)論21</b></p><p>  五、改進及不足之處21</p><p>  六、設(shè)計心得體會22</p><p><b>  參考文獻23</b></p><p>  課程

5、設(shè)計作品:自行車?yán)锍虦y量儀</p><p><b>  一、設(shè)計背景及目的</b></p><p>  我國是一個人口大國,隨著人們生活水平的逐漸提高,人們對生活性能的要求也日益增加。隨著人們的環(huán)保意識的增強,自行車以其特有的輕型、環(huán)保、方便、快捷為優(yōu)勢及減少噪聲污染等優(yōu)點,受到廣大消費者的喜愛。自行車是一項十分受歡迎的健身運動。自行車鍛煉的好處是不受時間的限制、不受

6、速度的限制。騎自行車不但可以減肥,而且還可使身材勻稱。由于自行車運動是需要大量氧氣的運動,所以還可以強化心臟功能。同時還能防止高血壓,有時比藥物更有效。踩自行車壓縮血管,使得血液循環(huán)加速,大腦攝入更多的氧氣,再加上吸入大量新鮮空氣,會使人精神氣爽。騎在車上,你會感覺十分自由且暢快無比。如果在自行車上加裝一個里程表,就可以知道自己騎車的行程,從而很好地控制運動量。隨著石油危機波及全球,油價上漲,受到經(jīng)濟能力的限制,自行車迅速激起消費者的購

7、買欲望,并且在中國逐步成為人們的代步工具,特別是學(xué)生群體對自行車的需求量很大。從保護環(huán)境和經(jīng)濟條件許可等因素綜合來看,自行車目前乃至今后都有著廣闊的發(fā)展空間。</p><p><b>  二、設(shè)計任務(wù)和要求</b></p><p><b>  2.1設(shè)計任務(wù)</b></p><p>  設(shè)計一個自行車?yán)锍虦y量儀,要求設(shè)計出

8、完整的自行車?yán)锍虦y量系統(tǒng),并且能夠顯示出自行車的里程。</p><p><b>  2.2設(shè)計方案</b></p><p>  本設(shè)計中的里程表設(shè)計以單片機和光電傳感器為核心。光電傳感器將自行車車輪的運轉(zhuǎn)情況經(jīng)過一定的抗干擾和運算處理后,輸出到LCD顯示里程,使得電動自行車的里程數(shù)據(jù)能直觀的顯示給使用者。</p><p>  2.2.1控制器選

9、擇</p><p>  單片微型計算機簡稱單片機,又稱微控制器,特別適用于控制領(lǐng)域。通常單片機由單塊集成電路構(gòu)成,內(nèi)部包含有計算機的基本部件:CPU(中央處理器),存儲器和I/O接口電路等。因此,單片機只需要與適當(dāng)?shù)能浖巴獠吭O(shè)備相結(jié)合,便可以成為一個單片機控制系統(tǒng)。單片機因為其體積小、功能強,可靠性高,靈活方便等優(yōu)點,所以可以用于各個領(lǐng)域,對各行各業(yè)的技術(shù)改造和產(chǎn)品更新?lián)Q代起到重要的推動作用。</p>

10、;<p>  2.2.2顯示器的選擇</p><p>  極低的工作電壓,只要2V-3V即可工作,而工作電流僅幾個微安即每個顯示字符只有幾個微安。一個小小的鈕扣電池也可以用一兩年,這是其他任何顯示器件無法比擬的。在工作電壓和功耗上液晶顯示正好與大規(guī)模的集成電路的發(fā)展相適應(yīng)。液晶顯示器件的基本結(jié)構(gòu)是由兩片玻璃基板制成的薄形盒。這種結(jié)構(gòu)最利于用作顯示窗口,而且它可以在有限的面積上容納最大量的顯示內(nèi)容,顯

11、示內(nèi)容的利用率最高。這種結(jié)構(gòu)還便于大批量、自動化生產(chǎn)。液晶材料是有機高分子合成材料,具有極高的純度,其他材料也都是高純物質(zhì),在極凈化的條件下制成,液晶的驅(qū)動電壓又很低,驅(qū)動電流更是很微小,這種器件的劣化幾乎沒有,壽命很長。</p><p>  2.2.3傳感器的選擇</p><p>  光電傳感器是各種光電檢測系統(tǒng)中實現(xiàn)光電轉(zhuǎn)換的關(guān)鍵元件,它是把光信號(紅外、可見及紫外光輻射)轉(zhuǎn)變成為電信

12、號的器件。光電檢測方法具有精度高、反應(yīng)快、非接觸等優(yōu)點,而且可測參數(shù)多,傳感器的結(jié)構(gòu)簡單,形式靈活多樣,因此,光電式傳感器在檢測和控制中應(yīng)用非常廣泛。遮光是光電傳感器對于檢測自行車車輪轉(zhuǎn)過的圈數(shù),具有結(jié)構(gòu)簡單、性能穩(wěn)定、傳感器小及方便的優(yōu)點。</p><p><b>  三、系統(tǒng)的概述</b></p><p>  本系統(tǒng)由信號預(yù)處理電路、單片機MSP430G2553、

13、系統(tǒng)化LCD顯示模塊、串口數(shù)據(jù)存儲電路和系統(tǒng)軟件組成。其中信號預(yù)處理電路包含信號放大、波形變換和波形整形。對待測信號進行放大的目的是降低對待測信號的幅度要求;波形變換和波形整形電路則用來將放大的信號轉(zhuǎn)換成可與單片機相連的TTL信號;通過單片機的設(shè)置可使內(nèi)部定時器T1對脈沖輸入引腳T0進行控制,這樣能精確地算出加到T0引腳的單位時間內(nèi)檢測到的脈沖數(shù)。系統(tǒng)的原理框圖如圖所示</p><p><b>  3.

14、1工作原理</b></p><p>  里程測量通??梢杂糜嫈?shù)法來進行測量。所謂計數(shù)法就是給定一個閘門時間, 在閘門時間內(nèi)計數(shù)輸入的脈沖個數(shù)。使用單片機進行自行車?yán)锍痰臏y量, 可以使用簡單的脈沖計數(shù)法,只要轉(zhuǎn)軸每旋轉(zhuǎn)一周,產(chǎn)生一個或固定的多個脈沖, 并將脈沖送入單片機中進行計數(shù),即可獲得里程信息。該設(shè)計能實時地將所測的累計里程數(shù)顯示出來,考慮到信號的衰減、干擾等影響,在信號送入單片機前應(yīng)對其進行放大整

15、形,然后通過單片機計算出里程,再將所得的數(shù)據(jù)存儲到串口數(shù)據(jù)存儲器,并由LCD顯示模塊顯示所測里程。本設(shè)計的速度和里程值采用8位顯示,并包含兩個小數(shù)位。</p><p>  3.1.1系統(tǒng)的硬件設(shè)計</p><p>  本設(shè)計采用了ST1101紅外光電傳感器,進行非接觸式檢測。當(dāng)有物體擋在紅外光電發(fā)光二極管和高靈敏度的光電晶體管之間時,傳感器將會輸出一個低電平,而當(dāng)沒有物體擋在中間時則輸出為

16、高電平,從而形成一個脈沖。該系統(tǒng)在自行車后輪的軸處保持著與輪子旋轉(zhuǎn)切面平行的方向延伸附加一個鋁盤,在這個鋁盤的邊沿處挖出若干個圓形過孔,把傳感器的檢測部分放在圓孔的圓心位置。每當(dāng)鋁盤隨著后輪旋轉(zhuǎn)的時候,傳感器將向外輸出若干個脈沖。把這些脈沖通過一系列的波形整形成單片機可以識別的TTL電平,即可算出輪子即時的轉(zhuǎn)速。鋁盤的圓孔的個數(shù)決定了測量的精度,個數(shù)越多,精度越高,而自行車所需記錄的里程遠大于車輪轉(zhuǎn)一圈所走的路程,故只需要在鋁盤上打兩個

17、過孔就可以滿足精度。本設(shè)計在鋁盤過孔的設(shè)計上采用2個過孔,從而車輪每轉(zhuǎn)過一圈,便會產(chǎn)生兩個脈沖。這樣在以后的軟件設(shè)計中能夠較為方便的計算出里程。</p><p>  3.1.2信號預(yù)處理電路</p><p><b>  信號預(yù)處理電路</b></p><p>  系統(tǒng)的信號預(yù)處理電路由二級電路構(gòu)成,第一級是由開關(guān)三極管組成的零偏置放大器,采用開

18、關(guān)三極管可以保證放大器具有良好的高頻響應(yīng)。當(dāng)輸入信號為零或負電壓時,三極管截止,電路輸出高電平;而當(dāng)輸入信號為正電壓時,三極管導(dǎo)</p><p>  通,此時輸出電壓隨著輸入電壓的上升而下降,這使得速度里程表既可以測量任意方波信號的頻率,也可以測量正弦波信號的頻率。由于放大器的放大功能降低了對待測信號的幅度要求,因此,系統(tǒng)能對任意大于0.5V的正弦波和脈沖信號進行測量。預(yù)處理電路的第二級采用帶施密特觸發(fā)器的反相器

19、DM74LS14來把放大器生成的單相脈沖轉(zhuǎn)換成與COMS電平相兼容的方波信號同時將輸出信號加到單片機的P3.4口上。 </p><p>  利用施密特觸發(fā)器狀態(tài)轉(zhuǎn)換過程中的正反饋作用,可以把邊沿變化緩慢的周期性信號變換為邊沿很陡的矩形脈沖信號。輸入的信號只要幅度大于VT+,即可在施密特觸發(fā)器的輸出端得到同等頻率的矩形脈沖信號。從傳感器得到的矩形脈沖經(jīng)傳輸后往往發(fā)生波形畸變。當(dāng)傳輸線上的電容較大時,波形的

20、上升沿將明顯變壞;當(dāng)傳輸線較長,而且接受端的阻抗與傳輸線的阻抗不匹配時,在波形的上升沿和下降沿將產(chǎn)生振蕩現(xiàn)象;當(dāng)其他脈沖信號通過導(dǎo)線間的分布電容或公共電源線疊加到矩形脈沖信號時,信號上將出現(xiàn)附加的噪聲。無論出現(xiàn)上述的那一種情況,都可以通過用施密特反相觸發(fā)器整形而得到比較理想的矩形脈沖波形。只要施密特觸發(fā)器的VT+和VT-設(shè)置得合適,均能受到滿意的整形效果。</p><p>  3.2 E2ROM AT24C02的

21、應(yīng)用</p><p>  AT24C02是CMOS 2048位串行E2PROM,在內(nèi)部組織成256%26;#215;8位。AT24C02的特點是具有允許在簡單的二線總線上工作的串行接口和軟件協(xié)議。 如圖5所示,在本設(shè)計中用芯片AT24C02的SDA端與單片機的P3.7口相連,SCL端與單片機的P3.5口相連。因為在這個I2C總線上只有一個器件,所以把AT24C02的地址設(shè)為000,即把A0、A1、A2都接地。單片

22、機計算出來的里程數(shù)據(jù)通過SDA、SCL向AT24C02輸送數(shù)據(jù)。單片機首先向AT24C02發(fā)送寫信號,當(dāng)確認后從單片機內(nèi)部的數(shù)據(jù)儲存單元提取數(shù)據(jù)然后向AT24C02的內(nèi)部地址傳送數(shù)據(jù)。當(dāng)顯示里程時,單片機首先向AT24C02發(fā)送讀信號,然后確認后,單片機從AT24C02內(nèi)部的地址向單片機的讀出單元字節(jié)讀出數(shù)據(jù),供顯示所用。</p><p>  AT24C02與單片機的接口電路圖</p><p&

23、gt;<b>  3.3顯示模塊</b></p><p>  本設(shè)計的顯示模塊包括MC14511BCP、CD4076、74LS138。 MC14511是將鎖存、譯碼、驅(qū)動三種功能集于一身的“三合一”器件。鎖存器的作用是避免在計數(shù)過程中出現(xiàn)跳數(shù)現(xiàn)象,便于觀察和記錄。用譯碼器將BCD碼轉(zhuǎn)換成7段碼,再經(jīng)過大電流反相器,驅(qū)動LCD。譯碼器屬于非時序電路,其輸出狀態(tài)與時鐘無關(guān),僅取決于輸入的BCD碼

24、。74LS138的作用相當(dāng)于位選的功能,當(dāng)C,B,A的輸入分別為“000、001、010、011、100、101”時分別選擇不同的MC14511,從而在不同位上顯示不同的數(shù)字和小數(shù)點。CD4076是CMOS 4位三態(tài)輸出D寄存器,通過74LS138的Y6,Y7來控制其CP的工作,從而使CD4076來控制小數(shù)點顯示。</p><p><b>  顯示模塊框圖</b></p>&l

25、t;p><b>  系統(tǒng)顯示部分的電路</b></p><p>  系統(tǒng)中用74LS138的Y0~Y5選擇MC14511以驅(qū)動LCD顯示,Y6、Y7來控制CD40756的CP,從而達到以CD4076的Q1~Q4控制小數(shù)點的顯示,另一個CD4076只用到其Q1和Q2,圖中字符相對應(yīng)的地方表示其引腳相連。</p><p>  3.4系統(tǒng)的軟件設(shè)計</p>

26、<p>  系統(tǒng)軟件是整個測試系統(tǒng)的重要組成部分,對系統(tǒng)的運算、邏輯、控制以及輸入輸出具有決定性的作用。</p><p>  3.4.1軟件設(shè)計概述</p><p>  本系統(tǒng)軟件采用模塊化設(shè)計方法。整個系統(tǒng)由初始化模塊、頻率測量模塊,里程計算模塊、數(shù)據(jù)轉(zhuǎn)BCD碼模塊、里程顯示模塊、數(shù)據(jù)存儲,讀取模塊、定時器中斷服務(wù)模塊以及其他功能模塊組成。待測信號經(jīng)預(yù)處理電路后加至單片機的

27、P3.4(T0)引腳可為單片機測量信號頻率提供有效的輸入信號。單片機通過檢測P3.4引腳電平來決定是否啟動測量頻率程序。當(dāng)該引腳為高電平時,系統(tǒng)處于等待狀態(tài),要一直到該引腳出現(xiàn)低電平時才開始測頻率。我們可以從TL0寄存器知道在兩秒內(nèi)單片機檢測到的N個脈沖。而M%26;#215;N所得到的正是這兩秒內(nèi)鋁盤在圓周上所走得距離S。至于里程的計算,根據(jù)速度計算的分析,在得到2s內(nèi)鋁盤在其圓周上走過的距離后。根據(jù)它與自行車輪子的圓周走過的距離有一

28、定比例關(guān)系(通過兩者角速度一樣的算法)可以通過單片機的算出自行車在這兩秒內(nèi)走過的路程S1。把這個路程S1與存儲器原來的里程數(shù)相加即可得到目前的總里程數(shù)。 通過單片機計算出來的速度和里程的數(shù)據(jù),必須通過BCD碼的轉(zhuǎn)換才能輸出給顯示模塊??偫锍虜?shù)的顯示是設(shè)定出現(xiàn)在電動自行車開動,單片機開機經(jīng)過初始化后顯示出來,這樣以來用戶可以清楚的知道自己的車子已經(jīng)運行</p><p>  3.4.2 軟件程序</p>

29、<p>  #include "msp430g2553.h"</p><p>  #define d x;</p><p>  ///////////////////////////////////////////////////////////////</p><p>  /////CS:片選,低電平有效 RS:復(fù)位端,低電

30、平有效</p><p>  /////D/C:選擇位,1=送數(shù)據(jù)/0=送命令 SCL: 串行時鐘輸入</p><p>  /////SDA:串行數(shù)據(jù)輸入</p><p>  /////////此液晶從正面看,其實際打點是從右往左畫,高位在上,且頁與列全部到相</p><p>  //漢字的取模方式是:圖形模式,陰碼,列行式,順向,C51格式

31、</p><p>  //接口:CS:地 RES:P1.5 A0:P2.0 SCL:P2.1 SI:P1.6</p><p>  //////////////////////////////////////////////////////////////</p><p>  #include <math.h></p><

32、p>  #define RS_1 P1OUT |= BIT5</p><p>  #define DC_1 P2OUT |= BIT0</p><p>  #define Clock_Out_1 P2OUT |= BIT1</p><p>  #define Data_Out_1 P1OUT

33、 |= BIT6</p><p>  #define RS_0 P1OUT &= ~BIT5</p><p>  #define DC_0 P2OUT &= ~BIT0</p><p>  #define Clock_Out_0 P2OUT &= ~BIT1</p>&l

34、t;p>  #define Data_Out_0 P1OUT &= ~BIT6</p><p>  const unsigned char ChTab[]={</p><p>  0x3E,0x7E,0xD8,0x98,0xD8,0x7E,0x3E,0x00, //A</p><p>  0x00,0xFE,0xFE,0x92,0

35、x92,0x6C,0x6C,0x00, //B</p><p>  0x00,0x38,0x7C,0xC6,0xC6,0xC6,0xC6,0x00, //C</p><p>  0x00,0xFE,0xFE,0xC6,0xC6,0x7C,0x38,0x00, //D</p><p>  0x00,0xFE,0xFE,0xD6,0xD6,

36、0xD6,0x00,0x00, //E</p><p>  0x00,0xFE,0xFE,0xD8,0xD8,0xD8,0x00,0x00, //F</p><p>  0x38,0x7C,0xC6,0xD6,0xDE,0x5C,0x10,0x00, //G</p><p>  0x00,0xFE,0xFE,0x30,0x30,0xFE

37、,0xFE,0x00, //H</p><p>  0x00,0x06,0xC6,0xFE,0xFE,0xC6,0x06,0x00, //I</p><p>  0x00,0xCC,0xC6,0xFE,0xFC,0xC0,0xC0,0x00, //J</p><p>  0x00,0xFE,0xFE,0x30,0x6C,0xC6,0x0

38、2,0x00, //K</p><p>  0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x00, //L</p><p>  0xFE,0xFE,0x40,0x38,0x40,0x7E,0xFE,0x00, //M</p><p>  0xFE,0xFE,0xF0,0x38,0x1E,0xFE,0xFE,0x

39、00, //N</p><p>  0x3C,0x7E,0xE7,0xC3,0xE7,0x7E,0x3C,0x00, //O</p><p>  0x00,0xFF,0xFF,0xCC,0xEC,0x78,0x18,0x00, //P</p><p>  0x3C,0x7E,0xD7,0xDB,0xDF,0x7E,0x7B,0x00,

40、 //Q</p><p>  0xFF,0xFF,0xDC,0xDC,0xFE,0xF7,0x73,0x00, //R</p><p>  0x00,0x64,0xF6,0x92,0x92,0xDE,0x4C,0x00, //S</p><p>  0xC0,0xC0,0xC0,0xFE,0xFE,0xC0,0xC0,0xC0,

41、 //T</p><p>  0x00,0xFC,0xFE,0x06,0x06,0xFE,0xFC,0x00, //U</p><p>  0x00,0xF8,0xFC,0x06,0x06,0xFC,0xF8,0x00, //V</p><p>  0xFF,0x0E,0x1C,0x38,0x1C,0x0E,0xFF,0x00, //W

42、</p><p>  0xC3,0x66,0x3C,0x18,0x3C,0x66,0xC3,0x00, //X</p><p>  0x80,0xC0,0x60,0x3E,0x3E,0x60,0xC0,0x80, //Y</p><p>  0x00,0xC3,0xC7,0xCF,0xDB,0xF3,0xE3,0x00 //Z<

43、/p><p><b>  };</b></p><p>  const unsigned char NumDat[]={</p><p>  0x38,0x7C,0x86,0x82,0xC2,0x7C,0x38,0x00, //0</p><p>  0x00,0x02,0x42,0xFE,0xFE,0x02,0x

44、02,0x00, //1</p><p>  0x46,0xCE,0x9E,0x9A,0xBA,0xF2,0x62,0x00, //2</p><p>  0x04,0x86,0x92,0xB2,0xF2,0xDE,0x8C,0x00, //3</p><p>  0x18,0x38,0x68,0xC8,0xFE,0xFE,0x08,0

45、x00, //4</p><p>  0xE4,0xE6,0xA2,0xA2,0xA2,0xBE,0x1C,0x00, //5</p><p>  0x3C,0x7E,0xD2,0x92,0x92,0x9E,0x0C,0x00, //6</p><p>  0xC0,0xC0,0x8E,0x9E,0xB0,0xE0,0xC0,0x00,

46、 //7</p><p>  0x6C,0xFE,0x92,0x92,0x92,0xFE,0x6C,0x00, //8</p><p>  0x60,0xF2,0x92,0x92,0x96,0xFC,0x78,0x00, //9</p><p>  0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00

47、 //.</p><p><b>  };</b></p><p>  const unsigned char PicDat[]={</p><p>  0x07,0x0F,0x0F,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x90,0x90,0xB0,0xD2,0x12, //人手形<

48、;/p><p>  0x12,0x12,0x13,0x12,0x12,0x12,0x0C,0x00, 0xF0,0xF8,0xF8,0x08,0x08,0x08,0x04,0x04,</p><p>  0x02,0x02,0x01,0x01,0x01,0x09,0x49,0x49,0x46,0x30,0x80,0x00,0x00,0x00,0x00,0x00</p><p

49、><b>  };</b></p><p>  const unsigned char Chinese[]={</p><p>  0x10,0x10,0x10,0x10,0x10,0x10,0x9F,0x52,0x32,</p><p>  0x12,0x12,0x13,0x10,0x10,0x10,0x00,0x02,0x02,<

50、;/p><p>  0x04,0x08,0x30,0xC0,0x00,0x00,0x04,0x02,0x02,</p><p>  0xFC,0x00,0x00,0x00,0x00};/*"方",0*/</p><p>  ///////////////////////////////////////// 送數(shù)據(jù)到液晶</p><

51、p>  static void Send_Data(unsigned char Data)</p><p><b>  {</b></p><p><b>  char i;</b></p><p><b>  DC_1;</b></p><p>  for(i=0;i&

52、lt;8;i++)</p><p><b>  {</b></p><p>  Clock_Out_0;</p><p>  if(Data&0x80)</p><p>  Data_Out_1;</p><p>  else Data_Out_0;</p><p>

53、;<b>  Data<<=1;</b></p><p>  Clock_Out_1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  ///////////////////////////////////////

54、//送命令到液晶</p><p>  static void Send_Com(unsigned char Com)</p><p><b>  {</b></p><p><b>  char i;</b></p><p>  DC_0; //送命令</p><p>  

55、for(i=0;i<8;i++){</p><p>  Clock_Out_0;</p><p>  if(Com&0x80)</p><p>  Data_Out_1;</p><p>  else Data_Out_0;</p><p><b>  Com<<=1;</b&

56、gt;</p><p>  Clock_Out_1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void delay_us(unsigned int us) //延時10*us US</p><p><b&

57、gt;  {</b></p><p>  while(--us)</p><p><b>  {</b></p><p>  _NOP(); //一個周期 1/1mhz=1us</p><p><b>  _NOP();</b></p>

58、<p><b>  _NOP();</b></p><p><b>  _NOP();</b></p><p><b>  _NOP();</b></p><p><b>  } </b></p><p><b>  }</b&

59、gt;</p><p>  ////////////////////////////////////////////液晶初始化</p><p>  void INIT_JHD(void)</p><p><b>  {</b></p><p><b>  RS_0;</b></p>&

60、lt;p>  delay_us(10);</p><p>  RS_1; //硬件復(fù)位</p><p>  P1DIR |= BIT5;</p><p>  P1DIR |= BIT6;</p><p>  P2DIR |= 0x07; //數(shù)據(jù)端口為輸出</p><p>  Send_Com(0x

61、A2); //設(shè)置Bais電源</p><p>  Send_Com(0xA1); //選擇ADC</p><p>  Send_Com(0xC0); //命令方向選擇</p><p>  Send_Com(0xA6); //設(shè)置顯示方式</p><p>  Send_Com(0xA4); /

62、/設(shè)置顯示像素</p><p>  Send_Com(0x81); //設(shè)置對比度</p><p>  Send_Com(30); //對比度數(shù)值</p><p>  Send_Com(0x2F); //設(shè)置電源</p><p>  Send_Com(0xF8); //設(shè)置DC/DC變換</p

63、><p>  Send_Com(0x02); //DC/DC四倍壓</p><p>  Send_Com(0xAF); //開顯示</p><p><b>  }</b></p><p>  ///////////////////////////////////////////////頁設(shè)置 (共8頁)

64、</p><p>  void SetPage(unsigned char Page){</p><p>  Page&=0x0f; // 去掉Page高四位</p><p>  Page|=0xb0; // 加上顯示ROM頁設(shè)置默認位(高四位始終為1011)</p><p>  Send_Com(Page);</p>

65、<p><b>  }</b></p><p>  ////////////此函數(shù)一般不用,它主要用來設(shè)置從哪一行開始顯示(即可以關(guān)閉部分顯示)(每頁8行)</p><p>  /*void SetStartLine(unsigned char StartLine){</p><p>  StartLine&=0x3f;//

66、去掉StartLine高兩位</p><p>  StartLine|=0x40;// 加上顯示ROM起始行默認位(高兩位始終為0100)由資料應(yīng)為0x40,</p><p>  Send_Com(StartLine);</p><p><b>  } */</b></p><p>  /////////////////

67、/////////////////////////////列設(shè)置 (共128列)</p><p>  void SetColumn(unsigned char Column){</p><p>  Send_Com(0X10|((Column+4)>>4)); //列地址高四位,其中加4是列糾正,此液晶存在4列的錯位</p><p>  Send_

68、Com((Column+4)&0X0f); //列地址低四位</p><p><b>  }</b></p><p>  /////////////////////////////////////////////// 清屏</p><p>  void Screen_Clear(void){</p><p

69、>  unsigned char i,j;</p><p>  for(i=0;i<8;i++){</p><p>  SetColumn(0);//每一頁都必須以第一列為參考</p><p>  SetPage(i);</p><p>  for(j=0;j<128;j++)</p><p>  S

70、end_Data(0x00);</p><p><b>  }</b></p><p><b>  }</b></p><p>  ////////////////////////////////////////////////////畫點</p><p>  void DotPoint(unsig

71、ned char X,unsigned char Y){ // 坐標(biāo):|------------>X</p><p>  SetColumn(127-X); //列選擇 |</p><p>  SetPage(7-(unsigned char)(Y/8));

72、 //行選擇 |</p><p>  Send_Data(0x01<<(7-(unsigned char)(Y%8))); //數(shù)據(jù)輸出 |</p><p>  }

73、 // Y</p><p>  ////////////////////////////////////////Y0 X0為顯示的起始列數(shù)與頁數(shù),</p><p>  void PrintCh(unsigned char X0,unsigned char Y0,unsigned char Ch){</p><p>  unsigned char i;&

74、lt;/p><p>  unsigned char Index;</p><p>  Index=Ch*8+7;</p><p>  SetPage(7-X0);</p><p>  SetColumn(119-Y0);</p><p>  for(i=0;i<8;i++)Send_Data(ChTab[Index-

75、i]);</p><p><b>  }</b></p><p>  ////////////////////////////////////畫線 (目前不能畫斜線)</p><p>  //////////////////////////X0 Y0為起點,X1 Y1為終點</p><p>  void DrawLin

76、e(unsigned char X0, unsigned char Y0, unsigned char X1, unsigned char Y1){</p><p>  unsigned char i;</p><p>  unsigned char Top;</p><p>  Top=((unsigned char)(Y0/8)+1)*8;</p>

77、<p>  if(X0==X1) //畫縱線</p><p>  for(i=Y0;i<=Y1;i++){</p><p>  SetColumn(127-X0); //列設(shè)置</p><p>  SetPage(7-(unsigned char)(i/8)); //頁設(shè)置</p><p>  if(i<

78、;=Top)</p><p>  Send_Data( 0xff>>(Y0%8) ); //由于此液晶是一頁一頁的送,且工作在串口</p><p>  else if(i==Y1) //方式下不能讀液晶當(dāng)前值</p><p>  Send_Data( 0xff<<( 8-(Y1%8) ) );</p

79、><p>  else Send_Data(0xff);</p><p><b>  }</b></p><p>  else if(Y0==Y1) //畫橫線</p><p>  for(i=X0;i<X1;i++){</p><p>  DotPoint(i,Y0);</p>

80、<p><b>  }</b></p><p><b>  }</b></p><p>  ///////////////////////////////////////////////////////////////////畫方格</p><p>  //////////////////////////X Y為

81、方格左上角坐標(biāo),Len Wide為方格的長和寬</p><p>  void DrawBox(unsigned char X, unsigned char Y,unsigned char Len,unsigned char Wide){</p><p>  DrawLine(X,Y,X,Y+Wide);</p><p>  DrawLine(X+Len,Y,X+Le

82、n,Y+Wide);</p><p>  DrawLine(X+1,Y,X+Len,Y);</p><p>  DrawLine(X+1,Y+Wide,X+Len,Y+Wide);</p><p><b>  }</b></p><p>  ////////////////////////////////////////

83、//// 專用顯示128*64的圖象</p><p>  /*void DisplayPic2(){</p><p>  unsigned char i,j,in=0;</p><p>  for(j=0;j<128;j++){</p><p>  for(i=0;i<8;i++){ //坐標(biāo)有待改進

84、</p><p>  SetColumn(127-j);</p><p>  SetPage(7-i);</p><p>  Send_Data(PicDat2[in++]);</p><p><b>  }</b></p><p><b>  }</b></p>

85、<p><b>  in=0;</b></p><p><b>  } */</b></p><p>  ////////////////////////////////////// X0 Y0為顯示的起始列數(shù)與頁數(shù)(注:必須滿足X0+X<=128)</p><p>  ////////////////

86、//////////////////////X為一頁要顯示的數(shù)據(jù)量,Y為分幾頁顯示,Index為下標(biāo)</p><p>  void DisplayPic(unsigned char X0,unsigned char Y0,unsigned X,unsigned char Y,unsigned int Index){</p><p>  unsigned char TempX,TempY,i

87、;</p><p>  TempX=127-X0-X;</p><p>  TempY=7-Y0;</p><p>  while(Y>0){</p><p>  SetPage(TempY);</p><p>  SetColumn(TempX);</p><p>  for(i=0;i

88、<X;i++)Send_Data(Chinese[Index+X-i-1]);</p><p><b>  TempY--;</b></p><p><b>  Index+=X;</b></p><p><b>  Y--;</b></p><p><b> 

89、 }</b></p><p><b>  }</b></p><p>  //////////////////////////////////////////Y0 X0為顯示的起始列數(shù)與頁數(shù),</p><p>  void PrintList(unsigned char X0,unsigned char Y0,unsigned ch

90、ar *word_list){</p><p>  unsigned char length=0;</p><p>  while(word_list[length]!=0x00){ //判斷是否字符串結(jié)束,將字符串拆分成為單個字符輪流顯示</p><p>  PrintCh(X0,Y0+length*8,(unsigned char)word_

91、list[length]-'A');</p><p><b>  length++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //////////////////////////////////

92、/////////// Y0 X0為顯示的起始列數(shù)與頁數(shù),,Ch為要顯示數(shù)字</p><p>  void PrintNum(unsigned char X0,unsigned char Y0,unsigned char Ch){</p><p>  unsigned char i;</p><p>  unsigned char Index;</p>

93、<p>  Index=Ch*8+7;</p><p>  SetPage(7-X0);</p><p>  SetColumn(119-Y0);</p><p>  for(i=0;i<8;i++)Send_Data(NumDat[Index-i]);</p><p><b>  }</b></

94、p><p>  //////////////////////////////////////////Y0 X0為顯示的起始列數(shù)與頁數(shù),</p><p>  void PrintListNum(unsigned char X0,unsigned char Y0,unsigned char *word_list){</p><p>  unsigned char lengt

95、h=0;</p><p>  while(word_list[length]!=0x00){ //判斷是否字符串結(jié)束,將字符串拆分成為單個字符輪流顯示</p><p>  PrintNum(X0,Y0+length*8,(unsigned char)word_list[length]-'0');</p><p><b>

96、  length++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  ///////////////////////////////////////////// Y0 X0為顯示的起始列數(shù)與頁數(shù),,Ch為要顯示數(shù)字</p><p&

97、gt;  ////////////////////////////////////////////////////////////</p><p><b>  //顯示浮點數(shù)</b></p><p>  //x,y:起點坐標(biāo)</p><p>  //number:要顯示的數(shù)字</p><p>  //decimal:要保

98、留的小數(shù)位</p><p><b>  //用16字體</b></p><p>  static float _fround[6]={0.49,0.05,0.005,0.0005,0.00005,0.000005};</p><p>  void _ftoa(float n,unsigned char decimals,unsigned cha

99、r *str)</p><p><b>  {</b></p><p>  float scale;</p><p>  unsigned char i,d;</p><p>  if (n<0.0) {n=-n; *str++='-';};</p><p>  if (de

100、cimals>5) decimals=5;</p><p>  n=n+_fround[decimals];</p><p><b>  i=0;</b></p><p>  scale=1.0;</p><p>  while (n>=scale) {scale=scale*10.0; ++i;};<

101、/p><p>  if (i==0) *str++='0';</p><p><b>  else</b></p><p>  while (i--)</p><p><b>  {</b></p><p>  scale=floor(0.5+scale/10.0

102、);</p><p>  d=(unsigned char) (n/scale);</p><p>  *str++=d+'0';</p><p>  n=n-scale*d;</p><p><b>  };</b></p><p>  if (decimals==0) {*st

103、r=0; return;};</p><p>  *str++='9'+1;</p><p>  //str=Point;</p><p>  while (decimals--)</p><p><b>  {</b></p><p><b>  n=n*10.0;&l

104、t;/b></p><p>  d=(unsigned char) n;</p><p>  *str++=d+'0';</p><p><b>  n=n-d;</b></p><p><b>  };</b></p><p><b>  *

105、str=0;</b></p><p><b>  }</b></p><p>  void LCD_ShowFloat(unsigned int x,unsigned int y,float number,unsigned char decimal)</p><p><b>  {</b></p>

106、<p>  unsigned char a[]="0";</p><p>  _ftoa(number,decimal,a);</p><p>  //LCD_ShowString(x,y,a);</p><p>  PrintListNum(x,y,a);</p><p><b>  }</b

107、></p><p>  int main( void )</p><p><b>  {</b></p><p>  // Stop watchdog timer to prevent time out reset</p><p>  int time = 0;</p><p>  floa

108、t distance = 0;</p><p>  WDTCTL = WDTPW + WDTHOLD;</p><p>  P1REN = 0x08;//使能上拉電阻</p><p>  P1IE |= 0x08;//使能P1.3管腳中斷</p><p>  P1IES = 0x00;//中斷觸發(fā)方式為上升沿</p><p

109、>  P1IFG = 0x00;//清除中斷標(biāo)志</p><p>  _EINT();//使能總中斷</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  distance = time * d/2.0;</p><

110、;p>  PrintNum(0,0,distance); </p><p><b>  }</b></p><p><b>  }</b></p><p>  #pragma vector=PORT1_VECTOR//P1口中斷服務(wù)函數(shù)</p><p>  __interrupt void

111、Port_1(void)</p><p><b>  {</b></p><p><b>  time ++;</b></p><p><b>  }</b></p><p><b>  四、結(jié)論</b></p><p>  本設(shè)計

112、以MSP430G2553為核心,通過光電傳感器來檢測自行車的運轉(zhuǎn)情況進而實現(xiàn)電動自行車的速度,里程的計算及里程的累計,存儲,最后用6位的LCD能直觀的將里程顯示給用戶。</p><p><b>  五、改進及不足之處</b></p><p>  由于自行車在戶外使用時,大多數(shù)情況下為晴天。當(dāng)太陽光照射到液晶顯示器上時,廉價的液晶器上顯示的數(shù)字會看不清楚,成本較LED大

113、,故可以改為LED顯示。還可以在顯示器上輸出顯示行駛時間及速度,即增加對自行車車速測量環(huán)節(jié),使該里程表性能更加豐富,滿足更多的消費者的需求。改進里程表,使消費者可以選隨時記錄里程及選擇性測量顯示某些參數(shù)。</p><p><b>  六、設(shè)計心得體會</b></p><p>  通過這次測試技術(shù)的課程設(shè)計,我進一步熟悉和掌握了傳感器的結(jié)構(gòu)、工作性能、工作環(huán)境、工作條件

114、、原理及測試系統(tǒng)的性能及結(jié)構(gòu)。將書本上的知識運用到實際測量中,理論與實際相聯(lián)系,對傳感器及測試系統(tǒng)的認識上升到實踐,對以后的工作和學(xué)習(xí)具有積極的影響。通過向朋友請教單片機方面的知識,我對片機的結(jié)構(gòu)及工作原理,單片機的接口技術(shù)及相關(guān)外圍芯片的外特性,有了更加深刻地認識。這次的課程設(shè)計是很難得,其中也有很多不懂得地方,但正是這樣,我才能在從中學(xué)到很多的東西!</p><p><b>  參考文獻</b

115、></p><p>  [1] 《單片機原理與接口技術(shù)》曾一江. 第一版.北京:科學(xué)出版社. 2006</p><p>  [2]《數(shù)字式汽車?yán)锍瘫淼脑O(shè)計》  諸德宏, 潘天紅, 朱湘臨 江蘇大學(xué)電氣信息工程學(xué)院 , 江蘇 鎮(zhèn)江  </p><p>  [3]《電子車速里程表的單片機實現(xiàn)方案》王鎖弘, 威海雙豐電子傳感有限公司 山東 威海 <

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論