測試課程設計自行車里程測量儀_第1頁
測試課程設計自行車里程測量儀_第2頁
測試課程設計自行車里程測量儀_第3頁
測試課程設計自行車里程測量儀_第4頁
測試課程設計自行車里程測量儀_第5頁
已閱讀5頁,還剩17頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、目 錄一、設計背景及目的2二、設計任務和要求32.1設計任務32.2設計方案3控制器選擇3顯示器的選擇3傳感器的選擇4三、系統的概述43.1工作原理5系統的硬件設計5信號預處理電路63.2 E2ROM AT24C02的應用73.3顯示模塊83.4系統的軟件設計9軟件設計概述93.4.2 軟件程序9四、結論21五、改進及不足之處21六、設計心得體會22參考文獻23課程設計作品:自行車里程測量儀一、設計背景及目的我國是一個人口大國,隨著人們生活水平的逐漸提高,人們對生活性能的要求也日益增加。隨著人們的環保意識的增強,自行車以其特有的輕型、環保、方便、快捷為優勢及減少噪聲污染等優點,受到廣大消費者的

2、喜愛。自行車是一項十分受歡迎的健身運動。自行車鍛煉的好處是不受時間的限制、不受速度的限制。騎自行車不但可以減肥,而且還可使身材勻稱。由于自行車運動是需要大量氧氣的運動,所以還可以強化心臟功能。同時還能防止高血壓,有時比藥物更有效。踩自行車壓縮血管,使得血液循環加速,大腦攝入更多的氧氣,再加上吸入大量新鮮空氣,會使人精神氣爽。騎在車上,你會感覺十分自由且暢快無比。如果在自行車上加裝一個里程表,就可以知道自己騎車的行程,從而很好地控制運動量。隨著石油危機波及全球,油價上漲,受到經濟能力的限制,自行車迅速激起消費者的購買欲望,并且在中國逐步成為人們的代步工具,特別是學生群體對自行車的需求量很大。從保

3、護環境和經濟條件許可等因素綜合來看,自行車目前乃至今后都有著廣闊的發展空間。二、設計任務和要求2.1設計任務設計一個自行車里程測量儀,要求設計出完整的自行車里程測量系統,并且能夠顯示出自行車的里程。2.2設計方案本設計中的里程表設計以單片機和光電傳感器為核心。光電傳感器將自行車車輪的運轉情況經過一定的抗干擾和運算處理后,輸出到LCD顯示里程,使得電動自行車的里程數據能直觀的顯示給使用者。控制器選擇單片微型計算機簡稱單片機,又稱微控制器,特別適用于控制領域。通常單片機由單塊集成電路構成,內部包含有計算機的基本部件:CPU(中央處理器),存儲器和I/O接口電路等。因此,單片機只需要與適當的軟件及外

4、部設備相結合,便可以成為一個單片機控制系統。單片機因為其體積小、功能強,可靠性高,靈活方便等優點,所以可以用于各個領域,對各行各業的技術改造和產品更新換代起到重要的推動作用。顯示器的選擇極低的工作電壓,只要2V-3V即可工作,而工作電流僅幾個微安即每個顯示字符只有幾個微安。一個小小的鈕扣電池也可以用一兩年,這是其他任何顯示器件無法比擬的。在工作電壓和功耗上液晶顯示正好與大規模的集成電路的發展相適應。液晶顯示器件的基本結構是由兩片玻璃基板制成的薄形盒。這種結構最利于用作顯示窗口,而且它可以在有限的面積上容納最大量的顯示內容,顯示內容的利用率最高。這種結構還便于大批量、自動化生產。液晶材料是有機高

5、分子合成材料,具有極高的純度,其他材料也都是高純物質,在極凈化的條件下制成,液晶的驅動電壓又很低,驅動電流更是很微小,這種器件的劣化幾乎沒有,壽命很長。傳感器的選擇光電傳感器是各種光電檢測系統中實現光電轉換的關鍵元件,它是把光信號(紅外、可見及紫外光輻射)轉變成為電信號的器件。光電檢測方法具有精度高、反應快、非接觸等優點,而且可測參數多,傳感器的結構簡單,形式靈活多樣,因此,光電式傳感器在檢測和控制中應用非常廣泛。遮光是光電傳感器對于檢測自行車車輪轉過的圈數,具有結構簡單、性能穩定、傳感器小及方便的優點。三、系統的概述本系統由信號預處理電路、單片機MSP430G2553、系統化LCD顯示模塊、

