日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机入门教程

發布時間:2023/12/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机入门教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

單片機入門教程 (轉)

來自:http://home.eeworld.com.cn/my/space.php?uid=78216&do=blog&id=13105

2009-01-07 10:51 請允許我假設你已經掌握基本的模擬與數字電路知識、基本的計算機理論知識(比如知道二進制是怎么回事,RAM和ROM是什么東西)與操作知識(比如會裝載與使用應用軟件)、明白C語言的基本規則與語句。同時,我默認你有一本經典51教材(哪個版本都可以)、一本51單片機應用教材(內容為給出硬件電路和源程序的單片機開發實例)、一塊51單片機實驗板(含一條串口線)、一塊具有ISP(在系統編程)功能的單片機、某個版本的KEIL軟件、某個版本的ISP燒寫軟件、一臺性能一般的PC電腦。 ?
如果不具備上述任何一項,請不要繼續閱讀本教程,收起你的書本,回家吧,你無法學會單片機。知識方面的欠缺請自己盡快彌補。教材與應用書籍可以借閱,但是我建議各買一本,因為它們屬于工具書,需要隨時翻看,版本我就不推薦了,各種版本內容基本都一樣,這個投資需要數十元。實驗板可以使用我提供的這一款,硬件功底好的也可以自制,成本在100元以內,網上有很多這方面的資料,且基本配置都大同小異。具有ISP功能的51單片機我推薦使用飛利浦系列,本實驗板就是針對P89C51RD2系列(價格40元左右)設計的(周立功單片機公司全面代理飛利浦單片機,可以聯系郵購)。其他ISP功能的單片機也行,如華邦的W78E系列,AVR哈佛結構(不是51內核)高速系列,不過我都沒有使用過。具有ISP功能的單片機雖然比AT89C51之類(10元左右)貴很多,但是配置很強(僅ROM容量就有64K,是AT89C51的16倍),而且相對于數百元的編程器或者仿真器來說,性價比還是很高的,有利于降低硬件投資給初學者造成的門檻。KEIL軟件網上隨處都可以下載到(搜索KEIL下載即可),當然盡量使用高版本的。ISP編程軟件周立功單片機的網站可以下載,名稱為ZLGISP,飛利浦的WINISP也可以。不算PC電腦的話,200元的投資足夠開始學習51單片機了(實驗板+串口線+單片機+教材)。
OK,這是一份面向對單片機一無所知的初學者的入門教程。單片機技術就如同一張窗戶紙,這份膚淺的教程就是來戳穿它的,呵呵。就如同你來到一個陌生的城市,我送你一張地圖——不是我水平高,是我比你來得早,就這么點優勢,呵呵。它的作用僅僅是幫助你在茫然的情況下順利上手,至于上手之后的進展,就全靠你自己的辛勤鉆研了。你要明白,沒有任何路標能夠代替你走完腳下的路。顯然,我不想你們再像我一樣在入門上花費過多寶貴時間。你們當然會感謝我,這是可以理解的,因為我也曾感謝過在我入門的時候給過我幫助的朋友。
好了,我們開始學習單片機的旅程。
第一章:單片機開發的基本流程
不是所有人都學過地理,但是幾乎每個人都能找到回家的路,學習單片機也是如此。我們先不要看什么教材,我們直接進入開發過程的介紹與學習,爭取在最短的時間內獲得最多的感性認識。千萬不要像學英語那樣學單片機,就像背了十年單詞卻沒見著一回老外——看一年教材也沒見過單片機什么樣的話,那就不可能學會了。
針對我們前言中的軟硬件,基本開發流程是這樣的:
1、在PC電腦上安裝并啟動KEIL軟件,建立一個單片機工程項目,調整設置,使項目輸出時生成HEX格式(INTERL公司規定的一種二進制格式)燒寫文件。具體操作詳見第二章。
2、新建程序文件,將其加入項目。用匯編或者C51語言編寫一個程序,編譯,糾錯,再編譯,再糾錯,直到錯誤全部消失,編譯成功,系統會自動生成HEX格式文件,保存在項目所在的文件夾里。
3、在實驗板斷電的情況下(如果帶電容易擊穿PC機串口),用串口線連接單片機與PC機串口。接通實驗板電源,選擇ISP編程(紅色發光管亮),復位,進入編程狀態。啟動ISP編程軟件ZLGISP,選擇需要擦除的FLASH塊(初學編程代碼不會很大,擦除第一塊BLOCK8K足夠)。點擊設置選項,VECTOR為FC不要改動,STATUS改為00,點擊寫入。然后點擊讀出,確認VECTOR確實為FC,而STATUS確實為00,如果不是,重新寫入,然后退出ISP狀態,則設置完成。也就是說每次退出ISP功能之前,必須確認向量為FC,否則下次將無法進入ISP狀態,就好比你把鑰匙放在屋子里卻從外邊鎖上了門一樣。因為VECTOR和STATUS是同時被改寫的,所以改寫STATUS的時候VECTOR可能發生誤碼或丟失等錯誤,一旦發生這種情況,只能使用支持P89C51RD2的并行編程器將VECTOR的入口地址FC重新燒入,等于破門而入拿鑰匙,比較麻煩了。注意,這一步非常關鍵,STATUS不為00程序將不能正常運行程序,原理下文再做介紹。打開編譯好的HEX格式燒寫文件。點擊編程選項,不必做任何選擇,等待編程自動結束。
4、切換到運行狀態(綠色發光管亮),按下復位鍵。此時程序開始運行,實驗板的器件會有相應的反應。至此一次完整的單片機開發流程成功結束。
第二章:KEIL軟件使用方法
如何安裝與啟動KEIL軟件我就不說了,這個軟件的功能有三個:編輯程序源代碼,編譯源程序為目標文件(目標文件就是翻譯過來的機器碼),軟件仿真運行結果。作為初學者,你要明白編輯和編譯的區別——就像你要明白秘書和翻譯的區別一樣。
啟動軟件以后,點擊PROJECT(工程),在下拉菜單中選擇NEW(新建),在對話框中設置項目文件的保存位置,具體位置隨你便了。給該工程項目命名,隨你便,但是要把擴展名設為.UV2,比如可以命名為LED.UV2,保存。此時彈出單片機設備選擇對話框,針對我們的實驗板請選擇ATMEL公司的AT89C51或者PHILIPS公司的8XC51RD2,點擊確定。
點擊FILE(文件)中的NEW,此時會出現一個文本界面,點擊FILE中的SAVE(保存),在對話框中設置保存路徑(最好與剛才的工程文件在一個文件夾中)。給該源程序文件命名,擴展名要根據你使用的編程語言確定,如果使用匯編語言,就命名為.ASM,如果使用C51語言,就命名為.C。對于沒有學過C51的初學者來說,應使用.ASM,比如LED.ASM,保存。
在左面的工程窗口里用右鍵點擊TARGET1,選擇OPTIONS ? ?FOR ? ?TARGET ‘TARGET 1’ ,在對話框中選擇OUTPUT選項,在CREAT ? HEX ? FILE選項前打勾,點擊確定,這樣編譯之后,在工程項目所在的文件夾中就能夠生成HEX格式的燒寫文件了。
點擊TARGET1前面的加號,用右鍵點擊SOURSE ? GROUP ? 1,選擇ADD ? FILES ? TO ? GROUP ‘SOURSE ? GROUP ? 1’ ,將剛才新建的源程序文件加入。此時SOURSE ? GROUP ? 1之前也有加號了,點擊會看到你新建的文件。
雙擊進入你建立的文件,現在可以編寫你的第一個程序了。
第三章:你的第一個單片機程序
源程序如下:
ORG ? 00H
MOV ? P0 , #55H
LOOP: ? SJMP ? LOOP
END
什么?這么簡單?!是不是在搞笑?!沒錯,雖然簡單,但這就是一個完整的單片機程序。具體語句我先不作解釋,你要先把這個程序在實驗板上跑起來才行。點擊編譯按鈕(項目窗口上面那三個蛋糕一樣的按鈕中間或者右邊那個),也可以選擇PROJECT選項中的BUILD ? TARGET選項,編譯就自動開始。如果有錯誤或者警告,下面的編譯輸出欄將會顯示,如果你編譯過C語言的程序,就會比較熟悉,所以要求你具有一定的C語言基礎。如果沒有錯誤和警告,系統將顯示代碼量,DATA表示占用內部RAM空間的大小,XDATA表示占用外部RAM空間的大小,CODE表示占用片內ROM空間的大小。P89C51RD2HBP本身有1K內部數據存儲器RAM,64K內部程序存儲器ROM,本實驗板沒有擴展外部RAM,所以暫時不能做有關外部RAM存儲的實驗。至于你使用AT89C51+編程器的話,資源就比較少了,只有128B(1字節=8位)RAM和4K大小的ROM,不過對于初學者,足夠使用了。
好的,對于你這樣一個一點成就感都沒有的初學者來說,激動人心的時候就要到了:我們要把這個程序固化到單片機的ROM里了。連接好串口線,寫入STATUS為00(切記!寫一次就行了,頻繁擦寫有可能導致向量丟失,那麻煩就大了),擦除,固化,復位——哈,程序運行了嗎?8個LED發光管隔一個亮一個嗎?如果是的話,恭喜你啊!你已經成為一名單片機的開發人員啦!呵呵,雖然這個程序沒有什么實用價值,你也不明白語句的意義,但是它給你帶來了成就感和自信心,這才是作為初學者最最需要的,有了信心與興趣,一切都不再成為負擔和難題。
是不是開始躍躍欲試了?好的,我們繼續講下去。
第四章:程序解釋與軟件仿真功能的介紹
現在我們回過頭來解釋這個程序。
ORG是一個偽指令。不懂?呵呵,正常,當初我也不懂。偽指令就是一條沒有真正操作的指令,說白了就是什么活也不干,耍耍嘴皮子而已。ORG是個定位偽指令,告訴系統程序從00地址開始執行,至于執行什么,怎么執行,它不管。就像一次掃雪任務,一個領導來了,指著腳下說:從這里開始掃。至于具體怎么掃,那是你的事情,呵呵。還有幾條偽指令,去看教材。
MOV ? P0 , #55H是這個程序的核心指令,工作全部都是它做的。參照教材,它的意思是將十六進制數55輸出給寄存器P0,而P0口的狀態由8個LED顯示。我知道你會對這個十六進制數字感到糊涂,因為我們長了10手指頭。這里的55不是十進制轉換來的,它實際是二進制數字的一種壓縮寫法,寫成二進制就是01010101,這樣P0口接的8個LED就會隔一個亮一個。55屁股后面的H表示它是十六進制數,如果去掉H就表示55是十進制數了。十進制數55轉換為十六進制數是37,二進制數是00110111,就不是01010101了,不信可以試試看,去掉55后面的H。為了明確輸出狀態,你可以將55H寫成01010101B,這個B表示是二進制數,顯示結果一樣,我寫輸出一般都使用二進制寫法。你必須明白十進制、二進制、十六進制之間的轉換方法,各種計算機書里都有的。以后你就不要用十進制思考了,二進制是一種重要思維方式,你務必熟悉。具體計算你不要動手,那很傻哦——PC機的附件里不是有個很好的計算器嗎?可以非常方便的轉換多種數制,編程的時候同時打開就行了。
現在來解釋那個很有趣味的軟件仿真,你不用燒寫芯片就可以看到運行結果,神奇吧!我當初都不知道有這么好的軟件,為了改變一個簡單的程序會白白燒片十幾次,簡直是傻瓜。現在我使你避免成為傻瓜,你是不是應該感謝我呢?呵呵。編譯成功后點擊DEBUG(調試或者叫除錯,因為BUG是錯誤的意思)選項里的STARTSTOP ? DEBUG ? SESSION,工具欄里也有這個快捷圖標(有個帶紅色B字母的放大鏡)。點擊PERIPHERAL(外設)選項,選擇需要察看的部分,這里我們選擇P0口。點擊左上角文件下面的RET復位,然后點擊RET右面的帶下箭頭的小方塊來運行程序,這時可以看到P0口狀態變為01010101,表明運行成功。想要退出運行中的程序,點擊那個圓形的紅色叉。要回到編輯界面請再次點擊DEBUG的快捷圖標。
現在有個問題,那個LOOP : ? SJMP ? LOOP是干嘛的?這是一個死循環,指令反復跳轉到本身,相信你能夠看懂。你會覺得它沒有什么用,你感覺很對,它的確沒有什么實際的作用。那么好,讓我們把它刪除——編譯照樣通過,沒有任何錯誤和警告,而且就算你現在把它燒寫到芯片里,它也能正確運行,那為什么還要加上?你不服?好,那我們進入剛才的調試界面,運行程序,不好!系統提示出錯NO ? ‘EXECUTE/REDA’ ? PERMISSION ? !什么原因?問題出來了吧?因為你刪除了這個循環,程序就跑飛了!跑飛了是什么意思?比如你讓一只小狗在廣場上隨便跑,你怎么知道它會跑到哪里去?這就是跑飛,結果是你丟失了這條小狗,當然你可以重新買一只,這就是復位了,哈哈。如果你讓一只小狗在院子里跑,它就不會丟失啦。循環的意義就在這里,讓程序掉到這個循環里,你和系統就能把它控制住。你還是不以為然嗎?這是一個簡單程序,也許問題不大,但是當程序復雜之后,跑飛了是件很麻煩很可怕的事情,會出現莫名其妙的錯誤,而且你也無法使用軟件仿真功能了。要是你還不服氣,那就嘗試每次編程都讓程序跑飛一次,如此之后你就有感覺了,我曾經被這個簡單問題困擾了數周之多,現在我提示你,你要當回事。
END也是個偽指令,是個編譯結束標志,編譯器編譯到END的時候就結束編譯了,不再編譯END以下的程序。
這就是軟件仿真的基本過程,后面我還會介紹到仿真的其他功能。建議你每次編寫程序以后都要先進行軟件仿真,反復修改,反復調試,直到需要完成的功能完全仿真成功再將程序燒寫到芯片,這樣能夠提高開發效率,延長單片機使用壽命。
第五章:關于編程器、仿真器與ISP
我建議你使用具有ISP功能的單片機完全是考慮到初學者的資金問題,因為很多人一聽說學習要花錢就會放棄學習。世界上沒有免費的知識,更沒有免費的技能,投資是非常必要的,但是成本越低就越容易上手,所以我推薦具有ISP功能的單片機,但這并非說編程器與仿真器已經沒用,這一點你們要明白。
首先說說編程器,它是干什么用的呢?程序編輯好后,并且通過編譯生成了HEX格式的二進制燒寫文件,就要用編程器把它燒寫到單片機里面。我最初入門的時候就是使用AT89C51 +編程器的開發模式,過了半年多才在發現具有ISP功能的單片機,白花了那么多銀子。編程器本身很貴的,最好的上千,好一點的數百元,最便宜的簡易型的也要上百元,是個不小的投資,很多人之所以對單片機望而卻步,正是在這個投資上出現了猶豫。另外編程器使用起來也比較麻煩,每一次編程都要把芯片從實驗板上拔下來,燒寫好了再插回去,很容易弄壞插座和管腳,為此配置零插拔力插座的話,又要花一只單片機的錢了(十多元一只)。而且如果去現場工作的話,拎著個編程器多麻煩!設備復雜的話插拔芯片也很困難,一旦弄壞了管腳或者印刷板,設備就完蛋了。但是編程器在開發產品中具有重要作用,因為產品的目標板(相當于完成指定功能的實驗板)一般沒有空間額外加掛串口電平轉換部分的器件,所以要通過編程器編程。而且開發產品如果使用一般的51芯片,成本也會大幅度下降。對于那些不用改動程序的產品比較有利。當然如果產量非常大的話,就選擇掩膜(就是把程序直接做到芯片里)生產了,編程器也不用了,成本非常低。
仿真器在高校教學、實驗與復雜產品開發中可以使用。使用編程器和ISP的開發方法叫做“崩潰——燒寫”模式,如果程序運行結果錯誤,只能改動程序后擦除芯片重新燒寫,為了調試一個程序連續燒寫芯片數十次是很正常的事情,但是這樣不但麻煩,還會縮短芯片使用壽命,而且無法觀察程序運行中的狀態。仿真器正是針對這一問題,它無需燒寫,通過它可以直接觀察運行結果,而且可以單步運行,能夠最直接的找到問題所在,所以高級產品的開發都要用到。不過初學者一般買不起仿真器,也沒必要買,KEIL本身就有軟件仿真功能,可以大大減少燒寫次數。只要不涉及到外部擴展接口,在KEIL上仿真運行成功的程序,絕大部分燒寫以后都能正常運行,下文將有說明。
ISP的意思是在系統編程,但是我不喜歡這個說法,剛入門誰能理解?我的解釋就是單片機本身自帶編程功能,就像把一臺編程器集成到單片機上,這就很容易理解了。它本身有一個出廠時候就固化好的編程程序,放在BOOT ? ROM里,不可修改。這個BOOT ? ROM不占用系統本身的ROM空間,具體放在哪里我們不必關心,VECTOR(向量)設置為FC(針對P89C51RD2系列)就是BOOT ? ROM的入口的地址,不得改動。順便解釋一下,BOOT不是靴子的意思哦,是啟動的意思。向量的意思我理解就是一個地址,線性代數中不是有N維向量的概念嗎?其實就是一串數字,你記住是地址就行了,不要去想什么向量。對于P89C51RD2來說,PSEN腳(29腳)接地(低電平)是進入ISP功能的硬件激活條件,所以編程的時候要按下選擇開關到編程端。編程結束后使PSEN腳恢復高電平,復位之后即可啟動程序,但是此時STATUS(狀態字)必須為00,它的意思就是程序從00地址開始啟動,因為編程操作是把程序燒寫到00地址開始的空間里,如果不從00啟動,程序就發生錯誤了。有關ISP的詳細資料可以從網上下載。不懂什么叫高低電平?不準確的說,低電平就是0V,高電平就是電源電壓5V,低電平相當于邏輯里的0,高電平相當于邏輯里的1,數字電路教材里一定有描述,我就不說了。
我覺得開發器材的選擇是這樣的:當你是初學者的時候,用一塊具有ISP功能的單片機學習足夠;當你能夠獨立設計目標板進行小產品開發時,可以考慮購置編程器;當你成為專業單片機技術人員乃至嵌入式系統工程師的時候,仿真器對于高級產品的開發是必須的了。
第六章:51單片機實驗板原理與功能簡介
現在市面上單片機實驗板種類繁多,有的非常簡陋,有的相對高級,價格與外圍器件擴展的程度正相關。我設計的這一款實驗板個人認為不算簡陋但也稱不上高級,和網上的各種普及型實驗板都差不多,市售價格在100元左右,非常適合初學者使用。能夠把這款實驗板的所有功能都開發出來的話,你的單片機開發水平就相當可以了。由于電路原理非常簡單,電路原理圖與PCB圖我將免費公布,以利于廣大初學者自制,需要者請聯系向我索要。你也可以參考我板子的硬件結構,根據自己的要求自行設計。
請參照你手里的51教材中列出的單片機管腳,我將詳細說明本實驗板的硬件結構。
1、P0口通過74LS244(單方向8位總線驅動器)驅動8位LED發光二極管。可以實現廣告燈、跑馬燈、交通燈等相關實驗。
2、P0同時通過74LS244驅動4位LED數碼管的段選,與8位LED切換通過一只開關完成。位選由P2口前4位通過4只NPN三極管驅動完成。可以實現時間顯示、秒表與計數顯示等與數碼管有關的實驗。
3、P1.5通過一只PNP三極管驅動一只自震蕩的蜂鳴器。自震蕩的意思是加上一定直流電壓,蜂鳴器即可發出一定頻率的聲音。如果想改變頻率,可以使用PWM(脈寬調制,就是改變脈沖占空比)方式通過音頻調制驅動。如果想實現音樂編程,更換為一般的蜂鳴器(就是音樂賀卡里的壓電片)即可。可以完成與音樂發生有關的實驗,也可作為報警信號輸出。
4、P1.6與P1.7腳連接IIC器件,板載一只8腳DIP插座,可選AT24C02,它是一只256B的EEPROM(電可擦寫存儲器)。可以實現電子密碼鎖等需要保存數據的實驗,通過實驗也可以對IIC技術有個基本的了解與掌握。
5、P3.2——P3.5是51的4個中斷的外部輸入端,這四個管腳連接4只按鍵開關到地,按下按鍵將該管腳接地。選擇P3工作于第一功能,則按鍵開關工作于查詢方式。如果選擇第二功能,就工作于中斷方式。可以完成按鍵和中斷的相關實驗。此處解釋一下查詢與中斷,如果你在睡午覺,為了防止遲到,你每隔5分鐘就睜眼看一下鬧鐘(假設你能夠準時醒來),這就是查詢方式,使用鬧鐘叫你就是中斷方式了。它們的區別很顯然,選擇查詢方式CPU就不能干別的工作了(就像你無法連續的睡覺),選擇中斷的話CPU可以去做其他工作,直到中斷來臨,CPU再去做中斷要求的工作。
6、P3.0與P3.1是單片機的串口接收與發送數據線,它們通過MAX232轉換為RS-232(一種串口通訊協議)標準電平,以便與PC機的串口通訊。因為51單片機與PC機的串口電平標準不同,所以用MAX232進行一個電平轉換工作,僅此而已,你不需要準確的知道RS-232的協議標準。這就如同英制與公制的轉換,對于你來說1M的長度對一個英國人來說就是3.28英尺。這個串口可以實現單片機與PC或者其他具備RS-232接口的單片機的通訊實驗,更為重要的是,ISP編程就是通過這個串口將程序從PC機下載到單片機的ROM里面的。對于具有ISP功能的單片機,必須有這個電平轉換部分(最小系統組成部分之一),否則無法進行編程。
7、其他沒有使用的管腳可以作為系統擴展使用。P0口外接上拉電阻。同時引出全部IO口線、ALE口線以及5V電源線和地線,便于擴展。晶振使用12M,選擇12個時鐘周期方式,機器周期為1US,選擇6個時鐘周期方式,機器周期為0.5US,這是飛利浦單片機的特殊功能。在ZLGISP軟件編程時,點擊設置,在6CLOCK前打勾即可選擇6個時鐘周期方式。這個方式比12個時鐘周期方式速度提高不少,但是對于精確延時程序將有影響,而且大多51教材都是針對12個時鐘周期所寫,所以不推薦初學者使用。
8、單片機非常害怕電源極性顛倒,所以電源插口后邊安裝了一只全橋作為“防呆開關”(原理簡單而巧妙,請自行研究),無論電源極性如何都可以直接輸入,但是輸入電壓不得低于8.5V,也不可太高,否則穩壓塊LM7805功耗過大容易發熱。可以使用市售收音機直流電源,推薦使用9V。至于復位開關,編程選擇開關,電源穩壓部分就不再贅述了。
以上簡介了實驗板的硬件結構,實驗請參見下文設計。
第七章:51單片機常見問題解答
關于51單片機的硬件,你手里任何一本教材都寫得很清楚,我沒有必要重新COPY一份,但是我很少看到能夠不費力氣就看得懂的51教材。對于初學者來說,一堆術語加上一堆嚴密得讓人頭痛的邏輯推導不啻為一種災難,有時候明明很簡單的原理非要被描述得艱澀異常。科學的精神在于把復雜的東西表述得簡單,但是我們很多教材編寫者卻反其道而行之,完全違背了真正的科學精神,實在是面目可憎,行而不遠。這也是我花費時間撰寫本教材的原因之一。下面就針對幾個被教材解釋得一塌糊涂的常見問題做一下通俗的解釋。
1、處理能力的概念。51單片機屬于8位機,8位是個什么意思呢?就是CPU處理的數據是8位的。位數的高低體現了CPU處理能力的強弱。4位的處理器已經基本淘汰了,8位的處理器占據了低端單片機的大部分市場,32位處理器是現在興起的嵌入式系統的主流配置,我們常用的電腦大多都是32位,64位的處理器也有,但是市場份額比較少,價格也較高。所以我們學習的51單片機屬于比較低級的單片機,會逐漸被新興的嵌入式處理器所淘汰,但是51單片機成本低,學習資源最豐富,上手容易,對于初學者來說是很理想的用于學習的單片機。
2、存儲器問題。51單片機有兩類存儲器,一類是程序存儲器ROM,它斷電以后數據不丟失,但是必須用編程器擦除和寫入程序;另一類是數據存儲器RAM,它斷電以后數據會丟失,但是可以用程序改寫內容。以AT89C51為例,因為它有16條地址線(P0和P2),所以它可以訪問64K存儲器空間(2的16次方是65535),它的ROM和RAM都是分內外的,外部存儲器都需要擴展,擴展方法參見教材。但是ROM和RAM的內外執行方式不同,ROM的內外切換要用EA腳(31腳)的電平選擇,而RAM的切換可以直接用不同指令MOV和MOVX分開同時訪問。例如AT89C51有4K內部ROM,64K外部ROM,如果EA=1,則從內部ROM開始執行,當超出4K之后,跳轉到片外4K以上的空間運行;如果EA=0,則完全在外部ROM中運行,內部ROM不再起作用。什么意思呢?就是要么運行內部4KROM要么運行外部4KROM,內外ROM的前4K不能同時運行,必須用EA切換。所以一般在沒有外部ROM的情況下,EA必須接電源正極,否則程序不能運行。我曾經因為EA懸空造成程序無法運行,苦苦思索一周才找到原因,期間因為盲目測試導致3塊AT89C51損壞,教訓十分慘痛,望后來者吸取教訓。RAM就不同了,AT89C51有128B內部RAM,可以擴展64K外部RAM,這兩個部分的RAM可以同時被訪問,注意選擇不同指令即可,訪問內部用MOV,訪問外部用MOVX,外部RAM擴展方法參見教材。ROM的種類除了常見的PROM(可編程ROM),還有MASK ? ROM、FLASH ? ROM 和EEPROM等種類。MASK ? ROM是掩模存儲器,掩模的意思就是工廠把程序直接做在芯片上了,適于不需要反復修改的大批量產品生產,成本非常低,但是用戶不能更改程序,8051里就是這種ROM。我最初接觸單片機的時候,去電子市場買8051,結果商家真的賣給我了一塊,回家一看,里面全都是程序,根本無法修改,現在回想起來,自己簡直是個傻瓜,哪有買掩模ROM的單片機做學習和開發的?!商家也不告訴我已經燒好的程序可以干什么,害的我只能拿它當8031使了!這個教訓真是好笑,希望大家一定要搞明白ROM的種類區分。PROM有OTP(一次性編程)和允許反復擦寫(用紫外線照射擦除)兩種,87C51系列就是OTP的ROM;就現在的形勢看,ROM有普及FLASH之勢,那些用紫外線擦除的垃圾看來是要被淘汰了。FLASH ? ROM可以電擦寫,但必須整塊擦除,寫入速度快,擦寫次數在1000到10萬次之間(視不同類型芯片而定),事實上89C51系列的ROM就是FLASH ? ROM,U盤內的ROM也是,一種NAND FLASH現在廣泛用于嵌入式系統中,它的存儲容量大,成本低,可以實現固態硬盤的功能;EEPROM是電可擦寫存儲器,它是按位擦寫的,可以擦寫10萬次以上,但擦寫速度較FLASH ROM要慢,AT24C02就是EEPROM,我們用的很多智能IC卡也是。RAM的種類有靜態SRAM,動態DRAM和SDRAM之分。SRAM只要寫入一次,有電數據就可以保持,單片機里就是SRAM,但是它的缺點就是太貴,所以單片機里的RAM都很小。DRAM一次寫入數據之后只能保持一瞬間,必須不斷重寫,叫做刷新,這個過程還需要相應的邏輯電路支持,很麻煩但是很便宜。SDRAM叫做具有靜態特性的動態RAM,它把邏輯刷新電路和DRAM做到了一起,它的工作方式本質是動態的,但是從外部看相當于一個SRAM,這樣就不但具有靜態特性而且價格便宜,我們電腦里的內存條都是SDRAM。我自己的理解是這樣的,就像爬山比賽,能力強的人呢,爬上去就不會滑下來。但是能力不行的人站不住,只好滑下來再爬上去,反復這樣,頻率高了給人的感覺就好像他在山上一樣。呵呵,反正能力強的東西總是更貴一些的。
3、IO口問題。P0口是集電極開路,所以我的實驗板上給它加了上拉電阻。上拉電阻的作用就是在基本沒有電流輸出的情況下將管腳電位拉到5V,這樣對于外部來說是邏輯1,如果沒有這個電阻,管腳電位就是0。為什么?假如三極管關閉的情況下C-E間電阻為100M,如果上拉電阻為10K,則分壓的結果是幾乎接近5V,這就是上拉的原理。IO口的驅動能力有限,AT89C51也就不到20MA(8051連這些都沒有),可以直接驅動LED(電流流入方式),但是驅動別的大電流外部設備必須加驅動電路,否則會燒毀IO口,務必注意。迄今為止,我一共燒毀了7塊AT89C51,損失了一把銀子之后我終于找到了原因:一個是電源問題,電源電壓超過5V或者極性顛倒都會導致芯片燒毀;另一個問題就是我在單片機供電的情況下測量P0.0腳(39腳)電位時表筆不小心連通了電源正極(40腳),而此時剛好P0.0內部MOS管開通(也就是輸出0),結果直接燒毀了輸出MOS管。因為P0口是數據線,結果導致編程時數據無法寫入。這個教訓最慘痛了,務必牢記。單片機的一種絕對保密技術就是利用了這種方法,編程之后燒毀一只閑置的數據或地址管腳的輸出管,造成數據無法讀出,達到絕對保密的目的。還有一點需要注意,如果要讀入管腳的狀態,必須先向該管腳寫1,然后再讀該管腳方能得到正確輸入。使用P3的第二功能之前,也要先向P3口寫1,目的都是讓IO口輸出管關閉。IO口詳細構造請閱讀51教材相關部分。
4、有關尋址方式。相關教材中的尋址部分純粹是找別扭,我都可以用51開發產品了,可是我現在重讀這部分教材依然一頭霧水,無法理解。不理解很好,說明你大腦正常,不用去管教材所說的尋址方式到底是什么意思,你學會如何使用就行了。其實就是對數字操作(所謂立即尋址)、對寄存器操作(所謂寄存器尋址)、對地址操作(所謂直接尋址)、對指針操作(有專用指針也有寄存器作為指針)和對位操作5種情況。尋址方式就是告訴你一個操作什么東西的問題,沒有什么高深的。如果還是不明白就不要看這部分內容了,直接學習指令進行編程,當你編程很熟練之后,你會發現,其實它那些怪里怪氣的尋址方式命名是很可笑的。
5、對中斷概念的理解。我最開始看了一個使用中斷的程序之后,想了好幾個晚上也沒有理解什么叫中斷。這個程序的注釋竟然說中斷服務程序是這個程序的核心部分,我當時就茫然了——那主函數是什么?垃圾嗎?在我的認識里,主函數才應該是一個程序的核心。忘了過了多少日子,我終于明白了中斷的含義。假如你設置一只鬧鐘6點叫你,如果你6點準時爬起來看鬧鐘是不是叫你的話,那就不叫鬧鐘了,你成了鬧鐘的鬧鐘了。初學者很容易不明白為什么主函數里并沒有跳轉到中斷服務函數的指令,怎么中斷服務程序就自己自動執行了呢?沒錯,中斷不需要什么指令來啟動,它會自己啟動,就像定時炸彈到點就會自動爆炸一樣。什么時候啟動由定時器、計數器或者外部中斷決定,這是一個前臺運行過程(誰表演誰就是前臺嘛),你在后臺看不到,后臺是個設置中斷的過程,決定什么情況下中斷會叫你。比如你在車站等你女朋友,你無法準確知道她什么時候來,所以后臺函數是個循環——你來回踱步,焦急的等待。當你女朋友出現的時候,她要求你停止踱步,和她去商店買衣服——這是中斷服務函數。如果你女朋友還沒來,你就自己跑到商店里了,那就不叫中斷了。如果她來了你還在踱步——很不幸,系統不是跑飛就是崩潰了,呵呵。有關中斷的具體操作與設置方法,請仔細閱讀51教材相關部分。中斷是單片機一個的難點,也是一個有特色之處,沒有中斷的話單片機就失去了全部的靈活性與實時性,變成一塊用于順序控制的數字電路了。
6、編程語言問題。你可以用匯編編程,也可以用C51語言編程。它們各有各的強項和弱點,選擇哪種語言要根據你的基礎和具體任務確定。有個老兄這樣說:匯編挺好啊,不過你用著用著就想用C51了;C51嘛,也挺好啊,不過你用著用著就想用匯編了。呵呵,真的是這樣。我個人的理解是:匯編好寫不好看,C語言好看不好寫。去看別人一段沒有注釋的匯編語言是一件很困難的事情,看不懂并不說明你編程水平差。這種情況下先不要看別人的例程,根據你自己的思路編寫即可,到了關鍵部分或是遇到障礙再看看例程,效果很好。別人寫的C語言比較好理解,因為C語言本質上就是各種各樣的函數調來調去的過程,看懂了函數,程序基本就明白了。下面說說匯編和C各自的特點:匯編是個事必躬親的戰術語言,要干什么就直接干什么,什么事情都要直接操作硬件,所以累啊——系統倒不累,你累啊,呵呵,累死你換來的好處就是代碼比較小,而且工作準確,操作決不會馬馬虎虎。C語言就不同了,是個戰略語言,只抓大局,一堆基層工作全給INCLUDE了,夠狠,要干什么不好好干,非要拐彎抹角——比如重新運行不讓用跳轉(封殺GOTO語句),非要設計一個巧妙的循環,匯編就沒這么不老實。這次你不累了,但是如果智商不夠就慘了,一句都寫不下去,不像匯編——就算我笨,能編多少時多少,編一點是一點。當甩手掌柜自然不錯,但是缺點也很明顯:一來代碼要大不少,系統資源一下就被搞緊張了;二來涉及到對硬件的具體操作就它就沒招了,還得求人家匯編,呵呵。所以匯編和C你都要掌握,大局由C定,幾處需要準確處理硬件的工作交給匯編,屬于瞎子背瘸子的組合,呵呵。兩手抓,兩手都要硬,互相滲透,結合使用,這就是學習單片機語言的基本原則。說了一頓,和具體編程一點關系都沒有,但是原則你要把握。匯編語言我就不說了,教材都會詳細說明指令的意義和使用方法,下面我說一下C51。C語言的具體結構和編寫方法你明白了嗎?沒明白趕緊看書。C51與通用C語言的區別我理解主要有兩點:一是中斷函數的聲明與使用,二是如何在單片機里進行位操作,我的理解就這一點點,當然這與我水平比較菜有很大關系。那么C語言如何能夠認識那些單片機的寄存器呢?難道每寫一個程序都先要鋪天蓋地的定義一番?!這個我們不怕也不用管,KEIL里有自帶的包含文件來解決這個問題。你在KEIL里寫C51程序的話,上來先寫一個#INCLUDE<AT89C51.H>,這一堆問題就解決了,下面你可以直接寫P0=0X00,或者SCON=0X00之類,反正C語言可以認識,還能正確編譯,怎么樣?戰略語言確實不得了,臟活全讓<AT89C51.H>這個文件做了。當然想舒服就得付出資源的代價,C代碼肯定比匯編大,不信你編寫一個同樣的匯編程序試試看。想學習C51的話,可以找一本教材,但是如果你基本明白C了,買教材就有點浪費了,因為大多數C51教材都花上很大篇幅講C的規則,什么數據類型,什么控制語句,簡直是浪費白紙,所以你借一本教材看看C51和通用C不同的地方就可以了,買一本實在不值得。借不到也可以到網絡上搜索一下,有更通俗的教材,這里推薦明浩寫的那個基于KEIL軟件的C51教材,雖然只有幾課內容,很簡單,但是非常容易理解,也很實用,同時還說明了KEIL的使用方法。
常見問題就談這么多,都是一些概括性的介紹,具體問題你要自己去解決。
第八章:實驗設計
你一定很著急知道學習多長時間才具有開發產品的能力,這個過程很快,一般連續學習半年以上(注意不是三天打魚兩天曬網)即可開發簡單的產品。你必須嚴格進行一系列實驗,通過實現單片機的所有功能達到提高開發能力的目的。下面列出我自己認為需要完成的實驗的名稱以及實驗項目的說明。
實驗1:跑馬燈左右循環移動的應用
實驗項目:
1、學習IO口的控制技巧,掌握各種數制的轉換方法。
2、第一次用取機器周期倍數的延時方法實現移動速度的設定。
3、第二次使用定時器中斷的方法實現移動速度的設定。
4、第三次使用DPTR取表的方式實現移動順序的設定。
實驗2:中斷的應用
實驗項目:
1、第一次用多種模式實現兩個定時器中斷的功能,可以用LED閃爍顯示,也可以讓蜂鳴器發聲。
2、第二次設定四個中斷同時存在,兩個外部中斷,兩個計數器中斷,由四個按鍵作為外部輸入。四個按鍵設定兩個優先級,完成五種任務(包括后臺的任務和四個中斷服務程序的任務)。
實驗3:布爾代數(一位機)應用
實驗項目:
類似可編程邏輯控制器的使用,選擇多個復雜的邏輯關系,使用指令中的邏輯語句完成相關的邏輯功能,使單片機成為一塊可以完成復雜邏輯的數字電路。這個實驗主要用于工業配線以及順序生產過程。
實驗4:串口應用
實驗項目:
1、UART通過74LS164和74LS166實現串行擴展IO口輸入輸出功能。
2、兩個單片機做全雙工通訊實驗。
3、單片機與PC機之間進行全雙工通訊實驗。
4、一個單片機與兩個以上單片機做全雙工主機從機通訊實驗。
實驗5:單片機音樂編程應用
實驗項目:
1、該實驗可以用延時的方法也可以用定時器中斷的方法實現,主要學習了如何通過對頻率和節拍編碼表的讀取進行音樂編程。
2、在此基礎上,可以學習如何使用單片機產生雙音頻撥號音,完成單片機自動撥號實驗。
實驗6:直流電機與步進電機控制應用
實驗項目:
1、了解直流電機驅動部分硬件原理。掌握單片機控制直流電機正反轉的方法,能夠使用PWM(脈寬調制)方式改變直流電機轉速。
2、了解步進電機驅動部分硬件原理。掌握用脈沖分配的方法驅動步進電機正反轉,并且可以通過改變脈沖分配頻率來改變步進電機轉速。
實驗7:鍵盤與顯示器應用
實驗項目:
1、獨立按鍵識別操作方法,BCD碼轉盤的使用方法。
2、掃描式按鍵操作方法(結合中斷操作)。
3、串口擴展IO口的鍵盤操作方法。
4、靜態LED顯示操作方法。
5、動態掃描LED顯示操作方法。
6、結合時鐘芯片(需要擴展),設計一個電子表。
7、結合4*4鍵盤,設計一個計算器。
8、結合EEPROM,設計一個防掉電電子密碼鎖。
9、結合步進電機,設計一個可設定和顯示速度的步進電機控制板。
實驗8:其他顯示器件應用
實驗項目:
1、點矩陣LED顯示器應用。使用4塊8*8矩陣LED作為大屏幕,滾動顯示中文字幕。
2、使用LCD顯示字符與圖形,掌握LCD驅動方法。
實驗9:AD/DA轉換應用
實驗項目:
1、使用ADC0809和一種溫度探頭,結合LED顯示制作一只數字溫度計。如果溫度探頭成本過高,可以制作一只數字電壓表。
2、使用雙積分型A/D轉換電路ICL7135制作數字電壓表。
3、使用DAC0832制作一個多種波形的數控信號發生器。
4、使用ADC0809和DAC0832,外擴RAM(可使用32K的62256)制作簡易數字錄音機(錄音時間為數秒鐘)。
實驗10:外部傳感器輸入與數據采集應用
實驗項目:
1、利用光敏三極管采集光電信號。
2、利用紅外線對管構成主動式紅外線光電信號采集。
3、利用熱釋電紅外線傳感器,結合驅動電路,構成被動式紅外線光電信號采集。
4、利用駐極體話筒或壓電陶瓷片,結合音頻鎖相環技術(LM567),制作超聲波距離探測器,使用LED顯示距離。
5、利用霍爾元件,制作伺服電機轉速控制器,由鍵盤設定轉速,LED顯示。
6、利用壓力傳感器制作電子秤,鍵盤輸入,LED顯示。
實驗11:單片機外圍擴展IC應用
實驗項目:
1、8155原理與應用。
2、8255原理與應用。
3、8279原理與應用。
4、利用時鐘芯片DS12887制作智能電子表。
5、利用ISD1420或者APR9600制作公共汽車報站器、漢語報時鐘或會說話的萬用表。
實驗12:IIC技術應用
實驗項目:
1、電可擦寫存儲器AT24C02讀寫實驗。
2、PCF8583驅動實驗,可制作電子表。
3、8位并行輸入輸出芯片PCF8574實驗。
4、數模轉換芯片PCF8591實驗。
IIC技術可以節省單片機端口,有利于設計小型化和制作低成本化,但是實時性有所下降。以前的實驗均可由相關IIC器件完成。
實驗13:操作系統UCOS_II在單片機上的移植
實驗項目:
要求單片機ROM最少要8K,一般要14K以上,外部擴展RAM最少要4K。完成在單片機上運行多個任務的操作系統的移植
如果你已經成功做完以上所列的所有實驗,不要謙虛了,請刪除本教材,并收下我這個徒弟,可以說在51單片機開發方面你已經走在我們這些菜鳥前面了。對于初學者,當然不必因此而泄氣,能夠在每個方面都實現一個基本實驗就相當不錯了,就算自己無法編出程序,把網上編好的程序拿來跑一跑也很不錯,起碼說明我們具有“移植”的能力,呵呵。別小看這個能力,復雜產品的開發基本都是這樣,試問誰能為了一個產品自己開發操作系統?要是能編出來還賣產品干嗎?直接賣操作系統就發財了,呵呵!所以初學者要量力而行,上述所列只不過給大家指出個學習方向,基本就這么多了,從簡單的開始,一步一步做下去。當然還有一些比較高難的,比如單片機上網,單片機控制藍牙模塊、GSM模塊、GPRS模塊乃至GPS全球定位系統模塊等等,這些暫時不是我們的學習內容,等你成為高手以后再研究吧。
后記
單片機的入門教材暫且寫到這里,如果以后有新的體會再繼續補充。每一個初學硬件技術的人都要明白,世界上的器件是無窮無盡的,有數以萬計的技術可能你還沒來得及接觸就被淘汰掉了,所以不要揪住一堆知識不放,或者幻想掌握所有器件的使用方法。培養一種思維方式是最重要的——有方法沒有知識隨時可以學,有知識沒方法的話,知識最終也會被忘掉。我們現在學習51,如果我們在學習過程中培養出了解決方法的思維方式,一旦客觀需要我們使用AVR,很短的時間我們就可以搞定,哪怕我們對AVR一無所知。

轉載于:https://my.oschina.net/freeblues/blog/68074

總結

以上是生活随笔為你收集整理的单片机入门教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。