『壹』 《單片機》課程學習總結
《單片機》課程學習總結
篇一:《單片機》課程學習總結
《單片機》這門課程我已經學了一個學期了,在這一個學期的學習過程中,我一開始不怎麼懂得編程,但慢慢的我現在已經不僅會讀程序還會寫程序了。真為自己一個學期來努力學到的單片機知識只是而感到高興。
怎麼學單片機?也常看到有人說學了好幾個月可就是沒有什麼進展。當然,受限於每個人受到的教育水平不同和個人理解能力的差異,學習起來會有快慢之分,但我感覺最重的就是學習方法。一個好的學習方法,能讓你事半功倍,這里說說我學習單片機的經歷和方法。
我覺得學習單片機首先要懂得C語言,因為單片機大多說都是靠程序來實現的,如果看不懂程序或則不懂的編程是很難學會單片機的。學習單片機首先要明白一個程序是怎麼走的,要完全懂得程序每一個步驟的意思。其次要懂得每一條指令的意思,不能盲目地去靠背指令,這是記得不牢靠的,最主要的還是靠了解。學習單片機最主要的對89C51晶元內部結構有全方面的,只要了解了89C51才能知道單片機實現什麼樣的功能和作用,才能對單片機有更深一步的了解。 通過一個學期《單片機》這門課程的學習,我也從中有了不少心
得和體會想和大家分享一下。
萬事開頭難、要勇敢邁出第一步。開始的時候,不要老是給自己找借口,不要說單片機的程序全是英文,自己看不懂。遇到困難要一件件攻克,不懂指令就要勤奮看書,不懂程序就先學它,這方面網上教程很多,隨便找找看一下,做幾次就懂了。然後可以參考別的人程序,抄過來也無所謂,寫一個最簡單的,讓它運行起來,先培養一下自己的感覺,知道寫程序是怎麼一回事,無論寫大程序還是小程序,要做的工序不會差多少。然後建個程序,加入項目中,再寫代碼、編譯、運行。必須熟悉這一套工序。個人認為,一塊學習板還是必要的,寫好程序在上面運行一下看結果,學習效果會好很多,模擬器就看個人需要了。單片機是注重理論和實踐的,光看書不動手,是學不會的。
知識點用到才學,不用的暫時丟一邊。厚厚的一本書,看著人頭都暈了,學了後面的,前面的估計也快忘光了,所以,最好結合實際程序,用到的時候才去看,不必說非要把書從第一頁看起,看完它才來寫程序。比如你寫流水燈,完全就沒必要看中斷的知識,專心把流水燈學好就是了,這是把整本書化整為零,一小點一小點的啃。 程序不要光看不寫,一定要自己寫一次。最開始的時候,什麼都不懂,可以抄人家的程序過來,看看每一句是干什麼用的,達到什麼目的,運行後有什麼後果。看明白了之後,就要自己寫一次,你會發現,原來看明白別人的程序很容易,但到自己寫的時候卻一句也寫不出來,這就是差距。當你自己能寫出來的時候,說明你就真的懂了。
必須學會掌握調試程序的方法。不少人寫程序,把代碼寫好了,
然後一運行,不是自己想要的結果,就暈了,然後跑到論壇上發個帖子,把程序一貼,問:為什麼我的程序不能正常運行?然後就等別人來給自己分析。這是一種很不好的行為,應該自己學會發現問題和學會如何解決問題。這就需要學習調試程序的方法,比如KEIL里,可以下斷點啦,查看寄存器內容等等,這些都是調試程序的手段,當你發現你寫的程序運行結果和你想像中不一樣的時候,你可以單步,也可以下斷點,然後跟蹤,查看各相關寄存器內容,看看程序運行過中是不是有什麼偏差,找出影響結果的地方,改正過來。這一個過程非常重要,通過程序的排錯,你可以學到的知識是書上得不到的。
找到解決問題思路比找到代碼更重要。我們用單片機來控制周邊器件,達到我們想到的目的,這是一個題目,而如何寫出一個程序,來控制器件按你想要的結果去運作,這個就是解題的思路。要寫程序,就得先找到解決問題的思路,你學會找出這個解題思路,比你找到代碼更為重要。不少人很喜歡找人家的代碼,有的人甚至有了代碼就直接復制到自己的程序中,可以說,這不是一種學習的態度,無助於你編程水平的提高。
我幾乎不怎麼看人家的代碼,多數時候是看別人的思路,有方框圖最好,沒有的話文字說明也可以。要從代碼中看出別人處理問題的思路,是相當困難的,特別是大型的程序,看起來是非常的累人。所以現在我也明白了,以前讀書時說的程序流程圖很重要,現在算是知道了。當你知道一個問題怎麼去解決了,那麼剩下的只是你安排代碼去完成,這就已經不是什麼問題了。
開動腦筋,運用多種方法,不斷優化自己的程序。想想用各種不同方法來實現同一功能。這是一個練習和提高的過程,一個問題,你解決了,那麼你再想想,能不能換種寫法,也可以實現同一功能,或者說,你寫出來的代碼,能不能再精簡一點,讓程序執行效率更高,這個過程,就是一個進步的過程。很多知識和經驗的獲得,並不是直接寫在書讓你看就可以得到的,需要自己去實踐,開動腦筋,經驗才能得到積累,編程水平才能有所提高。
看別人的程序,學習人家的思路。這個在學習初期是很有用,通過看別人的程序,特別是老師寫出的具有一定水平的程序,可以使自己編程水平得到迅速的提高。同時,也可以結合別人的編程手法,與自己的想法融合在一起,寫出更高水平的程序,從中得到進步。但要注意,切忌將學習變成抄襲,更不是抄襲完了就認為自己學會了,這樣做只會使你退步。
嘗試編寫一下綜合應用的程序。從流水燈學起,到動態掃描,再到中斷,那麼,你可以試試寫一下時鍾這種綜合性應用的程序,不要小看時鍾,要寫好它不是一件容易的事情,它包括了單片機大部分的知識,比如有按鍵(IO讀取)、動態掃描(IO輸出)、中斷等,如何協調好各功能模塊正常工作,才是編程者需要學習的地方,當你單獨寫一個功能的時候,比如按鍵讀取,你可能感覺很容易,因為你的程序什麼也不做,只是讀按鍵。但把它和其它功能混合在一起,如何在整個程序運行中使每一部分都正常工作,這就不是寫一個按鍵讀取這么容易的事情,功能模塊之間有可能會互相影響,比如你需要讓數碼管既能顯示,又要去處理按鍵讀取,怎麼使這兩部分都正常工作,這就是一個協調過程。當你有了這個處理協調能力,你就算是入門了。
著重於培養解決問題的能力,而不是具體看自己編寫了多少程序或者做過什麼。「學單片機重點在於學習解決問題的思路,而不是局限於具體的晶元類型和語言」這一直是我的座右銘,是我學單片機學習單片機之後感悟出來的。真正的能力不是你曾經編寫過多少個可以實現的程序,而應該是:「遇到沒有解決過的問題,能利用自己已學的知識,迅速找到解決問題的方法。」這個才是能力。
面對一個新程序時,多自己開動腦筋,不要急於找別人的程序。
有不少人面對一個新程序時,第一步想到的就是網上找別人寫過的程序,然後抄一段,自己再寫幾句,湊在一起就完成任務,這雖然可能是省時間,但絕對不利你的學習。當你接到一個程序時,應該先自己構思一下整個程序的架構,想想如何來完成。有可能的話,畫一個流程圖,簡單的可以畫在腦子里,對程序中用到的數據、變數有一個初步的安排,然後自己動手去寫,遇到實在沒辦法解決的地方,再去請教老師或同學,或看別人是怎麼處理的,這樣首先起碼你自己動過腦想過,自己有自己的思路。如果你一開始就看別人的程序,你的思維就會受限在別人的思維里,自己想再創新就更難了,這樣你自己永遠也沒辦法提高,因為你是走在別人的影子里。
學會提問題。一般來說,學習過程中,你遇上的問題,多數人也有遇上的,所以如果有什麼不懂,你可以去問老師。我覺得學習單片機最主要的要多提問,對於一個自己不是太懂的程序,自己一定要多提問幾遍,這樣不但有利於加深自己的印象還能從中學到不少別人的方法。
經過一個學期我對《單片機》這門課程的學習,不僅讓我懂得了很多程序的編寫,還讓我學到了很多對自己有用的學習方法。總結這個學期來的我自己的學習情況,我覺得自己對編程進步了不少,懂得運用正確的學習方法學習單片機程序,不再去死記硬背指令了。所以我覺得學習要不斷總結學習方法,才能讓自己學習不斷進步。
交通信號燈設計報告
實驗目的: P1口的使用方法,延時程序的編寫
實驗要求:在一個十字路口分為東西南北走向,信號等按以下的狀態順序工作:
(1) 初始狀態0,東西、南北紅燈全亮。延時一定時間;
(2) 狀態1,南北綠燈亮通車,東西紅燈,延時一定時間;
(3) 狀態2,南北綠燈閃爍幾次轉黃燈,東西仍然紅燈,延時一定
時間;
(4) 狀態3,南北紅燈,東西綠燈通車,延時一定時間;
(5) 狀態4,南北仍然紅燈,東西綠燈閃爍幾次轉黃燈,延時一定
時間;
(6) 循環至狀態1,繼續
實驗電路和流程框架圖:
(1) 硬體電路
交通燈實訓設備用最小系統板和信號燈組合而成。
2、軟體編程
若各路口燈亮滅的時間間隔為2s鍾,燈光閃爍時間間隔為0.5s。用軟體延時的方法,晶振頻率12MHz時,一個機器周期為1us。
編寫交通信號燈程序:
編寫主程序,由R7做主程序的計數器,確定調用延時時間為0.5s,從而獲得交通燈的亮滅時間。
篇二:《單片機》課程學習總結
時光飛逝,一轉眼,一個學期又進尾聲了,本學期的單片機課程也結束,但通過這次單片機的學習,我不僅加深了對單片機理論的理解,將理論很好地應用到實際當中去,而且我還學會了如何去培養我們的創新精神,從而不斷地戰勝自己,超越自己。創新可以是在原有的基礎上進行改進,使之功能不斷完善,成為真己的東西。
當今社會隨著電子技術的發展,特別是隨著大規模集成電路的產生,給人們的生活帶來了根本性的變化,如果說微型計算機的出現使現代的科學研究得到了質的飛躍,那麼可編程式控制制器的出現則是給現代工業控制測控領域帶來了一次新的革命。在現代社會中,溫度控制不僅應用在工廠生產方面,其作用也體現到了各個方面。本學期我們就學習了單片機這門課程,感覺是有點難呢。也不知道整個學習過程是怎麼過來得,可是時間不等人。
剛開始學習的時候,對單片機沒有什麼認識,不知道什麼是單片機,更不知道它有什麼作用。通過學習才大體知道了單片機的一些知識。單片機是一塊在集成電路晶元上集成了一台有一定規模的微型計算機。簡稱為:單片微型計算機或單片機。單片機的應用到處可見,應用領域廣泛,主要應用在智能儀表、實時控制、通信、家電等方面。由中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、I/O介面、定時器/計數器以及串列通信介面等集成在一塊晶元上,構成了一個單片微型計算機,簡稱為單片機。它的應用范圍很廣,在工業自動化中應用有數據採集、測控技術。
在智能儀器儀表中應用有數字示波器、數字信號源、自動取款機等。在消費類電子產品中應用有空調機、電視機、微波爐、手機、IC卡、汽車電子設備等。在通訊方面應用有手機、小靈通等。在武器裝備方面應用有飛機、坦克、導彈、太空梭、智能武器等。剛開始學習時只能抄寫別人做成功的程序,一遍一遍的寫,從簡單的入手,逐步的積累,一步步的能夠將小的程序結合到一起,拼接成較為復雜一些的程序。但是程序不要只是看別人得,一定要自己寫過才是自己的。只有當你自己能寫出來的時候說明你真懂了。剛接觸KEIL時確實很讓人頭疼,使用 KEIL不會建項目、不會使用實驗板。然後可以參考已經成功的程序,抄過來,寫一個最簡單的,讓它運行起來,先培養一下自己的感覺,先建個項目,再配置一下項目,然後建個程序,加入項目中,再寫代碼、編譯、生成HEX,刷進單片機中、運行。其實當遇到問題一定要自己嘗試著解決,不能遇到問題就去問別人,自己一定要掌握解決問的方法和思路。對一個新項目時,自己一定要多想想,不要急著去看別人是怎麼寫的。應該先想一下程序的構架,想想如何來完成。然後自己動手去寫,理清自己的思路這樣更容易提高自己。
熟悉單片機的人都知道,要學好單片機可不是一件容易的事,倒不是因為單片機很難學,而是很難找到一本專為單片機入門者而編寫的教材。翻一下身邊的單片機教材,都好像是為已經懂單片機的人而寫的,一般先介紹單片機的硬體結構和指令系統,再是系統擴展和外圍器件,順便講一些應用設計(隨便說一下,很多書中的電路設計已經過時,並且有些程序還是錯誤的`)。如果按照此種學習方法,想進行產品開發,就必須先把所有的知識全部掌握了才可以進行實際應用。學習使用單片機只能靠循序漸進的積累,雖然單片機的課程只上了幾節就去上班了,但在學習的過程中有了一定的了解。下面就本人學習單片機的過程和經驗做簡要介紹。
首先,學習單片機要有一定的基礎:電子技術方面要有數字電路和模擬電路等方面的理論基礎,特別是數字電路;編程語言要求匯編語言或C語言。要想成為單片機高手,建議初學者首先學習匯編語言,學的差不多的時候,轉入C語言學習。盡管匯編語言屬於低級語言,編程效率低,但是較C語言具有目標代碼簡短,佔用內存少,執行速度快等優點,更重要的是能使初學者盡快熟悉單片機的內部結構,並能對其進行精確的控制。匯編語言在單片機教材裡面都會涉及,不需要單獨購買教材和學習。C語言是一門學問,有很多專業書籍來講解,並且對我們今後的編程生涯有絕對的好處,因此要深入學習,千萬不要自以為看了某某的視頻教程就以為掌握了C語言,那隻是C語言的一部分。在這里給大家推薦一本單片機C語言程序設計參考書,馬忠梅等著,北京航空航天大學出版社出版的《單片機的C語言應用程序設計》,要求C語言基礎。如果沒學過C語言,建議學習清華大學譚浩強編寫的C語言程序設計,這本書寫的不錯,通俗易懂。
其次,是單片機教材選擇。單片機是一門非常重視實踐的技術,不能總是看書,但要學習它首先應看書,對單片機引腳、內部結構、寄存器和原理有一定地了解和感官認識,它的是怎樣工作的,能幹些什麼?剛開始時,也許你看不明白,但這並不要緊,因為你還缺乏實踐經驗。現在單片機應用廣泛,因此各個廠家分別推出了自己的單片機,我們沒必要每樣都學!因為他們的編程方法和調試過程以及內部指令結構有一定的相似,只要學精通一款就OK了!尤其是用C語言編程,就幾乎不用分什麼派系,但是我們要選擇一款有代表性的知識范圍廣,並且入門容易,書籍多。一般來說,MCS-51系列單片機已經得到廣泛的普及和應用,市場上它的資料也比較多,用的人也很多。給大家推薦一些參考書,學習時只需要一本就足夠拉。書名:《新編MCS-51單片機應用設計》,哈爾濱工業大學出版,作者:張毅剛;書名:《單片機原理及應用》,高等教育出版社,作者:張毅剛等;書名:《單片機高級教程:應用與設計》,北京航空航天大學出版社,作者:何立民。相關教材還有很多,在這不一一列舉。
然後,是開發工具和開發環境的選擇。選擇一塊合適的學習板,對於初學者來說一般無力接受,如果經濟條件允許、本人又對單片機很感興趣、有從事相關工作意向的話,鼓勵大家購買。隨便說一句,學習板功能要求太全,具有流水燈、數碼管、獨立鍵盤、矩陣鍵盤、AD或DA、液晶、蜂鳴器等就差不多啦,畢竟,功能齊全的價格比較高。模擬器對單片機初學者來說既是那麼耳熟,同時又有些陌生,這主要是因為市場上傳統的模擬器價格都在千元以上,對經濟不是非常寬裕的人來說是不小的開支。同時模擬器是用來提高調試程序效率的,也不是非需不可的,如果你沒有模擬器,遇到程序出錯的時候,只好苦思冥想,反復燒寫調試。
隨便推薦一下,學林電子的51tracer模擬器,有興趣的朋友可關注一下。有了單片機教程板以後,先看下指導說明書,熟悉一下學習板,開卷有益。以後就得靠自己多練習了,將學習板與電腦連接好,先學會開發軟體的使用,然後從最簡單的流水燈實驗做起,按照你自己的意願控制流水燈,當你完成時,你會發現這是多麼愜意的事情。太好玩了,你會覺得這不是在學習,而是在玩,當你發現,單片機能夠按照你編寫的程序工作時,你會覺得非常興奮,比做什麼事情都開心,這樣你會慢慢迷上單片機,真的。不少網站上說搞定某個實驗,就恭維的告訴你一聲」恭喜你,學會了」自己學會了單片機,這有點可笑,這只能說明你算過關了,對單片機有了一定了解和會使用它了。但是單片機能完成的功能太多了,尤其是對外圍器件的控制,綜合起來能設計出許多意想不到的產品.因此除了入門外,精通可千萬別輕易說出口。
最後,在熟練掌握和應用後,那可以說對於單片機方面的硬體你已經入門了,剩下的就是自己練習設計開發各種課題,不斷的積累經驗。最終,自己完全設計具有個人風格的課題,產品,這樣你就是單片機高手拉。只要過了第一關,後面的路就好走多了,萬事開頭難,這大家可能都聽過。
有時候單片機的學習很單調,有些知識學起來很抽象,不容易理解,只能慢慢適應,一邊學習理論知識,一邊編寫程序,將程序刷入單片機進行調試,通過這種方式才能更快速的學習單片機。要堅定自己的學習信心,在付出持之以恆的努力,我相信自己能進一步加深對單片機的了解,在單片機的學習道路上走得更遠!
;『貳』 學習單片機課程的核心是什麼
單片機的主要學習內容是:
1、存儲器結構:包括程序存儲器、RAM(工作寄存器、位寄存器、用戶寄存器、特殊功能寄存器、擴展RAM)
2、中斷資源:外部中斷、定時器中斷、串口中斷等
3、IO口:很多IO都是復用的,所以需要弄清楚具體意義及控制方法
4、各個功能模塊:如RS232、SPI、定時計數器、I2C、PWM、WATCHDOG等等,這些模塊有的單片機只有其中之一,有的多些。
5、最好學一下匯編,這樣有利於你更好的理解這些東西。
『叄』 單片機要學哪些課程才能學好
單片機是一種集成電路晶元。
單片機是採用超大規模集成電路技術把具有數據處理能力的中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統、定時器/計數器等功能;
還包括顯示驅動電路、脈寬調制電路、模擬多路轉換器、A/D轉換器等電路,集成到一塊矽片上構成的一個小而完善的微型計算機系統,在工業控制領域廣泛應用。
相關歷史沿革:
從上世紀80年代,由當時的4位、8位單片機,發展到現在的300M的高速單片機。單片機的使用領域已十分廣泛,如智能儀表、實時工控、通訊設備、導航系統、家用電器等。
各種產品一旦用上了單片機,就能起到使產品升級換代的功效,常在產品名稱前冠以形容詞——「智能型」
日常生活中,單片機經常可以看見,但是即使如此,也有很多人不知道單片機是什麼?簡單來說單片機就是一個晶元,不過這個晶元屬於高度集成的電路晶元,是一個非常小的計算機系統,我想此時應該有很多人好奇單片機究竟是什麼?接下來我就向大家詳細介紹一下單片機是什麼吧。
單片機定義
單片機,又叫做單片微控制器,英文名稱叫做Microcontrollers,它是一種特殊的晶元,而且晶元裡面的電路是非常密集的,另外正是這些電路把中央處理器CPU、I/O口、存儲器ROM等功能集中到一起,單片機跟計算機相比較而言,其功能大部分還是一樣的,除了單片機不具備I/O設備而已,但是單片機的體積和價格要小於計算機,而且單片機攜帶起來更方便。
從20世紀80年代開始,單片機就一直保持著快速的發展,就其發展歷程來說,從最初的4位單片機、8位單片機,發展到如今的300m單片機。
單片機的應用分類
一般來說,單片機的應用分類有三種,即通用型、控制型、匯流排型。
單片機的基本結構
單片機的基本結構非常的簡單,有三部分組成,即運算器、主要寄存器、控制器。主要寄存器又包括五種,即累加器A、數據寄存器DR、指令寄存器IR和指令解碼器ID、程序計數器PC、地址寄存器AR。
單片機的應用范圍
單片機的應用范圍從最初的只運用工業方面,發展到現在的多方位、寬領域,基本上每個領域每個行業都會運用到單片機,尤其是科技技術含量高的行業,例如:汽車、網路通信、家用電器、智能機器等。
單片機的特性
單片機的特性非常的多,下面我就具體來說說吧。
1、單片機的體積很小、攜帶起來非常的方便。
2、單片機的可靠性非常的的強,它可以連續工作一天都沒問題。
3、單片機耗電、耗能非常的小。
4、單片機的操作非常的方便。
5、單片機的適應能力很強。
6、單片機的結構組成非常的簡單,使用起來非常的方便。
『肆』 單片機 匯編語言編程設計 廣告燈設計
免費讓人給你設計的話,那你還是別想了,如果是想花錢的話,可以上威客網上發布任務,找專業人士幫你設計呢,而且還會有很多個選擇讓你選,花一份錢,能看到很多個設計作品,絕對夠你選,威客網上的威客,都是很有創意的,給你推薦一個威客網,任務中國,注冊方便省事。
『伍』 單片機和單片機課程設計是一門課嗎
單片機應該是講單片機原理的課程,屬於理論性較強的課程,單片機的編程不是這門課的重點。單片機課程設計屬於單片機教學方面的課程。單片機編程是重點教授單片機程序設計的課程,都有很大區別,側重點不一樣。
『陸』 單片機課程設計(數字時鍾) 麻煩大家不要發鏈接 直接幫我把程序寫過來。
哈哈有個1602顯示的不過程序太長貼不上給你個數碼管的吧不行再聯系
1302.c
#include<DS1302.h>
#include<key.h>
ucharbit_ser[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
ucharseven_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/***********************時間顯示*****************/
voidtimer0_init(void) //T0初始化函數,用於時間的動態顯示
{
TMOD=0x21;
TL0=(65536-5000)%256;
TH0=(65536-5000)/256;
EA=1;
ET0=1;
TR0=1;
}
voidtimer0_isr(void)interrupt1 //T0中斷處理函數
{
charflag; //flag用於表示調整時閃爍的亮或滅
TR0=0;
TL0=(65536-5000)%256;
TH0=(65536-5000)/256;
TR0=1;
flag=x/100*0xff; //設置閃爍標志,如果x大於100則flag為0xff,小於100則為0x00
x++;
if(x>200)
x=0;
switch(i)
{
case0:
P2=bit_ser[0];
if(setflag==3) //根據setflag的值判斷當前位是否需要閃爍
P0=flag|seven_seg[dis_buffer[0]];
else
P0=seven_seg[dis_buffer[0]];
break;
case1:
P2=bit_ser[1];
if(setflag==3)
P0=flag|seven_seg[dis_buffer[1]];
else
P0=seven_seg[dis_buffer[1]];
break;
case2:
P2=bit_ser[2];
if(setflag==2)
P0=flag|seven_seg[dis_buffer[2]];
else
P0=seven_seg[dis_buffer[2]];
break;
case3:
P2=bit_ser[3];
if(setflag==2)
P0=flag|seven_seg[dis_buffer[3]];
else
P0=seven_seg[dis_buffer[3]];
break;
case4:
P2=bit_ser[4];
if(setflag==1)
P0=flag|seven_seg[dis_buffer[4]];
else
P0=seven_seg[dis_buffer[4]];
break;
case5:
P2=bit_ser[5];
if(setflag==1)
P0=flag|seven_seg[dis_buffer[5]];
else
P0=seven_seg[dis_buffer[5]];
break;
}
i++;
if(i>=6)
{
i=0;
if(j==10)
{
j=0;
if(setflag==0)
DS1302_GetTime(&Time); //如果setflag是0,就從1302中讀出時間,因為setflag不是0時,說明處於調整狀態,不需要讀時間
dis_buffer[5]=Time.Second%10; //把當前時間放入顯示緩沖區
dis_buffer[4]=Time.Second/10;
dis_buffer[3]=Time.Minute%10;
dis_buffer[2]=Time.Minute/10;
dis_buffer[1]=Time.Hour%10;
dis_buffer[0]=Time.Hour/10;
}
j++;
}
}
voidmain()
{
Initial_DS1302(Time);
timer0_init();
while(1)
{
set_down();
timer_down();
up_down();
down_down();
beepflag_down();
if(setflag==0&&Time.Hour==romhour&&Time.Minute==romminute&&Beepflag==1) //判斷蜂鳴器是否要響
Beep=!Beep;
}
}
//key.c
#include<reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
uchari=0,j=0,x=0,setflag,flag_set,flag_timer;//setflag用來表示調整的位置,flag_set和flag_timer分別表示當前處於調整狀態還是定時狀態
SYSTEMTIMETime={0,20,15,3,30,6,10}; //系統時間的初始值2010年6月30日星期三,15時20分0秒
chardis_buffer[6]; //存放顯示數據的緩沖區
sbitBeep_flag=P3^2; //蜂鳴器的介面
sbitkey_timer=P3^4; //定時按鈕
sbitkey_set=P3^5; //調整按鈕
sbitkey_up=P3^6; //增加按鈕
sbitkey_down=P3^7; //減小按鈕
charromhour,romminute,romsec; //分別存放定時的時,分,秒
bitBeepflag; //標記鬧鍾是否開啟
//延時函數
voiddelays(ucharx)
{
while(x)x--;
}
//設置鍵的處理函數
voidset()
{
setflag++;
flag_set=1;
if(setflag>=4)
{
setflag=0;
flag_set=0;
Initial_DS1302(Time);
}
}
//定時間的處理函數
voidtimer()
{
setflag++;
flag_timer=1;
if(setflag==1)
{
Time.Hour=romhour;
Time.Minute=romminute;
Time.Second=romsec;
}
elseif(setflag>=4)
{
setflag=0;
flag_timer=0;
romhour=Time.Hour;
romminute=Time.Minute;
romsec=Time.Second;
}
}
//增加鍵的處理函數
voip()
{
switch(setflag)
{
case0:
break;
case1:
Time.Second++;
if(Time.Second>=60)
Time.Second=0;
break;
case2:
Time.Minute++;
if(Time.Minute>=60)
Time.Minute=0;
break;
case3:
Time.Hour++;
if(Time.Hour>=24)
Time.Hour=0;
break;
}
}
//減小鍵的處理函數
voiddown()
{
switch(setflag)
{
case0:
break;
case1:
Time.Second--;
if(Time.Second<0)
Time.Second=59;
break;
case2:
Time.Minute--;
if(Time.Minute<0)
Time.Minute=59;
break;
case3:
Time.Hour--;
if(Time.Hour<0)
Time.Hour=23;
break;
}
}
//設置鍵的掃描函數
voidset_down()
{
if(key_set==0&&flag_timer==0)
{
delays(100);
if(key_set==0)
{
set();
}
while(!key_set);
}
}
//定時鍵的掃描函數
voidtimer_down()
{
if(key_timer==0&&flag_set==0)
{
delays(100);
if(key_timer==0)
{
timer();
}
while(!key_timer);
}
}
//增加鍵的掃描函數
voip_down()
{
if(key_up==0&&setflag!=0)
{
delays(100);
if(key_up==0)
{
up();
while(!key_up);
}
}
}
//減少鍵的處理函數
voiddown_down()
{
if(key_down==0&&setflag!=0)
{
delays(100);
if(key_down==0)
{
down();
while(!key_down);
}
}
}
//定時開關的掃描處理函數
voidbeepflag_down()
{
if(Beep_flag==0)
{
delays(100);
{
Beepflag=!Beepflag;
while(!Beep_flag);
}
}
}
//ds1302.h
#ifndef_REAL_TIMER_DS1302
#define_REAL_TIMER_DS1302
#include<REG51.h>
sbitDS1302_CLK=P1^1;//實時時鍾時鍾線引腳
sbitDS1302_IO=P1^2;//實時時鍾數據線引腳
sbitDS1302_RST=P1^3;//實時時鍾復位線引腳
sbitACC0=ACC^0;
sbitACC7=ACC^7;
sbitBeep=P2^7;
typedefstruct__SYSTEMTIME__
{ charSecond;
charMinute;
charHour;
charWeek;
charDay;
charMonth;
charYear;
}SYSTEMTIME; //定義的時間類型
#defineAM(X) X
#definePM(X) (X+12) //轉成24小時制
#defineDS1302_SECOND 0x80//秒寄存器
#defineDS1302_MINUTE 0x82//分寄存器
#defineDS1302_HOUR 0x84
#defineDS1302_WEEK 0x8A
#defineDS1302_DAY 0x86
#defineDS1302_MONTH 0x88
#defineDS1302_YEAR 0x8C
#defineDS1302_RAM(X) (0xC0+(X)*2) //用於計算DS1302_RAM地址的宏
voidDS1302InputByte(unsignedchard) //實時時鍾寫入一位元組(內部函數)
{unsignedchari;
ACC=d;
for(i=8;i>0;i--)
{ DS1302_IO=ACC0; //相當於匯編中的RRC
DS1302_CLK=1;
DS1302_CLK=0;//發一個高跳變到低的脈沖
ACC=ACC>>1;
}
}
unsignedcharDS1302OutputByte(void) //實時時鍾讀取一位元組(內部函數)
{ unsignedchari;
for(i=8;i>0;i--)
{ ACC=ACC>>1; //相當於匯編中的RRC
ACC7=DS1302_IO;
DS1302_CLK=1;
DS1302_CLK=0;//發一個高跳變到低的脈沖
}
return(ACC);
}
voidWrite1302(unsignedcharucAddr,unsignedcharucDa)//ucAddr:DS1302地址,ucData:要寫的數據
{ DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr); //地址,命令
DS1302InputByte(ucDa); //寫1Byte數據
DS1302_CLK=1;
DS1302_RST=0;//RST0->1->0,CLK0->1
}
unsignedcharRead1302(unsignedcharucAddr) //讀取DS1302某地址的數據
{ unsignedcharucData;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;//enable
DS1302InputByte(ucAddr|0x01);//地址,命令
ucData=DS1302OutputByte();//讀1Byte數據
DS1302_CLK=1;//RST0->1->0,CLK0->1
DS1302_RST=0;
return(ucData);
}
voidDS1302_SetProtect(bitflag)//是否防寫
{ if(flag)
Write1302(0x8E,0x80);//WP=1,不能寫入
else
Write1302(0x8E,0x00);//WP=0,可以寫入
}
voidDS1302_SetTime(unsignedcharAddress,unsignedcharValue)//設置時間函數
{ DS1302_SetProtect(0);
Write1302(Address,((Value/10)<<4|(Value%10)));//高4位為十位,低4位為個位
DS1302_SetProtect(1);
}
//獲取時間函數,從DS1302內讀取時間然後存入Time內
voidDS1302_GetTime(SYSTEMTIME*Time)
{ unsignedcharReadValue;
ReadValue=Read1302(DS1302_SECOND);
Time->Second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//轉換成10進制的秒
ReadValue=Read1302(DS1302_MINUTE);
Time->Minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
ReadValue=Read1302(DS1302_HOUR);
Time->Hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
ReadValue=Read1302(DS1302_DAY);
Time->Day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
ReadValue=Read1302(DS1302_WEEK);
Time->Week=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
ReadValue=Read1302(DS1302_MONTH);
Time->Month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
ReadValue=Read1302(DS1302_YEAR);
Time->Year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
}
//利用STime初始化DS1302
voidInitial_DS1302(SYSTEMTIMESTime)
{ unsignedcharSecond=Read1302(DS1302_SECOND);
if(Second&0x80) DS1302_SetTime(DS1302_SECOND,0);//如果第七為1(表明沒有啟動),則啟動時鍾
DS1302_SetTime(DS1302_SECOND,STime.Second); //設定起始時間
DS1302_SetTime(DS1302_MINUTE,STime.Minute);
DS1302_SetTime(DS1302_HOUR,STime.Hour);
DS1302_SetTime(DS1302_DAY,STime.Day);
DS1302_SetTime(DS1302_MONTH,STime.Month);
DS1302_SetTime(DS1302_YEAR,STime.Year);
DS1302_SetTime(DS1302_WEEK,STime.Week);
}
#endif
『柒』 學習單片機需要哪些課程,單片機工程師的就業前景如何
單片機怎麼入門?
http://hi..com/mcu%5Fdesigner/blog/item/f8b3a75488de5a511138c25f.html
你看了這篇文章就明白了
『捌』 談談對單片機課程的理解認識意見和建議
單片機又稱單片微控制器,它不是完成某一個邏輯功能的晶元,而是把一個計算機系統集成到一個晶元上。
概括的講:一塊晶元就成了一台計算機。它的體積小、質量輕、價格便宜、為學習、應用和開發提供了便利條件。同時,學習使用單片機是了解計算機原理與結構的最佳選擇。
單片機內部也用和電腦功能類似的模塊,比如CPU,內存,並行匯流排,還有和硬碟作用相同的存儲器件,不同的是它的這些部件性能都相對我們的家用電腦弱很多,不過價錢也是低的,一般不超過10元即可......用它來做一些控制電器一類不是很復雜的工作足矣了。我們現在用的全自動滾筒洗衣機、排煙罩、VCD等等的家電裡面都可以看到它的身影!......它主要是作為控制部分的核心部件。 它是一種在線式實時控制計算機,在線式就是現場控制,需要的是有較強的抗干擾能力,較低的成本,這也是和離線式計算機的(比如家用PC)的主要區別。
單片機是靠程序的,並且可以修改。通過不同的程序實現不同的功能,尤其是特殊的獨特的一些功能,這是別的器件需要費很大力氣才能做到的,有些則是花大力氣也很難做到的。
一個不是很復雜的功能要是用美國50年代開發的74系列,或者60年代的CD4000系列這些純硬體來搞定的話,電路一定是一塊大PCB板!但是如果要是用美國70年代成功投放市場的系列單片機,結果就會有天壤之別!只因為單片機的通過你編寫的程序可以實現高智能,高效率,以及高可靠性!
由於單片機對成本是敏感的,所以目前占統治地位的軟體還是最低級匯編語言,它是除了二進制機器碼以上最低級的語言了,既然這么低級為什麼還要用呢?很多高級的語言已經達到了可視化編程的水平為什麼不用呢?原因很簡單,就是單片機沒有家用計算機那樣的CPU,也沒有像硬碟那樣的海量存儲設備。
一個可視化高級語言編寫的小程序裡面即使只有一個按鈕,也會達到幾十K的尺寸!對於家用PC的硬碟來講沒什麼,可是對於單片機來講是不能接受的。 單片機在硬體資源方面的利用率必須很高才行,所以匯編雖然原始卻還是在大量使用。
一樣的道理,如果把巨型計算機上的操作系統和應用軟體拿到家用PC上來運行,家用PC的也是承受不了的。 可以說,二十世紀跨越了三個「電」的時代,即電氣時代、電子時代和現已進入的電腦時代。
不過,這種電腦,通常是指個人計算機,簡稱PC機。它由主機、鍵盤、顯示器等組成。還有一類計算機,大多數人卻不怎麼熟悉。這種計算機就是把智能賦予各種機械的單片機(亦稱微控制器)。顧名思義,這種計算機的最小系統只用了一片集成電路,即可進行簡單運算和控制。因為它體積小,通常都藏在被控機械的「肚子」里。
它在整個裝置中,起著有如人類頭腦的作用,它出了毛病,整個裝置就癱瘓了。現在,這種單片機的使用領域已十分廣泛,如智能儀表、實時工控、通訊設備、導航系統、家用電器等。
各種產品一旦用上了單片機,就能起到使產品升級換代的功效,常在產品名稱前冠以形容詞——「智能型」,如智能型洗衣機等。
現在有些工廠的技術人員或其它業余電子開發者搞出來的某些產品,不是電路太復雜,就是功能太簡單且極易被仿製。究其原因,可能就卡在產品未使用單片機或其它可編程邏輯器件上。
『玖』 樂博樂博的單片機能學到什麼有誰知道
單片機是從基礎的Scratch動畫編程和單片機模塊開始學起,能接觸到信號顯示部件(LED)、動力部件(直流馬達、伺服馬達)、數字感測器部件(接觸感測器、紅外感測器等)、模擬感測器部件(陀螺儀、溫度感測器、光線感測器等)等各種部件原理、應用和編程。目前還新加入了感知AI技術。
因為課程接觸的知識點比較多,所以學習單片機分為6期,需要從初級課程,也就是理論知識開始學起。學習半年也就剛學習到皮毛,怎麼可能做出來機器人。要想學習單片機機器人,就要堅持,還有看孩子的愛好和興趣。可網路了解更多詳情。