TOP
0
0
即日起~6/30,暑期閱讀書展,好書7折起
手把手教你學51單片機(C語言版)(簡體書)
滿額折

手把手教你學51單片機(C語言版)(簡體書)

商品資訊

人民幣定價:55 元
定價
:NT$ 330 元
優惠價
87287
領券後再享88折起
海外經銷商無庫存,到貨日平均30天至45天
可得紅利積點:8 點
相關商品
商品簡介
作者簡介
名人/編輯推薦
目次
書摘/試閱

商品簡介

《手把手教你學51單片機(C語言版)》旨在培養和鍛煉單片機系統實用開發技能,全書以實踐為主線,讓讀者在一個個實踐案例中逐步掌握單片機電路設計與程式碼編寫能力。書中的內容從最初點亮一個小燈的簡單實驗,逐步擴展知識面,到最後多功能電子鐘的實際專案開發指導,不僅講解了大量原理性知識,更重要的是給讀者提供了實際專案開發的思路和經驗,可以讓讀者從實踐過程中提高自己發現問題、分析問題、解決問題的能力。本書的參編人員都是擁有多年實際專案研發經驗的資深工程師,因此書中的內容涵蓋了大量的實際項目中所採用的技術和技巧,具有極強的即時性和先進性,為讀者鋪就一條從單片機初學者晉級為工程師的康莊大道。本書適合剛剛接觸單片機的初學者自學閱讀,又可以作為各類院校電子技術相關專業的單片機教材,同時對電子行業的從業技術人員也有很高的參考價值。

作者簡介

宋雪松:國內知名單片機培訓專家,嵌入式產品技術顧問。擁有近十年產品研發經驗,曾主持研發通信類、虛擬儀器等多款產品,在硬體電路設計和嵌入式軟體設計方向有豐富的專案實戰經驗。2010年創立金沙灘工作室(www.kingst.org),致力於實用化的單片機技術教育,出品《手把手教你學51單片機》視頻教程,該教程以通俗的語言、專業的思路和精湛的技術獲得了廣大讀者一致好評,廣為傳播。

名人/編輯推薦

編輯推薦
《手把手教你學51單片機(C語言版)》的創作,目的就是改變當前“51單片機”教學與自學的模式;所以這本書的創作過程已經創造了諸多業界第一:國內首創“手把手教你學”——集理論知識、視頻教程、教學課件與技術支持於一體的教學解決方案!未出版圖書就接收到數百份訂單!本科院校、職業院校的多名主講教師閱讀樣章後一致認同並採用為教材(對於購買教師讀者,將遴選贈送開發板)。可以預見,《手把手教你學51單片機(C語言版)》將引領一場單片機教學的革命!

媒體評論

何賓(博士,暢銷書《Xilinx FPGA設計權威指南》作者)
在該書出版前夕,很榮幸有機會閱讀了樣章。整體感覺是這本書具有突出的原創性和優秀的實踐性!作者是真正在用“心”寫書,為什麼這麼說呢?這本書其實就是作者在和讀者分享自己學習單片機的歷程。作為一個工程師,作者從系統的角度,告訴讀者學習單片機的方法,而不是就事論事地單純講應用。本書始終圍繞著一個主題,即告訴讀者如何根據不同應用要求,構建相關硬體介面和設計軟體程式。書中給出的實例,基本上涵蓋了單片機最為典型的應用場合。該書為讀者提供了完備的學習生態系統,包括視頻、課件、開發板和論壇。這樣,讀者和作者之間就建立了一個很好的交流平臺,有利於高效學習。
於寅虎(電子產品世界總編)
20世紀80年代誕生以來,8051就從未離開過嵌入式應用開發工程師的視線。在30多年的歷程中,以8051為內核的單片機在結構、功能和開發語言等方面一直不斷演進,至今仍被大量應用於各種電子設備,仍有大批的電子工程師採用8051單片機從事嵌入式系統的開發。作為微控制器的鼻祖,8051奠定了嵌入式晶片系統的經典體系結構; 掌握8051的開發應用,有利於從事更高層次的嵌入式開發系統的學習。該書的突出特點就是緊跟時代步伐,從實戰角度論述,其設計思路、程式設計技巧和程式演算法源於實踐。作者能夠靈活運用C語言的指標和結構體,可以將已呈現SoC特徵的8051的性能發揮到極致。希望讀者能夠從8051開始,開啟美妙的嵌入式開發之旅。
楊暉(電子技術應用副總編)
宋雪松是一個電子技術的追夢人!他在追逐單片機的道路上,摸過燒紅的鐵塊,有過無數的坎坷; 幸運的是,他堅持學習,勇於突破,終於成長為一名有理想、有本領的嵌入式工程師。該書是作者總結多年的學習經驗和培訓經歷,凝練出的單片機學習的最佳實踐途徑。該書摒棄了傳統的“先講基本原理再舉例”的學習套路,以一個個專案實例為載體,理論聯繫實踐,手把手教會讀者掌握單片機系統設計的方法和技巧; 是一本極具變革思想的前沿教材,推薦閱讀!
劉繼曾(教師,羅定職業技術學院)
站在單片機初學者的角度,尤其是高職高專的廣大師生的立足點,學習單片機的目標就是成長為單片機開發工程師。該書通過一個個獨立的模組講解,然後綜合這些模組開發實際專案——這正是我們學習單片機的最有效的途徑!甚至可以說,這本書是單片機學習的里程碑著作,值得學習,值得珍藏。
吳常玉(青島東軟載波科技股份有限公司,高級嵌入式系統工程師)
毫無疑問,宋雪松這本《手把手教你學51單片機(C語言版)》既有較高的專業技術含量又通俗易懂,還附贈大量超值服務。想當初,本人在單片機與嵌入式系統學習的過程中,是摸著石頭過河,走過不少彎路。現在想想,如果一開始就遇到了這樣一本書,“手把手”地學習下來,至少可以節省兩三年的摸索時間。真心希望更多的電子初學者們讀到此書,提高學習效率。
夏皓(上海讀者)
我以前從未期待過某本書出版,但是自從得知《手把手教你學51單片機(C語言版)》要出版的消息後,我就越來越期待宋雪松老師撰寫的這本書了,很榮幸現在有幸先睹為快。讀過很多書,很多技術類圖書即使貼有“初學”、“入門”的標籤,也僅僅是標榜。而宋雪松老師是真正注重入門讀者的問題,該書以通俗、生動的語言解釋了複雜的知識,避免了晦澀難懂的專業術語,同時又不失培養讀者學習行業規範,是一本極好的入門教材!
白一哲(廣州讀者)
我很久沒有看到過這麼好的教材了,好像正好你想知道什麼它就告訴你什麼,你缺什麼它就給你講解什麼。宋雪松老師一定是傾其全力,把寶貴的學習和教學經驗奉獻給了讀者; 尤其是書中的實戰項目,更是讓人耳目一新。我目前只閱讀到了文字教程,還沒有看視頻教程,非常期待!也更期待宋老師後續出版更高級的教程,可以領單片機初學者走出迷茫,成長為成熟的單片機工程師。
劉蛟宇(深圳讀者)
《手把手教你學51單片機(C語言版)》有個鮮明的特點:“實踐總結理論,理論指導實踐”。該教程善於“手把手”地帶領讀者去做各種奇妙的實驗,接著“手把手”地剖析與之緊密聯繫的數電、C語言等理論根基,而後又利用這些理論去把前面的實驗做改善或演變。其中的樂趣會強烈地吸引著你去“動手實踐”,去“舉一反三”!

