各路大牛的C語言編程建議和技巧风秤,看完感觸頗深

我們鼓勵在編程時應有清晰的哲學思維鳖目,而不是給予硬性規(guī)則。我并不希望你們能認可所有的東西缤弦,因為它們只是觀點疑苔,觀點會隨著時間的變化而變化〉槟瘢可是惦费,如果不是直到現(xiàn)在把它們寫在紙上,長久以來這些基于許多經驗的觀點一直積累在我的頭腦中抢韭。因此希望這些觀點能幫助你們薪贫,了解如何規(guī)劃一個程序的細節(jié)。(我還沒有看到過一篇講關于如何規(guī)劃整個事情的好文章刻恭,不過這部分可以是課程的一部分)要是能發(fā)現(xiàn)它們的特質瞧省,那很好;要是不認同的話鳍贾,那也很好鞍匾。但如果能啟發(fā)你們思考為什么不認同,那樣就更好了骑科。在任何情況下橡淑,都不應該照搬我所說的方式進行編程;要用你認為最好的編程方式來嘗試完成程序咆爽。請一以貫之而且毫不留情的這么做梁棠。

1 、排版問題

程序是一種出版物斗埂。意味著程序員們會先閱讀(也許是幾天符糊、幾周或幾年后的你自己閱讀),最后才輪到機器呛凶。機器的快樂就是程序能編譯男娄,機器才不在乎程序寫的有多么漂亮,可是人們應該保持程序的美觀漾稀。有時人們會過度關心:用漂亮的打印機呆板地打印出漂亮的輸出模闲,而這些輸出只是將所有介詞用英文文本以粗體字體凸顯出來,都是些與程序無關的細節(jié)县好。雖然有很多人認為程序就應該像 Algol.68 所描述的一樣(有些系統(tǒng)甚至要求照搬該風格編寫程序)围橡,可清晰的程序不會因為這樣的呈現(xiàn)而變得更清晰,只會使糟糕的程序變得更可笑缕贡。對于清晰的程序來說翁授,排版規(guī)范一向都是至關重要的拣播。當然,眾所周知最有用的是縮進收擦,但是當墨水遮蓋了意圖時贮配,就會控制住排版。因此即便堅持使用簡單的舊打字機輸出塞赂,也該意識到愚蠢的排版泪勒。避免過度修飾,比如保持注釋的簡潔和靈活宴猾。通過程序整齊一致地說出想表達的圆存。接著往下看。

2 仇哆、變量命名

對于變量名稱沦辙,長度并不是名稱的價值所在,清晰的表達才是讹剔。不常用的全局變量可能會有一個很長的名稱油讯,像 maxphysaddr。在循環(huán)中每一行所使用的數(shù)組索引延欠,并不需要取一個比 i 更詳盡的名字恤溶。取 index 或者 elementnumber 會輸入更多的字母(或調用文本編輯器)误甚,并且會遮蓋住計算的細節(jié)秽五。當變量名稱很長時巷送,很難明白發(fā)生了什么剥纷。在一定程度上娩鹉,這是排版問題牙瓢,看看下面
image

vs.
image

現(xiàn)實例子中的問題會變得更糟酌儒。所以僅需把索引當成符號來對待。指針也需要合理的符號为居。np 僅僅只是作為指針 nodepointer 的助記符。如果一貫都遵從命名規(guī)范杀狡,那么很容易就能推斷出 np 表示“節(jié)點指針”蒙畴。在下一篇文章中會提到更多。同時在編程可讀性的其它方面呜象,一致性也是極其重要的膳凝。假使變量名為 maxphysaddr,則不要給同級關系的變量取名 lowestaddress恭陡。最后蹬音,我傾向于「最小長度」但「最大信息量」的命名,并讓上下文補齊其余部分休玩。例如:全局變量在使用時很少有上下文幫助理解著淆,那么它們的命名相對而言更需要令人易懂劫狠。因此我稱 maxphyaddr 作為一個全局變量名,對于在本地定義和使用的指針來說 np 并不一定是 NodePoint永部。這是品味的問題独泞,但品味又與清晰度相關。我避免在命名時嵌入大寫字母苔埋;它們的閱讀舒適性太別扭了懦砂,像糟糕的排版一樣令人心煩。

其實做為一個學習者组橄,有一個學習的氛圍跟一個交流圈子特別重要這里我推薦一個C/C++基礎交流583650410荞膘,不管你是小白還是轉行人士歡迎入駐,大家一起交流成長

3 玉工、指針的使用

C語言不同尋常衫画,因為它允許指針指向任何事物。指針是鋒利的工具瓮栗,像任何這樣的工具一樣削罩,使用得當可以產生令人愉悅的生產力,但使用不當也可以造成極大的破壞费奸。指針在學術界的名聲不太好弥激,因為它太危險了,莫名其妙地就變得糟糕的不行愿阐。但我認為它是強大的符號微服,它可以幫助我們清楚地自我表達。思考:當有指針指向對象時缨历,對于那個對象以蕴,確切地說它只是名稱,其它什么也不是辛孵。聽起來很瑣碎丛肮,但看看下面的兩個表達式:
image

