單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解(四)
單片機(jī)被廣泛應(yīng)用于工業(yè)控制,家電,消費(fèi)電子,醫(yī)療電子,儀表測(cè)量等領(lǐng)域,為應(yīng)廣大初級(jí)電子工程師/單片機(jī)愛好者之需,電子發(fā)燒友網(wǎng)隆重策劃整合推出《單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解》系列技術(shù)文章,以后會(huì)陸續(xù)推出其他章節(jié),敬請(qǐng)廣大工程師朋友繼續(xù)關(guān)注和留意。應(yīng)廣大工程師網(wǎng)友對(duì)前三個(gè)章節(jié)熱烈反響,電子發(fā)燒友網(wǎng)會(huì)再接再厲為各位工程師網(wǎng)友推出更多技術(shù)精品系列文章,以饗讀者。
一、電子電路設(shè)計(jì)之C51單片機(jī)常見問題
筆者在工作中實(shí)際使用過AT89C2051、AT89C51、AT89C52等51單片機(jī),后來(lái)應(yīng)用臺(tái)灣新茂、華邦等廠家的51單片機(jī)。實(shí)踐中遇到許多問題,都是書本上沒有的。我印象中,書本上的知識(shí)只有一頁(yè)插圖了,就是cpu的時(shí)序圖。最初直接用匯編寫程序,然后是C51嵌套匯編。編譯器曾用偉福系列編譯器,后來(lái)使用keil等,感覺這些編譯器大同小異。需要熟練的C語(yǔ)言基礎(chǔ),加上單片機(jī)應(yīng)用的特殊性。
本文就51單片機(jī)應(yīng)用中一些常見問題作個(gè)總結(jié),這都是我實(shí)際碰到過的,因?yàn)槲恼缕?,這些問題遠(yuǎn)遠(yuǎn)不足以表達(dá)單片機(jī)的常見問題。希望對(duì)初學(xué)者有所幫助,文中不完善的地方務(wù)請(qǐng)指點(diǎn)。謝謝!
1:C51編譯器如何區(qū)分位地址和字節(jié)地址
是靠預(yù)定義實(shí)現(xiàn)的,比如:sfr P0 = 0x80; sbit P0_0 = 0x80;前者聲明了P0端口地址位于0x80,后者說(shuō)明了P0端口的bit0,即P0.0位于位地址空間0x80處。這2個(gè)0x80具有完全不同的含義,靠關(guān)鍵字sfr和sbit來(lái)區(qū)別。這樣當(dāng)程序被編譯時(shí),編譯器會(huì)依此編譯成相應(yīng)的匯編語(yǔ)言。例如:
C51語(yǔ)句: P0 = 1;
P0聲明為sfr,因此編譯成:mov 80h,01h,將把0x01數(shù)據(jù)送入0x80單元,由于0x80單元物理上對(duì)應(yīng)P0端口,因此,P0.0腳將輸出高電平(其實(shí)是呈現(xiàn)高阻態(tài),P0口獨(dú)有的),其他.1-.7腳輸出低電平。
C51語(yǔ)句: P0_0 = 1;
P0_0聲明為sbit,因此編譯成:setb 80h,這將把位地址空間的0x80地址的bit的值置1。這個(gè)位正是P0口的bit0,執(zhí)行后,P0.0將輸出高阻態(tài)。而P0.1-.7不會(huì)變化。
2:C51為什么要嵌套匯編
51單片機(jī)一個(gè)顯著優(yōu)點(diǎn)就是指令執(zhí)行時(shí)間固定,因此可以適應(yīng)時(shí)序要求嚴(yán)格的場(chǎng)合。例如符合ISO7816協(xié)議的cpu卡的讀寫,對(duì)時(shí)序要求比較嚴(yán)格。其實(shí)就是用io腳做出來(lái)的同步半雙工串口。支持cpu卡的程序一般比較龐大,需要用c51來(lái)組織,但是由于c編譯的不確定性,必須把底層程序封裝成匯編語(yǔ)言模塊嵌入到工程中。這就帶來(lái)幾個(gè)問題:如何聲明函數(shù)、參數(shù)如何傳遞等。限于篇幅,不能說(shuō)得很細(xì)。下面舉例:
匯編程序單獨(dú)保存一個(gè)文件,加入到工程中,函數(shù)如下:
_proc_a:
評(píng)論