




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
目錄TOC\o"1-3"\h\u104411設計任務與調研 設計任務與調研自行車是人類發明的最成功的一種人力機械,是由許多簡單機械組成的復雜機械。自行車,具有100多年的歷史,由于環保以及交通的問題,是世界各國特別是發達國家居民喜愛的交通、健身工具,世界自行車行業的重心正從傳統的代步型交通工具向運動型、山地型、休閑型轉變。隨著中國居民生活水平的不斷提高,自行車不再僅僅是普通的運輸、代步的工具,而是成為人們娛樂、休閑、鍛煉的首選。因此,人們希望自行車的功用更強大,能給人們帶來更多的方便。像是摩托車或是稱霸中國的交通工具電動自行車也是有自行車演變而來。而現在的中國因為污染嚴重霧霾難治理,越來越提倡綠色出行,自行車無疑是最為方便綠色的出行工具,自行車對地形要求較低可以說是有路就能跑,在新中國發展初期甚至作為一種家庭必須品。近兩年來市場也出現了共享自行車給居民帶來極大出行便利也減少交通壓力。自行車里程表是用于遠距離連續測量自行車行駛速度和距離的儀表。它分為傳感器、單片機和顯示器三部分。目前,里程表普遍使用在汽車和摩托車上,是一種機械測量裝置,測試精度相對低,自行車上使用里程表的還很少見。針對這種情況,研制數字化里程表用于自行車上是非常有必要的用處也是十分廣泛。自行車簡易數字里程表作為自行車的一大輔助工具也隨著這個需求而面世,其功能也逐漸從單一的里程顯示發展到速度、時間顯示。然而因為自行車大小重量的局限性自行車的碼表并沒有汽車、摩托車碼表的功能復雜,相對的體積也更加小巧。通過碼表的功能我們能像運動員一般能夠監測一天的運動量、騎行最快速度。1.1設計目的設計一個可以適用各種自行車的數字里程表碼表可顯示騎行里程。碼表可顯示實時速度。里程表帶有超速報警功能。(5)學習、了解自行車數字里程表的基本工作原理。1.2設計的思路、方法本次設計中采用單片機作為處理核心,用霍爾傳感器將車輪的轉數轉換為電脈沖,進行處理后送入單片機。里程及速度的測量,是經過51單片機的定時/計數器測出總的脈沖數和每轉一圈的時間,再經過單片機的計算得出,其結果通過LED顯示器顯示出來。結合高精度的采樣電路、控制電路、顯示電路,方便地實現了智能化、高精度、高可靠性、高效率的自行車里程表的設計,并且使用方便。以AT89C51為核心,搭建數據采集模塊(霍爾傳感器采集數據、鍵盤矩陣)、控制模塊(AT89C51)、顯示模塊。數據采集數據采集AT89C51顯示外部信號圖1-1系統框圖用單片機設計一個可以適用各種自行車的數字里程,表實現自行車在行駛過程中速度,里程數和時間的顯示功能。通過數據采集,單片機控制系統搭建,液晶顯示和鍵盤輸入實現設計目標。其中數據的采集由霍爾傳感器來完成,其中關鍵的處理由單片機系統來完成,輸出的信號由液晶進行顯示,顯示當前的行駛里程情況。最后利用Proteus的交互式仿真功能,用戶可以清楚的觀察電路的工作情況,確認設計方法以及結果無誤。假定輪圈的周長為L,在輪圈上安裝a個永久磁鐵,則測得的里程值最大誤差為L/a。經綜合分析,本設計中取a=1。當輪子每轉一圈,通過開關型霍爾元件傳感器采集到一個脈沖信號,并從引腳P3.2中斷0端輸入,傳感器每獲取一個脈沖信號即對系統提供一次計數中斷。每次中斷代表車輪轉動一圈,中斷數n與輪圈的周長L的乘積為里程值。計數器T1計算每轉一圈所用的時間time,就可以計算出即時速度speed。若自行車超過限定速度,系統發出報警信號,蜂鳴器響。1.3調研的目的和總結60、70年代,自行車已經在人們的生活中占有重要位置,縫紉機、手表、自行車被列為三大件,成為一個家庭是否富裕的象征。據父輩講,這是女孩子當時找婆家的首要物質條件,是為姑娘出嫁時一份倍有面子的嫁妝。如果有人騎上自行車,后面都會引來一群駐足羨慕的眼神。而且那時憑票購買自行車后需及時向當地派出所登記上牌,另如誰家的自行車丟失了,公安局、派出所也會立刻派人偵破。隨著時代的進步、科技的發展,汽車在越來越多的家庭中開始普及,從而導致了環境污染與交通擁堵,所以人們又重新開始重視自行車這種無能源消耗的交通工具,政府也倡導文明綠色的出行方式,所以現在為了能更好的向社會推廣這種出行方式,各地也頻出奇招,例如市面普及的共享單車,它是無樁借還車模式的智能硬件,人們通過智能手機就能快速租用和歸還一輛共享單車,用可負擔的價格來完成一次幾公里的市內騎行。在現代智能手機雖有計步功能也有gps定位,但是并不精準,在專業的自行車運動員的車上依舊使用的是傳統的碼表。將來碼表里面記錄的數據可任意上傳至手機發到朋友圈,實現遠程盡速,以后可以和全世界的自行車愛好者來一場不同時間不同地方的耐力賽和自己差不多水平的自行車手一起訓練。設計自行車數字里程表,功能包含:數碼管顯示速度、里程;通過按鍵設定報警速度;可以通過按鈕實現速度的加、減;超過預定速度報警;復位按鈕可以實現里程計復位,清“0”按鈕實現里程清“0”。
2設計過程與說明2.1硬件設計本設計的任務是:以通用MCS-51單片機為處理核心,用傳感器將車輪的轉數轉換為電脈沖,進行處理后送入單片機。里程及速度的測量,是經過MCS-51的定時/計數器測出總的脈沖數和每轉一圈的時間,再經過單片機的計算得出,其結果通過LED顯示器顯示出來。2.1.1單片機模塊單片機是指一種集成在電路芯片上的微型計算機,它包括中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、并行I/O口、串行I/O口、中斷系統、定時器/計數器、定時電路及元件等部件集成到一塊芯片上構成的一個小而完善的計算機系統。51系列單片機的優點及各種51單片機的簡單比較
51系列優點之一是它從內部的硬件到軟件有一套完整的按位操作系統,稱作位處理器,或布爾處理器。它的處理對象不是字或字節而是位。它不光能對片內某些特殊功能寄存器的某位進行處理,如傳送、置位、清零、測試等,還能進行位的邏輯運算,其功能十分完備,使用起來得心應手。雖然其他種類的單片機也具有位處理功能,但能進行位邏輯運算的實屬少見。51系列在片內RAM區間還特別開辟了一個雙重功能的地址區間,十六個字節,單元地址20H~2FH,它既可作字節處理,也可作位處理(作位處理時,合128個位,相應位地址為OOH~7FH),使用極為靈活。這一功能無疑給使用者提供了極大的方便,因為一個較復雜的程序在運行過程中會遇到很多分支,因而需建立很多標志位,在運行過程中,需要對有關的標志位進行置位、清零或檢測,以確定程序的運行方向。而實施這一處理(包括前面所有的位功能),只需用一條位操作指令即可。對周圍的其他位不會產生影響。
有的單片機并不能直接對RAM單元中的位進行操作,如AVR系列單片機中,若想對RAM中的某位置位時,必須通過狀態寄存器SREG的T位進行中轉。51系列的另一個優點是乘法和除法指令,這給編程也帶來了便利。八位除以八位的除法指令,商為八位,精度嫌不夠,用得不多。而八位乘八位的乘法指令,其積為十六位,精度還是能滿足要求的,用的較多。作乘法時,只需一條指令就行了,即MuLAB(兩個乘數分別在累加器A和寄存器B中。積的低位字節在累加器A中,高位字節在寄存器B中)。很多的八位單片機都不具備乘法功能,作乘法時還得編上一段子程序調用,十分不便。在51系列中,還有一條二進制一十進制調整指令DA,能將二進制變為BCD碼,這對于十進制的計量十分方便。而在其他的單片機中,則也需調用專用的子程序才行。AT89C51單片機的介紹AT89C51是一種帶4K字節閃爍可編程可擦除只讀存儲器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低電壓,高性能CMOS8位微處理器,俗稱單片機。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。(1).主要特性:與MCS-51兼容
2.4K字節可編程閃爍存儲器
壽命:1000寫/擦循環
數據保留時間:10年
3.全靜態工作:0Hz-24Hz
4.三級程序存儲器鎖定
5.128*8位內部RAM
6.32可編程I/O線
7.兩個16位定時器/計數器
8.5個中斷源
9.可編程串行通道
10.低功耗的閑置和掉電模式
11.片內振蕩器和時鐘電路(2).管腳說明:
VCC:供電電壓。GND:接地。
P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數據存儲器,它可以被定義為數據/地址的第八位。在FIASH編程時,P0口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。P1口:P1口是一個內部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。
P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內部上拉的緣故。P2口當用于外部程序存儲器或16位地址外部數據存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內部上拉優勢,當對外部八位地址數據存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。P3口:P3口管腳是8個帶內部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1”后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。P3口也可作為AT89C51的一些特殊功能口,口管腳備選功能P3.0RXD(串行輸入口)P3.1TXD(串行輸出口)P3.2/INT0(外部中斷0)P3.3/INT1(外部中斷1)P3.4T0(記時器0外部輸入)P3.5T1(記時器1外部輸入)P3.6/WR(外部數據存儲器寫選通)P3.7/RD(外部數據存儲器讀選通)P3口同時為閃爍編程和編程校驗接收一些控制信號。RST:復位輸入。當振蕩器復位器件時,要保持RST腳兩個機器周期的高電平時間。
ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數據存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時,ALE只有在執行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執行狀態ALE禁止,置位無效。/PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數據存儲器時,這兩次有效的/PSEN信號將不出現。/EA/VPP:當/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內部程序存儲器。注意加密方式1時,/EA將內部鎖定為RESET;當/EA端保持高電平時,此間內部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。
XTAL1:反向振蕩放大器的輸入及內部時鐘工作電路的輸入。XTAL2:來自反向振蕩器的輸出。圖2-1單片機電源電路:20腳是地GND,40腳是電源VCC,一般我們會選擇在電源VCC處,加一個瓷片電容,它的目的是能濾掉電源中的高頻雜波,使系統更加安全。需要注意的是51單片機使用的是5伏直流電源。時鐘電路:AT89C51片內有一個用于構成振蕩器的反相放大器,該反相放大器的輸入為芯片引腳XTAL1(19腳),輸出端為引腳XTAL2(18腳),這兩個引腳通過連接一個12MHz晶振X1和兩個30pF的瓷片電容C1、C2,構成了單片機的時鐘電路。振蕩器是單片機系統正常工作的保證,如果振蕩器不起振,系統將會不能工作;假如振蕩器運行不規律,系統執行程序的時候就會出現時間上的誤差,這在通信中會體現的很明顯:電路將無法通信。晶振是石英晶體振蕩器的簡稱,通常用來構成振蕩電路,產生各種頻率信號。是一種能夠輸出穩定的震蕩周期的元件,通過晶振輸出的時鐘脈沖,來安排單片機的工作,這樣單片機才能夠有了時間的概念。但是晶振并不能夠獨立的使用,圖中的瓷片電容C1和C2起穩定作用,所以晶振必須配合合適的負載電容,否則會產生錯誤,或者是晶振不能正常的工作。晶振所加電容是匹配電容,主要是根據單片機內部電路和晶振確定的,一般選取30pF左右即可,電容大小對振蕩的穩定性有較大影響,對頻率有一定的微調,但不明顯。晶振和瓷片電容是沒有正負的,注意兩個瓷片電容相連的那端一定要接地。51單片機最小系統晶振的振蕩頻率直接影響單片機的處理速度,頻率越大處理速度越快。圖2-2時鐘電路復位電路:AT89C51單片機的復位信號時高電平有效,通過RST/VPD(9腳)連接復位電路,復位電路連接方式有兩種。1)上電復位:單片機接通電源時產生復位信號,完成單片機啟動,確定單片機起始工作狀態。2)手動復位:手動按鍵產生復位信號,完成單片機啟動,確定單片機的初始狀態。通常在單片機工作出現混亂或“死機”時,使用手動復位可實現單片機的“重啟”。上電復位是每個單片機都必須有的,一般斷電以后,再上電就復位了,而手動復位在大型的系統中運用比較多,在一般的小東西里面基本不用,所以本設計采用了上電復位方式。本設計的復位電路是由一個10uF的電容C3和一個10K的電阻R1組成的。一般單片機復位腳至少需要大約10ms時間的持續高電平脈沖,才能保證有效復位。當上電時,電容充電,類似于短路,復位腳就變成高電平,電容充滿電后,復位腳就變成低電平。同時應注意保證加在RST引腳上的高電平持續兩個機器周期,才能使單片機可靠復位。圖2-3復位電路復位是使CPU和系統中其他部件都處于一個確定的初始狀態,并從這個狀態開始工作。51系列單片機通常采用上電復位、手動復位、上電+手動的混合復位等方式。而本設計采用上電復位方式,其實質是一階充放電電路,系統上電時該電路將提供有效的復位信號RST(高電平)直至系統電源穩定后撤銷復位信號(低電平)。同時應注意保證加在RST引腳上的高電平持續兩個機器周期,才能使單片機可靠復位。中斷系統中斷源:引起中斷的根源中斷請求:中斷源向CPU提出的處理要求中斷響應過程:CPU中斷事件A,轉去執行事件B的過程中斷處理:對事件B的整個處理過程中斷返回:CPU處理完事件B返回到原事件A被中斷的地方繼續執行實現上述中斷功能—中斷系統。AT89C51有5個中斷源,2個優先級。顯示模塊顯示設計采用LM016L液晶模塊,該點陣的屏顯成本相對較低,適用于各類儀器,小型設備的顯示領域。在本設計中用來顯示速度、路程。LCD模塊引腳及功能如下圖2-4液晶模塊LM016L引腳VSS:接地VDD(VCC):電源電路,+5VVEE(VO):液晶驅動電壓RS:寄存器選擇(為“1”時,選數據寄存器DR,為“0”時選指令寄存器IR)RW:讀寫信號E:使能,片選,下降沿觸發DB0-DB7:數據線報警設計報警設計中當即時速度超過固定值時,指示燈D1會發亮,提示需要減速2.2傳感器的模塊里程測量傳感器的選擇方案有:使用編碼器對自行車車輪的圈數進行測量、可做選擇的傳感方式有兩種1.使用紅外光敏電阻對里程進行測量。2.利用霍爾傳感器對自行車里程進行測量。在本次畢業設計中我選擇了霍爾傳感器,因為紅外光敏電阻不僅對光敏感,還對環境和天氣的要求也高,這些因素都能嚴重影響測量的效果,如果裝在自行車輻條上的紅外光敏原件被路面污泥覆蓋就會出現測量不出的結果。而霍爾傳感器完全能避免上述的不足之處,由霍爾元件加整形電路構成的霍爾開關系統,不僅安裝方便,不受光線和環境的影響,而且具有輸出響應快,數字脈沖性能好,既簡單又經濟適用,所以本設計采用霍爾傳感器來對里程進行測量。霍爾傳感器霍爾傳感器是根據霍爾效應制作的一種磁場傳感器?;魻栃谴烹娦囊环N,這一現象是霍爾(A.H.Hall,1855-1938)于1879年在研究金屬的導電機構時發現的。后來發現半導體、導電流體等也有這種效應,而半導體的霍爾效應比金屬強得多,利用這現象制成的各種霍爾元件,廣泛地應用于工業自動化技術、檢測技術及信息處理等方面?;魻栃茄芯堪雽w材料性能的基本方法。通過霍爾效應實驗測定的霍爾系數,能夠判斷半導體材料的導電類型、載流子濃度及載流子遷移率等重要參數。當一塊通有電流的金屬或半導體薄片垂直地放在磁場中時,薄片的兩端就會產生電位差,這種現象就稱為霍爾效應。兩端具有的電位差值稱為霍爾電勢U,其表達式為U=K·I·B/d,其中K為霍爾系數,I為薄片中通過的電流,B為外加磁場的磁感應強度,d是薄片的厚度,由此可見,霍爾效應的靈敏度高低與外加磁場的磁感應強度成正比的關系。而利用霍爾效應制成的元件叫做霍爾元件.圖2-5霍爾元件接線圖圖2-6霍爾傳感器2.3軟件設計所謂的軟件設計就是指把軟件需求變換成軟件具體設計方案(即模塊化結構)的過程。模塊化結構設計是指根據要求和硬件設計的結構,將整個系統的功能分成多個小的功能模塊,再根據小的功能模塊進行程序編寫的過程。所以在本設計中的軟件設計的思想主要是模塊化設計,包括一個主模塊和三個子模塊(數據采集子模塊、控制子模塊、LCD顯示子模塊),對各個子模塊進行逐一設計,主模塊完成對各個子模塊的初始化,調用控制子模塊、顯示子模塊。數據采集子模塊采用中斷方式工作,同時在編程中采用C語言編寫,使用了許多技巧,使運算做到高精度、快速。開始初始化液晶模塊初始化液晶模塊中斷時間是否到重新設置中斷時間計算速度和里程顯示內容 NYY圖2-7主程序流程圖延時延時、顯示內容設置顯示位置初始化開始圖2-8顯示流程圖開始計算速度計算速度是否超速是否超速YN顯示速度顯示速度報警返回圖2-9速度處理流程圖
3設計成果簡介3.1總電路圖3.2Proteus仿真Proteus中的電路仿真是在ISIS原理圖設計模塊中延續下來的,利用Proteus的交互式仿真功能,用戶可以清楚的觀察電路的工作情況。Proteus原理圖仿真分析的首要任務是從元件庫中選取繪制電路所需元件,查找所需元件,將元件放置在繪圖區,同時編輯元件的參數,然后連線。再利用電器規則對設計進行檢查直到通過其檢查為止。在源代碼通過編譯無誤后就可以進行仿真。3.3技術指標IEC國際電工委員會標準IEC60310:2004;GB3797-2005電氣控制設備;維修電工-國家職業技能標準(2009)年修訂。3.4作品特點本設計的自行車碼表具有市面上碼表的基礎功能,顯示實時速度、騎行里程、顯示年月日。還新加了超速報警功能,更加廣泛適用安全可靠。操作簡單,顯示讀數清晰明了適合大范圍人群。由于自己的技術水平和時間關系,本次設計并不是十分完美,外觀粗糙,只能實現基礎功能,希望以后有機會做復雜功能的裝備。3.5附錄:程序#include<reg52.h> //調用單片機頭文件#defineucharunsignedchar//無符號字符型宏定義 變量范圍0~255#defineuintunsignedint //無符號整型宏定義 變量范圍0~65535#include"eeprom52.h"/******************ds1302內部RAMRAM01100000R/W1讀0寫RAM11100001R/WRAM301111110R/W********************/sbitclk=P1^3; //ds1302時鐘線定義sbitio=P1^4; //數據線sbitrst=P1^5; //復位線ucharcodewrite_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};//寫地址ucharcoderead_add[]={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b};//讀地址ucharcodeinit_ds[]={0x55,0x17,0x15,0x01,0x01,0x13,0x13};ucharmiao,fen,shi,ri,yue,week,nian;uchari;uchart1_num,t2_num; //計時間中斷的次數unsignedlongspeed1,juli,time2;floatf_hz ,speed_km,speed_m;//dlaouttime1 ,speed_km,speed_m;ucharTH11,TL11;ucharflag_en;//開始計算速度使能ucharflag_stop_en;//要確定車子是否停下了uintjuli_s; //每秒走的距離uintjuli_z;//總路程floatzhijing=0.55;//直徑0.55Mbitflag_1s=1; //1sucharmenu_1;//菜單設置變量ucharmenu_2;//菜單設置變量longzong_lc;//總量程ucharflag_200ms;uintshudu;//定義速度的變量uintbj_shudu=80; //報警速度//這三個引腳sbitrs=P1^0; //寄存器選擇信號H:數據寄存器 L:指令寄存器sbitrw=P1^1; //寄存器選擇信號H:數據寄存器 L:指令寄存器sbite=P1^2; //片選信號下降沿觸發ucharcodetable_num[]="0123456789abcdefg";uchari;sbitbeep=P3^7;//蜂鳴器IO口定義/******************1ms延時函數*******************/voiddelay_1ms(uintq){uinti,j;for(i=0;i<q;i++)for(j=0;j<120;j++);}/******************把數據保存到單片機內部eepom中******************/voidwrite_eeprom(){SectorErase(0x2000);byte_write(0x2000,bj_shudu%256);byte_write(0x2001,bj_shudu/256);byte_write(0x2002,zong_lc%256);byte_write(0x2003,zong_lc/256%256);byte_write(0x2004,zong_lc/256/256%256);byte_write(0x2055,a_a);}/******************把數據從單片機內部eepom中讀出來*****************/voidread_eeprom(){uintvalue;bj_shudu=byte_read(0x2001);bj_shudu<<=8;bj_shudu|=byte_read(0x2000);zong_lc=byte_read(0x2004);zong_lc<<=16;value=byte_read(0x2003);zong_lc|=(value<<8);zong_lc|=byte_read(0x2002);a_a=byte_read(0x2055);}/**************開機初始化保存的數據*****************/voidinit_eeprom() //開機初始化保存的數據*{read_eeprom(); //先讀if(a_a!=1) //新的單片機初始單片機內問eeprom{bj_shudu=50;a_a=1;write_eeprom(); //保存數據}/*********************************************************************名稱:delay_uint()*功能:小延時。*輸入:無*輸出:無***********************************************************************/voiddelay_uint(uintq){while(q--);}/*********************************************************************名稱:write_data(uchardat)*功能:1602寫數據函數*輸入:需要寫入1602的數據*輸出:無***********************************************************************/voidwrite_data(uchardat){i=0;e=0;rs=1;rw=0;P0=dat;delay_uint(3);e=1;delay_uint(25);e=0;}/*********************************************************************名稱:write_sfm4(ucharhang,ucharadd,uchardate)*功能:顯示2位十進制數,如果要讓第一行,第五個字符開始顯示"23",調用該函數如下write_sfm1(1,5,23)*輸入:行,列,需要輸入1602的數據*輸出:無***********************************************************************/voidwrite_sfm4(ucharhang,ucharadd,uintdate){if(hang==1)write_com(0x80+add);elsewrite_com(0x80+0x40+add);write_data(0x30+date/10000%10);write_data(0x30+date/1000%10);write_data('.');write_data(0x30+date/100%10);write_data(0x30+date/10%10);write_data(0x30+date%10);write_data('k');write_data('m');}voidwrite_sfm7(ucharhang,ucharadd,uintdate){if(hang==1)write_com(0x80+add);elsewrite_com(0x80+0x40+add);write_data(0x30+date/100000%10);write_data(0x30+date/100000%10);write_data(0x30+date/10000%10);write_data(0x30+date/1000%10);write_data('.');write_data(0x30+date/100%10);write_data(0x30+date/10%10);write_data('k');write_data('m');}/***********************lcd1602上顯示兩位十進制數************************/voidwrite_sfm2_ds1302(ucharhang,ucharadd,uchardate){if(hang==1)write_com(0x80+add);elsewrite_com(0x80+0x40+add);write_data(table_num[date/16]);write_data(table_num[date%16]);}/*****************控制光標函數********************/voidwrite_guanbiao(ucharhang,ucharadd,uchardate){if(hang==1)write_com(0x80+add);elsewrite_com(0x80+0x40+add);if(date==1)write_com(0x0f);//顯示光標并且閃爍elsewrite_com(0x0c);//關閉光標}/*********************************************************************名稱:init_1602()*功能:初始化1602液晶*輸入:無*輸出:無***********************************************************************/voidinit_1602()//1602初始化{write_com(0x38);write_com(0x0c);write_com(0x06);delay_uint(1000);write_string(1,0,"sd:00km/h00:00");write_string(2,0,"lc:00.00km");}// E309R/*************寫一個數據到對應的地址里***************/voidwrite_ds1302(ucharadd,uchardat){rst=1; //把復位線拿高for(i=0;i<8;i++){ //低位在前clk=0; //時鐘線拿低開始寫數據io=add&0x01;add>>=1; //把地址右移一位clk=1; //時鐘線拿高}for(i=0;i<8;i++){clk=0; //時鐘線拿低開始寫數據io=dat&0x01;dat>>=1; //把數據右移一位clk=1; //時鐘線拿高}rst=0; //復位線合低clk=0;io=0;}/*************從對應的地址讀一個數據出來***************/ucharread_ds1302(ucharadd){ucharvalue,i;rst=1; //把復位線拿高for(i=0;i<8;i++){ //低位在前clk=0; //時鐘線拿低開始寫數據io=add&0x01;add>>=1; //把地址右移一位clk=1; //時鐘線拿高}for(i=0;i<8;i++){clk=0; //時鐘線拿低開始讀數據value>>=1;if(io==1)value|=0x80;clk=1; //時鐘線拿高}rst=0; //復位線合低clk=0;io=0;returnvalue; //返回讀出來的數據}/*************把數據保存到ds1302RAM中**0-31*************/voidwrite_ds1302ram(ucharadd,uchardat){add<<=1;//地址是從第二位開始的add&=0xfe;//把最低位清零是寫的命令add|=0xc0;//地址最高兩位為1write_ds1302(0x8e,0x00);write_ds1302(add,dat);write_ds1302(0x8e,0x80);}/*************把數據從ds1302RAM讀出來**0-31*************/ucharread_ds1302ram(ucharadd){add<<=1;//地址是從第二位開始的add|=0x01;//把最高位置1是讀命令add|=0xc0;//地址最高兩位為1return(read_ds1302(add));}/***********外部中斷0初始化程序****************/voidinit_int0(){EX0=1; //允許外部中斷0中斷EA=1; //開總中斷IT0=1; //外部中斷0負跳變中斷}/*************定時器0初始化程序***************/voidtime_init() //定時器0初始化程序{EA=1; //開總中斷TMOD=0X11; //定時器0、工作方式1ET0=1; //開定時器0中斷TR0=1; //允許定時器0定時ET1=1; //開定時器1中斷TR1=1; //允許定時器1定時}/***********計算速度函數**************/voidmenu_dis() //計算速度函數{staticucharvalue;if(menu_1==0){if(flag_1s==1){flag_1s=0;if(flag_en==0){value++;if(value>=3) //2秒{speed_km=0;//速度為0shudu=(uint)speed_km;value=0;}}if((flag_en==1)){value=0;flag_en=0;//1s=1/1000000us; //1m/s=0.001km除以1/3600h=3.6km/hf_hz=(t2_num*65536.0+TH11*256+TL11)/1000000;//算出來就是秒t2_num=0; //把變量清零TH11=0;TL11=0;speed_m=f_hz*zhijing*3.14; //算出來的是m/sjuli_z=(juli_z+(uint)speed_m);//總路程mspeed_km=speed_m*3.6; //(帶個小數點)km/sshudu=(uint)speed_km;zong_lc+=speed_m;}write_sfm2(1,3,shudu);write_sfm4(2,3,juli_z);}}}/********************獨立按鍵程序*****************/ucharkey_can; //按鍵值voidkey() //獨立按鍵程序{staticucharkey_new;key_can=20;//按鍵值還原P3|=0x78;//對應的按鍵IO口輸出為1if((P3&0x78)!=0x78) //按鍵按下{delay_1ms(1); //按鍵消抖動if(((P3&0x78)!=0x78)&&(key_new==1)){ //確認是按鍵按下key_new=0;switch(P3&0x78){case0x70:key_can=4;break; //得到按鍵值case0x68:key_can=3;break; //得到按鍵值case0x58:key_can=2;break; //得到按鍵值case0x38:key_can=1;break; //得到按鍵值}// write_sfm2(1,0,key_can); //顯示按鍵值}}elsekey_new=1;}/**********************設置函數************************/voidkey_with(){if(key_can==1) //設置鍵{{if(menu_1==2) //設置報警速度{menu_2=1;write_string(1,0,"set-sd:00km/h");write_string(2,0,"zlc:");}menu_2=1;if(menu_1>2)//回到正常顯示{menu_1=0;write_guanbiao(1,2,0); //關閉光標init_1602();//1602初始化//初始化液晶顯示}}if(key_can==2) //選擇鍵{if(menu_2==1) //設置速度{if(key_can==3) //加{bj_shudu++;if(bj_shudu>=99)bj_shudu=0;}if(key_can==4) //減{if(bj_shudu!=0)bj_shudu--;}}if(menu_2==2) //把總量程清零{if(key_can==3){zong_lc=0;}if(key_can==4){zong_lc=0;}}write_sfm2(1,7,bj_shudu);//顯示報警速度write_sfm7(2,4,zong_lc);//顯示switch(menu_2) //光標顯示{case1:write_guanbiao(1,6,1);break;case2:write_guanbiao(2,3,1);break;}write_eeprom();}}/****************報警函數***************/voidclock_h_l(){staticucharvalue;if((shudu>=bj_shudu)){value++;//消除實際距離在設定距離左右變化時的干擾{beep=~beep; //蜂鳴器報警}}else{beep=1;}}/******************主程序**********************/voidmain(){// beep=0;delay_1ms(200);P0=P1=P2=P3=0xff;//IO口初始為電平init_ds1302_io();init_ds1302();init_1602();//1602初始化init_int0();time_init(); //定時器0初始化程序init_eeprom(); //開機初始化保存的數據*while(1){ //shudu=11;key(); //按鍵程序if(key_can<10){key_with();}if(flag_200ms==1){flag_200ms=0;read_time(); //讀時間if(menu_1==0)init_1602_ds1302();//顯示時鐘menu_dis(); //計算速度函數clock_h_l();//報警函數}}}/*********************外部中斷0中斷服務程序************************/voidint0()interrupt0{staticucharvalue;switch(value){case0:t1_num=0; //第一次就把變量清零TH1=0;TL1=0;break;case1:t2_num=t1_num;//保存TH11=TH1;TL11=TL1;flag_en=1;break;}}/*************定時器0中斷服務程序***************/voidtime0_int()interrupt1{staticucharvalue;TH0=0x3c;TL0=0xb0;//50msvalue++;if(value%4==0)flag_200ms=1;if(value>=20)//1秒才是一秒鐘的速度{value=0;flag_1s=1;}}/*************定時器1中斷服務程序***************/voidtime1_int()interrupt3{t1_num++;}
4結束語經過一個月的努力我的畢業設計終于完成了,但是現在回想起來做畢業設計的整個過程,頗有心得,其中有苦也有甜,艱辛同時又充滿樂趣,不過樂趣盡在其中!通過本次畢業設計,沒有接受任務以前覺得畢業設計只是對這幾年來所學知識的單純總結,但是通過這次做畢業設計發現畢業設計不僅是對前面所學知識的一種檢驗,而且也是對自己能力的一種提高。畢業設計是我作為一名學生即將完成學業的最后一次作業,他既是對學校所學知識的全面總結和綜合應用,又為今后走向社會的實際操作應用鑄就了一個良好開端,畢業設計是我對所學知識理論的檢驗與總結,能夠培養和提高設計者獨立分析和解決問題的能力,是我在校期間向學校所交的最后一份綜和性作業。在做完成這次畢業設計的過程中,對我最難的是設計和Proteus仿真還有c語言編程,這些我基本上沒有實踐過也沒有寫出過無bug的程序,程序編寫中一次一次顯示錯誤無法正常運行的時候感覺十分糟糕。仿真軟件proteus廣泛在業界運用,但是在我眼中真的很復雜,一開始非常后悔上課不認真筆記不記全,問了老師看了視頻勉強給運行出來代碼仿真無錯的時候心里樂開了花。我從小就會騎自行車也算半個愛好者自己買的山地車上也裝有各式各樣的設備,自行車碼表也拆開看過但是那時的我并不知道原理,碼表的功能還不如現在自己設計的多。并沒有限速報警功能,現在的手機運動、共享單車只能通過gps定位來實現路程控制,并不能很準確的表達一天的騎行量騎行方式。在全球最盛名的自行車賽事--環法自行車賽中自行車碼表仍是標配。在設計中收獲了很多很多的實踐知識這是不動手絕對學不會的,看著容易做起來真的很難。還收獲了原來生活中看
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 焊接項目的成本控制試題及答案
- 電氣工程師資格考試復習的獨特視角試題及答案
- 初中歷史人教部編版七年級下冊第8課 金與南宋的對峙教案
- 2025年中國壁掛式電吹風市場調查研究報告
- 人教部編版七年級道德與法治下冊教學設計:4.1青春的情緒
- 2025年中國塑料登山扣市場調查研究報告
- 電氣工程師資格證書考試特殊題型與應對技巧分享試題及答案
- 2025年中國加料再生破碎機市場調查研究報告
- 電氣工程師資格證書考試跨學科知識應用探討試題及答案
- 如何在商務禮儀師考試中動態調整復習計劃試題及答案
- 2025河南中煙漯河卷煙廠招聘7人易考易錯模擬試題(共500題)試卷后附參考答案
- 大數據行業數據資產轉讓協議范本
- 三農村合作社應急管理方案
- s7-200smart詳細教學教案
- 旅館業治安管理培訓會
- 血透病人皮膚瘙癢課件
- 國際農業技術轉移與合作-深度研究
- 4-2-電商文案開頭、結尾、正文的寫作
- 2025年廣州水務投資集團有限公司招聘筆試參考題庫含答案解析
- 2025年江蘇揚州水利建筑工程公司招聘筆試參考題庫含答案解析
- 合肥濱湖濕地森林公園觀光火車項目設計方案
評論
0/150
提交評論