第一個指向一個 node(節(jié)點),第二個計算為(可以說)同一個 node魄缚。但第二種形式是不太容易理解的表達式宝与。這里解釋一下,因為我們必須要知道 node 是什么冶匹,i 是什么习劫,還要知道 i 和 node 與周圍程序之間相關的規(guī)則是什么。孤立的表達式并不能說明 i 是 node 的有效索引嚼隘,更不用提是我們想要元素的索引诽里。如果 i、j 和 k 都是 node 數(shù)組中的索引將很容易出差錯飞蛹,而且連編譯器都不能幫助找出錯誤谤狡。當給子程序傳參數(shù)時灸眼,尤其容易出錯:指針只是一個單獨的參數(shù);但在接收的子程序中必須認為數(shù)組和索引是一體的豌汇。計算為對象表達式本身幢炸,比該對象的地址更不易察覺,而且容易出錯拒贱。正確使用指針可以簡化代碼:
image

vs.
image

如果想取下一個元素的 type 可以是
image

image

i 前移宛徊,但其余的表達式必須保持不變;用指針的話逻澳,只需要做一件事闸天,就是指針前移。把排版因素也考慮進來斜做。對于處理連續(xù)的結構體來說苞氮,使用指針比用表達式可讀性更好:只需要較少的筆墨,而且編譯器和計算機的性能消耗也很小瓤逼。與此相關的問題是笼吟,指針類型會影響指針正確使用,這也就允許在編譯階段使用一些有用的錯誤檢測霸旗,來檢查數(shù)組序列不能分開贷帮。而且如果是結構體,那么它們的標簽字段就是其類型的提示诱告。因此
image

是足以讓人明白的撵枢。如果是索引數(shù)組,數(shù)組將取一些精心挑選的名字精居,而且表達式也會變得更長:
image

此外锄禽,由于例子變得越來越大,額外的字符更加讓人惱火靴姿。一般來說沃但,如果發(fā)現(xiàn)代碼中包含許多相似并復雜的表達式,而且表達式計算為數(shù)據(jù)結構中的元素空猜,那么明智地使用指針可以消除這些問題绽慈。考慮一下
image

看起來像利用復合表達式表示 p辈毯。有時這值得用一個臨時變量(這里的 p)或者把運算提取成一個宏。

4 搜贤、過程名稱

過程名稱應該表明它們是做什么的谆沃,函數(shù)名稱應該表明它們返回什么。函數(shù)通常在像 if 這樣的表達式使用仪芒,因此可讀性要好唁影。
image

是沒有太大幫助的耕陷,因為不能推斷出 checksize 錯誤時返回 true,還是非錯誤時返回据沈。相反
image

使這點能清晰表達哟沫,并且在常規(guī)使用中將來也不大可能出錯。

5锌介、 注釋

這一個微妙的問題嗜诀,需要自己體會和判斷。由于一些原因孔祸,我傾向于寧可清除注釋隆敢。第一,假如代碼清晰崔慧,并且使用了規(guī)范的類型名稱和變量名稱拂蝎,應該從代碼本身就可以理解。第二惶室,編譯器不能檢查注釋温自,因此不能保證準確,特別是代碼修改過以后皇钞。誤導性的注釋會非常令人困惑悼泌。第三,排版問題:注釋會使代碼變得雜亂鹅士。但有時我會寫注釋券躁,像下文一樣僅僅只是把它們用于介紹。例如:解釋全局變量的使用和類型(我總是在龐大的程序中寫注釋)掉盅;作為一個不尋骋舶荩或者關鍵過程的介紹;或標記出大規(guī)模計算的一節(jié)趾痘。有一個糟糕注釋風格的例子:
image

還有更糟糕的做法:
image

先不要嘲笑慢哈,等到在現(xiàn)實中看到再去吧∮榔保或許除了諸如重要數(shù)據(jù)結構的聲明(對數(shù)據(jù)的注釋通常比對算法的更有幫助)卵贱,這樣至關重要部分之外,需要避免對注釋的“可愛”排版和大段的注釋侣集;基本上最好就不要寫注釋键俱。如果代碼需要靠注釋來說明,那最好的方法是重寫代碼世分,以便能更容易地理解编振。這就把我們帶到了復雜度。

其實做為一個學習者臭埋,有一個學習的氛圍跟一個交流圈子特別重要這里我推薦一個C/C++基礎交流583650410踪央,不管你是小白還是轉行人士歡迎入駐臀玄,大家一起交流成長

6 、復雜度

