基于stc89c52單片機的自行車簡易數(shù)字里程表項目設計方案_第1頁
已閱讀1頁,還剩44頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  基于STC89C52單片機的自行車簡易數(shù)字里程表項目設計方案</p><p><b>  1引言</b></p><p>  在幾百年的不斷發(fā)展、不斷設計的過程中,自行車經(jīng)歷了一個漫長的發(fā)展歷程,并有了較為成熟的制造技術。與此同時,騎自行車也從一個單純交通使用的角色轉變成現(xiàn)在受很多人們愛好的日常休閑活動的方式。</p><p&

2、gt;  作為使人們能夠用于鍛煉身體、日常休閑使用的重要方式,很多現(xiàn)有的功能已經(jīng)無法滿足人們的需求。社會的需求推動著技術產(chǎn)業(yè)的發(fā)展,于自行車行業(yè)也同樣如此。人們生活質量的提升,要求其必須具有著較為便利的輔助功能,如在騎行的過程中需要了解到行車速度,為了方便地點距離的測量,還要求其有著可以測量行程的功能。</p><p>  除此之外,出于上述種種理由,本設計本著在能夠滿足人們平常生活中鍛煉身體、休閑娛樂的目的,在

3、這種形勢之下,一臺方便、實用的簡單數(shù)字式自行車里程表就被設計出來了。本設計的速度里程具有速度、里程的檢測功能,還可以顯示時間并有著清楚、明了的顯示界面。該里程表可以將當前的自行車速度及行走的路程直接在液晶屏幕上顯示出來,在自行車上安裝也特別方便。</p><p>  為實現(xiàn)所需功能,單片機、霍爾感應器等其它組件組合并可用液晶顯示器顯示出騎車時的速度及騎行路程是本設計的主要目標。整個設計分為硬件部分的設計和軟件部分

4、的設計。除此之外,自行車速度里程表的設計想法、電路和器件的原理及選擇都在本文當中有提及。</p><p>  課題目標對計劃、軟硬件設計方案的理論驗證,是整個設計工作開始的重要一步。接下來需要提及的便是自行車速度里程表在符合科學設計的基礎上,對于如何挑選芯片等元件的選擇和怎樣設計電路鋪設的走向。其中,速度里程表在軟件設計層面的設計思路及計劃也得到了很好的闡述。對于整個設計過程而言,分析討論模擬過程、找出存在的問題

5、、進行系統(tǒng)的檢查并得出結論是作為最后的關鍵一步。</p><p>  除了STC89C52單片機外部電路以及顯示電路等具體的硬件電路和初始化、定時、中斷等子程序的軟件設計外,整個軟件設計過程中,用C語言來編寫軟件。</p><p><b>  2 設計分析要求</b></p><p><b>  2.1 設計要求</b>&

6、lt;/p><p> ?。?)設計一個基于單片機制作的簡易自行車里程表。</p><p>  (2)顯示速度、路程等的預期目標可以在該該設計中得以實現(xiàn)。</p><p> ?。?)騎行環(huán)境達到一定的溫度時,系統(tǒng)會提示減速休息。</p><p> ?。?)當警報響起時,會反饋一條指令給電動機,拉緊剎車,使車緩慢減速。</p><

7、p> ?。?)自行車里程計的基本工作原理能夠完全了解。</p><p><b>  2.2 方案分析</b></p><p>  構件簡單、并有著較強實用性的本系統(tǒng)可以通過信號采集即由計數(shù)器計算短時間內(nèi)的路程來求出平均速度,該平均速度近相似于該時刻的瞬時速度。光電對管來完成采集數(shù)據(jù)的任務,并以矩形脈沖的形式輸出。</p><p>  在本

8、設計當中有若干個按鍵,可以用來滿足自行車不同車型輪子直徑大小的設置、對數(shù)據(jù)進行清0、調(diào)整時間等,整個設計的計數(shù)由單片機的P3.0引腳來完成。我們在設計過程當中,為實現(xiàn)較好的產(chǎn)品體驗,應該全面考慮準確的測量和縮短系統(tǒng)反映過程中的時間。</p><p>  采用通過脈沖頻率來得到速度這種方法雖然能夠獲得較為精確的精度,我們在計算時卻采用的理想狀態(tài)下的數(shù)據(jù),從而會有一定的誤差產(chǎn)生。誤差不可避免,我們要盡量的把不可避免的

9、誤差控制在一定的合理范圍之內(nèi)。除上述外,在編寫程序代碼時,確保實現(xiàn)功能所需程序的合理編寫在整個過程當中也是非常重要的。</p><p>  在本設計過程當中,自行車輪胎產(chǎn)生的數(shù)字脈沖數(shù)據(jù)經(jīng)過霍爾感應器發(fā)送給作為控制核心的單片機,單片機經(jīng)過計算單位時間的數(shù)據(jù)把最終的結果顯示在顯示屏上即為單片方式的電路集成。</p><p>  容易得出結論,本設計的精確程度與霍爾元件計數(shù)的準確性有著不可分割

