<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          C51學(xué)習(xí)心得

          作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
          1、只有頻繁用到或?qū)\(yùn)算速度要求很高的變量才放到data區(qū)內(nèi),如for循環(huán)中的計(jì)數(shù)值。

          2、其他不頻繁調(diào)用到和對(duì)運(yùn)算速度要求不高的變量都放到xdata區(qū)。
          3、常量放到code區(qū),如字庫、修正系數(shù)。
          4、邏輯標(biāo)志變量可以定義到bdata中。
          在51系列芯片中有16個(gè)字節(jié)位尋址區(qū)bdata,其中可以定義8*16=128個(gè)邏輯變量。這樣可以大大降低內(nèi)存占用空間。定義方法是: bdata bit LedState;但位類型不能用在數(shù)組和結(jié)構(gòu)體中。
          5、data區(qū)內(nèi)最好放局部變量。
          因?yàn)榫植孔兞康目臻g是可以覆蓋的(某個(gè)函數(shù)的局部變量空間在退出該函數(shù)是就釋放,由別的函數(shù)的局部變量覆蓋),可以提高內(nèi)存利用率。當(dāng)然靜態(tài)局部變量除外,其內(nèi)存使用方式與全局變量相同;
          6、確保程序中沒有未調(diào)用的函數(shù)。
          在Keil C里遇到未調(diào)用函數(shù),編譯器就將其認(rèn)為可能是中斷函數(shù)。函數(shù)里用的局部變量的空間是不釋放,也就是同全局變量一樣處理。這一點(diǎn)Keil做得很愚蠢,但也沒辦法。
          7、如果想節(jié)省data空間就必須用large模式。
          將未定義內(nèi)存位置的變量全放到xdata區(qū)。當(dāng)然最好對(duì)所有變量都要指定內(nèi)存類型。
          8、使用指針時(shí),要指定指針指向的內(nèi)存類型。
          在C51中未定義指向內(nèi)存類型的通用指針占用3個(gè)字節(jié);而指定指向data區(qū)的指針只占1個(gè)字節(jié);指定指向xdata區(qū)的指針占2個(gè)字節(jié)。如指針p是指向data區(qū),則應(yīng)定義為:char data *p;。還可指定指針本身的存放內(nèi)存類型,如:char data * xdata p;。其含義是指針p指向data區(qū)變量,而其本身存放在xdata區(qū)。

          本文引用地址:http://www.ex-cimer.com/article/201611/321650.htm

          以前沒搞過C51,大學(xué)時(shí)代跟單片機(jī)老師的時(shí)候也是搗鼓下匯編,現(xiàn)在重新搞單片機(jī),因?yàn)槭诸^資料不多,找到一些C51的程序,發(fā)現(xiàn)里面有這些關(guān)鍵字,不甚明了,沒辦法只好找了下,發(fā)現(xiàn)如下描述:

          從數(shù)據(jù)存儲(chǔ)類型來說,8051系列有片內(nèi)、片外程序存儲(chǔ)器,片內(nèi)、片外數(shù)據(jù)存儲(chǔ)器,片內(nèi)程序存儲(chǔ)器還分直接尋址區(qū)和間接尋址類型,分別對(duì)應(yīng)code、data、xdata、idata以及根據(jù)51系列特點(diǎn)而設(shè)定的pdata類型,使用不同的存儲(chǔ)器,將使程序執(zhí)行效率不同,在編寫C51程序時(shí),最好指定變量的存儲(chǔ)類型,這樣將有利于提高程序執(zhí)行效率(此問題將在后面專門講述)。與ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各種不同的模式對(duì)應(yīng)不同的實(shí)際硬件系統(tǒng),也將有不同的編譯結(jié)果。


          在51系列中data,idata,xdata,pdata的區(qū)別

          data:固定指前面0x00-0x7f的128個(gè)RAM,可以用acc直接讀寫的,速度最快,生成的代碼也最小。

          idata:固定指前面0x00-0xff的256個(gè)RAM,其中前128和data的128完全相同,只是因?yàn)樵L問的方式不同。idata是用類似C中的指針方式訪問的。匯編中的語句為:mox ACC,@Rx.(不重要的補(bǔ)充:c中idata做指針式的訪問效果很好)

          xdata:外部擴(kuò)展RAM,一般指外部0x0000-0xffff空間,用DPTR訪問。

          pdata:外部擴(kuò)展RAM的低256個(gè)字節(jié),地址出現(xiàn)在A0-A7的上時(shí)讀寫,用movx ACC,@Rx讀寫。這個(gè)比較特殊,而且C51好象有對(duì)此BUG,建議少用。但也有他的優(yōu)點(diǎn),具體用法屬于中級(jí)問題,這里不提。


          三、有關(guān)單片機(jī)ALE引腳的問題

          "單片機(jī)不訪問外部鎖存器時(shí)ALE端有正脈沖信號(hào)輸出,此頻率約為時(shí)鐘振蕩頻率的1/6.每當(dāng)訪問

          外部數(shù)據(jù)存儲(chǔ)器是,在兩個(gè)機(jī)器周期中ALE只出現(xiàn)一次,即丟失一個(gè)ALE脈沖."這句話是不是有毛

          病.我覺得按這種說法,應(yīng)該丟失3個(gè)ALE脈沖才對(duì),我一直想不通是怎么回事,希望大蝦們幫幫我.

          小弟感激涕零.

          答:

          其他所有指令每6個(gè)機(jī)器周期發(fā)出一個(gè)ALE,而MOVX指令占用12個(gè)機(jī)器周期只發(fā)出一個(gè)ALE

          四、如何將一個(gè)INT型數(shù)據(jù)轉(zhuǎn)換成2個(gè)CHAR型數(shù)據(jù)?

          經(jīng)keil優(yōu)化后,char1=int1/256,char2=int1%6或char1=int1>>8,char2=int1&0x00ff效率是一樣的。

          五、在KEIL C51上仿真完了,怎樣生成HEX文件去燒寫??

          右鍵點(diǎn)項(xiàng)目中Target 1,選第二個(gè),在OUTPUT中選中CREAT HEX

          六、typedef 和 #define 有何不同??

          typedef 和 #define 有何不同》》》 如

          typedef unsigned char UCHAR ;

          #define unsigned char UCHAR ;

          typedef命名一個(gè)新的數(shù)據(jù)類型,但實(shí)際上這個(gè)新的數(shù)據(jù)類型是已經(jīng)存在的,只不過是定義了

          一個(gè)新的名字.

          #define只是一個(gè)標(biāo)號(hào)的定義.

          你舉的例子兩者沒有區(qū)別,但是#define還可以這樣用

          #define MAX 100

          #define FUN(x) 100-(x)

          #define LABEL

          等等,這些情況下是不能用typedef定義的

          七、請(qǐng)問如何設(shè)定KELC51的仿真工作頻(時(shí)鐘)

          用右鍵點(diǎn)擊左邊的的target 1,然后在xtal一欄輸入

          八、不同模塊怎樣共享sbit變量,extern不行?

          把SBIT定義單獨(dú)放到一個(gè).H中,每個(gè)模塊都包含這個(gè).h文件

          九、C51中對(duì)于Px.x的訪問必須自己定義嗎?

          是的。

          如sbit P17 = 0x97;即可定義對(duì)P1.7的訪問

          十、SWITCH( )語句中表達(dá)式不可以是位變量對(duì)嗎?

          可以用位變量:

          #include

          #include

          void main()

          {

          bit flag;

          flag=0;

          switch(flag)

          {

          case 0:{printf("0n");break;}

          case 1:{printf("1n");break;}

          default:break;

          }

          }

          bit 變量只有兩種狀態(tài),if 語句足夠啦,!!!

          十一、const常數(shù)聲明占不占內(nèi)存???

          const 只是用來定義“常量”,所占用空間與你的定義有關(guān),如:

          const code cstStr[] = {"abc"};

          占用代碼空間;而如:

          const char data cstStr[] = {"abc"};

          當(dāng)然占用內(nèi)存空間。

          另外,#define 之定義似乎不占用空間。

          十二、philips的單片機(jī)P89C51RD+的擴(kuò)展RAM在C51中如何使用?

          試一試將auxr.1清0,然后在c語言中直接聲明xdata類型的變量

          十三、BUG of Keil C51

          程序中用如下語句:

          const unsigned char strArr[] = {"數(shù)學(xué)"};

          結(jié)果發(fā)現(xiàn)strArr[] 內(nèi)容為 {0xCA,0xD1,0xA7},真奇怪!


          上一頁 1 2 下一頁

          關(guān)鍵詞: C51學(xué)習(xí)心

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();