前言
為什麼要寫這樣一本書
單片機技術是現代工業自動化、電子電氣、通信及物聯網等領域的一門主流技術。隨著人們生活及生產方式的自動化、智慧化程度越來越高,單片機技術早已融入我們生活的每一個角落,幾乎所有的家電內部都有單片機的身影,無數的自動化及智慧公共設施也都有單片機在其背後兢兢業業地工作著。同時,單片機技術也是學習ARM嵌入式系統、FPGA設計等更高階技術的一個基礎。
很多同學都想學好單片機技術,可能看了不少書,也付出了很多的努力,但卻總感覺似懂非懂,遇上具體專案也很茫然而無從入手。目前市面上關於單片機開發的書有很多,但絕大多數,要麼是過於理論化,全是架構講述和彙編指令等,學了半天仍不知單片機為何物。要麼只是一些很簡單的小實驗,學完後也只能做到點亮個小燈、顯示個數位等,C語言指標都沒有用到過,綜合實踐的例子更是一個沒有。在學完這類教材後無法深入下去,很難跟實際專案開發銜接起來,於是可能會懷疑自己的能力,適不適合搞單片機。
從作者多年從事單片機領域的工作經驗來說,單片機這東西,要說難的話真不怎麼難,外行人看起來可能挺神秘,其實主要是沒人幫忙去點破各種緣由,學不會的主要原因是方法不對頭,沒有專業的人員帶領大家入門。
基於這些原因,我們編寫了這本《手把手教你學51單片機(C語言版)》,並且配套了相關的視頻教程、電子教案、原始程式碼和實驗開發板(詳情點擊www.kingst.org),手把手地帶領大家來學習單片機技術,給單片機初學者帶來福音,讓大家一步一個腳印地掌握單片機技術。
《手把手教你學51單片機(C語言版)》這本書除了講解簡單的實驗和程式設計語法、由淺入深地講解單片機技術和C語言程式設計技巧外,更重要的是結合了多個模組,以實際工程項目的程式設計規則來逐步帶領大家學習實際開發中的電路設計和程式設計思路。尤其是C語言的指標和結構體的靈活運用、單片機的多模組程式設計、實際專案開發流程指導等,更是當前單片機類教材中少見的瑰寶。通過對本教材的透徹掌握,可以使讀者在進入公司後能夠快速適應並能承擔實際的專案開發,可以說這本教材為同學們搭建了從初學者步入工程師殿堂的橋樑。
本書特色
1) 實踐為主,理論與實踐相結合
現階段,學習單片機不是為了應付考試,也不是為了去撰寫論文,而是真正學會單片機開發技術。因此本書主要起到一個輔導實踐的作用,通過每一章節的學習,目的不是讓大家記住背過哪些理論,而是讓大家知道如何去實際操作程式設計,瞭解方法後,大家就可以真正地去實踐操作一下,從而達到學習和掌握單片機技術的目的。
2) 科學的學習方案,由淺入深循序漸進
眾多初學者不知道單片機該如何學習,不要緊,本書為你制定了一套科學的學習方法和思路,只要緊跟著書中的方法和思路,按照書中要求的去實踐,相信很快就可以學會單片機了。本書的學習套路和傳統的方法大不相同,傳統的是先講基本原理,然後再舉例,本書則是盡可能先舉例子,建立起鮮活的形象,然後帶領大家去探求其中的奧秘,逐一解釋常式中的每個知識點的原理,這樣會非常有利於大家對常式的理解。
3) 細緻講解,形象比喻
自然萬物都是相通的,單片機也不例外。其實單片機技術的很多原理和道理都跟人們的實際生活類似。在課程講解的過程中,會儘量把難以理解的技術問題和實際生活經驗相聯繫,用形象的比喻來幫助大家透徹理解原理。
4) 常式豐富,設計規範,與實際專案緊密結合
以前的教材大多是學校老師或者專業寫書人的著作,相對來說和實際專案開發有所偏離。我們認為: 學習技術,無限接近實際專案才是正道。因此參與編寫此書的人員都是有著多年的豐富的實際專案開發經驗的工程師,所有的電路設計、程式設計的思路和規範,都是與實際專案開發相結合的,這樣大家在入門後,能夠很快地投入到實際開發中去。
5) 重點關注實用技術
本書的內容偏重于單片機的應用而非詳盡的理論闡述。傳統的書籍作者一般會把和單片機、C語言相關的內容一一列舉介紹出來,而本書的原則是常用的重點講解分析,不常用的只做簡單介紹,早已經過時的或者極少用到的內容直接不予理會,提高本書的精華度。用一位網友的描述就是: 都是乾貨,對實際開發相當有用。
6) 配套視頻教程
除了紙質書本之外,還附贈了DVD光碟,內容是視頻教程、電子課件(PPT)、各章節的實例原始程式碼和習題答案等。
7) 完善的技術討論平臺
本書提供論壇技術討論平臺: www.kingst.org。讀者可以在上邊找到我們的聯繫方式,下載所有的學習視頻和文檔資料,可以加入到我們的技術討論群中和大家一起討論學習,共同進步。
本書主要內容
全書一共20章,從第1章到第18章以實驗為載體,從單片機最小系統和C語言基本語法開始講解,逐步深入,講解單片機內部資源和C語言的各種用法,並穿插介紹實際專案開發常用的電路設計思路和程式設計技巧等。本書在知識講解的過程中,有些地方沒有按照傳統思路先介紹後應用,而是先應用後講解,這樣的方式更有利於大家深入理解知識點,清楚地瞭解知識點的用法和原理。第19章是專案開發指導,帶領大家逐一走過實際專案開發的全部流程,並最終完成它,讓大家進行一次實際項目開發前的一個實戰演習。第20章講解了單片機開發中一些常用工具的用法,熟練運用它們,可以幫助大家高效率地定位並解決問題。
關於我們
相信很多學電子的同學和我接觸單片機的經歷一樣,大學裡開了C語言和單片機相關的課程,但是上完課了卻從未見過單片機長什麼樣子,也不知道C語言有何用處,考試的時候通過背一下書上的概念和程式就那麼通過了,頭腦中除了留下“單片機”和“C語言”這樣兩個概念外,其他的全都就著饅頭下肚了,沒在大腦中留下一片雲彩。
一個偶然的機會,我進入了我的單片機啟蒙恩師李冬明老師的實驗室,從此真正的單片機進入了我的世界。李老師給了我一套學習板,讓我從師兄編寫的程式開始學習,不懂的可以問師兄師姐。剛開始的學習很難,什麼都不懂,甚至想問問題都不知道該問什麼,但是我還是堅持從早上8點半到晚上9點半全天候在實驗室裡學習。大概兩三個月的時間,隨著老師佈置給我的第一個任務的完成,我發現自己一下理解單片機了,當然這頓悟離不開兩三個月的積累。半年後正式開始參與老師項目開發的一些簡單工作,算是入門單片機了。我找工作的那年,由於經濟危機帶來就業問題很嚴峻,但是帶著在實驗室學習的技術和積累的經驗,我在就業大潮中很容易地找到了工作,而且進入工作崗位後,我迅速進入狀態,一個月後在公司就開始參與實際產品研發工作了,幾乎沒有什麼過渡期。
回顧我的單片機之路,我發現我是個幸運兒。一個班級裡幾十個人,一個學校又有那麼多電子專業的學生,最終能夠真正跟著老師參與專案開發鍛煉的就那麼幾個,而全國有很多很多高校,最終有機會得到特訓參加電子比賽以及專案開發實踐機會的人太少太少了,大多數同學只能在週邊羡慕嫉妒恨。更有很多同學發現自己沒這種機會後就自甘墮落,整天蹺課玩遊戲,最終大學畢業兩手空空,如果不靠拼爹,靠自己很難找到稱心的工作。大多數同學能考上大學,腦子一點也不比別人笨,只是沒有一個領路人,沒有一個正確的學習方法,缺少了參與學習的平臺和參加實踐的機會。
隨著我自己工作中技術水準的不斷提高,我也發現傳統的單片機教材完全跟不上技術發展的節奏,導致這個行業的初學者非常迷茫和無奈。找了幾個志同道合的朋友出來創業的時候,決定把單片機教學相關工作作為工作室一項業務,先後做過兩個版本的《手把手教你學單片機》視頻教程。2013年初,和清華大學出版社商定撰寫《手把手教你學51單片機(C語言版)》這本教材,旨在幫助那些想學單片機但又無從下手的初學者們,幫助同學們真正跨過這道門檻,步入工程師的行列。
本書在編寫過程中得到李冬明老師的大力指點和指導,由衷地表示感謝。李冬明老師是一位非常嚴謹和認真的老師,他的嚴謹不僅體現在教學上,在科研上對我們的要求也是無比嚴格。我跟著他學習的時候,他經常說的一句話就是: “做技術必須要認真,很多人做事的時候喜歡糊弄,但做技術絕對不可以。技術是邏輯性很強的東西,不應該有任何僥倖心理,你糊弄它的話它就糊弄你。”這一點我在做實驗的時候已經體會到了,曾經由於自己的不認真,電容極性接反,導致電容爆掉,板子燒毀。
本書的諸多與實際開發相關的設計思路、程式設計技巧和演算法等得到崔長勝工程師的大力指導,由衷地表示感謝。此外,本書在編寫過程中,也得到了廣大單片機愛好者熱情的支持和寶貴的回饋,在此表示真誠的感謝。
限於作者水準,書中難免存在不當之處,懇請廣大讀者批評指正。任何批評和建議請發至: service@kingst.org
宋雪松2014年2月

