智能測控系統原理課程大作業 作業題目:具有實時時鐘顯示的自行車里程表的設計 學院名稱:電氣工程學院 專業班級:測控1303班 學生姓名: 劉*濤 學號:230*319 完成時間: 2016-6 任課教師: | | | | | | | | | | | | | 實現以下功能: - 自行車的速度、里程的計算顯示
- 當前環境溫度測量與顯示
- 按鍵調整自行車的半徑
- 具有實時時間顯示
| | - 能夠實現速度的測量,里程的計算與顯示,并且能夠修改自行車的半徑
- 能夠顯示溫度,當前時間
- 設計總體的硬件連接
- 設計MCU測控源程序并完成調試。
- 畫出相關的子程序流程圖及其實現的C語言代碼;
|
目 錄
摘要 1 設計需求分析 1.1 設計目的 1.2 市場需求分析 1.3 主要功能 2 特色與創新 2.1 超低功耗微控制器 2.2 彩屏顯示 3 功能規劃 3.1 溫度測量 3.2 時間顯示 3.3 自行車半徑的調整 3.4 速度里程的計算 4 硬件組成 4.1 硬件組成框圖 4.2 整體原理圖 4.3 ds18b20溫度傳感器 4.4 DS3231時鐘模塊 4.5 霍爾傳感器 4.6 TFT彩屏 5 軟件架構和開發環境 5.1 程序流程圖 5.2 速度測量的原理 5.3 程序調試 總結 參考文獻 附錄一 元件清單 附錄二 源程序 附錄三 實物展示
摘要隨著居民生活水平的不斷提高、低碳生活的提出,自行車不再僅僅是普通的運輸、代步的工具,而是成為人們娛樂、休閑、鍛煉的首選,騎自行車出行越來成為人們出行的首要選擇,自行車里程表能夠滿足人們最基本的需求,讓人們能清楚地知道當前的速度、里程等物理量。但是目前我們買的自行車好多都沒有速度里程表,我們無法知道騎行的速度和已經騎行的里程數;因此就有了這樣的想法:能不能自己設計一個自行車里程表,既經濟又實用。剛好我們這學期開設了智能測控系統這門課程,學了MSP430g2553這款微控制器,于是就想利用這款單片機來設計一個自行車里程表。其實原理也是比較簡單,通過傳感器采集自行車輪在規定時間內轉的圈數,然后通過單片機進行處理,最后用LCD顯示屏將想要得到的數據顯示出來,就可以實現自行車的測速,因此需要我們選擇合適的傳感器,編寫相應的程序來處理數據。本設計所選的是霍爾傳感器和1.44寸TFT彩屏模塊來實現自行車的測速和顯示的。 1 設計需求分析1.1 設計目的隨著低碳環保理念的提出,自行車越來越受人們的歡迎,雖然市面上也有好多自行車里程表,但是自己剛好學了430微處理器,因此就像能不能用430做一款自行車里程表,不僅可以更好的學習這門課程,而且還可以吧學到的理論知識用到實踐中去,是一次很好的機會,并且,如果自己做的好的話這也是一個很大的市場。 自世界上第一輛自行車問世至今已有200多年的歷史了。18世紀末,法國人西夫拉克發明了最早的自行車。這輛最早的自行車是木制的,其結構比較簡單。世界上第一批真正實用型的自行車出現于19世紀初。在20世紀,自行車在中國獲得了前所未有的普及和發展。從某種意義上來說,中國是一個自行車的王國。每天清晨和落日時分,滾滾車流在中國的城市中碾動,這是最為壯觀的一道風景,這是一條現代中國流動的長城。 隨著居民生活水平的不斷提高,自行車不再僅僅是普通的運輸、代步的工具,而是成為人們娛樂、休閑、鍛煉的首選。因此,人們希望自行車的功用更強大,能給人們帶來更多的方便。自行車里程表作為自行車的一大輔助工具也正是隨著這個要求而迅速發展的,其功能也逐漸從單一的里程顯示發展到速度、時間顯示,甚至有的還具有測量騎車人的心跳、顯示騎車人熱量消耗等功能。本設計采用了MSP430系列單片機設計一種體積小、操作簡單的便攜式自行車里程表,它能自動地顯示當前自行車行走的距離、運行的速度、當前的時間、實時的溫度等。
1.2 市場需求分析隨著自行車越來越多的被人們使用,自己如果能設計一款功耗低、成本低,既經濟又實用的自行的自行車里程表,也是非常有市場前景的,只是后期的話再對自己的作品加以改進,更加的完善就行。目前好多城市都有刷卡租自行車的裝置,我們學校在今年也開始實施,這說明自行車在未來一段時間應該還是非常流行的,人們之所以現在又開始這么喜歡使用自行車,我感覺主要有以下幾方面的原因: - 現在私家車越來越多,我們會經常聽說,上班早高峰、下班晚高峰,開車的還沒有走路的快,交通擁堵人們也許早已習以為常了,因此人們就又開始重視自行車的使用。
- 人們現在缺少鍛煉,職業病越來越多,騎自行車不僅可以給人們的上班提供方便,還可以鍛煉身體,一舉兩得。
- 低碳生活的提出,人們越來越重視環境保護。
1.3 主要功能本設計主要實現的是自行車的測速、里程的計算,另外還加入了實時時間的顯示,還可以通過按鍵調整自行車的半徑,可以滿足各種規格的自行車,又多增加了溫度顯示,當我們外出時可以給我們提提供實時的環境溫度信息。通過里程表,可以給我們騎車出行實時提供騎行的一些速度里程溫度等信息。供電采用的5V供電,供電電源比較常見。
2 特色與創新2.1 超低功耗微控制器本款自行車里程表采用的是TI公司的MSP430g2553微控制器,MSP430 單片機之所以有超低的功耗,是因為其在降低芯片的電源電壓和靈活而可控的運行時鐘方面都有其獨到之處。 首先,MSP430 系列單片機的電源電壓采用的是1.8-3.6V 電壓。因而可使其在1MHz 的時鐘條件下運行時,芯片的電流最低會在165μA左右,RAM保持模式下的最低功耗只有0.1μA。 其次,獨特的時鐘系統設計。在 MSP430 系列中有兩個不同的時鐘系統:基本時鐘系統、鎖頻環(FLL 和FLL+)時鐘系統和DCO數字振蕩器時鐘系統。可以只使用一個晶體振蕩器(32.768kHz)DT-26 OR DT-38,也可以使用兩個晶體振蕩器。由系統時鐘系統產生 CPU 和各功能所需的時鐘。并且這些時鐘可以在指令的控制下,打開和關閉,從而實現對總體功耗的控制。 由于系統運行時開啟的功能模塊不同,即采用不同的工作模式,芯片的功耗有著顯著的不同。在系統中共有一種活動模式(AM)和五種低功耗模式(LPM0~LPM4)。在實時時鐘模式下,可達2.5μA ,在RAM 保持模式下,最低可達0.1μA 。 2.2 彩屏顯示這款自行車里程表采用的是1.44寸的128*128分辨率的TFT彩屏顯示,可以顯示16*16的漢字8行8列,足夠顯示各種想要的信息,并且是24位真彩屏,不僅實用,而且好看,價格也比較便宜。 3 功能規劃3.1 溫度測量溫度采用DS18B20數字溫度傳感器,不用再進行模數裝換,使用方便,溫度測量誤差小,連接簡單,價格便宜,多種特點綜合分析后決定采用該數字溫度傳感器。 3.2 時間顯示時鐘模塊采用DS3231,DS3231內部集成了TCXO、RTC和32.768kHz晶體,并采用低成本、標準型、16引腳SOIC封裝。在-40℃至+85℃溫度范圍內,計時精度為±2分鐘/年。這一出色性能使DS3231成為當前要求高計時精度應用的最佳解決方案。因此本設計采用了該時鐘模塊,價格便宜,、精度高。 3.3 自行車半徑的調整由于每種自行車的半徑不一樣,在進行速度和里程的計算的時候需要用到自行車的半斤,從而計算出速度和里程,因此,為了使里程變能夠適應各種規格的自行車,在安裝的調試的時候需要對半徑進行修改,而如果不加按鍵調整的話,每次修改半徑都要在程序中輸入對應規格型號的自行車半斤,這樣可移植性就差了,不能量化生產, 3.4 速度里程的計算速度計算原理是用的微處理器的計數器,大概原理:首先計數器清零,開始計數,延時一秒,停止計數,讀取計數器中的數值,計數值即是測得的頻率,通過機械結構來得到轉速,通過半徑計算出速度和里程。
4 硬件組成4.1 硬件組成框圖本設計設計的自行車里程表的硬件組成框圖如圖4.1-1所示:
圖4.1-1 硬件組成框圖 4.2 整體原理圖4.3 ds18b20溫度傳感器4.3.1 DS18B20功能特點 ①采用單總線技術,與單片機通信只需要一根I/O線,在一根線上可以掛接多個DS18B20。 ②每只DS18B20具有一個獨有的,不可修改的64位序列號,根據序號訪問對應的器件。 ③低壓供電,電源范圍從3.0~5.5V,可以本地供電,也可以直接從數據線竊取電源(寄生電源方式)。 ④測溫范圍為-55℃~+125℃,在-10℃~+85℃范圍內誤差為±0.5℃。 ⑤可編輯分辨率為9~12位,對應的可分辨溫度分別為0.5℃,0.25℃,0.125℃和0.0625℃,可實現高精度測溫。 ⑥用戶可自設定報警上下限溫度。 ⑦報警搜索命令可識別和尋址超過程序限定溫度(溫度報警條件)的器件。 ⑧DS18B20的分辨率由用戶通過EEPROM設置為9~12位。 ⑨DS18B20可將檢測到溫度值直接轉化為數字量,并通過串行通信的方式與主控制器進行數據通信。 ⑩負電壓特性,電源極性接反時,溫度計不會因為發熱而燒毀,只是不能正常工作。 在使用中不需要任何外圍元件,全部傳感元件及轉換電路集成在形如一只三極管的集成電路內。 4.3.2 工作原理DS18B20在出廠時默認配置為12位,其中最高位為符號位,即溫度值共11位,單片機在讀取數據時,一次會讀2字節共16位,讀完后將低11位的二進制數轉化為十進制數后再乘以0.0625便為所測的實際溫度值。另外,還需要判斷溫度的正負。前5個數字為符號位,這5位同時變化,我們只需要判斷11位就可以了。前5位為1時,讀取的溫度為負值,且測到的數值需要取反加1再乘以0.0625才可以得到世紀的溫度值。前5位為0時,讀取的溫度為正值,且溫度為正值時,只需要將測得的數值乘以0.0625即可得到實際的溫度值。 DS18B20部分溫度值對應的二進制溫度表示數據
4.4 DS3231時鐘模塊DS3231內部集成了TCXO、RTC和32.768kHz晶體,并采用低成本、標準型、16引腳SOIC封裝。在-40℃至+85℃溫度范圍內,計時精度為±2分鐘/年。這一出色性能使DS3231成為當前要求高計時精度應用的最佳解決方案。而RTC的其它集成功能也擴展了系統應用領域,適合那些對計時精度要求極高的應用。應用包括:服務器、電表、安防及門禁控制系統、車隊管理、遠程信息處理系統、GPS導航裝置、POS終端以及ATM。DS3231是低成本、高精度I2C實時時鐘(RTC),具有集成的溫補晶振(TCXO)和晶體。該器件包含電池輸入端,斷開主電源時仍可保持精確的計時。集成晶振提高器件的長期精確度,并減少了生產線的元件數量。 DS3231的引腳功能說明如下:32kHz是32kHz頻率輸出;VCC用于主電源的DC引腳;INT/SQW為低電平有效中斷或方波輸出;RST是低電平有效復位引腳;NC表示無連接,外部必須接地;GND為地;VBAT為備用電源輸入;SDA為串行數據輸入、輸出;SCL為串行時鐘輸入。 RTC保存秒、分、時、星期、日期、月和年信息。少于31天的月份,將自動調整月末的日期,包括閏年的修正。時鐘的工作格式可以是24小時或帶AM/PM指示的12小時格式。提供兩個可設置的日歷鬧鐘和一個可設置的方波輸出。DS3231采用I2C總線與系統微控制器進行通信,I2C總線是由PHILIPS公司開發的兩線式串行總線,用于連接微控制器及其外圍設備,由于接口直接在組件之上,因此I2C總線占用空間少,減少了電路板的空間和芯片管腳的數量,降低了互聯成本。它支持多主控,任何能夠進行發送和接收的設備都可以成為主總線。一個主控能夠控制信號的傳輸和時鐘頻率。I2C總線通過兩根連線(串行時鐘線SCL和雙向傳送SDA)實現半雙工同步數據傳輸,確保兩器件之間地址和數據信息的雙向傳輸。它采用器件地址的硬件設置方法(即每個器件具有一個確定的ID),通過軟件尋址,從而避免器件的片選信號線尋址,使硬件系統擴展靈活簡便。為保證通信正常,必須保證I2C總線上的數據能夠順利傳送。在數據開始傳送前,首先讓I2C接口進行初始化。DS3231的I2C接口的初始化操作可通過微控制器在總線上發送一個有效START條件來實現,因為微控制器產生的START信號能夠終止DS3231的I2C接口當前的數據收、發過程,并將該接口置于START條件后的待命狀態。但要發送一個有效的START條件,必須在DS3231釋放SDA數據線時才能實現。如果SDA數據線處于低電平狀態,這時,可以讓系統微控制器產生一個附加的SCL脈沖來迫使DS3231接口送出下一位數據。假設下一位數據仍然為邏輯“0”,就繼續產生附加的SCL脈沖,經過多個SCL脈沖后,DS3231就會釋放SDA數據總線。完成I2C總線的初始化后,接著進行控制和狀態寄存器的初始化設置,確定正確的數據范圍,就可以運行相應的測控程序。 除計時精度高之外,DS3231還其有一些其它功能,這些功能擴展了系統主機的附加功能和選擇范圍。該器件內部集成了一個非常精確的數字溫度傳感器,可通過I2C接口對其進行訪問(如同時間一樣)。這個溫度傳感器的精度為±3℃。片上控制電路可實現自動電源檢測,并管理主電源和備用電源(即低壓電池)之間的電源切換。如果主電源掉電,該器件仍可繼續提供精確的計時和溫度,性能不受影響。 4.5 霍爾傳感器霍爾傳感器是對磁敏感的傳感元件,由磁鋼、霍耳元件等組成。測量系統的轉速傳感器選用CS3144的霍爾傳感器,其響應頻率為250KHz,額定電壓為4.5-24(V)、檢測距離為10(mm)。其在大電流磁場或磁鋼磁場的作用下,能測量高頻、工頻、等各種波形電流。該傳感器具有測量精度高、電壓范圍寬、功耗小、輸出功率大等優點,廣泛應用在高速計數、測頻率、測轉速等領域。輸出電壓4.5~24V,直流電源要有足夠的濾波電容,測量極性為S極。安裝時將一非磁性圓盤固定在電動機的轉軸上,將磁鋼粘貼在圓盤邊緣,磁鋼采用永久磁鐵,其磁力較強,霍爾元件固定在距圓盤1-10mm處。當磁鋼與霍爾元件相對位置發生變化時,通過霍爾元件周圍磁場強度就會發生變化。圓盤轉動,磁鋼靠近霍爾元件,穿過霍爾元件的磁場較強,霍爾傳感器輸出低電平;當磁場減弱時,輸出高電平,從而使得在圓盤轉動過程中,霍爾元件輸出連續脈沖信號。霍爾電壓隨磁場強度的變化而變化,磁場越強,電壓越高,磁場越弱,電壓越低,霍爾電壓值很小,通常只有幾個毫伏,但經集成電路中的放大器放大,就能使該電壓放大到足以輸出較強的信號。若使霍爾集成電路起傳感作用,需要用機械的方法來改變磁感應強度。下圖所示的方法是用一個轉動的葉輪作為控制磁通量的開關,當葉輪葉片處于磁鐵和霍爾集成電路之間的氣隙中時,磁場偏離集成片,霍爾電壓消失。霍爾效應傳感器屬于被動型傳感器,它要有外加電源才能工作,這一特點使它能檢測轉速低的運轉情況。模塊的原理圖如圖4.4-1所示: 圖4.4-1 霍爾傳感器模塊原理圖 4.6 TFT彩屏TFT(Thin Film Transistor)即薄膜場效應晶體管。所謂薄膜晶體管,是指液晶顯示器上的每一液晶象素點都是由集成在其后的薄膜晶體管來驅動。TFT液晶為每個像素都設有一個半導體開關,每個像素都可以通過點脈沖直接控制,因而每個節點都相對獨立,并可以連續控制,不僅提高了顯示屏的反應速度,同時可以精確控制顯示色階,所以TFT液晶的色彩更真。基本原理很簡單:顯示屏由許多可以發出任意顏色的光線的象素組成,只要控制各個象素顯示相應的顏色就能達到目的了。在TFT LCD中一般采用背光技術,為了能精確地控制每一個象素的顏色和亮度就需要在每一個象素之后安裝一個類似百葉窗的開關,當“百葉窗”打開時光線可以透過來,而“百葉窗”關上后光線就無法透過來。 本設計采用的是最基本的TFT彩屏,平時我們做實驗的時候可以學習學習用一用,分辨率是128*128像素的,顏色是24位真彩色,響應速度快,可以顯示16*16的漢字64個,用在本設計中剛好可以顯示各種想要的功能。
5 軟件架構和開發環境5.1 程序流程圖所有硬件搭建完成后就是軟件的編程與調試,現在的硬件電路基本上都要通過軟件編程來控制,基本的程序流程圖如圖5.1-1所示: 5.1-1 程序流程圖
5.2 速度測量的原理要得到自行車的速度,首先我們應該知道自行車在一秒內轉了多少圈,比如一秒內轉了10圈,周長為1m,那么自行車的速度就是10m/s;這樣就得到了自行車的速度了,為了得到較為準確的結果,我們可以在自行車的輪子上面安裝盡可能多的磁鐵,加入安裝了12個磁鐵,那么自行車轉一圈我們就可以檢測到12個脈沖信號,轉速n和頻率f的關系為
,只要得到轉速我們就可以通過半徑計算出自行車的速度了。 對于里程的計算:速度的計算是每隔一秒計算一次,里程是一個累加的過程,將每秒走的路程累加起來,就可以得到里程。 5.3 程序調試程序調試主要有精確延時1s的函數編寫;用標準的方波信號測試看看顯示的頻率與示波器實際讀到的數值誤差有多大;測量電機的轉速,模擬自行車。 1s延時函數主要是通過控制一個燈的亮或滅來測量,用示波器觀察燈亮滅的周期,從而改變循環的值,得到精確延時1s的函數;然后用函數信號發生器產生一個100Hz的方波,通過實驗發現,在100Hz以內誤差為1左右,在200Hz左右誤差為4左右,頻率越高誤差越大,但是考慮到實際情況,自行車在走的時候不會太快,因此測量的還是比較準確的;最后用測量電機的轉速。
總結通過這門課程的學習,感覺自己學到了很多的知識,我很慶幸自己能當上組長,每一次老師布置的作業自己在下面都是花費了大量的時間去研究它,因為要給組員講,所以自己學的是非常的努力,并且每個程序都會遇到各種各樣的問題,我覺得學習就是不斷遇到問題和解決問題的過程,如果學習中什么問題都沒遇到,那么我們是不可能學好的。自己也是在下面看各種資料、例程,問別的同學,一起進步,共同學習,再加上給他們講自己的印象更是深刻。我感覺這種教學方法真的是挺好的,從實際的操作出發,不再只是老師一個人的教,而是同學們自主的學,只有這樣同學們才能學到知識。如果只是讓老師講的話,我們很容易養成惰性,因為這種課程本來就枯燥無味,聽著聽著就不想聽了,或者上課也聽懂了,但是自己不練習的話還是跟沒學一樣。最后 ,通過這個課程設計大作業,感覺真是學到了不少,在制作的過程中,通過自己給別人的講解,也是一種學習的最佳方法,因為每個人的都不太一樣,所以要想給他們講清楚,首先自己得搞明白,這個過程中,正是學習的最佳時機,感覺收獲還是挺多的,不僅我們組的人問,別的組的有的也問我,這樣一來自己學習的知識就更多了。總之,我感覺學習就應該這樣,要敢于去給別人講,要喜歡去給別人講,這樣別人不僅感激你,更重要的是自己能學到很多課本上和課堂上你學不到的知識,這才叫學習。
參考文獻[1] 王智, 潘強, 邢濤. MSP430系列超低功耗16位單片機原理與應用[D].電子工業出版社. 2009. [2] 閻石.數字電子技術基礎.北京:高等教育出版社,2009. [3] 楊家成.單片機原理與應用及C51程序設計.北京:清華大學出版社,2007 [4] 賽爾吉歐.佛朗格著,劉樹棠等譯。基于運算放大器和模擬集成電路的電路設計(第三版).西安交通大學出版,2009.2
附錄一 元件清單
附錄二 源程序- #include
- #include
- #include "font.h"
- #include "sys.h"
- #include "lcd.h"
- #include "ds18b20.h"
- #include"ds3231.h"
- extern uchar nian,yue,ri,shi,fen,miao;
- float d = 40.0, per;
- void CLK_Init(void) //時鐘配置
- {
- if (CALBC1_16MHZ ==0xFF || CALDCO_16MHZ == 0xFF)
- {
- while(1); // If calibration constants erased
- // do not load, trap CPU!!
- }
- DCOCTL=0;
- BCSCTL1 = CALBC1_16MHZ; // Set range
- DCOCTL = CALDCO_16MHZ; // Set DCO step + modulation
- BCSCTL2 |= 0X06; //SMCLK為DCO的8分頻,2M
- }
- void showjiemian() //界面顯示
- {
- LCD_Fill(0,0,128,20,GBLUE); //在指定區域填充顏色
- showhanzi1(13,2,0,RED,GBLUE);
- showhanzi1(30,2,1,RED,GBLUE);
- showhanzi1(47,2,2,RED,GBLUE);
- showhanzi1(64,2,3,RED,GBLUE);
- showhanzi1(81,2,4,RED,GBLUE);
- showhanzi1(98,2,5,RED,GBLUE); //自行車里程表
- showhanzi1(2,24,16,BLUE,YELLOW); //溫
- showhanzi1(18,24,17,BLUE,YELLOW); //度
- LCD_ShowChar(34,24,':',1);
- LCD_Fill(42,23,86,40,WHITE); //在指定區域填充顏色
- showhanzi1(89,24,18,BLUE,YELLOW); //℃
- showhanzi1(2,48,8,BLUE,YELLOW);
- showhanzi1(18,48,9,BLUE,YELLOW);
- LCD_ShowChar(34,48,':',1);
- LCD_Fill(42,47,86,65,WHITE); //在指定區域填充顏色
- LCD_ShowString(88,48,"km/h"); //速度km/h
- showhanzi1(2,72,10,BLUE,YELLOW);
- showhanzi1(18,72,11,BLUE,YELLOW);
- LCD_ShowChar(34,72,':',1);
- LCD_Fill(42,71,86,89,WHITE); //在指定區域填充顏色
- LCD_ShowString(88,72,"km"); //里程km:
- LCD_Fill(0,96,128,128,WHITE); //在指定區域填充顏色
- showhanzi1(24,104,25,BLUE,WHITE);//月
- showhanzi1(56,104,26,BLUE,WHITE);//日
- LCD_ShowChar(96,104,':',1);
- }
- int main(void)
- {
- u16 tem, a, b, c;
- u16 f;
- float v, l = 0.0;
- WDTCTL = WDTPW + WDTHOLD; //停止看門狗
- P1DIR |= BIT1;
- P1OUT |= BIT1;
- P2DIR |= 0x1f; //設置P2為輸出方式輸出方式
- P2OUT |= 0X1f;
- /************************配置P1.5,P1.6引腳為輸入***************************
- *****按下與P1.5連接的按鍵半徑增加,按下與P1.6連接的按鍵半徑減小***********/
- P1DIR &= ~(BIT5+BIT6);
- P1REN |= BIT5+BIT6;
- /************************頻率測量信號輸入引腳TACLK配置**********************/
- P1SEL |= BIT0; //設置P1.0引腳為外圍功能模塊引腳
- P1DIR &= ~BIT0; //設置P1.0引腳為輸入引腳
- /***************實現頻率測量的定時/計數器A(Timer_A)配置*********************/
- TACTL |=TASSEL_0; //計數信號選擇TACLK
- TACTL |= ID_0; //計數信號分頻選擇1
- LCD_ShowNum(48,48,0,3);
- //BACK_COLOR=WHITE; //背景色,
- //POINT_COLOR=BLUE; //畫筆色
- CLK_Init();
- Lcd_Init();
- LCD_Clear(YELLOW);
- /**************時間初始化**************/
- #if 0
- ModifyTime(16,5,6,17,34,00);
- LCD_Show2Num(8,104,5,2);//月
- LCD_Show2Num(40,104,6,2);//日
- LCD_Show2Num(80,104,16,2);//時
- LCD_Show2Num(104,104,12,2);//分
- #endif
- /**************中斷按鍵P1.4的配置**************/
- P1OUT|=BIT4;//選擇上拉方式
- P1REN=BIT4;//使能上拉電阻
- P1IE|=BIT4;//使能按鍵S2管腳中斷
- P1IES=0x00;//中斷觸發方式為上升沿
- P1IFG=0x00;//清除中斷標志
- _EINT();//使能總中斷
- showjiemian();
- BACK_COLOR=WHITE; //背景色
- POINT_COLOR=BLUE; //畫筆色
- P1OUT ^=BIT6;
- while(1)
- {
- /**************得到時間數值并顯示**************/
- GetAllTime();
- LCD_Show2Num(8,104,yue,2);//月
- LCD_Show2Num(40,104,ri,2);//日
- LCD_Show2Num(80,104,shi,2);//時
- LCD_Show2Num(104,104,fen,2);//分
- //LCD_Show2Num(72,104,miao,2);//秒
- /**************得到溫度值值并顯示**************/
- tem = Read_Temp();
- a = tem/1000;
- b = tem%1000/100;
- c = tem%100/10;
- //d = tem%10;
- LCD_ShowNum(51,24,a,1); //顯示溫度十位
- LCD_ShowNum(59,24,b,1); //顯示溫度個位
- LCD_ShowChar(67,24,'.',0); //顯示"."
- LCD_ShowNum(75,24,c,1); //顯示溫度十分位
- //LCD_ShowNum(83,24,d,1); //顯示溫度百分位
- /**************測量信號的頻率**************/
- TAR = 0x0000; //計數寄存器內部清零
- TACTL |= MC_2; //啟動計數,計數終值0xffff
- delay_s(1); //產生1s計數閘門
- TACTL |= MC_0; //停止計數
- f = TAR; //讀頻率測量值
- per = 3.14*(d/100.0);
- v = per*(f/16.0)*3.6+0.5;
- l += (1.5*(f/16.0))/1000.0;
- LCD_ShowNum(48,48,(u16)v,3); //顯示速度
- LCD_ShowNum(48,72,(u16)f,3); //顯示里程
- }
- }
- #pragma vector=PORT1_VECTOR
- __interrupt void PORT1_key3(void)
- {
- if(P1IFG & BIT4)
- {
- P1DIR &= ~BIT4;
- P1REN |= BIT4;
- LCD_Fill(0,96,128,128,MAGENTA);//在指定區域填充顏色
- showhanzi1(4,104,30,WHITE,MAGENTA);
- showhanzi1(20,104,31,WHITE,MAGENTA);
- showhanzi1(36,104,32,WHITE,MAGENTA);
- showhanzi1(52,104,33,WHITE,MAGENTA);
- LCD_ShowChar(68,104,':',1);
- LCD_ShowChar(104,104,'c',1);
- LCD_ShowChar(112,104,'m',1);
- LCD_Fill(78,102,102,120,WHITE);//在指定區域填充顏色
- while(1)
- {
- BACK_COLOR=WHITE; //背景色
- POINT_COLOR=BLUE; //畫筆色
- if(!(P1IN & BIT5))
- {
- delay_ms(50);
- if(!(P1IN & BIT5))
- {
- //while(!(P1IN & BIT5));
- delay_ms(150);
- d++;
- if(d>90)
- {
- d = 40;
- }
- }
- }
- else if(!(P1IN & BIT6))
- {
- delay_ms(50);
- if(!(P1IN & BIT6))
- {
- delay_ms(150);
- d--;
- if(d<40)
- {
- d = 90;
- }
- }
- }
- if(!(P1IN & BIT4))
- {
- while(!(P1IN & BIT4));
- LCD_Fill(0,96,128,128,WHITE); //在指定區域填充顏色
- showhanzi1(24,104,25,BLUE,WHITE);//月
- showhanzi1(56,104,26,BLUE,WHITE);//日
- LCD_ShowChar(96,104,':',1);
- P1OUT|=BIT4;//LED配置為高電平,S2選擇上拉方式
- P1REN=BIT4;//使能上拉電阻0000 1000
- P1IE|=BIT4;//使能按鍵S2所在P1.3管腳中斷
- P1IES=0x00;//中斷觸發方式為上升沿
- break;
- }
- LCD_ShowNum(82,104,d,2);
- }
- P1IFG = 0x00;
- }
- }
復制代碼
附錄三 實物展示
完整論文下載(word格式 可編輯):
http://www.raoushi.com/bbs/dpj-82279-1.html
|