10、的關系。也就是說,在自行車騎行這個復雜的環(huán)境中怎樣得到正確的脈沖數(shù)是完美實現(xiàn)該設計的點睛之筆。對于實現(xiàn)在繁雜工作環(huán)境下準確的計算脈沖這個問題,采用的是使脈沖以不同高度的信號來解決該問題。</p><p>  在下坡等危險容易高速騎行的路段,為了保護使用者人身安全,當自行車速度達到預設的危險值時危險報警器發(fā)出警報,與此同時控制剎車的微型發(fā)動機轉動使得剎車線拉緊從而緩慢降低速度。</p><p&g

11、t;  在夏季炎熱的天氣騎行時很容易造成中暑,為此,裝有一個溫度感應系統(tǒng)。當炎熱的溫度超過適合人體的極限溫度時系統(tǒng)會發(fā)出報警提示聲,并與上述原理相同緩慢降低速度。</p><p>  2.3 與傳統(tǒng)常用里程表比較</p><p>  雖然傳統(tǒng)使用磁電式的自行車里程表有著構造簡單并有著較為低廉的成本等優(yōu)點,但其無法抵抗電磁波的干擾。在現(xiàn)代社會中,移動電話被使用者隨時隨地的攜帶,移動電話所帶來

12、的電磁波對傳統(tǒng)里程表的使用有著致命的影響。其次,當使用者車速過快時,由于過高的電壓值會使傳感器產(chǎn)生額外次脈沖從而嚴重干擾了測量的精度同時也降低了產(chǎn)品的使用體驗。</p><p>  自行車工作的環(huán)境非常不理想,很強的震動、機油形成的污垢勢必有一個適應性強的產(chǎn)品才能夠滿足種種艱苦的工作要求。而在整個設計過程當中使用適應性、保障性強的霍爾傳感器很大程度上解決了此類問題,才使得設計的里程表具有優(yōu)越的使用性能。</

13、p><p><b>  3 系統(tǒng)硬件設計</b></p><p><b>  3.1 總設計方案</b></p><p>  作為MCS-51系列單片機中基本的產(chǎn)品屬于89C51增強型版本,CMOS可靠 其有著8位的處理單元、8k的存儲器(ROM)等較強的硬件條件。除此之外,在低功耗模式下該單片機可以在空余與掉電模式中轉換,只

14、需要軟件控制就可以。</p><p>  單片機只有在電源、時鐘、復位等硬件條件正常條件下,才可以運行。以MCS-51單片機作為操作過程的核心,車輪的轉數(shù)以電脈沖的形式由傳感元件轉換而成并將之解決成一個單獨的芯片是本系統(tǒng)的主要目的。用單片機的定時和計數(shù)功能來實現(xiàn)路程和速度的計算,原理是每轉的脈沖數(shù)都可以由定時器和計數(shù)器計算出。</p><p>  如果輪子的周長假設為C,裝q個磁鐵在輪圈上

15、,那么就會有測的的路程誤差值最大為C/q。只有一個磁鐵的時候,霍爾元件檢測到一個脈沖信號,也就意味著輪子轉了一圈。并且,每當霍爾元件檢測到脈沖信號時,相應的就會在P3.2引腳0端中斷輸入,與此同時,系統(tǒng)的數(shù)量計算也會停止一次。</p><p>  由上述易得,路程的測量值即為輪子的周長C*停止的次數(shù)=行程。輪子轉一圈所用的時間由單片機上的計數(shù)器可計算得出,有轉一圈所需的時間那么瞬時的速度很容易就會求得了。為了防止

16、車速過快容易發(fā)生意外事故,如果正在騎行的自行車速度達到一丁點設定極限值時,以蜂鳴器當作的警報設備就會發(fā)出聲響,提醒騎車的使用者。</p><p>  如圖所示即霍爾傳感器測速:</p><p>  圖3-1 霍爾傳感器測速</p><p>  把有磁性的小鋼塊固定在沒有磁性的材料制成的車輪邊緣上,自行車車輪轉動一次就會產(chǎn)生一個脈沖在霍爾感應器上,再由計數(shù)器來測算出轉

17、數(shù)。</p><p>  如下即為實現(xiàn)各指標舉措:</p><p>  確保霍爾元件出現(xiàn)里程脈沖信號。</p><p>  用單片機的計數(shù)器計算霍爾元件產(chǎn)生的脈沖信號。</p><p>  通過軟件編程來加工數(shù)據(jù),為了路程數(shù)和瞬時速度可以在顯示屏中顯示。目標是可以在單片機的控制下,由這三個舉措來使速度里程表有路程測量、速度測量并且顯示數(shù)據(jù)的功

18、能。</p><p><b>  圖3-2 系統(tǒng)框圖</b></p><p><b>  3.2 最小系統(tǒng)</b></p><p>  3.2.1 STC89C52單片機</p><p>  圖3-3 單片機內(nèi)部結構示意圖</p><p>  一般情況下,如果將單片機用于操作

19、中連接時,往往會和相應的連接電路、設備等硬軟件結合在一起,這樣的話,一個單片機應用系統(tǒng)才會構成。</p><p>  圖3-4 STC89C52單片機</p><p>  作為可與MCS-51系列產(chǎn)品性能完全兼容的單片機,STC89C52有著8K的可編程Flash存儲器,在性能上功能消耗非常低。同時,STC89C52作為很多應用系統(tǒng)非常優(yōu)質的處理元件,得益于它那8位的大規(guī)模集成電路和能夠在