許多程序過于復雜畅蹂,比需要有效解決的問題更加復雜健无。這是為什么呢?大部分是由于設計不好液斜,但我會跳過這個問題累贤,因為這個問題太大了。然而程序往往在微觀層面就很復雜旗唁,有關這些可以在這里解決畦浓。

  • 規(guī)則 1:不要斷定程序會在什么地方耗費運行時間。瓶頸總是出現(xiàn)在令人意想不到的地方检疫,直到證實瓶頸在哪讶请,不要試圖再次猜測并加快運行速度。

  • 規(guī)則 2:估量(measure) 在沒有對代碼做出估量之前不要優(yōu)化速度屎媳,除非發(fā)現(xiàn)最耗時的那部分代碼夺溢,要不也不要去做。

  • 規(guī)則 3:當 n 很小時(通常也很兄蛞辍)风响,花哨的算法運行很慢〉べ鳎花哨算法有很大的常數(shù)級別復雜度状勤。在你確定 n 總是很大之前, 不要使用花哨算法双泪。(即使假如 n 變大持搜,也優(yōu)先使用規(guī)則 2).例如,對于常見問題焙矛,二叉樹總比伸展樹高效葫盼。

  • 規(guī)則 4:花哨的算法比簡單的算法更容易有 bug,而且實現(xiàn)起來也更困難 盡量使用簡單的算法與簡單的數(shù)據(jù)結構村斟。

以下幾乎是所有實際程序中用到的數(shù)據(jù)結構:

  • 數(shù)組

  • 鏈表

  • 哈希表

  • 二叉樹

當然也必須要有把這些數(shù)據(jù)結構靈活結合的準備贫导,比如用哈希表實現(xiàn)的符號表,其中哈希表是由字符型數(shù)組組成的鏈表蟆盹。

  • 規(guī)則 5:以數(shù)據(jù)為核心 如果選擇了適當?shù)臄?shù)據(jù)結構并把一切都組織得很有條理性孩灯,算法總是不言而喻的。編程的核心是數(shù)據(jù)結構逾滥,而不是算法钱反。(參考 Brooks p. 102)

  • 規(guī)則 6:就是沒有規(guī)則 6。

7 匣距、數(shù)據(jù)編程

不像許多 if 語句面哥,算法或算法的細節(jié)通常以緊湊、高效和明確的數(shù)據(jù)進行編碼毅待。眼前的工作可以編碼尚卫,歸根到底是由于其復雜性都是由不相干的細節(jié)組合而成。分析表是典型例子尸红,它通過一種解析固定吱涉、簡單代碼段的形式,對編程語言的語法進行編碼外里。有限狀態(tài)機特別適合這種處理形式怎爵,但是幾乎任何涉及到對構建數(shù)據(jù)驅動算法有益的程序,都是將某些抽象數(shù)據(jù)類型的輸入“解析”成序列盅蝗,序列會由一些獨立“動作”構成鳖链。也許這種設計最有趣的地方是表結構有時可以由另一個程序生成(經典案例是解析生成器)。有個更接地氣的例子墩莫,假如操作系統(tǒng)是由一組表驅動芙委,這組表包含連接 I/O 請求到相應設備驅動的操作,那么可以通過程序“配置“系統(tǒng)狂秦,該程序可以讀取到某些特殊設備與可疑機器連接的描述灌侣,并打印相應的表。數(shù)據(jù)驅動程序在初學者中不常見的原因之一是由于 Pascal 的專制裂问。Pascal 像它的創(chuàng)始人一樣侧啼,堅信代碼要和數(shù)據(jù)分開。因而(至少在原始形式上)無法創(chuàng)建初始化的數(shù)據(jù)堪簿。與圖靈和馮諾依曼的理論背道而馳痊乾,這些理論可都是定義存儲計算機的基本原理。代碼和數(shù)據(jù)是一樣的戴甩,或至少可以算是符喝。還能怎樣解釋編譯器的工作原理呢?(函數(shù)式語言對 I/O 也有類似的問題)

8甜孤、 函數(shù)指針

Pascal 專制的另一個結果是初學者不使用函數(shù)指針协饲。(在 Pascal 中沒有把函數(shù)作為變量) 用函數(shù)指針來處理編碼復雜度會有一些令人感興趣的地方。指針指向的程序有一定的復雜度缴川。這些程序必須遵守一些標準協(xié)議茉稠,像要求一組都是相同調用的程序就是其中之一。除此之外把夸,所要實現(xiàn)的只是完成業(yè)務而线,復雜度是分散的。有個協(xié)議的主張是既然所有使用的功能相似,那么它們的行為也必須相似膀篮。這對簡單的文檔嘹狞、測試、程序擴展和甚至使程序通過網(wǎng)絡分布都有幫助——遠程過程調用可以通過該協(xié)議進行編碼誓竿。我認為面相對象編程的核心是清晰使用函數(shù)指針磅网。規(guī)定好要對數(shù)據(jù)執(zhí)行的一系列操作,以及對這些操作響應的整套數(shù)據(jù)類型筷屡。將程序合攏到一起最簡單的方法是為每種類型使用一組函數(shù)指針涧偷。簡而言之,就是定義類和方法毙死。當然燎潮,面向對象語言提供了更多更漂亮的語法、派生類型等等扼倘,但在概念上幾乎沒有提出額外的東西确封。數(shù)據(jù)驅動程序與函數(shù)指針的結合,變成了一種表現(xiàn)令人驚訝的工作方法唉锌。根據(jù)我的經驗隅肥,這種方法經常會產生驚喜的結果。即使沒有面向對象語言袄简,無需額外的工作也可以獲得 90% 的好處腥放,并且能更好地管理結果。我無法再推薦出更高標準的實現(xiàn)方式绿语。我所有的程序都是由這種方式組織管理秃症,而且經過多次開發(fā)后都相安無事——遠遠優(yōu)于缺少約束的方法。也許正如所說:從長遠來看吕粹,約束會帶來豐厚的回報种柑。

