51單片機編譯
A. 51單片機的編程問題
1:C51編譯器如何區分位地址和位元組地址
是靠預定義實現的,比如:sfr P0 = 0x80; sbit P0_0 = 0x80;前者聲明了P0埠地址位於0x80,後者說明了P0埠的bit0,即P0.0位於位地址空間0x80處。這2個0x80具有完全不同的含義,靠關鍵字sfr和sbit來區別。這樣當程序被編譯時,編譯器會依此編譯成相應的匯編語言。例如:
C51語句: P0 = 1;
P0聲明為sfr,因此編譯成:mov 80h,01h,將把0x01數據送入0x80單元,由於0x80單元物理上對應P0埠,因此,P0.0腳將輸出高電平(其實是呈現高阻態,P0口獨有的),其他.1-.7腳輸出低電平。
C51語句: P0_0 = 1;
P0_0聲明為sbit,因此編譯成:setb 80h,這將把位地址空間的0x80地址的bit的值置1。這個位正是P0口的bit0,執行後,P0.0將輸出高阻態。而P0.1-.7不會變化。
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的值被函數使用了,編程者不必恢復調用前的值。
B. 如何使用keil 5 編寫 51單片機 工程
1.先安裝Keil C51並破解,再安裝MDK5並破解。
2.分別打開Keil C51和MDK5的安裝目錄。將Keil C51安裝目錄下的C51文件夾復制到MDK5的安裝目錄文件夾下。
3.分別打開TOOLS.INI文件;將Keil C51下TOOLS.INI文件的內容復制,粘貼到MDK5下TOOLS.INI文件內容的最低端。
4.注意查看並找到粘貼到MDK5下TOOLS.INI文件中如下行代碼:
[C51]
PATH="D:KeilC51"(Keil C51安裝目錄下TOOLS.INI文件中的內容)
將Keil處的內容改成與MDK5下TOOLS.INI文件中如下行代碼:
RTEPATH="D:Keil_v5ARMPACK"
Keil_v5處的內容一樣。
目的是讓軟體在MDK5安裝目錄內找到C51文件。
5.完成以上操作,就可以將安裝的Keil C51軟體卸載,在MDK5軟體上就可以編譯C51單片機程序了。親自測試可行。
來自:網頁鏈接
C. 51單片機如何編譯成程序
1、首先在電腦上用proteus軟體打開目標文件。然後用滑鼠左鍵雙擊51單片機圖標,如圖所示。然後在出現的窗口中,點擊下圖中的文件夾圖標。然後在電腦文件夾中找到編譯好的HEX文件導入。
2、keil里編譯時,設置輸出文件為.HEX文件格式。然後在proteus中打開CPU屬性,在程序設定欄填入HEX文件路徑及名稱(也可以通過後面的瀏覽按鈕找到該文件,選中即可)。然後運行即可。
3、proteus里,雙擊單片機,跳出一對話框,點擊programFile邊上的文件夾按鈕,找到你的那個HEX文件,就可以載入。
4、先在keil中把程序編好,在PROTEUS中雙擊單片機,之後出現這個頁面在對話框中找到你keil編寫的程序的文件即可。
5、,用keil生成.hex文件,在isis中右擊at89c51,再左擊,出現相應元件的屬性對話框「ProgramFile」一項中選擇要加入的.hex文件。
6、工具/原料windowsXPPROTEUS生成的HEX文件方法/步驟PROTEUS安裝好後,默認不會在桌面上產生快捷方式。
D. 主流C51單片機編譯器比對
int short 的大小是因機器而異嘛(准確點應該是編譯器)。你都說了人家規定的是「最小」為16位,又不是只能是16位,也沒有說兩者應該相等(事實上是short不超過int就OK啦)。所以當然可以short類型為半個機器字長,而int類型則為一個機器字長的啦。
「C++標准規定了每個算術類型的最小存儲空間,但他並不自知編譯器使用更大的存儲空間 」
說簡單點就是C++規定了個最小的值,但是將你的代碼編譯成機器碼的編譯器則確定了你這個長度值為多少。因為C++是一種語言,一個規范,或者說只是一種規定,然後要將你按這種規范寫的代碼編譯成能在機器上運行的代碼的是編譯器。而在不同的機器上運行的程序的實際結構是不一樣的,比如單片機與PC相差就很大。要將按相同規范寫的程序在各種各樣亂七八糟的機器上運行,就需要相應的編譯器了。所以實際的大小是由你編譯代碼的編譯器確定的。
PS:當然當前一般的PC上int都是32位,short16位的。因為現在32位的機子是主流嘛。如果你不寫什麼單片機的程序可以不用太在意這個問題。但是寫單片機程序時就要注意了,因為一般一個單片機的編譯器可以編譯很多種型號晶元的代碼,而這些型號有可能從8位到32位都有……