20、線編程的Flash。</p><p>  除了和其他系列的單片機功能之外,能夠在節(jié)電的情況下運行兩種軟件。</p><p>  3.2.2 時鐘電路的設計</p><p>  振蕩時鐘與外部的時鐘組成了時鐘電路。作為協(xié)同外部的晶體產(chǎn)生振動電路的時鐘電路,可以正常工作的前提條件是有著相同脈沖的帶動,運行的時鐘可以提供給單片機。單片機正常工作的前提是運行的時鐘為1,除此

21、之外,也要要求單片機工作時的頻率要在所規(guī)定的單片機工作頻率范圍之內(nèi)。</p><p>  時鐘功能正常運轉是整個單片機各種功能運行的重要基礎,作為單片機的核心部分,其頻率的高低和電路的品質與單片機的穩(wěn)定性有著非常緊密的聯(lián)系。本設計在內(nèi)、外部時鐘當中采用內(nèi)部的時鐘方式。</p><p>  另外,輸入、輸出端分別為芯片引腳XTAL1、XTAL2的反相放大器也位于單片機里面,來組成一個振蕩器。

22、一個運行平穩(wěn)的自己振蕩器可由可調(diào)電容及晶體振蕩器與XTAL1、XTAL2這兩個引腳連接而成。</p><p><b>  圖3-5 時鐘電路</b></p><p><b>  復位電路的設計</b></p><p>  有了RET復位輸入引腳作為單片機實現(xiàn)初始的一種方法,能夠讓程序在程序存儲當中的初始地址0000H開始運

23、行。若使單片機初始復位,則只需要在引腳RET上接通兩個周期的高電平就可以實現(xiàn),若要使其不斷的復位,則只需要RET維持高電平即可。否則,單片機不會從0地址開始運行,除非RET從高電平降為低電平。</p><p>  首先,手動型的復位和復位電源型復位方式構成了單片機系統(tǒng)的復位方式。由電容的電壓不可以在短時間內(nèi)突然改變的特點及電容的串聯(lián)電阻構成的復位電路可以得出,如果給整個系統(tǒng)通上電源,那么高電平將會出現(xiàn)在RST引腳

24、,除此之外,該電路的RC值可以決定高電平所持續(xù)的時間。</p><p>  且振蕩器穩(wěn)定后,如果有一個高水平在RST引腳和保持2個機器周期以上,中央處理器可以響應,此時也會重置系統(tǒng),適當組合的RC的取值能夠使復位保證足夠的可能性。設計的該系統(tǒng)是通過按鍵復位的方式來進行復位操作,單片機復位的前提條件是其當RET引腳為高電平并且ALE及PSEN也為高電平輸出的引腳。</p><p>  如圖所

25、示為復位電路:</p><p><b>  圖3-6 復位電路</b></p><p>  3.3 顯示電路的設計</p><p>  將LCD1602顯示模塊用于本設計,具有較為美觀的人機交互界面和直觀的信息傳遞方式使得液晶顯示器有著非常高品質的顯示效果。除此之外,采用低電壓掃視的LCD液晶顯示器有著節(jié)能、性能穩(wěn)定易于控制、低消耗、占用CPU

26、少等優(yōu)點也使得這種顯示器使用范圍廣泛。</p><p>  作為專業(yè)用于呈現(xiàn)字符及數(shù)字的點陣式的液晶顯示模塊,有多種型號。下圖即為一般的1602液晶顯示器實物圖:</p><p>  圖3-7 液晶顯示器實物圖</p><p>  根據(jù)有無背光1602LCD顯示器分為兩個類別,而且有背光功能的厚度要厚一些。如下圖即為尺寸差別:</p><p>

27、;  圖3-8 液晶顯示模塊圖</p><p>  1602引腳說明表格如下:</p><p>  單 單片

28、機與液晶引腳連接:</p><p>  第1腳:VSS為電源地。</p><p>  第2腳:VDD接5V電源正極。</p><p>  第3腳:VO調(diào)整液晶顯示器對比度端口</p><p>  第4腳:RS依據(jù)電平高低選擇寄存器。</p><p>  第5腳:R/W依據(jù)電平高低讀寫信號線。</p>&l

29、t;p>  第6腳:E端為控制信號輸入端,當E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。</p><p>  第7~14腳:D0~D7為8位雙向數(shù)據(jù)端。</p><p>  第15腳:正極接電源背光源。</p><p>  第16腳:負極接地背光源。</p><p>  圖3-9 LCD電路結構圖</p><p&g

30、t;  液晶顯示模塊由于接地或接正極會出現(xiàn)最高或最低的對比度,我們可以通過10K的電位器來調(diào)節(jié)避免因太高的對比度而使之產(chǎn)生虛影。</p><p>  3.4 按鍵電路的設計</p><p>  按鍵作為單片機應用中的重要組成部分,最常用的有單獨和矩陣兩種類型。本設計采用單獨型的鍵盤,并且每一個按鍵相應的連接一個單片機端口。</p><p>  輕度接觸型開關常被用于

