导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→一个奇怪的延时程序时间的计算??????[stonenut]

 *第21288篇: 一个奇怪的延时程序时间的计算??????

  
楼 主:stonenut 2004年4月23日13:26
 一个奇怪的延时程序时间的计算??????
程序是让8在6个数码管上逐一显示;                
               BITOUT  EQU   8002H;
                SEGOUT  EQU   8004H;
                ;
                ORG   0000H;
         START: LJMP  MAIN;
                ORG   0100H;
         MAIN:  MOV  A,#7FH;  8的字型码
         LOOP:  MOV  DPTR,#SEGOUT;   
                MOVX @DPTR,A;
                MOV  A,#01H;
                MOV  DPTR,#BITOUT;
          
         LOOP:  MOVX @DPTR,A;      
                MOV  R2,#25H;     十进制数为37      
                LCALL  DELAY;
                RL A;
                SJMP  LOOP;    
         DELAY: PUSH 02H;
         LOOP1: PUSH 02H;
         LOOP2: PUSH 02H;
         LOOP3: DJNZ R2,LOOP3;
                POP  02H;
                DJNZ R2,LOOP2;
                POP  02H;
                DJNZ R2,LOOP1;
                POP  02H;
                DJNZ R2,DELAY;
                RET;
             
   END; 
          (外部晶振为6mhz 机器周期为2us)             
        上面子程序的延时时间的计算不是37*37*37*37*2*2us=7.5s吗?  
但答案说这是一个 延时时间为0.484s的程序 ,而且我下载到硬件上也观察到led的闪烁也大概为0.5s,那我的 延时时间的计算错在那呢?
        望指教!!   
  
2楼:stonenut 2004年4月29日13:41
 是不是太简单,没人回答啊
  
3楼:wping1234 2004年4月29日16:04
 不要想的那么简单...
计算过程太简单了.

LOOP3: DJNZ R2,LOOP3;
          ————执行了37次没有错误的
  LOOP2: PUSH 02H
  LOOP3: DJNZ R2,LOOP3;
             POP  02H;
             DJNZ R2,LOOP2;
          ————执行的却是36+35+34+.......+1=36*(36+1)/2次;
同样类推:
 LOOP1: PUSH 02H;
 LOOP2: PUSH 02H;
 LOOP3: DJNZ R2,LOOP3;
                POP  02H;
                DJNZ R2,LOOP2;
                POP  02H;
                DJNZ R2,LOOP1;
           ————执行的就是36*(36+1)/2+35*(35+1)/2+34*(34+1)/2.....+1*(1+1)/2次;

数字不一定正确,但是差不多就是这个思路了。依次类推,最好编一个高级程序看一下吧。
问题不要想太简单了,另外这类题目拿来玩玩可以,别写在程序里,被人骂死了。
       
我没有认真思考,仅代表一个不成熟的思路,如果错误请指正!

  
4楼:stonenut 2004年5月11日22:15
 谢谢了
谢谢了
  
5楼:wping1234 2004年4月29日16:32
 实际计算结果,中间语句一共执行约91390次。
#include"stdio.h"

main()
{
int push1,push2,push3;
int r2;
long counter;
counter=0;
r2=37;
do{
 push1=r2;
 do{
  push2=r2;
  do{
   push3=r2;
   do{
    counter++;
    r2--;
   }while(r2>  0);
   r2=push3;
   r2--;
  }while(r2>  0);
  r2=push2;
  r2--;
 }while(r2>  0);
 r2=push1;
 r2--;
}while(r2>  0);
   


printf("counter=%ld\n",counter);
printf("time=%ld\n",counter*4);

return 0;
}

counter=91390
time=365560

考虑到还要加上其他语句的执行时间,COUNTER在每个循环外加上一定值,比如在每个循环外让counter+=3,那么时间就大约484108uS=0.484s了。

如果我的思路有错误,请指正。


>>>>>>对该主题发表你的看法

本主题贴数5,分页: [第1页]


[上一篇主题]:嵌入式联盟

[下一篇主题]:请教4M三脚陶瓷晶振的用法?不胜感激!!