51單片機c嵌彙編教程

原帖:http://bbs.cepark.com/thread-13010-1-1.html

http://bbs.cepark.com/thread-13028-1-1.html(原帖有附件)

 

 

第一步;按照建立普通c51程序的方法,建立c51工程文件
           建立兩個*.c文件(c51shi.c和asm.c),加入工程。c51shi.c爲主程序,asm.c爲彙編函數。


第二步:在 Project 窗口中包含彙編代碼的 C 文件上右鍵,選擇“Options for ...”,點擊右邊的“Generate Assembler SRC File”和“Assemble SRC File”,使檢查框由灰色變成黑色(有效)狀態;


第三步: 根據選擇的編譯模式,把相應的庫文件加入工程中,該文件必須作爲工程的最後文件;
         注:庫文件說明
             C51S.LIB - 沒有浮點運算的 Small model
             C51C.LIB - 沒有浮點運算的 Compact model
             C51L.LIB - 沒有浮點運算的 Large model
             C51FPS.LIB - 帶浮點運算的 Small model
             C51FPC.LIB - 帶浮點運算的 Compact model
             C51FPL.LIB - 帶浮點運算的 Large model



第四步: build這個工程後將會產生一個asm.SRC的文件,將這個文件改名爲asm.A51,然後在工程裏去掉庫文件(如C51S.Lib)和asm.c,而將asm.A51添加到工程裏。


第五步: 檢查c51shi.c的“Generate Assembler SRC File”和“Assemble SRC File”是否有效,若是有效則點擊使檢查框變成無效狀態;再次build這個工程,到此你已經得到彙編函數的主體,修改函數裏面的彙編代碼就得到你所需的彙編函數了。

c51.c代碼如下:
#include <reg52.h>
//*************** 函數定義 ******************
void asm(void);                //彙編函數

//*************** 主程序 ********************
void main(void)
{
  while(1)
  {
asm();
  }
}


asm.c代碼如下:
void asm(void)
{

}

 

經過以上五步後,您將得到一個asm.a51文件,在文件中紅色代碼後添加您的彙編語句即可。


; ./asm.SRC generated from: asm.c
; COMPILER INVOKED BY:
;        C:/Keil/C51/BIN/C51.EXE asm.c BROWSE DEBUG OBJECTEXTEND SRC(./asm.SRC)

NAME ASM
?PR?asm?ASM          SEGMENT CODE
PUBLIC asm
;
;
;
; void asm(void)
RSEG  ?PR?asm?ASM
asm:
//在此處添加您的彙編代碼**************
      ret
   
      
      END

 

-----------------------------------------------------------------------------------------

第一步:在 Project 窗口中包含彙編代碼的 C 文件上右鍵,選擇“Options for ...”,點擊右邊的“Generate Assembler SRC File”和“Assemble SRC File”,使檢查框由灰色變成黑色(有效)狀態;

第二步:根據選擇的編譯模式,把相應的庫文件(如 Small 模式時,是Keil/C51/Lib/C51S.Lib)加入工程中, 該文件必須作爲工程的最後文件;
C51S.LIB - 沒有浮點運算的 Small model
C51C.LIB - 沒有浮點運算的 Compact model
C51L.LIB - 沒有浮點運算的 Large model
C51FPS.LIB - 帶浮點運算的 Small model
C51FPC.LIB - 帶浮點運算的 Compact model
C51FPL.LIB - 帶浮點運算的 Large model

第三步:在需要嵌入彙編的地方以如下方式加入彙編代碼;
    #pragma ASM
    ; Assembler Code Here
    #pragma ENDASM

第四步:編譯,即可生成目標代碼;

 

功能演示程序如下;

#include <reg52.h>
void fun(void)
{
  #pragma ASM
      //東西方向   紅燈       綠燈      黃燈
      //           P1.0       P1.1      P1.2
      //南北方向   紅燈       綠燈      黃燈
      //           P1.5       P1.6      P1.7
      GW EQU 30H
      SW EQU 31H

STAR: MOV P0,#0FFH
      MOV P2,#0FFH
      MOV P1,#0FFH
      MOV P3,#0FFH
      MOV A,#00H
      MOV GW,#00H
      MOV SW,#02H
      MOV R1,#255
      MOV R2,#30
     
DIS:  MOV P1,#10111110B       //南北放行    東西禁止
      MOV DPTR,#TAB
      MOV A,GW
      MOVC A,@A+DPTR
      MOV P0,A
      MOV P2,#10111011B
      ACALL DELAY
      MOV P2,#0FFH
     
      MOV DPTR,#TAB
      MOV A,SW
      MOVC A,@A+DPTR
      MOV P0,A
      MOV P2,#01110111B
      ACALL DELAY
      MOV P2,#0FFH
      DJNZ R1,DIS
      DJNZ R2,DIS
      LJMP LP
LP:   MOV R1,#255
      MOV R2,#30
      DEC GW
      MOV A,GW
      CJNE A,#0FFH,ST
      MOV GW,#09H
      DEC SW
      MOV A,SW
      CJNE A,#0FFH,ST2
      MOV GW,#00H
      MOV SW,#02H
      MOV P1,#01111011B       //黃燈點亮2秒鐘
      ACALL DEL2S
      LJMP DIS2
     
ST2:  LJMP DIS
ST:   LJMP DIS
  
DIS2: MOV P1,#11011101B       //東西放行    南北禁止
      MOV DPTR,#TAB
      MOV A,GW
      MOVC A,@A+DPTR
      MOV P0,A
      MOV P2,#10111011B
      ACALL DELAY
      MOV P2,#0FFH
     
      MOV DPTR,#TAB
      MOV A,SW
      MOVC A,@A+DPTR
      MOV P0,A
      MOV P2,#01110111B
      ACALL DELAY
      MOV P2,#0FFH
      DJNZ R1,DIS2
      DJNZ R2,DIS2
      LJMP LP2
LP2:  MOV R1,#255
      MOV R2,#30
      DEC GW
      MOV A,GW
      CJNE A,#0FFH,ST3
      MOV GW,#09H
      DEC SW
      MOV A,SW
      CJNE A,#0FFH,ST4
      MOV GW,#00H
      MOV SW,#02H
      MOV P1,#01111011B       //黃燈點亮2秒鐘
      ACALL DEL2S
      LJMP DIS
     
ST4:  LJMP DIS2
ST3:  LJMP DIS2

DELAY:MOV R7,#20H            //1MS延時(按12MHZ算)
      DJNZ R7,$
      RET
DELAY2:MOV  R7,#18H
TM:   MOV  R6,#0FFH
TM6:  DJNZ R6,TM6
      DJNZ R7,TM
      RET   
DEL2S:  MOV R5,#10H
F3: MOV R6,#0FFH
F2: MOV R7,#0E1H
F1: DJNZ R7,F1
DJNZ R6,F2
DJNZ R5,F3
RET

TAB:DB   0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,00H
         ; 0    1    2    3   4   5   6    7   8   9   ALL
  #pragma ENDASM
}
//*************** 主程序 ********************
void main(void)
{
  while(1)
  {
fun();
  }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章