9 、包含文件

簡單規(guī)則:包含(include)文件時應該永遠不要嵌套包含匹耕。如果聲明(在注釋或隱式聲明里)需要的文件沒有優(yōu)先包含進來聚请,那么使用者(程序員)要決定包含哪些文件,但要以簡單的方式處理稳其,并采用避免多重包含的結構驶赏。多重包含是系統(tǒng)編程的禍根。將文件包含五次或更多次來編譯一個單獨的 C 源文件的事情屢見不鮮既鞠。Unix 系統(tǒng)中 /usr/include/sys 就用了這么可怕的方式煤傍。說到 #ifdef,有一個小插曲嘱蛋,雖然它能防止讀取兩次文件蚯姆,但實際上經常用錯五续。#ifdef 是定義在文件本身中,而不是文件包含它龄恋。結果是常常導致讓成千上萬不必要的代碼通過詞匯分析器疙驾,這是(優(yōu)秀編譯器中)耗費最大的階段。只需遵從以上簡單規(guī)則篙挽,就能讓你的代碼變得優(yōu)雅而美觀荆萤,至少也是賞心悅目,從技術變成藝術~~延伸閱讀:有人認為铣卡,現(xiàn)在是java和.net的時代,有誰還需要C以及匯編呢偏竟?孰不知煮落,java和.net是建立在軟件之上的,是為了壟斷市場而建立起來的體系踊谋, 猶如挖好一個金壁輝煌的坑蝉仇,請你往下跳,還自以為站在巨人的肩膀上殖蚕,事實上成了坑底之蛙轿衔。要成為一個真正的程序員,并期望成為一個程序員高手睦疫,必須從機器 出發(fā)害驹,從cpu到操作系統(tǒng),再到軟件體系蛤育,高手的境界就是悟道后的明鏡靈臺宛官,軟件設計出神入化,我就是程序瓦糕,程序就是我底洗。旁觀者李四說:此人大笨也!我用鼠標隨便拖幾個控件咕娄,就是一個xxx管理系統(tǒng)了亥揖,你用C語言怕是一年也寫不出來吧!好吧圣勒,我要承認费变,講這話的都已經是mS 的奴才了,別的我不了解灾而,MFC本身就是一個封閉的架構胡控,從MFC入手學習,你只會形成一種封閉的思維模式旁趟,因為MS希望很多人只學會表面的東西昼激,不致成 為高手庇绽,所以它大力推薦所謂的可視化的程序開發(fā)工具,也真有很多人愿意上他的當橙困,最后真正迷失方向瞧掺。說他坐不了程序吧,他也可以作凡傅,但是如果程序復雜一 點辟狈,出現(xiàn)問題時,問題出再哪里就搞不清楚了夏跷,反正是不清楚哼转!梁肇新,大牛啊槽华,他說:"我就搞不懂了壹蔓,用鼠標怎么寫程序呢?在我的公司里猫态,高手的鍵盤響個不停佣蓉,鼠標偶爾響一下,新手是鼠標響個不停亲雪,鍵盤偶爾響一下勇凭,他們的薪水相差的就不是一倍那么多了!"C語言是各大操作系統(tǒng)的基礎义辕,Unix虾标、Linux、Windows其內核都清一色是C語言開發(fā)的终息,(某些地方是和匯編語言混合開發(fā)的)夺巩,君不見 WindowsAPI都是C語言函數(shù)的接口?Unix/Linux絕大多數(shù)應用都是C語言開發(fā)的周崭;Windows應用程序用純API開發(fā)已然不多柳譬,大多都 是依靠某種ApplicationFramework,比如所謂的VC++续镇,其實就是指VCIDE+C++語言+MFC(現(xiàn)在重點已轉向ATL美澳、 WTL),但是Windows服務摸航、網(wǎng)絡制跟、驅動程序等底層軟件,還是C語言開發(fā)的酱虎。各種語言的編譯器雨膨,包括java虛擬機,都是用C語言開發(fā)的读串。各種嵌入 式設備聊记,如手機撒妈、PDA也都是C語言開發(fā)的。下面是一些個人建議:****多看課本排监、代碼由于C語言靈活狰右、強大,初學者要全面地掌握它非常吃力舆床,因此在學習C語言的過程中棋蚌,要多看課本、代碼挨队,課本上沒有的可以上網(wǎng)搜索谷暮。首先一定要熟練掌握變量、常量瞒瘸、基本數(shù)據(jù)類型坷备、庫函數(shù)及特點和運用、運算符情臭、表達式及語句、C語言編寫的基本格式赌蔑。再次要掌握C語言的流程控制語句俯在、數(shù)組、函數(shù)娃惯、指針等基礎知識跷乐,上述知識熟練后就可以學習鏈表、隊列趾浅、樹愕提、圖等知識。最后要熟練各個知識點的運用皿哨,可以把學習的重點放在函數(shù)的設計框架浅侨、參數(shù)設計、返回值設計等關鍵問題上证膨。學好數(shù)學如输、英語在C語言的學習過程中,一般有大量的算法和數(shù)據(jù)結構需要去了解(大一同學在大二會接觸這些知識央勒,如果有想提前了解的同學不见,可以點擊下面鏈接查看:),許多算數(shù)運算和邏輯運算崔步、關系運算稳吮、循環(huán)結構都可以利用數(shù)學知識來完成的,同樣許多算法都是為了完成數(shù)學領域的計算井濒。編寫程序是為了讓計算機可以代替人操作運算過程灶似,從而減少人力列林。可見數(shù)學在計算機學習中的重要地位喻奥,有了數(shù)學知識席纽,你會發(fā)現(xiàn)數(shù)據(jù)結構與算法原來也是很簡單的。同理撞蚕,在C語言的學習過程中润梯,我們會用到大量的英語知識。對于編程來說甥厦,英語的作用體現(xiàn)在閱讀英文文檔纺铭,適應國際化的編程環(huán)境,我們要記住常用的一些C語言中用到的詞匯刀疙,也就是諸多的關鍵字舶赔。理論聯(lián)系實踐,重視上機試驗計算機專業(yè)的大部分課程都是通過實踐來檢驗學習成果的谦秧,更重要的是要將所學的理論知識都要在實踐中更好的發(fā)揮竟纳。編程序是個實干的活,光說不練不行疚鲤。剛開始學的時候可以多練習書上的習題锥累。對于自己不明白的地方,自己編個小程序實驗一下是最好的方法集歇,能給自己留下深刻的印象桶略。自己動手的過程中要不斷糾正自己不好的編程習慣和認識錯誤 C語言也是一門實踐性很強的課程,既要掌握概念诲宇,又要動手編程际歼、上機調試運行。養(yǎng)成上機前分析題目姑蓝,并編出程序源代碼的好習慣鹅心,編程時要注意程序的格式、標點符號等它掂,同時調試程序時要有耐心巴帮,有時一個程序可能要修改多次,甚至于費了不少勁還是沒結果虐秋。要不斷向老師或者同學請教胆剧,不斷地查閱資料狐胎,所以編程千萬不可遇難而退锋边,這個時候是決定你水平提高的關鍵疯坤,一定要堅持到底。大家對自己要有自信靶剑,對學好C語言課程要有信心蜻拨,這樣我們才會有一個好的學習狀態(tài)并改正BUG池充。程序調試成功后,要總結分析出自己在編寫程序時都出現(xiàn)了那些不足缎讼,在以后的解題過程中自己應該注意的問題收夸。上機調式程序成功后要完成實驗報告,逐步積累調試程序的經驗血崭。培養(yǎng)自己良好的編程習慣卧惜。養(yǎng)成良好的編程習慣(1)在比較復雜的代碼后面要有注釋。如果光溜溜一堆代碼夹纫,別人就不可能看懂你的代碼咽瓷,而且也不利于查找錯誤。除非你一直編東西給自己看舰讹。能在代碼里說明白的就一定要在代碼里體現(xiàn)茅姜。比如變量名、函數(shù)名月匣,在命名的時候盡量說明是干什么用的钻洒。(2)注意語句的嵌套不要太長,把主函數(shù)盡量寫簡短锄开。經澈剿簦看到別人的代碼是主函數(shù)只有幾行,幾個函數(shù)調用院刁,而定義全在主函數(shù)外部。這樣一是減少了主函數(shù)內部的嵌套粪狼,二是比較精簡退腥,容易讀懂。(3)注意語句的選擇再榄。并不是分支語句就用if循環(huán)就用while狡刘、for。在適當?shù)那闆r下switch和dowhile語句也是要用的困鸥。在某些時候嗅蔬,switch語句比if語句更加精練明了,而dowhile比while少一個循環(huán)疾就。

