首页 > 用户发贴区 > 编程问题提问区 > 关于延时时间的一个问题
2010
05-01

关于延时时间的一个问题

关于具体延迟时间我有个小问题:


我采用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应该写多少,延迟时间才能和上面一样呢???


关于延时时间的一个问题》有 4 条评论

  1. hill340 说:

    自己顶!!!

  2. whos 说:

    建议使用头文件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);

     
    现在给出个实例,每隔一秒钟输出一个数,从1-10。
    #include <stdio.h>
    #include <dos.h>
    #define TIMER 0x1c /*软定时中断*/

    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(); /* 恢复时钟中断 */
    }

  3. whos 说:

    给个简单的方法,i 是循环的次数,这样可以测出循环 i 次所需的时间。

    #include “stdio.h”
    #include “stdlib.h”
    #include “time.h”
    #define CLOCKS_PER_SEC ((clock_t)1000)
    int main( void )
    {
    long i = 100000L;
    clock_t start, finish;
    double duration;
    printf( “Time to do %ld empty loops is “, i );
    start = clock();
    while( i– )
    finish = clock();
    duration = (double)(finish – start) / CLOCKS_PER_SEC;
    printf( “%f seconds\n”, duration );
    system(“pause”);
    }
  4. hill340 说:

    谢谢帮助,我马上去实践下,谢谢!!!!

留下一个回复