目次

讚譽
前言
第1章 如何學習單片機
 1.1 學什麼類型的單片機
 1.2 學習單片機的最佳方法
 1.3 單片機學習的準備工作
 1.4 單片機開發軟體環境搭建
 1.5 Keil基本概況介紹
 1.6 答讀者問
第2章 點亮你的LED
 2.1 單片機的內部資源
 2.2 單片機最小系統
2.2.1 電源
2.2.2 晶振
2.2.3 重定電路
 2.3 LED小燈
 2.4 程式碼編寫
2.4.1 特殊功能寄存器和位定義
2.4.2 新建一個工程
2.4.3 編寫點亮小燈的程式
 2.5 程式下載
 2.6 練習題
第3章 硬體基礎知識學習
 3.1 電磁干擾
 3.2 去耦電容的應用
 3.3 三極管在數位電路中的應用
3.3.1 三極管的初步認識
3.3.2 三極管的原理
3.3.3 三極管的應用
 3.4 74HC138三八解碼器的應用
 3.5 LED閃爍程式
 3.6 練習題
第4章 C語言基礎以及流水燈的實現
 4.1 二進位、十進位和十六進位
 4.2 C語言變數類型和範圍
 4.3 C語言基本運算子
 4.4 for迴圈語句
 4.5 while迴圈語句
 4.6 函數的簡單介紹
 4.7 Keil軟體延時
 4.8 流水燈程式
 4.9 練習題
第5章 計時器與數碼管基礎
 5.1 邏輯電路與邏輯運算
 5.2 計時器的學習
5.2.1 計時器的初步認識
5.2.2 計時器的寄存器
5.2.3 計時器的應用
 5.3 數碼管的學習
5.3.1 數碼管的基本介紹
5.3.2 數碼管的真值表
5.3.3 數碼管的靜態顯示
 5.4 練習題
第6章 中斷與數碼管動態顯示
 6.1 C語言的陣列
6.1.1 陣列的基本概念
6.1.2 陣列的聲明
6.1.3 陣列的初始化
6.1.4 陣列的使用和賦值
 6.2 if語句
 6.3 switch語句
 6.4 數碼管的動態顯示
6.4.1 動態顯示的基本原理
6.4.2 數碼管顯示消隱
 6.5 單片機中斷系統
6.5.1 中斷的產生背景
6.5.2 計時器中斷的應用
6.5.3 中斷的優先順序
 6.6 練習題
第7章 變數進階與點陣LED
 7.1 變數的作用域
7.1.1 區域變數
7.1.2 全域變數
 7.2 變數的存儲類別
 7.3 點陣的初步認識
 7.4 點陣的圖形顯示
 7.5 點陣的動畫顯示
7.5.1 點陣的縱向移動
7.5.2 點陣的橫向移動
 7.6 練習題
第8章 函數進階與按鍵
 8.1 單片機最小系統
8.1.1 電源
8.1.2 晶振
8.1.3 重定電路
 8.2 函數的調用
 8.3 函數的形式參數和實際參數
 8.4 按鍵
8.4.1 獨立按鍵
8.4.2 矩陣按鍵
8.4.3 獨立按鍵的掃描
8.4.4 按鍵消抖
8.4.5 矩陣按鍵的掃描
 8.5 簡易加法計算器
 8.6 練習題
第9章 步進電機與蜂鳴器
 9.1 單片機IO口的結構
 9.2 上下拉電阻
9.32 8BYJ48型步進電機詳解與實例
9.3.1 電機的分類
 9.3.2 28BYJ48型步進電機原理詳解
9.3.3 讓電機轉起來
9.3.4 轉動精度與深入分析
9.3.5 編寫實用程式的基礎
9.3.6 包含綜合應用的實用程式
 9.4 蜂鳴器
 9.5 練習題
第10章 實例練習與經驗積累
 10.1 數位碼錶實例
10.1.1 不同資料類型間的相互轉換
10.1.2 定時時間精准性調整
10.1.3 位元組操作修改位元的技巧
10.1.4 數碼管掃描函數演算法改進
10.1.5 碼錶程式
 10.2 PWM知識與實例
 10.3 交通燈實例
 10.4 51單片機RAM區域的劃分
 10.5 長短按鍵的應用
 10.6 練習題
第11章 UART串口通信
 11.1 串列通信的初步認識
 11.2 RS232通信介面
 11.3 USB轉串口通信
 ……
第12章 指標基礎與I602液晶的初步認識
第13章 I602液晶與串口的應用實例
第14章 I2C匯流排與E2PROM
第15章 即時時鐘DSI302
第16章 紅外通信與DS18B20溫度感測器
第17章 模數轉換A/D與數模轉換D/A
第18章 RS-485通信與Modbus協議
第19章 實踐專案開發——多功能電子鐘
第20章 單片機開發常用工具的使用
附錄A ASCII碼字元表
附錄B C語言運算子及優先順序
附:KST-51開發板原理圖

書摘/試閱