31、按鍵,按鍵未受到手指的壓力時其觸點是斷開的,只有當手指給予其一定的壓力才會有觸點接觸使開關閉合,按鍵不會立即閉合或者立即斷開因為觸點有一定的彈性。在按鍵閉合、斷開的過程當中由于觸點具有彈性作用會發(fā)生顫動,按鍵自身的性能及使用者的操作會影響顫動時間的長短。整個按擊鍵盤的過程大概包含五個時段:</p><p>  等候時段:手指未按下鍵盤,觸點未接觸。</p><p>  閉合顫動時段:手指剛

32、剛按下鍵盤,觸點由于彈性作用發(fā)生顫動,也必須設置顫動延時來避免誤操作。</p><p>  穩(wěn)定時段:閉合引發(fā)的顫動已經(jīng)結束,起作用的按鍵動作已經(jīng)形成。</p><p>  斷開顫動階段:手指慢慢松開按鍵時,觸點由于彈性作用也會發(fā)生顫動,同理,也需設置顫動延時來防止誤操作。</p><p>  鍵盤松開時段:由于機械的性能而產(chǎn)生的顫動已消失,觸點恢復未接觸。<

33、/p><p>  圖3-10 按鍵電路</p><p><b>  報警電路的設計</b></p><p>  如果固定頻率的矩形的電磁波能夠由單片機的口線發(fā)出高或低的電平而產(chǎn)生,那么安裝一個喇叭就可以使頻率化成聲音。發(fā)出的頻率也可以通過調(diào)節(jié)高低電平的維持時間來改變,進而使喇叭產(chǎn)生不一樣的聲響即使音調(diào)發(fā)生變化。</p><p&g

34、t;  在5V的電壓下,蜂鳴器正常工作,除此之外,上拉電阻也沒有必要安裝在P3接口處。重要的是,5V的電源要與三極管的發(fā)送端相連接,三極管的陰極與1K的電阻相接,電阻最后要接I0口,蜂鳴器正負極分別與三極管集電極和地相接。</p><p>  圖3-11 蜂鳴器發(fā)聲電路結構圖</p><p>  蜂鳴器無法發(fā)出聲響,前提是正在行駛的速度小于已設的警示速度。如果行駛的速度達到了設定的警示值,

35、則蜂鳴器會發(fā)出報警的聲響,此時控制剎車的微型發(fā)動機轉動緩慢拉緊剎車線使速度降低。</p><p><b>  3.5 霍爾傳感器</b></p><p>  圖3-12 霍爾傳感器</p><p>  作為使用霍爾效應制成的一種磁敏傳感器,即霍爾感應器。</p><p>  當我們對放在磁場的半導體、導體開通電流并且磁場

36、垂直電流,那么會有電勢差在磁場和電流都垂直的方向產(chǎn)生,即霍爾效應。以霍爾效應為基礎的霍爾元件,由于有著簡單的構造、較高的靈敏度、耐高溫等一系列優(yōu)點,還能夠測出沒有轉速的情況,在環(huán)境惡劣的環(huán)境中正常工作,在檢測技術、處理信息的地方經(jīng)常顯示出它們的身影。</p><p>  磁通量的大小因傳感器內(nèi)部的轉軸轉動而發(fā)生變化,從而得到相應的反饋信號。由半導體制成的霍爾元件需要給以電流,并且將信號處理等系列功能聚焦于一張芯片

37、,霍爾元件磁場變大也會導致傳感器磁通量發(fā)生變化。</p><p>  圖3-13 霍爾傳感器外形</p><p>  霍爾傳感器的使用往往與與之匹配的組件共同使用,因為不能產(chǎn)生較大的電勢差所以會有放大器電路來進行信號放大,也要有溫度補償和穩(wěn)定電壓的電路給予功能上的補償。上圖所示為一種型號的霍爾傳感器外觀,容易看到,其體積較小。</p><p>  圖3-14 線性霍

38、爾傳感器特性</p><p>  如上圖所示,當磁場的強度位于B1~B2的范圍內(nèi)時,輸出的電壓和外面的磁場強度之間有著較好的線性關系。也容易發(fā)現(xiàn),當磁場場強超過一定范圍則電壓大小維持不變,而在一般適合騎行的環(huán)境中,霍爾傳感器的線性特性完全可以實現(xiàn)。</p><p><b>  3.6 時鐘芯片</b></p><p>  圖3-15 時鐘電路&

39、lt;/p><p>  DS1302型號的芯片作為時間芯片用于本次設計,作為有著微小電流充電功能的低消耗時鐘電路,在2.5V至5.5V的工作電壓下,DS1302還有著年、月、周、日、時、分、秒進行計時等的功能。</p><p>  由于使用串行的數(shù)據(jù)傳輸方式,在其內(nèi)部還置放臨時性儲存信息的RAM寄存器,也就意味著即使沒有電,信息也不會失去。RST引腳、SCLK串行時鐘引腳和I/O串行數(shù)據(jù)引腳組

40、成了時鐘芯片與STC89C52的連接線。另外,計時的脈沖也由作為備用電源的Vcc2,芯片外接晶振X2提供。</p><p><b>  3.7 溫度控制</b></p><p>  炎熱的夏日街頭,很容易看到全副武裝的騎友們,為了防止陽光的曝曬在身上覆蓋很多厚實的防護服。由于騎行過程中疲憊時精神不集中,特別容易引起中暑現(xiàn)象,在車輛川流不息的馬路上這是異常危險的。在自行

