关于具体延迟时间我有个小问题:
我采用51单片机,用汇编编了个延时程序:
DELAY: MOV R7,#250;
D1: MOV R6,#250;
D2: DJNZ R6,D2;
DJNZ R7,D1;
RET;
采用12M晶振,那么时钟周期就是1/12us,机器周期就是1us。
DJNZ指令周期是2机器周期,即2us
那么DELAY就延迟了2*250*250=125ms
我用C语言写的话,如下:
void delay(unsigned int i)
{
unsigned char j;
for(i;i > 0;i–)
for(j = 255;j > 0;j–);
}
请问下i应该写多少,延迟时间才能和上面一样呢???
>> 本文固定链接: http://www.vcgood.com/archives/3369
自己顶!!!
建议使用头文件dos.h中提供的中断处理函数getvect()和setvect(),使用方法如下:
setvect()设置中断向量函数
setvect(int 中断号,void interrupt(*中断函数名))
功能:把中断服务程序的地址装入中断向量表中。
调用方法:setvect(中断号,中断函数名即地址);
(1)得预先定义要代替原函数的新函数
void interrupt 中断函数名(void)
{……}
(2)得先保留原中断函数地址
void interrupt (*保留函数名)(void);
保留函数名=getvect(中断号);
(3)事后得将原中断函数地址装回向量表中
setvect(中断号,保留函数名);
getvect()读取中断向量函数
原形:void interrupt(*getvect(int interruptno))
功能:读入由interruptno(0-255之间)所指定的中断向量值,并把该中断向量值
作为中断函数的远指针返回。
返回值:指定中断向量的当前4字节值。
头文件:dos.h
使用实例:oldfunc=getvect(5);
先定义void interrupt(*oldfunc)();
用后恢复setvect(5,oldfunc);
#include <dos.h>
int TimerCounter=0; /* 计时变量,每秒钟增加18。 */
/* 指向原来时钟中断处理过程入口的中断处理函数指针(句柄) */
void interrupt (*oldhandler)();
/* 新的时钟中断处理函数 */
void interrupt newtime()
{
TimerCounter++;
oldhandler();
}
/* 设置新的时钟中断处理过程 */
void SetTimer(void interrupt (*IntProc)())
{
oldhandler=getvect(TIMER);
disable();
setvect(TIMER,IntProc);
enable();
}
/* 恢复原有的时钟中断处理过程 */
void KillTimer()
{
disable();
setvect(TIMER,oldhandler);
enable();
}
int main()
{
int key,time=0;
SetTimer(newtime); /* 修改时钟中断 */
while(1)
{
if (TimerCounter>18) /* 1秒钟处理一次 */
{
/* 恢复计时变量 */
TimerCounter=0;
time++;
printf(“%d\n”,time);
if(time==10) /* 10秒钟后结束程序 */
break;
}
}
KillTimer(); /* 恢复时钟中断 */
}
给个简单的方法,i 是循环的次数,这样可以测出循环 i 次所需的时间。
#include “stdlib.h”
#include “time.h”
{
long i = 100000L;
clock_t start, finish;
double duration;
start = clock();
while( i– )
finish = clock();
duration = (double)(finish – start) / CLOCKS_PER_SEC;
printf( “%f seconds\n”, duration );
system(“pause”);
}
谢谢帮助,我马上去实践下,谢谢!!!!