第一章.如何學習單片機
在錯誤的道路上日夜兼程,最終也無法成功,方法和思路絕對是第一重要的。一些學技術的同學,往往看到這類章節會直接跳過去,因為大多數類似章節都是廢話連篇。但是,今天在這裡我可以很負責任的告訴你,本章節講到的學習單片機的方法,都是我們學習單片機的無數經驗和教訓總結出來的瑰寶。因為我們披荊斬棘,開闢了道路,所以可以告訴你路在何方;也因為我們摸過燒紅的鐵塊,燙了手,所以也可以告訴你教訓和代價是什麼。希望各位都能站在我們的肩膀上,看得更遠!
1.1 學什麼單片機
單片機的型號那麼多,如何選取一款合適的進行學習?如果身邊有比較現成的學習單片機的條件,有什麼條件就學習什麼型號。比如,你所在的公司剛好用到某個型號單片機,那麼就方便多了。開發板不用購買,直接用公司現成的板子,指導老師到處是,公司的工程師,只要你耐心虛心的不恥上問,相信他們都願意幫你解答問題。或者你跟著學習的導師,正在使用某個型號的單片機開發產品,那麼同樣的道理,你也會有得天獨厚的優勢,直接跟著學就行了。單片機型號雖然眾多,看起來紛繁複雜,其實它們的基本原理、基本用法都是相通的,只要熟練掌握其中一種,其它的都可以觸類旁通,快速上手了。
如果你這些條件都沒有,那就跟著我學吧,我建議你學習51單片機。為什麼呢?雖然現在單片機種類和型號非常多,每個型號都有一定的市場份額,但是哪個型號也沒有早期51單片機那般風光和火爆,雖然現在地位不是那麼高了,但是因為51單片機積累的資料非常多,大家學起來就會擁有眾多的參考資料,所以上手肯定比其他型號的要快一些。如果你學習稍微偏門的單片機,可能一個簡單的軟體問題就要折騰你好長時間,不僅僅浪費了你的學習時間,更重要的是打擊了學習單片機的信心。
那麼是不是每種單片機我們都要學一遍呢?答案當然是否定的。大家跟著我來學習51單片機,必須得跟著學會舉一反三和融會貫通的能力。單片機型號那麼多,挨個學下來估計頭髮白了也學不完,所以大家跟著我學51單片機,不能僅僅當做51來學習,更重要的是要當做“單片機”來學,要通過我們的這個教程,把所有的單片機的內部資源都搞清楚弄明白,每個內部模組的用法理解透徹,這樣當你遇到一個從沒有用過的單片機,也就知道如何下手去使用它進行開發了。
1.2 如何學習單片機
前邊提到過,單片機是一門實用技術,我們學習它已經不是為了應付考試了,我給大家總結了單片機的學習方法是:一個要領,四個步驟。
學習單片機的要領就是:在實踐中成長,In Doing We Learn!
學射箭,你得去拉弓,整天只擺造型肯定不行;學游泳,你得下水撲騰,整天在岸上做模仿活動不行;學開車,你得坐車上去開,坐沙發上肯定學不會。同樣的道理,學單片機,整天盯著單片機書看肯定不行,你也必須得親自動手去練。
沒有不下水就學會游泳成為游泳健將的,沒有不到車上練就能成為賽車手的,這點大家都清楚,可為什麼那麼多人學單片機的時候,總是只抱著一本書看呢。第一,我們小學中學甚至大學的學習模式都是如此,學什麼東西主要都是靠看書,應付書面考試;第二,很多人想實踐卻不太清楚該怎麼去實踐。
遇到問題查下書比直接看書的效果要好過百倍。不是不讓大家看書,而是看了一點以後,要馬上去實踐驗證,然後再回頭結合實踐的結果,理解書上的內容。從這個地方,大家要得出一個結論來,就是在學實際技術的過程中,和應付考試不同,書上的內容不需要你去硬性記憶,書是用來查的,不是用來背的。
下面,就是我總結的跟著我學習單片機的四個步驟。
第一步:鸚鵡學舌。
剛出生的孩子叫“爸爸”“媽媽”的時候,他甚至不知道“爸爸”“媽媽”是什麼意思,更不會理解這些聲音是什麼意思,但是我們帶著孩子見到他爸爸就讓他喊“爸爸”,見到媽媽就讓他喊“媽媽”,見到爺爺就喊“爺爺”……慢慢的你會發現,次數多了,孩子就知道誰是爸爸,誰是媽媽,誰是爺爺,誰是奶奶了。
大家剛開始接觸單片機的時候,也屬於單片機行業的新生兒。單片機的樣子,單片機週邊的各種器件,單片機內部的各種結構,單片機使用C語言的程式設計方法,初學者可能都沒有見過,腦子裡全無概念。沒關係,有些概念和方法你不理解也沒有關係,甚至不需要你去理解,你只需要跟著我去鸚鵡學舌式的學習,第一遍學習某一節課的內容時,對於程式,大家就可以完全跟著抄下來,甚至抄兩三遍,過一段你會發現,好多東西你也認識了,好多概念你也慢慢的理解清楚了,你也能大概看懂別人的小程式了,切忌覺得自己看會了,而簡單複製粘貼。
第二步:照葫蘆畫瓢。
很多同學學習的時候喜歡看,看我做的視頻,看我寫的程式,甚至看別人的程式,都能看懂,覺得自己就會了,等到自己寫程式的時候,感覺就是老鼠啃天,不知道從哪裡下手了,這是初學者很容易犯的“眼高手低”的毛病,所以第二步的內容就非常重要了。
我的要求是,每一位同學,在學完了當前課的內容,把第一步順利完成以後,然後關掉視頻教程,關掉原始程式碼,自己通過看電路圖和查找非原始程式碼的其他任何資料,把當節課我寫的程式碼重新默寫出來,邊寫邊多少理解那麼一點點,不是純粹的背誦,應該說是背誦加理解的結合體。甚至學過幾節課以後,可以回頭把前邊曾經這樣實現過的課程,再按照這種方法做一遍。千萬不要認為這一步沒必要,這一步是你能否真正學會單片機的一個關鍵,在學完本教程之前,每一課內容都要這樣做,如果每一個程式你都能夠完美的完成,那麼可以說,當節課的內容,百分之七八十你已經掌握了。
第三步:他山之石,可以攻玉。
單片機技術的最大特點就是可以通過修改程式來實現不同的功能,因此舉一反三的能力就必不可少了。每一節課的常式後邊,我一般都會佈置幾個作業,大家儘量去獨立完成這個作業。在完成這個作業的過程中,都可以參考我的程式思路,在這個基礎上通過動腦思考去構建你自己的程式框架,最終將程式完成。
在我們工程師實際產品研發的時候,很多種情況下也是如此。比如一個產品,我們如果從零起步的話,可能會走很多彎路,遭遇很多前人已曾遭遇過的挫折,所以我們通常的做法是尋找購買幾款同類產品,然後先研究他們的各自優缺點,學習他們的長處,然後在同類產品基礎上再來設計我們自己的產品,這就是“他山之石,可以攻玉”。
初學者在學習的時候,往往遇到的問題很多,你應該想到,你遇到的問題,可能前輩們早就遇到過了,所以遇到問題後,不要慌張,首先利用穀歌或者百度這些搜尋引擎在網上搜一下,要做什麼新東西,先去網上找相關資料瞭解一下,不管是程式設計還是硬體設計,多多參考別人的東西,只要把別人的東西分析明白了,自己用起來了,也就成為自己的知識了。
第四步:理論實踐結合,溫故知新。
當大家把所有的課程都按照前邊三步完成後,這個時候不妨再把書打開,再看看書,經過了自己的實戰經歷,再看書的時候,對很多知識點會有一種恍然大悟的感覺。甚至視頻教程、書籍都可以反復看幾遍,可能有的知識點當時學習的時候不明白,過了一段時間,回過頭來再學習的時候,一下就明白了。
1.3 單片機學習的準備工作
第一:足夠的信心、恒心和耐心。
有同學問過我,單片機這門技術難不難。我覺得這個問題得從兩個方面去分析。
首先,我們從戰略上藐視它。那麼多同學跟著老師學一段時間就可以做出來小車,超聲波測距,甚至做出來機器人,似乎很拽的樣子。那他們又不是三頭六臂,我們也沒有什麼做不了的道理。實際上要說技術,其實就是一層窗戶紙,表面看不透徹,感覺特別神秘,實際只要你稍微一努力就可以捅破它,誇張點說,單片機在邏輯上的關係,只有小學的水準,簡單的很。正所謂會者不難,難者不會,大家不懂這個東西,看起來感覺很神秘。所以大家只要認真踏實堅持學下去,肯定能學好這麼技術。
其次呢,我們從戰術上要重視它。你說單片機這東西,如果十天八天就學會了,那麼這個技術還能值錢嗎?我可以這樣去表達,如果一個技術很簡單就被學會,那麼很多人都會的這個技術,肯定也沒什麼前途和錢途。那究竟多久能學會呢?我給大家制定的學習方案,根據每個人的基礎不同,平均每天要拿出2個小時以上的學習時間,大概一到三個月可以入門。入門的概念是給你一個單片機開發任務,你起碼知道要努力的方向和解決問題的大概方法了。技術這東西,關鍵是堅持做下去,有恒心和耐心,如果長時間不用的話,肯定還會生疏。所以要想成為單片機高手,起碼需要一年左右的單片機開發的歷練才行。成為單片機高手的概念就是你自己可以從頭根據自己的想法,去設計一個電路,根據需要的功能編寫代碼,做一個產品出來。
第二:教材和教程。
要學習單片機這門技術,良好的教材和教程必不可少。單片機方面,大家可以直接學習我們這本《手把手教你學單片機——51單片機C語言開發》,我們還精心製作了配套的《手把手教你學單片機》的視頻教程。本著開源、共用的理念,我們的視頻教程都是免費開放的,大家可以到我們的網站www.kingst.org找到下載連結。另外,因為我們做單片機開發使用的是C語言,所以最好能再有一本純C語言的教材,學到一些C語言的細節問題的時候,可以方便大家查閱,或者你也可以直接把相關問題通過穀歌和百度搜索一下,絕大部分情況下它們都會給你滿意的答案的。
第三:電腦一台、單片機開發板一塊。
電腦,是學習單片機必不可少的工具,因為編寫程式,查閱資料都得用到,但是有句題外話說一下,不要把電腦當成遊戲機或者影碟機,偶爾玩玩遊戲看看電影是可以的,勞逸結合,但是不可沉溺其中,否則還不如沒有電腦。
單片機開發板,這也是必須的。如果你還在上學,學校實驗室一般會有開發板,可以考慮跟老師借一個,或者使用師兄師姐們用完的,這樣可以省點錢。當然,如果身邊有高手,比如輔導老師,會單片機的師兄,在他們的指導下做一個也可以,身邊有人指導的話,不懂的問題還可以問他們。如果這些條件都不具備,那麼可以購買一個,先學習別人的板子設計思路,給自己以後設計電路板打下基礎。在這裡就順便推薦一下我們的KST-51開發板,我不敢說我們的設計是最好的,但是我可以很負責任的說,我們的板子是出自經驗豐富的一線工程師之手,其中的設計都是根據實際專案開發的思路進行的,包括整體規劃、電路設計、器件佈局等等,可以為你今後的專案開發提供一個優質的參考。另外一方面,因為我們的教程是基於我們的開發板做的,所以大家配套來用的話可以節省時間,提高學習效率。
當然,即使不購買我們的開發板,你想學單片機,也還是要有一塊開發板的,不能總是用軟體模擬,軟體模擬是學不會單片機的。經常有同學過來問我,老師我用軟體類比的好用,做了硬體不好用是什麼原因。在這裡我提一下,如果你上課用這個軟體模擬,糊弄老師應付考試是可以的,但是實際開發和模擬軟體卻差別很大,如果真心想學好單片機這門技術,那我只能告訴你,拿起烙鐵焊電路,動手寫程式,遠離模擬軟體,靠軟體模擬永遠學不到真正的技術。
1.4單片機開發軟體環境搭建
單片機開發,首要的兩個軟體一個是程式設計軟體,一個是下載軟體。程式設計軟體我們用Keil uVision4的51版本,也叫做Keil C51,不做過多介紹,先直接講如何安裝。
1、首先準備Keil uVision4安裝原始檔案,按兩下安裝檔,彈出安裝的歡迎介面,如圖1-1所示。
2、點擊“Next”按鈕,彈出“License Agreement”對話方塊,如圖1-2所示。這裡顯示的是安裝授權合約,需要在“I agree to all the terms of the preceding License Agreement”打勾。
3、點擊“Next”按鈕,彈出“Folder Selection”對話方塊,如圖1-3所示。這裡可以設置安裝路徑,預設安裝路徑在“C:\Keil”資料夾下。點擊“Browse...”按鈕,可以修改安裝路徑,這裡建議大家用預設的安裝路徑,如果你要修改,也必須使用英文路徑,不要使用包含有中文字元的路徑。
4、點擊“Next”按鈕,彈出“Customer Information”對話方塊,如圖1-4所示。大家輸入用戶名、公司名稱以及E-mail地址即可。
5、按一下“Next”,就會自動安裝軟體,如圖1-5所示
6、安裝完成後,彈出來安裝完成對話方塊,如圖1-6所示,並且出現幾個選項,大家剛開始把這幾個選項的對號全部去掉就可以了,先不用關注他有什麼作用。
7、最後,點擊“Finish”,Keil程式設計軟體發展環境就這麼裝好了。
1.5 Keil基本概況介紹
首先,我們用Keil先打開一個現成的工程,來認識一下Keil軟體,如圖1-7所示。
第2章 點亮你的LED
這節課的標題是點亮LED,雖然任務很簡單,但是需要大家瞭解的單片機基礎知識的內容卻很多,特別是對於初學者,剛開始要在頭腦中建立一個單片機的概念,課程最後通過點亮一個LED小燈來增加初學者對單片機的興趣和自信。
2.1 單片機的內部資源
在這裡我所講到的單片機內部資源,和傳統單片機書籍中講單片機內部結構不同,我這裡講到的內部資源,是指作為單片機用戶,單片機提供給我們可使用的東西。總結起來,主要是三大資源:
Flash——程式存儲空間,早期單片機是OTPROM。
RAM——資料存儲空間。
SFR——特殊功能寄存器。
在早期的單片機中,主要是用OTPROM(One Time Programmable Read-Only Memory,即一次可程式設計唯讀記憶體)來存儲單片機的程式,程式只能寫入一次,如果發現錯了,沒辦法,只能換一片,重新寫入了。隨著技術的發展,Flash以其可重複擦寫且容量大成本低的優點成為現在絕大多數單片機的程式記憶體。對於單片機來說Flash最大的意義是斷電後資料不丟失,這個概念類似於我們電腦的硬碟,我們保存了電影、文檔、音樂等檔,把電源關掉後,下次重新開電腦,所有的檔都還照樣存在。
RAM是單片機的資料存儲空間,用來存儲程式運行過程中產生的和需要的資料,跟電腦的記憶體是相似的概念,其實最典型的比喻是我們的計算器,我們用計算器計算個加減法,一些中間的資料都會保存在RAM裡邊,關電後資料丟失,所以我們每次打開計算器,都是從歸零開始計算。但是它的優點,第一是讀寫速度非常快,第二是理論上是可無限次寫入的,即壽命無限,不管程式怎麼運行怎麼讀寫它都不會壞。
第三個資源是SFR,特殊功能寄存器。這個概念大家可能剛開始理解不了,但是一定要記住。單片機有很多很多功能,每個功能都會對應一個或多個SFR,我們就是通過對SFR的讀寫來實現單片機的多種多樣的功能的。
講到這裡,我們來瞭解一下51單片機。通常我們一說到51單片機,指的都是相容Intel MCS-51體系架構的一系列單片機,而51是它的一個通俗的簡稱。全球有眾多的半導體廠商推出了無數款這一系列的單片機,比如Atmel的AT89C52,NXP(Philips)的P89V51,宏晶科技的STC89C52……具體型號千差萬別,但他們的基本原理和操作都是一樣的,程式開發環境也是一樣的。這裡我們要分清楚51這個統稱和具體的單片機型號之間的關係。
單片機內部資源的三個主要部分我們清楚了,那麼我們選擇STC89C52這款單片機來進行學習。STC89C52是宏晶科技出品的一款51內核的單片機,具有標準的51體系結構,全部的51標準功能,程式下載方式簡單,方便學習,我們就用它來學習單片機。它的資源情況:Flash程式空間是8K位元組(1K=1024,1位元組= 8位元),RAM資料空間是512位元組,SFR我們後邊會逐一提到並且應用。
2.2 單片機最小系統
為什麼稱之為單片機最小系統呢?單片機最小系統,也叫做單片機最小應用系統,是指用最少的原件組成單片機可以工作的系統。單片機最小系統的三要素就是電源、晶振、重定電路,如圖2-1所示。
圖2-1 單片機最小系統電路
這張最小系統的電路圖節選自我們的KST-51開發板原理圖,下面我們就照這張電路圖來具體分析最小系統的三要素。
2.2.1 電源
這個很好理解,電子設備都需要供電,就連我們的家用電器(手電筒^_^)也不例外。目前主流單片機的電源分為5V和3.3V這兩個標準,當然現在還有對電壓要求更低的單片機系統,一般多用在一些特定場合,在學習中我們不做過多的關注。
我們所選用的STC89C52,它需要5V的供電系統,我們的開發板是使用USB口輸出的5V直流直接供電的。從圖2-1可以看到,供電電路在40腳和20腳的位置上,40腳接的是+5V,通常也稱為VCC或VDD,代表的是電源正極,20腳接的是GND,代表的是電源的負極。+5V和GND之間還有個電容,作用我們下節課介紹。
這個地方我們還要普及一個看原理圖的知識。電路原理圖是為了表達這個電路的工作原理而存在的,很多器件在繪製的時候更多考慮的是方便原理分析,而不是表達各個器件實際位置。比如上邊的單片機引腳圖,引腳的位置我們是可以隨意放的,但是每個引腳上有一個數位標號,這個數位標號代表的才是單片機真正的引腳位置。一般情況下,這種雙列直插封裝的晶片,左上角是1腳,逆時針旋轉引腳號依次增加,一直到右上角是最大腳位,我們現在選用的單片機一共是40個引腳,因此右上角就是40(在表示晶片的方框的內部),如圖2-2所示,大家要分清原理圖引腳標號和實際引腳位置的區別。
圖2-2 單片機封裝圖
2.2.2 晶振
晶振,又叫晶體振盪器,從這個名字我們就可以看出來,它註定一生都要不停振盪的。他起到的作用是為單片機系統提供基準時鐘信號,類似於我們部隊訓練時喊口令的人,單片機內部所有的工作都是以這個時鐘信號為步調基準來進行工作的。STC89C52單片機的18腳和19腳是晶振引腳,我們接了一個11.0592M的晶振(它每秒鐘振盪11,059,200次),外加兩個20pF的電容,電容的作用是幫助晶振起振,並維持振盪信號的穩定。
2.2.3 重定電路
在圖2-1左側是一個重定電路,接到了單片機的9腳RST(Reset)復位引腳上,這個重定電路如何起作用我們後邊再講,現在著重講一下復位對單片機的作用。單片機重定一般是3種情況:上電重定、手動重定、程式自動重定。
假如我們的單片機程式有100行,當某一次運行到第50行的時候,突然停電了,這個時候單片機內部有的區域資料會丟失掉,有的區域資料可能還沒丟失。那麼下次打開設備的時候,我們希望單片機能正常運行,所以上電後,單片機要進行一個內部的初始化過程,這個過程就可以理解為上電復位,上電復位保證單片機每次都從一個固定的相同的狀態開始工作。這個過程跟我們打開電腦電源開電腦的過程是一致的。
當我們的程式運行時,如果遭受到意外干擾而導致程式死機,或者程式跑飛的時候,我們就可以按下一個重定按鍵,讓程式重新初始化重新運行,這個過程就叫做手動復位,最典型的就是我們電腦的重啟按鈕。
當程式死機或者跑飛的時候,我們的單片機往往有一套自動復位機制,比如看門狗,具體應用以後再瞭解。在這種情況下,如果程式長時間失去回應,單片機看門狗模組會自動重定重啟單片機。還有一些情況是我們程式故意重啟重定單片機。
電源、晶振、重定構成了單片機最小系統的三要素,也就是說,一個單片機具備了這三個條件,就可以運行我們下載的程式了,其他的比如LED小燈、數碼管、液晶等設備都是屬於單片機的外部設備,即外設。最終完成我們想要的功能就是通過對單片機程式設計來控制各種各樣的外設實現的。
2.3 LED小燈
LED(light-emitting diode),即發光二極體,俗稱LED小燈,它的種類很多,參數也不盡相同,我們板子上用的是普通的貼片發光二極體。這種二極體通常的正嚮導通電壓是1.8V到2.2V之間,工作電流一般在1mA~20mA之間。其中,當電流在1mA~5mA之間變化時,隨著通過LED的電流越來越大,我們的肉眼會明顯感覺到這個小燈越來越亮,而當電流從5mA~20mA之間變化時,我們看到的發光二極體的亮度變化就不是太明顯了。當電流超過20mA時,LED就會有燒壞的危險了,電流越大,燒壞的也就越快。所以我們在使用過程中應該特別注意它在電流參數上的設計要求。
那麼下面我們來看一下這個發光二極體在開發板上的設計應用。首先來看圖2-3。
圖2-3 USB介面電路
圖2-3是我們開發板上的USB介面電路,通過USB線,電腦給我們的開發板供電和下載程式以及實現電腦和開發板之間的通信。從圖上可以看出,USB座共有6個介面,其中2腳和3腳是資料通信引腳,1腳和4腳是電源引腳,1腳是VCC正電源,4腳是GND即地線。5腳和6腳是外殼,我們直接接到了GND上,大家可以觀察一下開發板上的這個USB座的6個引腳。
我們現在主要來看1腳VCC和4腳GND。1腳通過F1(自恢復保險絲)接到右側,在正常工作的情況下,保險絲可以直接看成導線,因此左右兩邊都是USB電源+5V,自恢復保險絲的作用是,當你後級電路哪個地方有發生短路的時候,保險絲會自動切斷電路,保護開發板以及電腦的USB口,當電路正常後,保險絲會恢復暢通,正常工作。
右側有2條支路,第一條是在+5V和GND接了一個470uF的電容,電容是隔離直流的,所以這條支路是沒有電流的,電容的作用,我們下節課再介紹,這節課我們主要看第二條支路。我們把第二條支路摘取出來就是如圖2-4這個樣子。
圖2-4 LED小燈電路(一)
發光二極體是二極體中的一種,因此和普通二極體一樣,這個二極體也有陰極和陽極,習慣上也稱之為負極和正極。原理圖裡的LED畫成這樣方便在電路上觀察,方向必須接對了才會有電流通過讓LED小燈發光。剛才提到了我們接入的VCC電壓是5V,發光二極體自身壓降大概是2V,那麼在右邊R34這個電阻上承受的電壓就是3V。那麼現在我們要求電流範圍是1~20mA的話,就可以根據歐姆定律R=U/I,把這個電阻的上限和下限值求出來。
U=3V,當電流是1mA的時候,電阻值是3K;當電流是20mA的時候,電阻值是150歐,也就是R34的取值範圍是150~3K歐姆。這個電阻值大小的變化,直接可以限制整條通路的電流的大小,因此這個電阻我們通常稱之為“限流電阻”。在圖2-3中,我們用的電阻是1K,這條支路電流的大小,我想大家可以輕鬆計算出來了,而這個發光二極體在這裡的作用,是作為電源指示燈的,使用USB線將開發板和電腦連起來,這個燈就會亮了。
同理,我們在板子後級開關控制的地方,又添加了一個LED10發光二極體,作用就是當我們打開開關時,這個二極體才會亮起,如圖2-5所示。
圖2-5 USB供電電路
大家注意,這裡的開關雖然只有一個,但是是2路的,2路開關並聯能更好的確保給後級提供更大的電流。電容C19和C10,都是隔離斷開直流的,作用我們下節課介紹,這裡大家可以忽略。
那麼下面呢,我們把圖2-4進行一下變化,把右側的GND去掉,改成一個單片機的IO口,如圖2-6所示。
圖2-6 LED小燈電路(二)
圖2-4由於電源從正極到負極有電壓差,並且電路是導通的,所以就會有電流通過,LED小燈因為有了電流通過,所以就會直接發光。我們把右側的原GND處接到單片機P0.0引腳上,那麼如果我們單片機輸出一個低電平,也就是跟GND一樣的0V電壓,就可以讓LED小燈和圖2-4一樣發光了。
因為我們的單片機是可以程式設計控制的,我們可以讓P0.0這個引腳輸出一個高電平,就是跟VCC一樣的5V電壓,那麼這個時候,左側VCC電壓和右側的P0.0的電壓是一致的,那就沒有電壓差,沒有電壓差就不會產生電流,沒有電流LED小燈就不會亮,也就是會處於熄滅狀態。下面,我們就用我們的程式設計軟體來實現控制小燈的亮和滅。
2.4 程式碼編寫
這是我們的第一個實驗程式,因此請大家一定要耐心,我們先來瞭解一些51單片機特有的程式語法以及Keil軟體的基本操作步驟。
2.4.1 特殊功能寄存器和位定義
我們主要是用C語言來對單片機程式設計,而有的單片機有那麼幾條很特殊的獨有的程式設計語句,51單片機就有,先介紹2條。
第一條語句是:sfr P0 = 0x80;
sfr這個關鍵字,是51單片機特有的,他的作用是定義一個單片機特殊功能寄存器(special function register)。51單片機內部有很多個小模組,每個模組居住在擁有唯一房間號的房間內,同時每個模組都有8個控制開關。P0就是一個功能模組,就住在了0x80這個房間裡,我們就是通過設置P0內部這個模組的8個開關,來讓單片機的P0這8個IO口輸出高電平或者低電平的。而51單片機內部有很多寄存器,如果我們想使用的話必須提前進行sfr聲明。不過Keil軟體已經把所有這些聲明都預先寫好並保存到一個專門的檔中去了,我們要用的話只要檔開頭添加一行#include即可,這個在後邊有用法詳解。
第二條語句是:sbit LED = P0^0;
這個sbit,就是對剛才所說的SFR裡邊的8個開關其中的一個進行定義。經過上邊第二條語句後,以後只要在程式裡寫LED,就代表了P0.0口(“^”這個符號在數位鍵6上邊),注意這個P必須大寫,也就是說我們給P0.0又取了一個更形象的名字叫做LED。
瞭解了這兩個語句後,我們來大概看一下單片機的特殊功能寄存器。請注意,每個型號的單片機都會配有生產廠商所編寫的資料手冊(Datasheet),所以我們來看一下STC89C52的資料手冊,從21頁到24頁,全部是對特殊功能寄存器的介紹以及位址映射列表。我們在使用這個寄存器之前,必須對這個寄存器的位址進行說明。是不是花花綠綠的太多了,記不住啊,這個沒關係的,不需要你記住,瞭解一下,後邊大部分我會慢慢給大家解釋,少部分需要用到的時候,自己過來查手冊就可以了,做技術不是為了應付考試,你可以隨時翻閱手冊查找你需要的資料。
如圖2-7,是截取的手冊中第22頁最下邊的一個表格。
圖2-7 IO口特殊功能寄存器
我們來看一下這個表,其中P4口STC89C52對標準51的擴展,我們先忽略它,只看前邊的P0、P1、P2、P3這4個,每個P口本身又有8個控制埠。大家可以結合我們的開發板原理圖或者圖2-1來看,那麼這樣就確定了我們的單片機一共有32個IO口(IO,Input和Output,分別是輸入和輸出)。
其中P0口所在的位址是0x80,一共有從7到0這8個IO口控制位,後邊有個Reset Value(復位值),這個很重要,是我們看寄存器必看的一個參數,8個控制位元重定值全部都是1。這就是告訴我們,每當單片機上電復位的時候,所有的引腳的值默認是都是1,即高電平,我們在設計電路的時候也要充分的考慮這個問題。
那麼上邊那2條語句,我們寫sfr的時候,必須要根據手冊裡的這個位址(Add)去寫,寫sbit的時候,就可以直接將一個位元組其中某一位元取出來。我們程式設計的時候,也有現成的寫好寄存器位址的標頭檔,我們直接包含該標頭檔就可以了,不需要逐一去寫了。
2.4.2 新建一個工程
對於單片機程式來說,每個功能程式,都必須要有一個配套的工程(Project),即使是點亮LED這樣簡單的功能程式也不例外,因此我們首先要新建一個工程,打開我們的Keil軟體後,點擊:Project-->New uVision Project...然後會出現一個新建工程的介面,如圖2-8所示。
圖2-8 新建一個工程
因為現在講到了第二章,所以我們在硬碟上建立了一個lesson2的目錄,然後把LED這個工程的路徑指定到這裡,這樣方便今後管理程式,不同的功能程式放到不同的資料夾下,並且給這個工程起一個名字叫做LED,軟體會自動添加副檔名.uvproj。如圖2-9所示。
圖2-9 保存工程
我們直接點保存就可以了,工程會自動保存成LED.uvproj檔,下次要打開LED這個工程時,可以直接找到資料夾,按兩下這個.uvproj檔就可以直接打開了。
保存之後會彈出一個對話方塊,這個對話方塊讓我們選擇單片機型號。因為Keil軟體是外國人開發的,所以我們國內的STC89C52並沒有上榜,但是只要選擇同類型號就可以了。因為51內核是由Intel公司創造的,所以這裡我們直接選擇Intel公司名下的80/87C52來代替,這個選項的選擇對於後邊的程式設計沒有任何的不良影響。如圖2-10所示
圖2-10 單片機型號選擇
點擊OK之後,會彈出一個對話方塊,如圖2-11所示,每個工程都需要一段啟動代碼,如果點“否”編譯器會自動處理這個問題,如果點“是”,這部分代碼會提供給我們用戶,我們就可以按需要自己去處理這部分代碼,那這部分代碼在我們初學51的這段時間內,一般是不需要去修改的,但是隨著技術的提高和知識的擴展,我們就有可能會需要瞭解這塊內容,因此這個地方我們選一下“是”,讓這段代碼出現,但是我們暫時不需要修改它,大家知道這麼回事就可以了。
圖2-11 啟動代碼選擇
這樣工程就建立好了,如圖2-12所示,如果我們點擊Target 1左邊的加號,會出現我們剛才加入的初始設定檔案STARTUP.A51,這個我們先不管。
圖2-12 工程檔
工程有了之後,我們要建立編寫代碼的檔,點擊File-->New,如圖2-13,新建一個檔,也就是我們編寫程式的平臺。然後點File-->Save或者直接點擊那個Save的快速鍵,可以保存檔,保存時我們把它命名為LED.c,這個地方必須加上.c,因為如果寫組合語言,這個地方的副檔名是.asm,標頭檔就是.h等等,我們編寫的是C語言程式,這個地方必須自己添加檔的副檔名.c,如圖2-14所示。
圖2-13 新建文件
圖2-14 保存檔
現在我們就可以在我們建立好的檔中輸入我們的程式碼了,在編寫之前還有個工作要做。我們每做一個功能程式,必須要新建一個工程,一個工程代表了單片機要實現的一個功能。但是一個工程,有時候我們可以把我們的程式分多個檔寫,所以每寫一個檔,我們都要添加到我們所建立的工程中去,滑鼠右鍵點Source Group 1,點Add Files to Group ‘Source Group 1’...,如圖2-15所示。
圖2-15 添加文件(一)
在彈出的對話方塊中,按一下LED.c選中它,然後點Add,或者直接按兩下LED.c都可以將檔加入到這個工程下,然後點Close,關閉添加。 這個時候大家會看到在Source Group 1下邊又多了一個LED.c文件。
圖2-16 添加文件(二)
2.4.3 編寫點亮小燈的程式
忙活了半天,準備工作做了那麼多,終於要編寫我們的程式碼了。如果學過C語言的話,你應該很輕鬆的跟著我的程式設計自己寫出來,如果沒學過C語言也沒關係,你先照著我的抄,我會在合適的位置寫出來對C語言語法的解釋,這樣抄幾次後再看看解釋,就應該很明白了,抄的時候一定要認真,尤其標點符號不可以搞錯。
#include //包含特殊功能寄存器定義的標頭檔
sbit LED = P0^0; //位地址聲明,注意:sbit必須小寫、P大寫!
void main() //任何一個C程式都必須有且僅有一個main函數
{ //{}是成對存在的,在這裡表示函數的起始和結束
LED = 0; //分號表示一條語句結束
}
先從程式語法上來分析一下。
1、main是主函數的函數名字,每一個C程式都必須有且僅有一個main函數。
2、void是函數的返回數值型別,本程式沒有返回值,用void表示。
3、{}在這裡是函數開始和結束的標誌,不可省略。
4、每條C語言語句以;結束的。
邏輯上來看,程式這樣寫就可以了,但是在實際單片機應用中,存在一個問題。比如我們的程式空間可以容納100行代碼,但是我們實際上的程式只用了50行代碼,當運行完了50行,再繼續運行時,第51行的程式不是我們想運行的程式,而是不確定的未知內容,一旦執行下去程式就會出錯從而可能導致單片機自動復位,所以我們通常在程式中加入一個閉環,讓程式停留在我們希望的這個狀態下,不要亂運行,有以下兩種寫法可以參考:
參考程式一: 參考程式二:
#include #include
sbit LED = P0^0; sbit LED = P0^0;
void main() void main()
{ {
while(1) LED = 0;
{ while(1);
LED = 0; }
}
}
程式一的功能是程式在反復不斷的無限次執行LED = 0;這條語句,而程式二的功能是執行一次,然後程式直接停留下來等待,相對程式一來說程式二更加簡潔一些。針對於圖2-6,我們這個程式能夠把小燈點亮,但是這個程式卻點不亮我們板子上的小燈,這是為什麼呢?
這裡大家就要培養一個意識了,我們做單片機程式設計,實際上算是硬體底層驅動程式開發,這種程式的開發,是離不開電路圖的,必須根據我們的電路圖來進行程式的編寫。如果我們設計電路板的電路圖和圖2-6一樣的話,我們那個程式可以成功點亮,但是如果不一樣,就可能點不亮。
我們的開發板上,還有一個74HC138作為8個LED小燈的總開關,而P0.0僅僅是個分開關。如同我們家裡總是有一個供電總閘,然後每個電燈又有一個專門的開關,我們剛才的程式僅僅打開了那個電燈的開關,但是沒有打開那個總電閘,所以程式需要加上這部分代碼。因為這節課要介紹的內容比較多,所以我們把74HC138的原理以及為什麼要加額外的代碼在下節課統一介紹,這節課我們直接加上這部分代碼,大家知道有這麼一回事就可以了。
#include //包含特殊功能寄存器定義的標頭檔
sbit LED = P0^0; //位地址聲明,注意:sbit必須小寫、P大寫!
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
LED = 0; //點亮小燈
while (1); //程式停止在這裡
}
寫了這麼多囉嗦的語句,剛開始大家可能覺得很麻煩,為什麼有的書上程式很簡單就可以點亮小燈,我們這裡卻這麼麻煩呢。大家要瞭解一點,就是我們做這個學習板,雖然僅僅提供給大家簡單學習使用,但是我們也得按照實際產品的開發模式去設計,所以綜合考慮因素很多,大家學到後邊就會明白它的設計價值了,這裡大家只要跟著我們去做就可以了。
程式編好了,我們要對我們的程式進行編譯,生成我們需要的可以下載到單片機裡的檔,在編譯之前,我們先要勾選一個選項,Project-->Options for Target ‘Target1’...,或者直接點圖2-17中紅框內的快捷圖示:
圖2-17 工程選項圖示
在彈出的對話方塊中,點擊Output選項頁,勾選其中的“Create HEX File”核取方塊,然後點OK,如圖2-18所示。
圖2-18 創建HEX文件
設置好以後呢,點擊“Project-->rebuild all target files”,或者滑鼠點擊圖2-19中紅框內的快捷圖示,就可以對程式進行編譯了。
圖2-19 編譯器
編譯完成後,在我們的Keil下方的Output視窗會出現相應的提示,大家注意看圖2-20,這個視窗告訴我們編譯完成後的情況,data=9.0,指的是我們的程式使用了單片機內部的256位元組RAM資源中的9個位元組,code=29的意思是使用了8K代碼Flash資源中的29個位元組。當提示“0 Error(s), 0 warning(s)”表示我們的程式沒有錯誤和警告,就會出現“creating hex file from “LED”...,意思是從當前工程生成了一個HEX檔,我們要下載到單片機上的就是這個HEX檔。如果出現有錯誤和警告提示的話,就是Error和warning不是0,那麼我們就要對程式進行檢查,找出問題,解決好了再進行編譯產生HEX才可以。
圖2-20 編譯輸出資訊
到此為止,程式就編譯好了,下邊我們就要把編譯好的程式檔下載到單片機裡了。
2.5 程式下載
首先,我們要把硬體連接好,把板子插到我們的電腦上,打開裝置管理員查看所使用的是哪個COM口,如圖2-21所示,找到“USB-SERIAL CH340(COM5)”這一項,這裡最後的數位就是開發板目前所使用的COM埠號。
圖2-21 查看COM口
然後STC系列單片的下載軟體——STC-ISP,如圖2-22所示。
圖2-22 程式下載設置
下載軟體列出了5個步驟:第一步,選擇單片機型號,我們現在用的單片機型號是STC89C52RC,這個一定不能選錯了;第二步,點擊“打開程式檔”,找到我們剛才建立工程的那個lesson2資料夾,找到LED.hex這個檔,點擊打開;第三步,選擇剛才查到的COM口,串列傳輸速率使用默認的就行;第四步,這裡的所有選項都使用預設設置,不要隨便更改,有的選項改錯了以後可能會產生麻煩。第五步,因為STC單片機要冷開機下載,就是先點下載,然後再給單片機上電,所以我們先關閉板子上的電源開關,然後點擊“Download/下載”按鈕,等待軟體提示你請上電後,如圖2-23所示,然後再按下板子的電源開關,就可以將程式下載到單片機裡邊了。當軟體顯示“已加密”就表示程式下載成功了,如圖2-24所示。
圖2-23 程式下載過程
圖2-24 程式下載完畢
程式下載完畢後,就會自動運行,大家可以在板子上看到那一排LED中最右側的小燈已經發光了。那現在如果我們把LED = 0改成LED = 1,再重新編譯器下載進去新的HEX檔,燈就會熄滅。至此,點亮一個LED的實驗已經完成,終於邁出了第一步,是不是還挺好玩的呢。
2.6 作業
1、瞭解普通發光二級管的參數,掌握限流電阻的計算方法。
2、理解單片機最小系統,單片機週邊電路,Flash,RAM和SFR這些概念。
3、瞭解Keil的基本用法和單片機程式設計流程,能夠獨立完成程式設計下載等基本操作。

您曾經瀏覽過的商品

購物須知

大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。

特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。

無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。

為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。

若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。

優惠價:87 287
海外經銷商無庫存,到貨日平均30天至45天

暢銷榜

客服中心

收藏

會員專區