41、車行程速度表內(nèi)安裝溫度感應器就可以很好避免這類問題。</p><p>  我們設定一個自己的身體在曝曬的情況下能夠承受的最大溫度值,并輸入進單片機系統(tǒng),也通過由蜂鳴器來警報炎熱溫度。比如說:當我們在騎行時,溫度逐漸上升到我們的設定值時,系統(tǒng)通過蜂鳴器發(fā)出警報并啟動控制剎車的微型電動機,微型發(fā)動機轉動從而拉緊剎車線。為了防止降速過快容易發(fā)生側翻電動機緩慢轉動使得車速緩緩降低,讓使用者安全的停下休息。</p&g

42、t;<p><b>  3.8 剎車系統(tǒng)</b></p><p>  圖3-16 微型發(fā)動機控制剎車原理圖</p><p>  剎車原理:當收到剎車的指令時,單片機啟動微型電動機,電動機轉動。由于電動機與剎車線接觸的圓柱形轉輪直徑較小,故山車線被拉緊的速度較為緩慢,從而使得速度緩慢降低,避免了降速過快引發(fā)的一些意外事故。</p><p

43、>  4 設計與實現(xiàn)軟件編程</p><p>  硬件是設計的四肢,則軟件是設計的大腦。單片機的優(yōu)越性能就是可以由軟件來操作,在此過程中,科學性、正確性是整個程序設計所要遵守的原則。以先整體再部分的設計思路每層仔細分開來,再研究各層次的關系并計劃好細節(jié)。</p><p>  主程序,計算、延時、顯示及中斷等子程序組成了軟件設計。</p><p><b&g

44、t;  4.1 主程序流程</b></p><p>  本系統(tǒng)的總體流程圖如圖所示。</p><p>  圖4-1 主程序流程圖</p><p><b>  設計方案及其步驟:</b></p><p>  1. 以系統(tǒng)所需和相應實現(xiàn)的操作為基礎來進行規(guī)劃模塊。</p><p>  2.

45、 要在確定整個設計的設計平臺之后,再確定程序的設計語言及如何設計和調(diào)整各類模塊的功能。</p><p>  3. 在設計時一定要把模塊之間數(shù)據(jù)傳遞的原理了解清楚,為了增加各模塊的自主性也要減少其之間的傳遞。</p><p>  4. 保證自身清楚的思考路線,合理調(diào)整程序調(diào)用、中止的關系。</p><p><b>  4.2 顯示流程</b>&l

46、t;/p><p>  使用LCD非靜態(tài)掃描來顯示子程序,把單片機的P2.2口接到使能端口E是第一步,然后便將數(shù)據(jù)/命令選擇端RS與單片機的P2.0口接起來,D0~D7的數(shù)據(jù)端口和P0口接起來,并把顯示的數(shù)字指令傳遞到P0口。</p><p>  除上述過程,使用延時的功能把P2.2口設置為0,把P2.0口設置為1。繼續(xù)還要把P2.2端口置于1,把P2.0端口置于1,在數(shù)字顯示之前一直持續(xù)改寫數(shù)

47、據(jù)。</p><p>  圖4-2 顯示流程圖</p><p><b>  速度處理流程</b></p><p>  圖4-3 速度處理流程圖</p><p><b>  溫度處理流程</b></p><p>  圖4-4 溫度處理流程圖</p><p&g

48、t;<b>  4.4 仿真電路</b></p><p>  4.4.1 軟件簡介</p><p>  除了有基本的電子設計自動化功能外,Proteus在模仿單片機以及外部零件等方面也有著非常實用并且有效的功能。在國內(nèi)發(fā)展的短短時間內(nèi),其卓越的用戶體驗已經(jīng)讓它在單片機及周邊行業(yè)好評如潮。</p><p>  作為風靡世界的EDA工具,無論是從布

49、置原理圖、檢測數(shù)據(jù)還是實際電路的模擬上,Proteus都做出了非常大的貢獻。Proteus也在虛擬框架到實體的設計過程當中做出了歷史性貢獻,是多種優(yōu)秀功能軟件的結晶,并且適合于多種型號的處理支持。</p><p><b>  4.4.2 結果</b></p><p><b>  繪制仿真圖要點:</b></p><p>&

50、lt;b>  找出所需元件。</b></p><p>  以電路圖為基礎進行連接。</p><p>  運行C程序產(chǎn)生的HEX文件來開始仿真。</p><p><b>  圖4-5 仿真圖</b></p><p><b>  5 調(diào)試與測量分析</b></p><

51、;p>  圖5-1 電路實物圖</p><p>  圖5-2 實物運行圖</p><p>  如果在電路中最低端的系統(tǒng)電路無法運轉,檢測電源是否有正常的電壓是首先做的工作。判斷電源電壓的常用方法是用電壓表測電源接口與接地接口的電壓,看是否為5V左右。</p><p><b>  附錄</b></p><p><

52、;b>  程序</b></p><p>  #include <reg52.h> //調(diào)用單片機頭文件</p><p>  #define uchar unsigned char //無符號字符型 宏定義變量范圍0~255</p><p>  #define uint unsigned int //無符號整型