image

那么如何學好單片機C語言澜术?很多想學單片機的人問我的第一句話就是怎樣才能學好單片機?對于這個問題我今天就我自己是如何開始學單片機猬腰,如何開始上手鸟废,如何開始熟練這個過程給大家講講。 先說說單片機姑荷,一般我們現(xiàn)在用的比較多的的MCS-51的單片機盒延,它的資料比較多缩擂,用的人也很多,市場也很大添寺。就我個人的體會怎么樣才能更快的學會單片機這門課胯盯。單片機這門課是一項非常重視動手實踐的科目,不能總是看書计露,但是學習它首先必須得看書博脑,因為從書中你需要大概了解一下,單片機的各個功能寄存器薄坏,而說明白點趋厉,我們使用單片機就是用軟件去控制單片機的各個功能寄存器,再說明白點胶坠,就是控制單片機那些管腳的電平什么時候輸出高君账,什么時候輸出低。由這些高低電平的變化來控制你的系統(tǒng)板沈善,實現(xiàn)我們需要的各個功能乡数。至于看書,只需大概了解單片機各管腳都是干什么的闻牡?能實現(xiàn)什么樣的功能净赴?第一次,第二次你可能看不明白罩润,但這不要緊玖翅,因為還缺少實際的感觀認識。所以我總是說割以,學單片機看書看兩三天的就夠了金度,看小說你一天能看五六本,看單片機你兩三天看兩三遍就夠了严沥,可以不用仔細的看猜极。推薦一本書,就這一本就足夠消玄,書名是《新編MCS-51單片機應用設計》跟伏,是哈爾濱工業(yè)大學出版社出的的,作者是張毅剛翩瓜。大概了解一下書上的內容受扳,然后實踐,這是非常關鍵的奥溺,如果說學單片機你不實踐那是不可能學會的辞色,關于實踐有兩種方法你可以選擇,一種方法:你自己花錢買一塊單片機的學習板,不要求功能太全的相满,對于初學者來說你買功能非常多的那種板子层亿,上面有很多東西你這輩子都用不著,我建議有流水燈立美、數(shù)碼管匿又、獨立鍵盤、矩陣鍵盤建蹄、AD或DA(原理一樣)碌更、液晶、蜂鳴器洞慎,這就差不多了痛单。如果上面我提到的這些,你能熟練應用劲腿,那可以說對于單片機方面的硬件你已經入門了旭绒,剩下的就是自己練習設計電路,不斷的積累經驗焦人。只要過了第一關挥吵,后面的路就好走多了,萬事開頭難花椭,大家可能都聽過忽匈。方法二:你身邊如果有單片機方面的高手,向他求助矿辽,讓他幫你搭個簡單的最小系統(tǒng)板丹允。對于高手來說,做個單片機的最小系統(tǒng)板只需要一分鐘的時間袋倔,而對于初學者可就難多了嫌松,因為只有對硬件了解了,才能熟練運用奕污。而如果你身邊沒有這樣的高手,又找不到可以幫助你的人液走,那我勸你最好是自己買上一塊碳默,畢竟自己有一塊要方便的多,以后做單片機類的小實驗時都能用得上缘眶,還省事嘱根。有了單片機學習板之后你就要多練習,最好是自己有臺電腦巷懈,一天少看電影该抒,少打游戲,把學習板和電腦連好顶燕,打開調試軟件坐在電腦前凑保,先學會怎么用調試軟件冈爹,然后從最簡單的流水燈實驗做起,等你能讓那八個流水燈按照你的意愿隨意流動時你已經入門了欧引,你會發(fā)現(xiàn)單片機是多么迷人的東西啊频伤,太好玩了,這不是在學習知識芝此,而是在玩憋肖,當你編寫的程序按你的意愿實現(xiàn)時你比做什么事都開心,你會上癮的婚苹,真的岸更。做電子類的人真的會上癮。然后讓數(shù)碼管亮起來膊升,這兩項會了后怎炊,你已經不能自拔了,你已經開始考慮你這輩子要走哪一行了用僧。就是要這樣練習结胀,在寫程序的時候你肯定會遇到很多問題,而這時你再去翻書找责循,或是問別人糟港,當?shù)玫浇獯鸷竽銜涀∫惠呑拥模R必須用于現(xiàn)實生活中院仿,解決實際問題秸抚,這樣才能發(fā)揮它的作用,你自己好好想想歹垫,上了這么多年大學剥汤,天天上課,你在課堂上學到了什么排惨?是不是為了期末考試而忙碌呢吭敢?考完得了90分,哈哈哈好高興啊暮芭,下學期開學回來忘的一干二凈鹿驼,是不是?你學到什么了辕宏?但是我告訴你單片機一旦學會畜晰,永遠不會忘了。另外我再說說用匯編和C語言編程的問題瑞筐。很多同學大一二就開設了C語言的課凄鼻,我也上過,我知道那時天天就是幾乘幾,幾加幾啊块蚌,求個階乘啊闰非。學完了有什么用?讓你用C語言編單片機的程序你是不是就傻了匈子?書上的東西我們必須要會運用河胎。單片機編程用C語言或匯編語言都可以,但是我建議用C語言比較好虎敦,如果原來有C語言的基礎那學起來會更好游岳,如果沒有,也可以邊學單片機邊學C語言其徙,C語言也挺簡單胚迫,只是一門工具而已,我勸你最好學會唾那,將來肯定用得著访锻,要不你以后也得學,你一點匯編都不會根本無所謂闹获,但你一點C語言都不會那你將來會吃苦頭期犬。匯編寫程序代碼效率高,但相對難度較大避诽,而且很羅嗦龟虎,尤其是遇到算法方面的問題時,根本是麻煩的不得了沙庐,現(xiàn)在單片機的主頻在不斷的提高鲤妥,我們完全不需要那么高效率的代碼,因為有高頻率的時鐘拱雏,單片機的ROM也在不斷的提高棉安,足夠裝得下你用C語言寫的任何代碼,C語言的資料又多又好找铸抑,將來可移植性非常好贡耽,只需要變一個IO口寫個溫度傳感器的程序在哪里都能用,所以我勸大家用C語言鹊汛」阶Γ總結上面,只要你有信心柒昏,做事能堅持到底,有不成功不放棄的強烈意志熙揍,那學個單片機來說就是件非常容易的事职祷。步驟:1.找本書大概了解一下單片機結構,大概了解就行。不用都看懂有梆,又不讓你出書的是尖。(三天)2.找學習板練習編寫程序,學單片機就是練編程序泥耀,遇到不會的再問人或查書饺汹。(二十天)3.自己網(wǎng)上找些小電路類的資料練習設計外圍電路。焊好后自己調試痰催,熟悉過程兜辞。(十天)4.自己完全設計具有個人風格的電路,產品夸溶,逸吵。。缝裁。你已經是高手了扫皱。。捷绑。韩脑。〈馕郏看到了嗎段多?下功夫一個多月你就能成為高手,我就講這么多了厕怜,學不學得會衩匣,下不下得了功夫就看你的了。我的單片機學習心得很多人說粥航,學單片機最好先學匯編語言琅捏,以我的經驗告訴大家,絕對沒有這個必要递雀,初學者一開始就直接用C語言為單片機編程柄延,既省時間,學起來又容易缀程,進步速度會很快搜吧。在剛開始學單片機的時候,千萬不要為了解單片機內部結構而浪費時間杨凑,這樣只能打擊你的信心滤奈,當你學會編程后,自然一步步就掌握其內部結構了撩满。單片機的學習實踐蜒程。單片機提高重在實踐绅你,想要學好單片機,軟件編程必不可少昭躺。但是熟悉硬件對于學好單片機的也是非常重要的忌锯。如何學習好硬件,動手實踐是必不可少的领炫。我們可以通過自己動手做一個自己的電子制作偶垮,通過完成它,以提高我的對一些芯片的了解和熟練運用它帝洪。這樣我們就可以多一些了解芯片的結構似舵。我相信,你完成了一個屬于自己的電子制作碟狞,你的單片機水平就會有一個質的提高啄枕。這就是我學習單片機的心得體會,希望給單片機的愛好者學好單片機有所幫助族沃。使用單片機就是理解單片機硬件結構频祝,以及內部資源的應用,在匯編或C語言中學會各種功能的初始化設置,以及實現(xiàn)各種功能的程序編制脆淹。第一步:數(shù)字I/O的使用使用按鈕輸入信號常空,發(fā)光二極管顯示輸出電平,就可以學習引腳的數(shù)字I/O功能盖溺,在按下某個按鈕后漓糙,某發(fā)光二極管發(fā)亮,這就是數(shù)字電路中組合邏輯的功能烘嘱,雖然很簡單昆禽,但是可以學習一般的單片機編程思想,例如蝇庭,必須設置很多寄存器對引腳進行初始化處理醉鳖,才能使引腳具備有數(shù)字輸入和輸出輸出功能。每使用單片機的一個功能哮内,就要對控制該功能的寄存器進行設置盗棵,這就是單片機編程的特點,千萬不要怕麻煩北发,所有的單片機都是這樣纹因。第二步:定時器的使用學會定時器的使用,就可以用單片機實現(xiàn)時序電路琳拨,時序電路的功能是強大的瞭恰,在工業(yè)、家用電氣設備的控制中有很多應用狱庇,例如惊畏,可以用單片機實 現(xiàn)一個具有一個按鈕的樓道燈開關是牢,該開關在按鈕按下一次后,燈亮3分鐘后自動滅陕截,當按鈕連續(xù)按下兩次后,燈常亮不滅批什,當按鈕按下時間超過2s农曲,則燈滅。數(shù) 字集成電路可以實現(xiàn)時序電路驻债,可編程邏輯器件(PLD)可以實現(xiàn)時序電路乳规,可編程控制器(PLC)也可以實現(xiàn)時序電路,但是只有單片機實現(xiàn)起來最簡單合呐,成本最低暮的。定時器的使用是非常重要的,邏輯加時間控制是單片機使用的基礎淌实。第三步:中斷單片機的特點是一段程序反復執(zhí)行冻辩,程序中的每個指令的執(zhí)行都需要一定的執(zhí)行時間,如果程序沒有執(zhí)行到某指令拆祈,則該指令的動作就不會發(fā)生恨闪,這樣就會耽誤很多快速發(fā)生的事情,例如放坏,按鈕按下時的下降沿咙咽。要使單片機在程序正常運行過程中,對快速動作做出反應淤年,就必須使用單片機的中斷功能钧敞,該功能就是在快速動作發(fā)生后,單片機中斷正常運行的程序麸粮,處理快速發(fā)生的動作溉苛,處理完成后,在返回執(zhí)行正常的程序豹休。中斷功能使用中的困難是需要精確地知道什么時候不允許中斷發(fā)生(屏蔽中斷)炊昆、什么時候允許中斷發(fā)生(開中斷),需要設置哪些寄存器才能使某種中斷起作用威根,中斷開始時凤巨,程序應該干什么,中斷完成后洛搀,程序應該干什么等等敢茁。中斷學會后,就可以編制更復雜結構的程序留美,這樣的程序可以干著一件事彰檬,監(jiān)視著一件事伸刃,一旦監(jiān)視的事情發(fā)生,就中斷正在干的事情逢倍,處理監(jiān)視的事情捧颅,當然也可以監(jiān)視多個事情,形象的比喻较雕,中斷功能使單片機具有吃著碗里的碉哑,看著鍋里的功能。以上三步學會亮蒋,就相當于降龍十八掌武功扣典,會了三掌了,可以勉強護身慎玖。第四步:與PC機進行RS232通信單片機都有USART接口贮尖,特別是MSP430系列中很多型號,都具有兩個USART接口趁怔。USART接口不能直接與PC機的RS232接口連接湿硝,它們之間的邏輯電平不同,需要使用一個MAX3232芯片進行電平轉換痕钢。USART接口的使用是非常重要的图柏,通過該接口,可以使單片機與PC機之間交換信息任连,雖然RS232通信并不先進蚤吹,但是對于接口的學習是非常重要的。正確使用USART接口随抠,需要學習通信協(xié)議裁着,PC機的RS232接口編程等等知識。試想拱她,單片機實驗板上的數(shù)據(jù)顯示在PC機監(jiān)視器上二驰,而PC機的鍵盤信號可以在單片機實驗板上得到顯示,將是多么有意思的事情氨印桶雀!第五步:學會A/D轉換MAP430單片機帶有多通道12位A/D轉換器,通過這些A/D轉換器可以使單片機操作模擬量唬复,顯示和檢測電壓矗积、電流等信號。學習時注意模擬地與數(shù)字地敞咧、參考電壓棘捣、采樣時間,轉換速率休建,轉換誤差等概念乍恐。使用A/D轉換功能的簡單的例子是設計一個電壓表评疗。第六步:學會PCI、I2C接口和液晶顯示器接口這些接口的使用可以使單片機更容易連接外部設備茵烈,在擴展單片機功能方面非常重要百匆。第七步:學會比較、捕捉呜投、PWM功能這些功能可以使單片機能夠控制電機胧华,檢測轉速信號,實現(xiàn)電機調速器等控制起功能宙彪。如果以上七步都學會,就可以設計一般的應用系統(tǒng)有巧,相當于學會十招降龍十八掌释漆,可以出手攻擊了。第八步:學習USB接口篮迎、TCP/IP接口男图、各種工業(yè)總線的硬件與軟件設計學習USB接口、TCP/IP接口甜橱、各種工業(yè)總線的硬件與軟件設計是非常重要的逊笆,因為這是當前產品開發(fā)的發(fā)展方向。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末岂傲,一起剝皮案震驚了整個濱河市难裆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镊掖,老刑警劉巖乃戈,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異亩进,居然都是意外死亡症虑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門归薛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谍憔,“玉大人,你說我怎么就攤上這事主籍∠捌叮” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵崇猫,是天一觀的道長沈条。 經常有香客問我,道長诅炉,這世上最難降的妖魔是什么蜡歹? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任屋厘,我火速辦了婚禮,結果婚禮上月而,老公的妹妹穿的比我還像新娘汗洒。我一直安慰自己,他們只是感情好父款,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布溢谤。 她就那樣靜靜地躺著,像睡著了一般憨攒。 火紅的嫁衣襯著肌膚如雪世杀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天肝集,我揣著相機與錄音瞻坝,去河邊找鬼。 笑死杏瞻,一個胖子當著我的面吹牛所刀,可吹牛的內容都是我干的。 我是一名探鬼主播捞挥,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼浮创,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了砌函?” 一聲冷哼從身側響起斩披,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讹俊,沒想到半個月后雏掠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡劣像,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年乡话,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耳奕。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡绑青,死狀恐怖,靈堂內的尸體忽然破棺而出屋群,到底是詐尸還是另有隱情闸婴,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布芍躏,位于F島的核電站邪乍,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜庇楞,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一榜配、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吕晌,春花似錦蛋褥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乏沸,卻和暖如春淫茵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹬跃。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工痘昌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炬转。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像算灸,于是被迫代替她去往敵國和親扼劈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349