新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 實用C51編程的高級技巧(C51編程)

        實用C51編程的高級技巧(C51編程)

        作者: 時間:2016-11-25 來源:網絡 收藏
        實用C51編程高級技巧(C51編程)

        一. C51熱啟動代碼的編制

        void main()

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

        {

        char data *HotPoint=(char *)0x7f;

        if((*HotPoint==0xaa)&&(*(--HotPoint)==0xaa))

        {

        }

        else

        {

        HotPoint=0x7e;

        }

        如果你的程序包含startup.a51,則需要對startup.a51進行修改。

        對于startup.a51的修改,根據自已的需要進行,如將IDATALEN EQU 80H中的80H改為70H,就可以使6F到7F的16字節內存不被清零。

        二.直接調用EPROM中已固化的程序

        void main(void)

        {

        void (*DispBuffer)();

        DispBuffer=0xde00;

        for(;;)

        {

        Key();

        DispBuffer();

        }

        }

        原理:利用指向函數的指針來實現的 (*指針變量名)();

        三. 將浮點數轉化為字符數組

        #define uchar unsigned char

        #define uint unsigned int

        void FtoC(void)

        {

        float a;

        uchar i,*px

        uchar x[4];

        pf=&a;

        a=34.526;

        for(i=0;i<4;i++)

        {

        *(px+i)=*((char *)pf+i);

        }

        }

        如果已將數存入EEPROM,要將其取出合并,方法也是一樣,可參考下面的程序。

        void CtoF(void)

        {

        float a;

        uchar i,*px

        uchar x[4]={56,180,150,73};

        void *pf;

        px=x;

        pf=&a;

        for(i=0;i<4;i++)

        {

        *((char *)pf+i)=*(px+i);

        }

        }

        四.絕對存儲器訪問

        (1) 絕對存儲器訪問宏

        #define CBYTE ((unsigned char volatile code *)0)

        #define DBYTE ((unsigned char volatile data *)0)

        #define XBYTE ((unsigned char volatile xdata *)0)

        #define IBYTE ((unsigned char volatile idata *)0)

        #define PBYTE ((unsigned char volatile pdata *)0)

        (2) 連接器位置控制

        KeilC編譯設置中,有定義

        (3) 關鍵字_at_

        data unsigned char aaa _at_ 0x40;

        idata unsigned char aaa _at_ 0x40;

        xdata unsigned char aaa _at_ 0x40;

        code unsigned char aaa _at_ 0x40;

        五. 強制函數的編譯模式

        void GetDataLen()small;

        void GetDataLen()small

        {

        ……………….

        }

        六. C程序與匯編的接口

        1.第1種情況:直接嵌入匯編

        #pragma asm

        #paragma endasm

        2.第2種情況:文件間調用

        通過寄存器傳遞參數,通過固定存儲區傳遞參數。

        3.第3種情況:由C生成匯編接口

        #pragma SRC

        #pragma SMALL

        unsigned int asmfunc1 (

        unsigned int arg)

        {

        return (1 + arg);

        }

        七. volatile的使用方法及使用條件點

        第一種情況涉及到內存映射硬件(memory-mapped hardware,如圖形適配器,這類設備對計算機來說就好象是內存的一部分一樣);

        #define XBYTE[1000] PORTADD //硬件口地址定義

        第二種情況涉及到共享內存(shared memory,即被兩個以上同時運行的程序所使用的內存)。

        C51中中斷調用的變量



        關鍵詞: C51編程高級技

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 广汉市| 景泰县| 丰宁| 通州市| 股票| 电白县| 镇坪县| 滁州市| 昭通市| 广平县| 长丰县| 华阴市| 慈溪市| 黄浦区| 古浪县| 台南市| 原平市| 沁源县| 昌平区| 克什克腾旗| 永兴县| 鄂州市| 岳西县| 竹北市| 广水市| 东台市| 二手房| 苍溪县| 潢川县| 两当县| 龙门县| 井陉县| 锦屏县| 二连浩特市| 柳江县| 永登县| 靖宇县| 长春市| 安庆市| 溧水县| 方正县|