C51语言调用汇编语言程序要注意以下几点:
1:在文件栏选中File Group和C51程序原文件,在配置文件选项中激活“产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含”三个选项。
2:根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\C51\LIB\C51SLIB)加入工程中。
3:在C51语言中必须声明需要调用的函数为外部函数。extern void DELAY(void);
4:在汇编语言程序中必须声明被调用子程序为公共子程序,在被调用的文件中还需要声明此文件是可从新定位的。
PUBLIC DELAY,DEL
DELAYY SEGMENT CODE
RSEG DELAYY
实例如下:
C51语言文件:
#include "reg51h"
extern void DELAY(void);
extern void DEL(void);
void main(void)
{
P1=0x00;
DELAY();
DEL();
P1=0xff;
}
汇编语言文件:
PUBLIC DELAY,DEL
DELAYY SEGMENT CODE
RSEG DELAYY
DELAY: MOV R2,#3H
DJNZ R2,$
RET
DEL: MOV R3,#03H
DJNZ R3,$
RET
END
(2)、C51语言中嵌入汇编程序;
在C51语言中嵌套使用汇编语言编写程序要注意以下的几个问题:
1:在文件栏选中File Group和C51程序原文件,在配置文件选项中激活“产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含”三个选项。
2:根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\C51\LIB\C51SLIB)加入工程中。
3:用#pragma asm,和#pragma endasm语句包含嵌入的汇编语言程序。
实例如下:
#include "reg51h"
void delay(void);
void main(void)
{
void delay(void);
P1=0x00;
#pragma asm
MOV R3,#08H
DJNZ R3,$
#pragma endasm
P1=0xff;
}
void delay(void)
{
#pragma asm
MOV R4,#08H
DJNZ R4,$
#pragma endasm
}
所谓的延时函数 就是做一个死循环
void delay(void)
{ unsigned int i;
for(i=0;i<20000;i++); //延迟函数,让程序数数,浪费时间。可以通过改变i的值来改变时间。
}
延迟1分钟 12hz 具体不知道i是多少了 试试601000
DEL:
MOV
R7,#210
DEL1:
MOV
R6,#117
DEL2:
DJNZ
R6,DEL2
NOP
DJNZ
R7,DEL1
NOP
;此处17个NOP
NOP
NOP
RET
1μs+(1+234+1+2)μs210+2μs+17=50000μs
其实考虑到LCALL调用这个函数的时间,末尾应该再减少2个NOP。
另外,实际使用中需要精确延时的话应该使用定时器中断,一方面是精确,另一方面延时函数执行时,如果有中断发生,那么延时就不正确了。
;以下按12M晶振计算,#后面的数最大可以是255
DELAY:MOV R7,#10 ;1
MOV R6,#100 ;101
MOV R5,#200 ;101001
DJNZ R5, $ ; 101002002
DJNZ R6, $ - 4 ;101002
DJNZ R7, $ - 8 ;102
RET ;2
Total=1+101+101001+101002002+101002+102+2=403033微秒
你先看下这段延时程序:
采用12M晶振,用51芯片处理。
DELAY: MOV R7,#250;
D1:MOV R6,#250;
D2:DJNZ R6 ,D2;
DJNZ R7,D1;
RET
以上是一段延时0125秒的程序。
它计算的原理是:
这段程序最终执行了250250次,而DJNZ指令执行需要2个机器周期,一个机器周期需要1微秒的时间,所以以上延时程序就是2502502=0125秒。
你的程序原理跟这个应该是一样的~
你应该了解一下所用的c编译程序有没有带浮点库。如能选用一个带浮点库的c编译程序,就行了。
否则,你要自己编写浮点子程序的话,最好也不应该用c语言编,而应该用汇编来编,最后连接时再和你的c语言的主程序连接在一起。
因为,如过你的浮点子程序都是直接用c语言写的,那效率就太低了。在51单片机这样的环境下,恐怕大多数的应用,都会嫌它太笨重,不合要求。
你说你过去用汇编语言“直接调用子程序”,请问那些子程序是自己编的呢?还是某个开发系统提供的标准子程序?
如果是你自己编的,那么,你只要了解一下c51中函数的出口入口的寄存器规则,将你的子程序改一下,使他符合这些规则,即可。
如果那些子程序是别人提供的标准子程序,那么您可以了解一下,那些子程序的入口、出口条件是否和c语言的要求兼容,如果兼容,那就可以直接连接了。
补充一点看法
从您的问题补充来看,您的应用中对精度的要求不高,完全可以采用定点的q格式,不用浮点运算。最合理。
假如用浮点,即使浮点子程序都是汇编编的,效率也会比定点的q格式差很远(一、两个数量级)。如果子程序本身再用c语言来编,那就更不知差到什么程度了。
以上就是关于IAR环境下 C语言中怎么嵌入汇编写延时程序全部的内容,包括:IAR环境下 C语言中怎么嵌入汇编写延时程序、求51单片机延时延时1分钟汇编语言程序。12Hz、怎样用单片机的汇编语言编写一个50ms的延时程序。(晶振频率为12MHz)ps51单片机等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)