IAR环境下 C语言中怎么嵌入汇编写延时程序

IAR环境下 C语言中怎么嵌入汇编写延时程序,第1张

(1)、C51语言中调用汇编语言程序

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单片机等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9321393.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存