新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > C51學習心得

        C51學習心得

        作者: 時間:2016-11-26 來源:網絡 收藏
        1、只有頻繁用到或對運算速度要求很高的變量才放到data區內,如for循環中的計數值。

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

        本文引用地址:http://www.104case.com/article/201611/321650.htm

        以前沒搞過C51,大學時代跟單片機老師的時候也是搗鼓下匯編,現在重新搞單片機,因為手頭資料不多,找到一些C51的程序,發現里面有這些關鍵字,不甚明了,沒辦法只好找了下,發現如下描述:

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


        在51系列中data,idata,xdata,pdata的區別

        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,建議少用。但也有他的優點,具體用法屬于中級問題,這里不提。


        三、有關單片機ALE引腳的問題

        "單片機不訪問外部鎖存器時ALE端有正脈沖信號輸出,此頻率約為時鐘振蕩頻率的1/6.每當訪問

        外部數據存儲器是,在兩個機器周期中ALE只出現一次,即丟失一個ALE脈沖."這句話是不是有毛

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

        小弟感激涕零.

        答:

        其他所有指令每6個機器周期發出一個ALE,而MOVX指令占用12個機器周期只發出一個ALE

        四、如何將一個INT型數據轉換成2個CHAR型數據?

        經keil優化后,char1=int1/256,char2=int1%6或char1=int1>>8,char2=int1&0x00ff效率是一樣的。

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

        右鍵點項目中Target 1,選第二個,在OUTPUT中選中CREAT HEX

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

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

        typedef unsigned char UCHAR ;

        #define unsigned char UCHAR ;

        typedef命名一個新的數據類型,但實際上這個新的數據類型是已經存在的,只不過是定義了

        一個新的名字.

        #define只是一個標號的定義.

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

        #define MAX 100

        #define FUN(x) 100-(x)

        #define LABEL

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

        七、請問如何設定KELC51的仿真工作頻(時鐘)

        用右鍵點擊左邊的的target 1,然后在xtal一欄輸入

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

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

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

        是的。

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

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

        可以用位變量:

        #include

        #include

        void main()

        {

        bit flag;

        flag=0;

        switch(flag)

        {

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

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

        default:break;

        }

        }

        bit 變量只有兩種狀態,if 語句足夠啦,!!!

        十一、const常數聲明占不占內存???

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

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

        占用代碼空間;而如:

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

        當然占用內存空間。

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

        十二、philips的單片機P89C51RD+的擴展RAM在C51中如何使用?

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

        十三、BUG of Keil C51

        程序中用如下語句:

        const unsigned char strArr[] = {"數學"};

        結果發現strArr[] 內容為 {0xCA,0xD1,0xA7},真奇怪!


        上一頁 1 2 下一頁

        關鍵詞: C51學習心

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 无极县| 清河县| 满洲里市| 宣城市| 腾冲县| 南昌市| 曲松县| 灌云县| 安福县| 盐边县| 昭苏县| 武乡县| 莱阳市| 金乡县| 营山县| 大渡口区| 渝中区| 柳江县| 荣成市| 兴安县| 余姚市| 平阳县| 叶城县| 柳江县| 岳西县| 金塔县| 余姚市| 波密县| 枝江市| 侯马市| 周至县| 邳州市| 遵义县| 洮南市| 盐边县| 略阳县| 滨海县| 巢湖市| 莱西市| 曲靖市| 都江堰市|