53、宏定義變量范圍0~65535</p><p>  sbit clk = P1^3; //ds1302時鐘線定義</p><p>  sbit io = P1^4; //數(shù)據(jù)線</p><p>  sbit rst = P1^5; //復位線</p><p>  //秒 分 時 日 月 年 星期 </

54、p><p>  uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a}; //寫地址</p><p>  uchar code read_add[] ={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b}; //讀地址</p><p>  uchar code init_ds[]

55、 ={0x55,0x17,0x15,0x01,0x01,0x13,0x13}; </p><p>  uchar miao,fen,shi,ri,yue,week,nian;</p><p><b>  uchar i;</b></p><p>  uchar t1_num,t2_num;//計時間中斷的次數(shù)</p><p

56、>  unsigned long speed1,juli,time2;</p><p>  float f_hz,speed_km,speed_m;</p><p>  uchar TH11,TL11;</p><p>  uchar flag_en; //開始計算速度使能</p><p>  uchar flag_stop_en

57、; //要確定車子是否停下了</p><p>  uint juli_s; //每秒走的距離</p><p>  uint juli_z; //總路程</p><p>  float zhijing = 0.55; //直徑 0.55M</p><p>  uint s_zhijing = 55;</p&

58、gt;<p>  bit flag_1s = 1; //1s</p><p>  uchar menu_1; //菜單設置變量</p><p>  uchar menu_2; //菜單設置變量</p><p>  long zong_lc; //總量程</p><p>  uc

59、har flag_200ms;</p><p>  uint shudu; //定義速度的變量</p><p>  uint bj_shudu = 80; //報警速度</p><p>  //這三個引腳參考資料</p><p>  sbit rs=P1^0; //寄存器選擇信號 H:數(shù)據(jù)寄存器 L:指令寄存器</p>

60、<p>  sbit rw=P1^1; //寄存器選擇信號 H:數(shù)據(jù)寄存器 L:指令寄存器</p><p>  sbit e =P1^2; //片選信號 下降沿觸發(fā)</p><p>  uchar code table_num[]="0123456789abcdefg";</p><p><b>  uchar

61、 i;</b></p><p>  sbit beep = P3^7; //蜂鳴器IO口定義</p><p>  /******************1ms 延時函數(shù)*******************/</p><p>  void delay_1ms(uint q)</p><p><b>  {</b

62、></p><p><b>  uint i,j;</b></p><p>  for(i=0;i<q;i++)</p><p>  for(j=0;j<120;j++);</p><p><b>  }</b></p><p>  /***********

63、*********************************************************</p><p>  * 名稱 : delay_uint()</p><p>  * 功能 : 小延時。</p><p><b>  * 輸入 : 無</b></p><p><b>  * 輸出

64、: 無</b></p><p>  ***********************************************************************/</p><p>  void delay_uint(uint q)</p><p><b>  {</b></p><p>  

65、while(q--);</p><p><b>  }</b></p><p>  /********************************************************************</p><p>  * 名稱 : write_com(uchar com)</p><p>  *

66、 功能 : 1602命令函數(shù)</p><p>  * 輸入 : 輸入的命令值</p><p><b>  * 輸出 : 無</b></p><p>  ***********************************************************************/</p><p>  vo

67、id write_com(uchar com)</p><p><b>  {</b></p><p><b>  i =0;</b></p><p><b>  e=0;</b></p><p><b>  rs=0;</b></p>&l

68、t;p><b>  rw=0;</b></p><p><b>  P0=com;</b></p><p>  delay_uint(3);</p><p><b>  e=1;</b></p><p>  delay_uint(25);</p><p

69、><b>  e=0;</b></p><p><b>  }</b></p><p>  /********************************************************************</p><p>  * 名稱 : write_data(uchar dat)</

70、p><p>  * 功能 : 1602寫數(shù)據(jù)函數(shù)</p><p>  * 輸入 : 需要寫入1602的數(shù)據(jù)</p><p><b>  * 輸出 : 無</b></p><p>  ***********************************************************************/

71、</p><p>  void write_data(uchar dat)</p><p><b>  {</b></p><p><b>  i =0;</b></p><p><b>  e=0;</b></p><p><b>  rs=

72、1;</b></p><p><b>  rw=0;</b></p><p><b>  P0=dat;</b></p><p>  delay_uint(3);</p><p><b>  e=1;</b></p><p>  delay_

73、uint(25);</p><p><b>  e=0;</b></p><p><b>  }</b></p><p>  /********************************************************************</p><p>  * 名稱 :

74、 write_sfm2(uchar hang,uchar add,uchar date)</p><p>  * 功能 : 顯示2位十進制數(shù),如果要讓第一行,第五個字符開始顯示"23" ,調(diào)用該函數(shù)如下</p><p>  write_sfm1(1,5,23)</p><p>  * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)</p>

75、<p><b>  * 輸出 : 無</b></p><p>  ***********************************************************************/</p><p>  void write_sfm2(uchar hang,uchar add,uint date)</p><