6、串口數據存儲電路和系統軟件組成。其中信號預處理電路包含信號放大、波形變換和波形整形。對待測信號進行放大的目的是降低對待測信號的幅度要求;波形變換和波形整形電路則用來將放大的信號轉換成可與單片機相連的TTL信號;通過單片機的設置可使內部定時器T1對脈沖輸入引腳T0進行控制,這樣能精確地算出加到T0引腳的單位時間內檢測到的脈沖數。系統的原理框圖如圖所示3.1工作原理里程測量通常可以用計數法來進行測量。所謂計數法就是給定一個閘門時間, 在閘門時間內計數輸入的脈沖個數。使用單片機進行自行車里程的測量, 可以使用簡單的脈沖計數法,只要轉軸每旋轉一周,產生一個或固定的多個脈沖, 并將脈沖送入單片機中進行計

7、數,即可獲得里程信息。該設計能實時地將所測的累計里程數顯示出來,考慮到信號的衰減、干擾等影響,在信號送入單片機前應對其進行放大整形,然后通過單片機計算出里程,再將所得的數據存儲到串口數據存儲器,并由LCD顯示模塊顯示所測里程。本設計的速度和里程值采用8位顯示,并包含兩個小數位。系統的硬件設計本設計采用了ST1101紅外光電傳感器,進行非接觸式檢測。當有物體擋在紅外光電發光二極管和高靈敏度的光電晶體管之間時,傳感器將會輸出一個低電平,而當沒有物體擋在中間時則輸出為高電平,從而形成一個脈沖。該系統在自行車后輪的軸處保持著與輪子旋轉切面平行的方向延伸附加一個鋁盤,在這個鋁盤的邊沿處挖出若干個圓形過孔

8、,把傳感器的檢測部分放在圓孔的圓心位置。每當鋁盤隨著后輪旋轉的時候,傳感器將向外輸出若干個脈沖。把這些脈沖通過一系列的波形整形成單片機可以識別的TTL電平,即可算出輪子即時的轉速。鋁盤的圓孔的個數決定了測量的精度,個數越多,精度越高,而自行車所需記錄的里程遠大于車輪轉一圈所走的路程,故只需要在鋁盤上打兩個過孔就可以滿足精度。本設計在鋁盤過孔的設計上采用2個過孔,從而車輪每轉過一圈,便會產生兩個脈沖。這樣在以后的軟件設計中能夠較為方便的計算出里程。信號預處理電路信號預處理電路系統的信號預處理電路由二級電路構成,第一級是由開關三極管組成的零偏置放大器,采用開關三極管可以保證放大器具有良好的高頻響應

9、。當輸入信號為零或負電壓時,三極管截止,電路輸出高電平;而當輸入信號為正電壓時,三極管導通,此時輸出電壓隨著輸入電壓的上升而下降,這使得速度里程表既可以測量任意方波信號的頻率,也可以測量正弦波信號的頻率。由于放大器的放大功能降低了對待測信號的幅度要求,因此,系統能對任意大于0.5V的正弦波和脈沖信號進行測量。預處理電路的第二級采用帶施密特觸發器的反相器DM74LS14來把放大器生成的單相脈沖轉換成與COMS電平相兼容的方波信號同時將輸出信號加到單片機的P3.4口上。利用施密特觸發器狀態轉換過程中的正反饋作用,可以把邊沿變化緩慢的周期性信號變換為邊沿很陡的矩形脈沖信號。輸入的信號只要幅度大于VT

10、+,即可在施密特觸發器的輸出端得到同等頻率的矩形脈沖信號。從傳感器得到的矩形脈沖經傳輸后往往發生波形畸變。當傳輸線上的電容較大時,波形的上升沿將明顯變壞;當傳輸線較長,而且接受端的阻抗與傳輸線的阻抗不匹配時,在波形的上升沿和下降沿將產生振蕩現象;當其他脈沖信號通過導線間的分布電容或公共電源線疊加到矩形脈沖信號時,信號上將出現附加的噪聲。無論出現上述的那一種情況,都可以通過用施密特反相觸發器整形而得到比較理想的矩形脈沖波形。只要施密特觸發器的VT+和VT-設置得合適,均能受到滿意的整形效果。3.2 E2ROM AT24C02的應用AT24C02是CMOS 2048位串行E2PROM,在內部組織成

11、256%26;#215;8位。AT24C02的特點是具有允許在簡單的二線總線上工作的串行接口和軟件協議。 如圖5所示,在本設計中用芯片AT24C02的SDA端與單片機的P3.7口相連,SCL端與單片機的P3.5口相連。因為在這個I2C總線上只有一個器件,所以把AT24C02的地址設為000,即把A0、A1、A2都接地。單片機計算出來的里程數據通過SDA、SCL向AT24C02輸送數據。單片機首先向AT24C02發送寫信號,當確認后從單片機內部的數據儲存單元提取數據然后向AT24C02的內部地址傳送數據。當顯示里程時,單片機首先向AT24C02發送讀信號,然后確認后,單片機從AT24C02內部的

