• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 電子電路設計之C51單片機常見問題

    電子電路設計之C51單片機常見問題

    作者: 時間:2011-11-24 來源:網絡 收藏

      筆者在工作中實際使用過AT89C2051、AT89C51、AT89C52等51單片機,后來應用臺灣新茂、華邦等廠家的51單片機。實踐中遇到許多問題,都是書本上沒有的。我印象中,書本上的知識只有一頁插圖了,就是cpu的時序圖。最初直接用匯編寫程序,然后是C51嵌套匯編。編譯器曾用偉福系列編譯器,后來使用keil等,感覺這些編譯器大同小異。需要熟練的C語言基礎,加上單片機應用的特殊性。

      本文就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的值被函數使用了,編程者不必恢復調用前的值。


    上一頁 1 2 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 德州市| 营山县| 恭城| 阿合奇县| 志丹县| 含山县| 游戏| 石家庄市| 连云港市| 哈密市| 朝阳区| 阜平县| 正安县| 衢州市| 应用必备| 黄平县| 塔河县| 湟源县| 鹰潭市| 上林县| 汉沽区| 苍梧县| 长子县| 本溪市| 饶平县| 隆昌县| 聂荣县| 玉屏| 香格里拉县| 城固县| 金阳县| 益阳市| 阳东县| 新乐市| 孝感市| 夏河县| 泸西县| 濮阳县| 云霄县| 灌南县| 台安县|