76、p><b>  {</b></p><p>  if(hang==1) </p><p>  write_com(0x80+add);</p><p><b>  else</b></p><p>  write_com(0x80+0x40+add);</p><p&g

77、t;  write_data(0x30+date/10%10);</p><p>  write_data(0x30+date%10);</p><p><b>  }</b></p><p>  /********************************************************************<

78、/p><p>  * 名稱 : write_sfm4(uchar hang,uchar add,uchar date)</p><p>  * 功能 : 顯示2位十進制數(shù),如果要讓第一行,第五個字符開始顯示"23" ,調(diào)用該函數(shù)如下</p><p>  write_sfm1(1,5,23)</p><p>  * 輸入 : 行

79、,列,需要輸入1602的數(shù)據(jù)</p><p><b>  * 輸出 : 無</b></p><p>  ***********************************************************************/</p><p>  void write_sfm4(uchar hang,uchar add,u

80、int date)</p><p><b>  {</b></p><p>  if(hang==1) </p><p>  write_com(0x80+add);</p><p><b>  else</b></p><p>  write_com(0x80+0x40

81、+add);</p><p>  write_data(0x30+date/10000%10);</p><p>  write_data(0x30+date/1000%10);</p><p>  write_data('.');</p><p>  write_data(0x30+date/100%10);</p

82、><p>  write_data(0x30+date/10%10);</p><p>  write_data(0x30+date%10);</p><p>  write_data('k');</p><p>  write_data('m');</p><p><b>

83、  }</b></p><p>  void write_sfm7(uchar hang,uchar add,uint date)</p><p><b>  {</b></p><p>  if(hang==1) </p><p>  write_com(0x80+add);</p>&l

84、t;p><b>  else</b></p><p>  write_com(0x80+0x40+add);</p><p>  write_data(0x30+date/100000%10);</p><p>  write_data(0x30+date/100000%10);</p><p>  write_d

85、ata(0x30+date/10000%10);</p><p>  write_data(0x30+date/1000%10);</p><p>  write_data('.');</p><p>  write_data(0x30+date/100%10);</p><p>  write_data(0x30+dat

86、e/10%10);</p><p>  write_data('k');</p><p>  write_data('m');</p><p><b>  }</b></p><p>  /***********************lcd1602上顯示兩位十進制數(shù)*********

87、***************/</p><p>  void write_sfm1(uchar hang,uchar add,uchar date)</p><p><b>  {</b></p><p>  if(hang==1) </p><p>  write_com(0x80+add);</p>

88、<p><b>  else</b></p><p>  write_com(0x80+0x40+add);</p><p>  write_data(0x30+date % 10);</p><p><b>  }</b></p><p>  /******************

89、**************************************************</p><p>  * 名稱 : write_string(uchar hang,uchar add,uchar *p)</p><p>  * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下</p>

90、<p>  write_string(1,5,"ab cd ef;")</p><p>  * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)</p><p><b>  * 輸出 : 無</b></p><p>  ***************************************************

91、********************/</p><p>  void write_string(uchar hang,uchar add,uchar *p)</p><p><b>  {</b></p><p>  if(hang==1) </p><p>  write_com(0x80+add);</

92、p><p><b>  else</b></p><p>  write_com(0x80+0x40+add);</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  if(*p == '\

93、0') break;</p><p>  write_data(*p);</p><p><b>  p++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /**********

94、*************lcd1602上顯示兩位十進制數(shù)************************/</p><p>  void write_sfm2_ds1302(uchar hang,uchar add,uchar date)</p><p><b>  {</b></p><p>  if(hang==1) </p&g

95、t;<p>  write_com(0x80+add);</p><p><b>  else</b></p><p>  write_com(0x80+0x40+add);</p><p>  write_data(table_num[date / 16]);</p><p>  write_data(t

96、able_num[date % 16]);</p><p><b>  }</b></p><p>  /*****************控制光標函數(shù)********************/</p><p>  void write_guanbiao(uchar hang,uchar add,uchar date)</p>

97、<p><b>  {</b></p><p>  if(hang==1) </p><p>  write_com(0x80+add);</p><p><b>  else</b></p><p>  write_com(0x80+0x40+add);</p>&

98、lt;p>  if(date == 1)</p><p>  write_com(0x0f); //顯示光標并且閃爍</p><p><b>  else </b></p><p>  write_com(0x0c); //關閉光標</p><p><b>  } </b>&l

99、t;/p><p>  /********************************************************************</p><p>  * 名稱 : init_1602()</p><p>  * 功能 : 初始化1602液晶 </p><p><b>  * 輸入 : 無</b>

100、;</p><p><b>  * 輸出 : 無</b></p><p>  ***********************************************************************/</p><p>  void init_1602() //1602初始化</p><p>

101、;<b>  {</b></p><p>  write_com(0x38);</p><p>  write_com(0x0c);</p><p>  write_com(0x06);</p><p>  delay_uint(1000);</p><p>  write_string(1,0,

102、"sd:00km/h 00:00");</p><p>  write_string(2,0,"lc:00.00km ");</p><p><b>  }</b></p><p><b>  // E309R</b></p><p>  

103、/*************寫一個數(shù)據(jù)到對應的地址里***************/</p><p>  void write_ds1302(uchar add,uchar dat)</p><p><b>  {</b></p><p>  rst = 1; //把復位線拿高</p><p>  for(i=

104、0;i<8;i++)</p><p>  { //低位在前</p><p>  clk = 0; //時鐘線拿低開始寫數(shù)據(jù)</p><p>  io = add & 0x01; </p><p>  add >>= 1; //把地址右移一位</p><p>  

105、clk = 1; //時鐘線拿高</p><p><b>  }</b></p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p>  clk = 0; //時鐘線拿低開始寫數(shù)據(jù)</p><p>  io =

106、 dat & 0x01;</p><p>  dat >>= 1; //把數(shù)據(jù)右移一位</p><p>  clk = 1; //時鐘線拿高</p><p><b>  }</b></p><p>  rst = 0; //復位線合低</p><p><b&

107、gt;  clk = 0;</b></p><p><b>  io = 0;</b></p><p><b>  }</b></p><p>  /*************從對應的地址讀一個數(shù)據(jù)出來***************/</p><p>  uchar read_ds130

108、2(uchar add)</p><p><b>  {</b></p><p>  uchar value,i;</p><p>  rst = 1; //把復位線拿高</p><p>  for(i=0;i<8;i++)</p><p>  { //低位在前<

109、/p><p>  clk = 0; //時鐘線拿低開始寫數(shù)據(jù)</p><p>  io = add & 0x01; </p><p>  add >>= 1; //把地址右移一位</p><p>  clk = 1; //時鐘線拿高</p><p><b>  }<

110、;/b></p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p>  clk = 0; //時鐘線拿低開始讀數(shù)據(jù)</p><p>  value >>= 1;</p><p>  if(io == 1)</p&

111、gt;<p>  value |= 0x80;</p><p>  clk = 1; //時鐘線拿高</p><p><b>  }</b></p><p>  rst = 0; //復位線合低</p><p><b>  clk = 0;</b></p>&l

112、t;p><b>  io = 0;</b></p><p>  return value; //返回讀出來的數(shù)據(jù)</p><p><b>  }</b></p><p>  /*************把要的時間 年月日 都讀出來***************/</p><p>  voi

113、d read_time()</p><p><b>  {</b></p><p>  miao = read_ds1302(read_add[0]);//讀秒</p><p>  fen = read_ds1302(read_add[1]);//讀分</p><p>  shi = read_ds1302(re

114、ad_add[2]);//讀時</p><p>  ri = read_ds1302(read_add[3]);//讀日</p><p>  yue = read_ds1302(read_add[4]);//讀月</p><p>  nian = read_ds1302(read_add[5]);//讀年</p><p>  w

115、eek = read_ds1302(read_add[6]);//讀星期</p><p><b>  }</b></p><p>  /*************把要寫的時間 年月日 都寫入ds1302里***************/</p><p>  void write_time()</p><p><b

116、>  {</b></p><p>  write_ds1302(0x8e,0x00);//打開寫保護</p><p>  write_ds1302(write_add[0],miao);//寫秒</p><p>  write_ds1302(write_add[1],fen);//寫分</p><p>  wri

117、te_ds1302(write_add[2],shi);//寫時</p><p>  write_ds1302(write_add[3],ri);//寫日</p><p>  write_ds1302(write_add[4],yue);//寫月</p><p>  write_ds1302(write_add[5],nian);//寫星期</p

118、><p>  write_ds1302(write_add[6],week);//寫年</p><p>  write_ds1302(0x8e,0x80);//關閉寫保護</p><p><b>  }</b></p><p>  /*************把數(shù)據(jù)保存到ds1302 RAM中**0-31******

119、*******/</p><p>  void write_ds1302ram(uchar add,uchar dat)</p><p><b>  {</b></p><p>  add <<= 1; //地址是從第二位開始的</p><p>  add &= 0xfe; //把最低位清

120、零 是寫的命令</p><p>  add |= 0xc0; //地址最高兩位為 1 </p><p>  write_ds1302(0x8e,0x00);</p><p>  write_ds1302(add,dat);</p><p>  write_ds1302(0x8e,0x80);</p><p>

121、<b>  }</b></p><p>  /*************把數(shù)據(jù)從ds1302 RAM讀出來**0-31*************/</p><p>  uchar read_ds1302ram(uchar add)</p><p><b>  {</b></p><p>  add

122、<<= 1; //地址是從第二位開始的</p><p>  add |= 0x01; //把最高位置1 是讀命令</p><p>  add |= 0xc0; //地址最高兩位為 1 </p><p>  return(read_ds1302(add));</p><p><b>  }</b

123、></p><p>  /*************初始化ds1302時間***************/</p><p>  void init_ds1302()</p><p><b>  {</b></p><p><b>  uchar i;</b></p><p&

124、gt;  rst = 0;//第一次讀寫數(shù)據(jù)時要把IO品拿低</p><p><b>  clk = 0;</b></p><p><b>  io = 0;</b></p><p>  i = read_ds1302ram(30); </p><p>  if(i != 3)</p&g

125、t;<p><b>  {</b></p><p><b>  i = 3;</b></p><p>  write_ds1302ram(30,i);</p><p>  write_ds1302(0x8e,0x00); //打開寫保護</p><p>  f

溫馨提示

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

評論

0/150

提交評論