導航:首頁 > 操作系統 > 為什麼51單片機不用聲明數據段

為什麼51單片機不用聲明數據段

發布時間:2022-07-12 22:22:57

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. 單片機輸入時為什麼要先定義介面比如直接使用P2^0的值為什麼不可以而要聲明sbit XX=P2^0;

因為P2^0口程序自己沒有自己定義,必須自己聲明,但是你可以直接對整個P2口進行操作,如
P2=0xff. 這是因為P2口在include<reg51.h>中得reg51.h已經定義好了,你可以把滑鼠放在reg51.h上,右鍵,選擇open,查看裡面已經定義多得一些引腳和寄存器等東西。

C. 為什麼51單片機的地址匯流排是16位而數據匯流排8位為什麼不都是16或者都是8呢

1.51單片機是8位的,因為其中的累加器是8位,所以一次最多能處理8位的數據,所以數據匯流排是8位的。如果數據匯流排是16位,那一次要將16位數據分兩次8位來處理,這樣的效率反而降低了,不合算。

2.如果地址匯流排是8位的,那能訪問的ROM空間有多大?只有256位元組!一般寫的程序都會大於256位元組吧?再說256位元組的ROM能保存怎樣的一個程序呢?

D. 有一個問題,51單片機中是否需要函數聲明

第一個程序,使用的i,j,k是全局變數,而且中斷是電平中斷,在沒有清中斷標志位的情況下,在按下中斷電路後,會產生多個中斷信號,每個中斷程序都在把他們清零,從而相互影響,導致很難達到計數終點,程序難以終止;而第二個程序使用的是局部變數,各中斷程序相互獨立進行不受干擾的延時,所以表現正常。

E. 51單片機C程序為什麼不能聲明浮點數

#include <reg51.h>
void main()
{ float c,a=78.3, b=70.1;
c=a-b;

}
試試先,好像單片機裡面用浮點運算比較復雜..

F. 51單片機在申請變數時總是有data,idata,xdata等限定詞,可以不用嗎有什麼好處嗎為什麼別的單片機沒有

data: 固定指前面0x00-0x7f的128個RAM,可以用acc直接讀寫的,速度最快,生成的代碼也最小。
idata: 固定指前面0x00-0xff的256個RAM,其中前128和dATa的128完全相同,只是因為訪問的方式不同。idata:是用類似C中的指針方式 訪問的。匯編中的語句為:mox ACC,@Rx.(不重要的補充:c中idATa做指針式的訪問效果很好)
xdata: 外部擴展RAM,一般指外部0x0000-0xffff空間,用DPTR訪問。
pdata: 外部擴展RAM的低256個位元組,地址出現在A0-A7的上時讀寫,用movx ACC,@Rx讀寫。這個比較特殊,而且C51好象有對此BUG, 建議少用。

G. 51單片機C編程中的問題

你的編譯模式用的不對,你的data數據段指定的太短了。用large模式試一試。

在C編譯器里,變數有兩個地方可以放,數據段和堆棧段,而外部變數是必須放到數據段中的。解決辦法是:優化程序,將除了信號量以外的數據耦合都用參數調用方式來進行,而不要用外部變數,既增強了程序可讀性,又減小了數據段空間。

閱讀全文

與為什麼51單片機不用聲明數據段相關的資料

熱點內容
解壓文件密碼怎樣重新設置手機 瀏覽:999
高考指南pdf 瀏覽:693
爬蟲python數據存儲 瀏覽:240
u盤怎麼取消加密 瀏覽:429
567除以98的簡便演算法 瀏覽:340
pdf手機如何解壓 瀏覽:15
python描述器 瀏覽:60
戰地聯盟3解壓密碼 瀏覽:805
s型命令 瀏覽:25
php年薪5年 瀏覽:71
如何上網上設個人加密賬戶 瀏覽:44
linux打開ssh服務 瀏覽:78
微信位置可以加密嗎 瀏覽:470
演算法蠻力法 瀏覽:438
隨機排練命令 瀏覽:147
python多進程並發 瀏覽:41
安卓軟體安裝如何躲避安全檢測 瀏覽:647
奇幻潮翡翠台源碼百度雲盤 瀏覽:187
什麼軟體可以免費pdf轉word 瀏覽:15
php正則表達式大全 瀏覽:395