12、地址向單片機的讀出單元字節讀出數據,供顯示所用。AT24C02與單片機的接口電路圖3.3顯示模塊本設計的顯示模塊包括MC14511BCP、CD4076、74LS138。 MC14511是將鎖存、譯碼、驅動三種功能集于一身的“三合一”器件。鎖存器的作用是避免在計數過程中出現跳數現象,便于觀察和記錄。用譯碼器將BCD碼轉換成7段碼,再經過大電流反相器,驅動LCD。譯碼器屬于非時序電路,其輸出狀態與時鐘無關,僅取決于輸入的BCD碼。74LS138的作用相當于位選的功能,當C,B,A的輸入分別為“000、001、010、011、100、101”時分別選擇不同的MC14511,從而在不同位上顯示不同的數

13、字和小數點。CD4076是CMOS 4位三態輸出D寄存器,通過74LS138的Y6,Y7來控制其CP的工作,從而使CD4076來控制小數點顯示。顯示模塊框圖系統顯示部分的電路系統中用74LS138的Y0Y5選擇MC14511以驅動LCD顯示,Y6、Y7來控制CD40756的CP,從而達到以CD4076的Q1Q4控制小數點的顯示,另一個CD4076只用到其Q1和Q2,圖中字符相對應的地方表示其引腳相連。3.4系統的軟件設計系統軟件是整個測試系統的重要組成部分,對系統的運算、邏輯、控制以及輸入輸出具有決定性的作用。軟件設計概述本系統軟件采用模塊化設計方法。整個系統由初始化模塊、頻率測量模塊,里程計

14、算模塊、數據轉碼模塊、里程顯示模塊、數據存儲,讀取模塊、定時器中斷服務模塊以及其他功能模塊組成。待測信號經預處理電路后加至單片機的P3.4(T0)引腳可為單片機測量信號頻率提供有效的輸入信號。單片機通過檢測P3.4引腳電平來決定是否啟動測量頻率程序。當該引腳為高電平時,系統處于等待狀態,要一直到該引腳出現低電平時才開始測頻率。我們可以從TL0寄存器知道在兩秒內單片機檢測到的N個脈沖。而M%26;#215;N所得到的正是這兩秒內鋁盤在圓周上所走得距離S。至于里程的計算,根據速度計算的分析,在得到2s內鋁盤在其圓周上走過的距離后。根據它與自行車輪子的圓周走過的距離有一定比例關系(通過兩者角速度一樣

15、的算法)可以通過單片機的算出自行車在這兩秒內走過的路程S1。把這個路程S1與存儲器原來的里程數相加即可得到目前的總里程數。 通過單片機計算出來的速度和里程的數據,必須通過BCD碼的轉換才能輸出給顯示模塊。總里程數的顯示是設定出現在電動自行車開動,單片機開機經過初始化后顯示出來,這樣以來用戶可以清楚的知道自己的車子已經運行了多少公里了。 軟件程序#include msp430g2553.h#define d x;/CS:片選,低電平有效 RS:復位端,低電平有效/D/C:選擇位,1=送數據/0=送命令 SCL: 串行時鐘輸入/SDA:串行數據輸入/此液晶從正面看,其實際打點是從右往左畫,高位在上

16、,且頁與列全部到相/漢字的取模方式是:圖形模式,陰碼,列行式,順向,C51格式/接口:CS:地 RES:P1.5 A0:P2.0 SCL:P2.1 SI:P1.6/#include #define RS_1 P1OUT |= BIT5#define DC_1 P2OUT |= BIT0#define Clock_Out_1 P2OUT |= BIT1#define Data_Out_1 P1OUT |= BIT6#define RS_0 P1OUT &= BIT5#define DC_0 P2OUT &= BIT0#define Clock_Out_0 P2OUT &= BIT1#define

17、 Data_Out_0 P1OUT &= BIT6const unsigned char ChTab= 0x3E,0x7E,0xD8,0x98,0xD8,0x7E,0x3E,0x00, /A 0x00,0xFE,0xFE,0x92,0x92,0x6C,0x6C,0x00, /B 0x00,0x38,0x7C,0xC6,0xC6,0xC6,0xC6,0x00, /C 0x00,0xFE,0xFE,0xC6,0xC6,0x7C,0x38,0x00, /D 0x00,0xFE,0xFE,0xD6,0xD6,0xD6,0x00,0x00, /E 0x00,0xFE,0xFE,0xD8,0xD8,0xD

