你说的“延时子函数”,是不是那种靠循环次数来延时的程序?
如果是的话,那么我告诉你,那种子程序的延时算法,只是用于“单线的”流程。也就是说,没有考虑系统中还有别的同时要做的工作。
所以,你如果要用这种延迟方法的话,就必须通盘考虑,一件事完了,再做另一件事,不要交叉。
如果你想提高CPU的利用效率,想多个任务穿插执行,那么,最好不要用这种延迟子程序。
可以用定时器中断来协调各项任务的进行,适当掌控各个动作的间隔时间。
(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
}
这个延时程序和你单片机系统的晶振有关系,看程序注解搭配的是12MHZ的晶振,估计是经过模拟运行程序后才得到这个延时200MS的函数Delay200ms。
至于那三个for循环就是延时的关键,执行任意一条语句都是有微小耗时的,循环部分由于反复执行耗时就会相对很长,可以达到延时的效果,设定for的初始值10 31 147意义就在于确定循环的次数,也就可以调整延时的长短。
有问题追问我。
以上就是关于两个需要调用的子函数,都包含延时子函数,调用的时候有冲突 , 怎么解决 望高人指点指点全部的内容,包括:两个需要调用的子函数,都包含延时子函数,调用的时候有冲突 , 怎么解决 望高人指点指点、怎样在单片机C代码中加入汇编延时子程序、关于单片机C程序延时的问题如下程序。回答我两个问题哦~ 问题1: 200MS是怎么得来的公式是什么样的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)