新聞中心

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

        C51學習心得

        作者: 時間:2016-11-26 來源:網絡 收藏

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

        凡是有0xfd,則會通通不見了,所以只能手工輸入內碼了,例如 uchar strArr[]=

        {0xCA,0xfd,0xd1,0xa7}(用Ultraedit會很方便)。

        十四、Keil C51中如何實現代碼優化?

        菜單Project下Option for target "Simulator"的C51.

        看到Code optimization了嗎?

        十五、請教c的!和 ~ 符號有甚區別??

        !是邏輯取反,~是按位取反。

        十六、c51編程,讀端口,還要不要先輸出1?

        我怎么看到有的要,有的不要,請高手給講講,到底咋回事?謝了

        要輸出1的,除非你能保證之前已經是1,而中間沒有輸出過其他值。

        十七、當定時器1(T1)用于產生波特率時,P3^5還是否可以用作正常的I/O口呢?

        p3.5完全可以當普通的io使用

        十八、C51中 INT 轉換為 2個CHAR?

        各位高手:

        C51中 INT 轉換為 CHAR 如何轉換諸如:

        X = LOW(Z);

        Y = HIGH(Z);

        答:

        x=(char)z;

        y=(char)(z>>8);

        十九、如果我想使2EH的第7位置1的話,用位操作可以嗎?

        現在對位操作指令我一些不太明白請各位多多指教:

        如 SETB 07H 表示的是20H.7置1,對嗎?(我在一本書上是這么看到的)

        那么如果我想使2EH的第7位置1的話,象我舉的這個例子怎么表示呢?謝謝!

        SETB 77H

        setb (2eh-20h)*8+7

        20h-2fh每字節有8個可位操作(00h-7fh),其它RAM不可位直接操作

        二十、char *addr=0xc000 和char xdata *addr=0xc000有何區別?

        char *addr=0xc000;

        char xdata *addr=0xc000;

        除了在內存中占用的字節不同外,還有別的區別嗎?

        char *addr=0xc000; 是通用定義,指針變量 addr 可指向任何內存空間的值;

        char xdata *addr=0xc000; 指定該指針變量只能指向 xdata 中的值;

        后一種定義中該指針變量(addr)將少占用一個存儲字節。

        uchar xdata *addr=0xc000;指針指向外ram;

        如果:data uchar xdata *addr=0xc000;指針指向外ram但指針本身存在于內ram(data)

        以此類推可以idata uchar xdata *addr=0xc000;pdata uchar xdata *addr=0xc000;

        data uchar idata *addr=0xa0;.........

        二十一、while(p1_0)的執行時間?

        假設,P1_0為單片機P1口的第一腳,請問,

        while(P1_0)

        {

        P1_0=0;

        }

        while(!P1_0)

        {

        P1_0=1;

        }

        以上代碼,在KEIL C中,需要多長時間,執行完。能具體說明while(P1_0)的執行時間嗎?

        仿真運行看看就知道了,

        我仿真了試了一下,約14個周期

        二十二、怎樣編寫C51的watchdog程序?

        各位大蝦,我用KEIL C51 編寫了一個帶外部開門狗的程序,可程序無法運行起來,經過查

        找,發現程序在經過C51編譯后,在MAIN()函數的前部增加了一端初始化程序,等到進入

        主程序設置開門狗時,開門狗已經時間到,將我的程序復位了,請問我怎樣才能修改這一端

        初始花程序,使他一運行,就設置開門狗?

        可以在startup.a51中加入看門狗刷新指令,當然用匯編,然后重新編譯startup.a51

        ,將他和你的程序連接即可。新的startup.a51會自動代替系統默認的啟動模塊。

        二十三、keil C51 怎樣把修改的startup.a51 加到工程文件中

        直接加入即可

        注意不要改動?STACK,?C_START,?C_STARTUP等符號。startup.a51直接加入項目,不用修改也可。可在內面自己修改匯編的一些限制或堆棧指針。

        二十四、關于波特率的設置

        我在設定串口波特率時發現一個問題:在晶體震蕩器為11.0592MHz時,若設9600BPS的話,

        TH1=0XFD,TL1=0XFD,而要設19200BPS的話,TH1、TL1有否變化,如果沒變,為什么?

        如果變了,又為什么?(因為我看書上倆個是一樣的),希望大家點撥。

        答:

        當電源控制寄存器(PCON)第BIT7(SMOD)為1時波特率加倍。

        TH1和TL1的值不變.

        二十五、如何在C中聲明保留這部分RAM區不被C使用?

        我不知道在C源程序中怎么控制這個,但在匯編程序中加入下面一段就行:

        DSEG AT 20H

        AA: DS 10

        這樣C51就不會占用20H--29H了

        或者在c51里這樣定義:

        uchar data asm_buff[10] _at_ 0x20;

        二十六、問浮點運算問題

        我在用C51時發現它對傳遞浮點參數的個數有限制,請問:

        1)參數是以全局變量的形式傳遞的,請問以全局變量的形式傳遞的參數也有限制嗎?

        2)這種傳遞浮點參數的限制有多少呢?

        3)float*float的結果是float類型還是double類型?能否直接賦值給float類型的變量?

        答:

        由于KEIL C51的參數傳遞是通過R0-R7來傳遞的,所以會有限制。

        不過KEIL提供了一個編譯參數,可以支持更多參數的傳遞。具體

        的內容見KEIL的PDF文檔。

        我建議你把多個要傳遞的參數定義到指針或結構體中去,傳遞參

        數通過指針或結構進行,這樣好一些。

        第3個問題回答是YES,你自己試試不就知道了。

        二十七、如何在某一個地址定義ram

        用_at_ 命令,這樣可以定位靈活一點的地址

        uchar xdata dis_buff[16] _at_ 0x6020 ;//定位RAM

        將dis_buff[16]定位在0x6020開始的16個字節

        二十八、keil c中,用什么函數可以得到奇偶校驗位?

        例如32位數據,將四個字節相互異或后檢查P即可,若擔心P被改變,可用內嵌匯編。

        #include

        unsigned char parity(unsigned char x){

        x^=x;

        if(P)return(1);

        else return(0);

        }

        unsigned char parity2(unsigned int x){

        #pragma asm

        mov a,r7

        xrl ar6,a

        #pragma endasm

        if(P)return(1);

        else return(0);

        }


        上一頁 1 2 下一頁

        關鍵詞: C51學習心

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 德惠市| 塔城市| 墨竹工卡县| 睢宁县| 淄博市| 宜城市| 日喀则市| 永城市| 大足县| 扎囊县| 亚东县| 广西| 措勤县| 定西市| 察雅县| 西和县| 万州区| 灵璧县| 丰镇市| 东乡族自治县| 鄯善县| 湘乡市| 甘南县| 靖边县| 广水市| 焉耆| 阳江市| 乐陵市| 泾阳县| 铁岭市| 丹江口市| 黔南| 望奎县| 西峡县| 县级市| 阿瓦提县| 三江| 和政县| 南宫市| 铜陵市| 洛宁县|