18、8,0x00,0x00, /F 0x38,0x7C,0xC6,0xD6,0xDE,0x5C,0x10,0x00, /G 0x00,0xFE,0xFE,0x30,0x30,0xFE,0xFE,0x00, /H 0x00,0x06,0xC6,0xFE,0xFE,0xC6,0x06,0x00, /I 0x00,0xCC,0xC6,0xFE,0xFC,0xC0,0xC0,0x00, /J 0x00,0xFE,0xFE,0x30,0x6C,0xC6,0x02,0x00, /K 0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x00, /L 0xFE,0xFE,0x40,0x38,

19、0x40,0x7E,0xFE,0x00, /M 0xFE,0xFE,0xF0,0x38,0x1E,0xFE,0xFE,0x00, /N 0x3C,0x7E,0xE7,0xC3,0xE7,0x7E,0x3C,0x00, /O 0x00,0xFF,0xFF,0xCC,0xEC,0x78,0x18,0x00, /P 0x3C,0x7E,0xD7,0xDB,0xDF,0x7E,0x7B,0x00, /Q 0xFF,0xFF,0xDC,0xDC,0xFE,0xF7,0x73,0x00, /R 0x00,0x64,0xF6,0x92,0x92,0xDE,0x4C,0x00, /S 0xC0,0xC0,0x

20、C0,0xFE,0xFE,0xC0,0xC0,0xC0, /T 0x00,0xFC,0xFE,0x06,0x06,0xFE,0xFC,0x00, /U 0x00,0xF8,0xFC,0x06,0x06,0xFC,0xF8,0x00, /V 0xFF,0x0E,0x1C,0x38,0x1C,0x0E,0xFF,0x00, /W 0xC3,0x66,0x3C,0x18,0x3C,0x66,0xC3,0x00, /X 0x80,0xC0,0x60,0x3E,0x3E,0x60,0xC0,0x80, /Y 0x00,0xC3,0xC7,0xCF,0xDB,0xF3,0xE3,0x00 /Z;const

21、 unsigned char NumDat= 0x38,0x7C,0x86,0x82,0xC2,0x7C,0x38,0x00, /0 0x00,0x02,0x42,0xFE,0xFE,0x02,0x02,0x00, /1 0x46,0xCE,0x9E,0x9A,0xBA,0xF2,0x62,0x00, /2 0x04,0x86,0x92,0xB2,0xF2,0xDE,0x8C,0x00, /3 0x18,0x38,0x68,0xC8,0xFE,0xFE,0x08,0x00, /4 0xE4,0xE6,0xA2,0xA2,0xA2,0xBE,0x1C,0x00, /5 0x3C,0x7E,0xD

22、2,0x92,0x92,0x9E,0x0C,0x00, /6 0xC0,0xC0,0x8E,0x9E,0xB0,0xE0,0xC0,0x00, /7 0x6C,0xFE,0x92,0x92,0x92,0xFE,0x6C,0x00, /8 0x60,0xF2,0x92,0x92,0x96,0xFC,0x78,0x00, /9 0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00 /.;const unsigned char PicDat= 0x07,0x0F,0x0F,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x90,0x90,0

23、xB0,0xD2,0x12, /人手形 0x12,0x12,0x13,0x12,0x12,0x12,0x0C,0x00, 0xF0,0xF8,0xF8,0x08,0x08,0x08,0x04,0x04, 0x02,0x02,0x01,0x01,0x01,0x09,0x49,0x49,0x46,0x30,0x80,0x00,0x00,0x00,0x00,0x00;const unsigned char Chinese=0x10,0x10,0x10,0x10,0x10,0x10,0x9F,0x52,0x32,0x12,0x12,0x13,0x10,0x10,0x10,0x00,0x02,0x02,

24、0x04,0x08,0x30,0xC0,0x00,0x00,0x04,0x02,0x02,0xFC,0x00,0x00,0x00,0x00;/*方,0*/ 送數據到液晶static void Send_Data(unsigned char Data) char i; DC_1; for(i=0;i8;i+) Clock_Out_0; if(Data&0x80) Data_Out_1; else Data_Out_0; Data=1; Clock_Out_1; /送命令到液晶static void Send_Com(unsigned char Com) char i; DC_0; /送命令 fo

