2:C51為什么要嵌套匯編
51單片機一個顯著優點就是指令執行時間固定,因此可以適應時序要求嚴格的場合。例如符合ISO7816協議的cpu卡的讀寫,對時序要求比較嚴格。其實就是用io腳做出來的同步半雙工串口。支持cpu卡的程序一般比較龐大,需要用c51來組織,但是由于c編譯的不確定性,必須把底層程序封裝成匯編語言模塊嵌入到工程中。這就帶來幾個問題:如何聲明函數、參數如何傳遞等。限于篇幅,不能說得很細。下面舉例:
匯編程序單獨保存一個文件,加入到工程中,函數如下:
_proc_a:
mov a, r7
inc a
mov r7, a
ret
用c語言在.h文件中聲明: extern unsigned char proc_a(unsigned char val);
調用時形如: retvalue = proc_a(0x11);
說明:
a:匯編程序如果帶參數,則需要在匯編程序前多加一個下劃線。而聲明它的地方不用加(偉福編譯器這么要求的)。
b:函數的形參中第一參數用R7傳遞,函數返回值用R7返回,這是C51的通用規范。其他參數都有相應規定。函數可以返回一個位,用psw的c位返回。
c:上面的語句,執行順序是把0x11給R7,然后跳轉子程序,子程序將它加1后送回。
d:函數跳轉到匯編程序時,本區的R0-R7,A,B,PSW,DPTR等寄存器可以供子程序使用,不必考慮調用后是否要恢復這些常規資源。上例中,A的值被函數使用了,編程者不必恢復調用前的值。
3:51單片機的P0口特殊之處
許多新手都碰到這個問題,其實很簡單,這涉及到芯片的io腳是怎么做出來的。這對硬件工程師來說十分重要。TTL的io腳模型:
P1,P2,P3口都可以理解成左圖,注意vcc下面有個電阻,因此可以理解成:引腳輸出1的能力弱。地那邊沒有電阻,可以理解成引腳吸入電流能力強。而P0口,可以理解成右圖。這就是集電極開路輸出,也叫OC輸出。可以看出,當CTR=1時,三極管導通,引腳被接地;當ctr=0時,三極管截止,引腳浮空,也叫三態。這個端口這么做的目的是考慮P0口肩負讀寫數據和地址復用,這個關系要仔細看懂cpu時序圖。因此,P0口要加合適的上拉電阻,絕不要加下拉電阻。上拉電阻的選擇要看外部負載情況。
4:P1-3口如何輸入輸出
從上節的左圖可以看出。做輸出時,ctr=1則輸出強信號0,ctr=0則輸出弱信號1。當io腳做輸入時,應使ctr=0,這樣三極管截止。外部信號如果是1,則上拉電阻加強了這個1,單片機就會讀到1。當外部信號為0時,注意,必須將上拉電阻的上拉作用全部抵消,才能在引腳上得到0。
因此,對于程序來說,把io腳置1就處于接收狀態,當然也是輸出1狀態。程序置io口為1,讀取的信號是不是1就依靠外部電路了,如果外部電路沒有“吃掉”上拉電阻的電流,則讀取得到1,反之,雖然程序置io腳為1,但是讀取得到的就是0。
因此,如果用io腳的高電平驅動外部電路時,要小心外部電路把這個1“吃掉”從而輸出不了1。而作為輸入時,為0電平的外設必須足夠有能力將io腳拉低。所以,用io腳直接點亮led的時候,最好用反邏輯,就是輸出0,讓led亮。這樣能保證驅動能力。就是io腳接led的負端,led的正端過電阻接vcc。
因此,io腳輸出1時,外部電路將它強行接地是沒有關系的,而io腳輸出0的時候,外部電路強行接電源就會把io腳損壞。所以,程序加電之后,一般把所有io口都寫成1:MOV P0,0FFH。
P3口引腳復用,必須引腳都處于輸出1狀態。例如,把RXD腳輸出0,則它什么數據都讀不進來了,筆者早期曾調試一整天才發現串口收不到數據是沒有把RXD置1的原因,把時間都浪費在外圍了,當時很是汗顏。
5:有關晶振
單片機的晶振在內部可以簡化成一個反向器。當晶振輸入腳XI剛過坎壓、被認為是1的一瞬間,輸出腳XO就輸出0,這個0會帶動晶振使XI電壓下降,當降低到坎壓被認為是0的一瞬間,輸出腳XO就輸出1。這樣周而復始。
因此,用示波器觀察正常工作的晶振輸入腳XI時,得到的是一個不高不低的近似水平線。而XO則是幅值很大的正弦波。測量晶振輸入腳XI時,示波器表筆要打在X10檔上,否則,表筆就能把晶振弄停。
因此布線時,晶振輸入腳XI要盡量靠近晶振,而XO腳可稍遠。同時XO具有一定的驅動能力,某些芯片可以用它驅動其它時序電路(不推薦這么做,因為系統可靠性下降)。
寫到這里,才發覺51單片機的問題太多了,這篇文字簡直就是滄海一粟。以后再補充吧,另行成文。
四、單片機經驗之談
一、前言
很多單片機初學者在與我交流的時候總是的一句話是我現在是單片機初學者,我怎樣才能更快的學好單片機,學習單片機有市場不,對于這個問題現在就我自己如何學單片機,如何入門,如何熟練,整個過程談談自己的想法。先說說單片機,現在用的比較多的的MCS-51的單片機(但是考慮到成本及引腳資源在實際開發中用的單片機型號不一),它的學習資料非常多,且學習成本非常低,如果你聽說企業里用的是什么什么芯片,但是不知道,你問過沒有,那個仿真器需要多少錢,51單片機對于智能控制入門來說是非常好的,一線下載程序,ARM太神秘,PLC太高貴,想來想去還是51。那怎樣才能更快更好的學好單片機呢?單片機這門課是一項非常重視動手實踐的科目,而且單片機也是一門集計算機編程與電子技術為一身的學科,如果你是單片機高手,那么說明你也是計算機編程和電子技術高手。
二、學習單片機時候一定要看書
不能總是看書,但是學習它首先必須得看書,那這不很矛盾。因為從書中你需要大概了解單片機各個功能寄存器(比如引腳控制寄存器、定時、中斷、串口相關寄存器),控制單片機的核心是用程序去控制單片機的各個功能寄存器,給寄存器賦值二進制數據0或者1,這樣一來對于引腳寄存器單片機可以根據二進制數據0和1輸出高低電平控制外部設備,對于內部資源寄存器,單片機也通過二進制數據0和1使用單片機內部的功能。比如單片機引腳寄存器P1,語句P1=0xfe;(MOV P1,#0FEH)。說明現在控制單片機P1口的第一個引腳輸出低電平,其他引腳輸出高電平。比如中斷中斷允許寄存器IE,語句IE=0x81;(MOV IE,#81H) 則說明控制中斷打開總開關和外部中斷0的子開關。至于看書,只需大概了解單片機各管腳、各個特殊功能寄存器都是干什么的?能實現什么樣的功能?這個非常重要,這也許是看書的最主要的目的。第一次,第二次你可能看不明白,但這不要緊,因為還缺少實際的感觀認識。通過接下來的實驗就可以非常感觀的認識,在這個過程一定要花時間,學習程序不能硬背,但是學習寄存器一定要下功夫,理解他的功能所在。推薦一本書,就這一本就足夠了,書名是《例說8051》有匯編語言和C語言版本的,非常強悍的一本書,但是我用一個五一放假的時間看完了這本書,看完后,覺得自己已經是單片機高手了。書中圖文并茂,內容安排緊張有序,并非市面上很多說教的技術文檔式的書,什么學完概念,學指令,學完指令學接口,學完接口才知道,原來學習單片機是學天書。根據書本的安排循序漸進的看完前兩章,然后一定是實踐,一定是實踐啊,這是非常關鍵的一步,在戰場上上紙上談兵的列子很多,在學習單片機也一樣,很多相關專業的研究生甚至博士生直到畢業都不清楚單片機的IO口的分布,不知道分布談何說開發呢?更有一些所謂的單片機高手只停留在編程,以為了買了一塊高級學習板,練習完了里面所有的程序,感覺自己排第二沒人敢拍第一,覺得下一步不知道如何學習單片機了。殊不知,他們中的很多人到最后單片機LED的電阻加多大都不清楚更不用說單片機的引腳分布,你說,如果這樣去開發那不是“草菅人命”啊。不是紙上談兵是什么啊。
三、學習單片機準備什么所以啊?
學習單片機看書不夠,實踐也要從實際出發,現在的技術太模塊了,什么都可以模塊,模塊的到最后,技術人員都成了只會用了,祖先的留下的知識,基礎的知識該知道還是一定要知道的啊。 畢竟學習單片機的最終目的是開發,是通過創造智能控制的實物,體現自己的價值。關于實踐有兩種方法可以選擇一種方法:購買一塊51單片機的實驗板,不要求功能太的,對于初學者來功能非常多的那種板子,上面有很多東西你這輩子都用不著,更有實驗板為了增加功能,降低成本,實驗板上到處用的是貼片元件,雙面布線,越復雜就越有水平,好像他們在設計的時候就想著,學習單片機只要根據我的提示下載程序就可以了,更有甚者將下載器和集成了實驗板上。很多初學者學完單片機還認為,原來單片機不是一塊芯片,是老教材上經常提到的使用已經不到的單板機。我覺得初學單片機有這幾個模塊就夠了,剩下的得自己去開發。流水燈、數碼管、鍵盤、蜂鳴器、串口通訊、AD等這就差不多了。如果上面我提到的這些,你能熟練應用,那可以說對于單片機方面的硬件你已經入門了,剩下的就是自己練習設計電路,不斷的積累經驗。設計的電路的時候必須要學習下PCB板設計軟件,畢竟現在做開發要產品批量化還得電腦輔助設計啊,手工的效率太低了。但是在學習的過程中建議自己動手焊接。在焊接前一定要了解電路連接,網上隨便搜索可以找到很多電路原理圖,但是都不一定都能用,所以建議備一塊面包板,有了它你在焊接電路前就可以先測試下了。如果在面包板上測試成功,后來的焊接你就志在必得了,如果失敗,大不了重新再找一個。只要過了第一關,后面的路就好走,萬事起步難。方法二:你身邊如果有單片機入門者,動手能力比較強,請他幫忙,搭個簡單的單片機最下電路,哪怕是控制一個LED工作的電路。對于他們來說,做個單片機的最小系統板是輕而易舉,而對于初學者可就難多,這中間的一層窗戶紙破了就什么都簡單了。因為只有對硬件了解了,才能熟練運用。只有知道程序是和下載到單片機內部的,才會清楚為什么要寫單片機程序,這個動力來自于哪里,來至于心里有底。單片機編程就是與單片機對話,如果不知道對方誰,有沒有再聽,你還會有說話的激情嗎。當然了如果沒有這樣的人,還是那句話,在網上多找幾個最小電路電路原理圖,在面包板上焊接就可以了。當然了這個也不會的,那建議你一定要買一塊實驗板,以后單片機的學習實驗及項目測試驗都用的上。
四、如何邁入單片機開發世界
有了單片機實驗板你就要多練習,最好是自己有臺電腦,少下載幾部電影,少網絡游戲,把實驗板和電腦連好,安裝上必備的軟件,下載參考程序,并修改參考程序,從最簡單的交通燈實驗做起,等你發現你能控制交通燈,并了解交通的軟硬設計的時候你已經入門了,你會發現單片機是多么迷人的東西啊,這不是在學習知識,而是在提升自我的價值。用途那么廣的交通的設計都不在話下了,你還會覺得你沒有學到東西嗎。還會覺得自己什么都不會嗎?計算機編程、電子技術的專業知識都用上了啊。
當你編寫的程序按你的意愿實現時,你比做什么事都開心,那種學習的收獲感和成就感還有充實感是非常難得的。然后讓數碼管亮起來顯示你所需要的數字。這兩部分會了以后,你已經不能自拔了,你已經開始考慮你這輩子要走哪一行了。就這樣學習,在寫程序的時候你肯定會遇到很多問題,而這時你再去翻書找,這其中你會找你之前學過的編程的書,還有數電模電的書,你會發現原來之前學的知識還是有用的。遇到不懂再去找以前學過的書本查閱這才是 “溫故而知新,可以為師矣”的大道理啊。
知識必須用于現實生活中,解決實際問題,用單片機設計個簡易的家電定時器、紅外遙控器什么,這樣才能發揮它的作用,好好想想,上了這么多年大學,探索了那么久,猶豫徘徊,天天上課,在課堂上學到了什么?是不是為了期末60分的考試而忙碌,僥幸靠了90分,很高興啊,在別人面前吹自己專業知識如何如何學習的好,殊不知,大學考試不像高中考試啊,那了獎學金又怎樣。但是下學期開學回來一想,所學的知識已經忘記的一干二凈。學到什么了?為什么要推薦學習單片機,因為單片機是工科生學的,集合計算機編程電子技術及多門控制語言為一體的學科,與其說學習是在學習單片機,不如說是在學習一個大學科。
五、學習單片機是匯編編程還是C語言編程 關于用匯編和C語言編程的問題。這個問題困惱很多人,可能主要是學校教學和部分教材的教育引導引起的吧,大一開了C語言編程,沒等學生知道到底C語言有什么實際的用途,馬上其他的語言一起來過來了。即使是開始了專門的單片機課程,但是課程的內容與技術文檔很相識,指令很多,但是完整的不多,所以學完了也不知道,到底為什么要學習編程。很多同學大一就開設了C語言的課,我也上過,但是那時候就是天天幾乘幾,幾加幾啊,求個階乘啊,用C語言去解決小學數學問題,每周兩次上機,對著書本不停的敲打,下課了也不知道自己到底掌握了什么,掌握了這個有什么用途。學完了有什么用?如果在面試的時候,老板問,你學過編程嗎,你腦子里馬上是什么“C語言,VC什么VB。很多,什么C語言是基礎是面向工程的,什么VC是高級面向對象的”,但是老板又問,你能將你所學習的C語言應用到實際中不,比如設計一個定時報警器的C語言。這下傻了,學校里沒有學過啊。
單片機編程用C語言或匯編語言都可以,但是我建議用C語言比較好,模塊化管理編程方便,移植性強,適合編寫大程序。如果原來有C語言的基礎那學起來會更好,如果沒有,也可以邊學單片機邊學C語言。雖然很多人是從匯編語言開始接觸單片機的,但是寫小程序匯編語言還是簡單的,如果要實現一些算法,那匯編語言就不簡單了。雖說C語言編譯以后代碼量明顯比匯編長,而且執行效率也沒有匯編語言高,但是在以前單片機開發中芯片工藝的限制,及單片機主頻的限制,很多單片機內部存儲器小的可伶,主頻也小得可伶。但是現在不一樣了,芯片內部的存儲器根不不在乎這點差別。主頻也越來越高。
那匯編語言是不是不學了呢?不是的,一定要學習,有兩方面首先入門單片機的時候要用匯編語言,它的語法簡單。第二如果你要做單片機的程序的高級設計師,那匯編語言是非掌握不可的,很多像高級單片機ARM都是匯編語言作為引導代碼的,還有就是很多新出品的單片機起先也是先有匯編語言編譯器之后才有C語言編譯器。所以,我覺得對于單片機學習匯編語言入門,C語言精通,匯編語言再精通。最后,對于單片機的學習,入門為先,入門了以后就要去關注市場,關注企業,企業需要什么樣的人才,我想有了基礎以后在面試之前了解下企業所需要的單片機類型,很快就上手了,畢竟學習是相同的。
評論