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();
  }
}

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值