25、r(i=0;i8;i+) Clock_Out_0; if(Com&0x80) Data_Out_1; else Data_Out_0; Com4); /列地址高四位,其中加4是列糾正,此液晶存在4列的錯位 Send_Com(Column+4)&0X0f); /列地址低四位/ 清屏void Screen_Clear(void) unsigned char i,j; for(i=0;i8;i+) SetColumn(0);/每一頁都必須以第一列為參考 SetPage(i); for(j=0;jX SetColumn(127-X); /列選擇 | SetPage(7-(unsigned char)(

26、Y/8); /行選擇 | Send_Data(0x01(7-(unsigned char)(Y%8); /數據輸出 | / Y /Y0 X0為顯示的起始列數與頁數,void PrintCh(unsigned char X0,unsigned char Y0,unsigned char Ch) unsigned char i; unsigned char Index; Index=Ch*8+7; SetPage(7-X0); SetColumn(119-Y0); for(i=0;i8;i+)Send_Data(ChTabIndex-i);/畫線 (目前不能畫斜線)/X0 Y0為起點,X1 Y1為

27、終點 void DrawLine(unsigned char X0, unsigned char Y0, unsigned char X1, unsigned char Y1) unsigned char i; unsigned char Top; Top=(unsigned char)(Y0/8)+1)*8; if(X0=X1) /畫縱線 for(i=Y0;i=Y1;i+) SetColumn(127-X0); /列設置 SetPage(7-(unsigned char)(i/8); /頁設置 if(i(Y0%8) ); /由于此液晶是一頁一頁的送,且工作在串口 else if(i=Y1)

28、/方式下不能讀液晶當前值 Send_Data( 0xff( 8-(Y1%8) ) ); else Send_Data(0xff); else if(Y0=Y1) /畫橫線 for(i=X0;iX1;i+) DotPoint(i,Y0); /畫方格/X Y為方格左上角坐標,Len Wide為方格的長和寬void DrawBox(unsigned char X, unsigned char Y,unsigned char Len,unsigned char Wide) DrawLine(X,Y,X,Y+Wide); DrawLine(X+Len,Y,X+Len,Y+Wide); DrawLine(

29、X+1,Y,X+Len,Y); DrawLine(X+1,Y+Wide,X+Len,Y+Wide);/ 專用顯示128*64的圖象/*void DisplayPic2() unsigned char i,j,in=0; for(j=0;j128;j+) for(i=0;i8;i+) /坐標有待改進 SetColumn(127-j); SetPage(7-i); Send_Data(PicDat2in+); in=0; */ X0 Y0為顯示的起始列數與頁數(注:必須滿足X0+X0) SetPage(TempY); SetColumn(TempX); for(i=0;iX;i+)Send_Dat

30、a(ChineseIndex+X-i-1); TempY-; Index+=X; Y-; /Y0 X0為顯示的起始列數與頁數,void PrintList(unsigned char X0,unsigned char Y0,unsigned char *word_list) unsigned char length=0; while(word_listlength!=0x00) /判斷是否字符串結束,將字符串拆分成為單個字符輪流顯示 PrintCh(X0,Y0+length*8,(unsigned char)word_listlength-A); length+; / Y0 X0為顯示的起始列

31、數與頁數,Ch為要顯示數字 void PrintNum(unsigned char X0,unsigned char Y0,unsigned char Ch) unsigned char i; unsigned char Index; Index=Ch*8+7; SetPage(7-X0); SetColumn(119-Y0); for(i=0;i8;i+)Send_Data(NumDatIndex-i);/Y0 X0為顯示的起始列數與頁數,void PrintListNum(unsigned char X0,unsigned char Y0,unsigned char *word_list)

32、 unsigned char length=0; while(word_listlength!=0x00) /判斷是否字符串結束,將字符串拆分成為單個字符輪流顯示 PrintNum(X0,Y0+length*8,(unsigned char)word_listlength-0); length+; / Y0 X0為顯示的起始列數與頁數,Ch為要顯示數字/顯示浮點數/x,y:起點坐標/number:要顯示的數字/decimal:要保留的小數位/用16字體static float _fround6=0.49,0.05,0.005,0.0005,0.00005,0.000005;void _ftoa

33、(float n,unsigned char decimals,unsigned char *str)float scale;unsigned char i,d;if (n5) decimals=5;n=n+_frounddecimals;i=0;scale=1.0;while (n=scale) scale=scale*10.0; +i;if (i=0) *str+=0;elsewhile (i-) scale=floor(0.5+scale/10.0); d=(unsigned char) (n/scale); *str+=d+0; n=n-scale*d; ;if (decimals=0) *str=0; return;*str+=9+1; /str=Point;while (decimals-) n=n*10.0; d=(unsigned char) n; *str+=d+0; n=n-d;*str=0;void LCD_ShowFloat(unsigned int x,unsigne

溫馨提示

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

最新文檔

評論

0/150

提交評論