求助;C延时程序怪现象 点击:1222 | 回复:14



李yi

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 122回
  • 年度积分:0
  • 历史总积分:192
  • 注册:2007年8月31日
发表于:2007-09-16 23:04:00
楼主
  #include<reg51.h>    //头文件   
     sbit   P10=P1^0 ;         
     void   delay();    //声明delay()延时函数     
    unsigned int i;
//-----------------主函数-------------------------------//

      void   main ()       //声明主函数void main()
  {  
      while (1)           //大循环
  { 
    
      P2=0x00;                //亮灯
      
      for (i=1;i<32000;i++);   //延时 :测的为192.497ms(12m晶振)
    
      P2=0xff;               //灭灯
      
      for (i=1;i<32000;i++);  //延时 ; 测的为288.375ms
   }
   }
/*以上为什么两次执行for (i=1;i<32000;i++)的时间会不同
 当我把for (i=1;i<32000;i++)改为 for (i=1;i<33000;i++)
 时间却相同了   请各位帮忙研究研究  */  
     



李yi

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 122回
  • 年度积分:0
  • 历史总积分:192
  • 注册:2007年8月31日
发表于:2007-09-22 09:40:00
1楼
怎么没人啊

想起时正是忘记

  • 精华:0帖
  • 求助:0帖
  • 帖子:42帖 | 1651回
  • 年度积分:0
  • 历史总积分:1960
  • 注册:2007年1月26日
发表于:2007-09-24 15:17:00
2楼
把延时做成子程序来调用,估计就会一样了。

李yi

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 122回
  • 年度积分:0
  • 历史总积分:192
  • 注册:2007年8月31日
发表于:2007-09-26 18:21:00
3楼
把延时做成子程序来调用是一样,但我不知道问题出在那里.

heidai

  • 精华:0帖
  • 求助:0帖
  • 帖子:11帖 | 1835回
  • 年度积分:0
  • 历史总积分:2824
  • 注册:2007年5月23日
发表于:2007-09-26 19:17:00
4楼
没有产生中断吧

lily555

  • 精华:0帖
  • 求助:0帖
  • 帖子:16帖 | 224回
  • 年度积分:0
  • 历史总积分:391
  • 注册:2006年9月06日
发表于:2007-09-27 11:11:00
5楼
请问:楼主,哪个时间你用什么测定的,我写的延时程序也是这样的。

李yi

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 122回
  • 年度积分:0
  • 历史总积分:192
  • 注册:2007年8月31日
发表于:2007-09-28 09:50:00
6楼
用仿真器单步执行,就看出来啦,另外用眼睛也可以看出来,灯亮和灭的时间不一样.

lily555

  • 精华:0帖
  • 求助:0帖
  • 帖子:16帖 | 224回
  • 年度积分:0
  • 历史总积分:391
  • 注册:2006年9月06日
发表于:2007-10-17 17:28:00
7楼
时间那么短,偶没看出来呢

lyzjb

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:31
  • 注册:2007年11月14日
发表于:2007-11-14 02:52:00
8楼
for语句中的循环变量由C编译器内部确定,当寄存器可用时,C编译器优先使用寄存器,当寄存器不可用时,C编译器指定一个临时变量作为循环变量,一般寄存器比临时变量快,这就引起了时间的不一致性。

周公

  • 精华:10帖
  • 求助:0帖
  • 帖子:119帖 | 5549回
  • 年度积分:0
  • 历史总积分:6446
  • 注册:2002年11月26日
发表于:2007-11-14 10:09:00
9楼
所以这样mS级以上的延时应该使用定时器来实现。

顾霸天

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 7回
  • 年度积分:0
  • 历史总积分:107
  • 注册:2008年2月28日
发表于:2008-02-28 13:22:00
10楼
首先问一下,你的晶振动是多少?你最好用示波器测量一下输出的P2上的波形,我不知道你的精确时间是怎么测试得来的,测量波形才是正确之道。我觉得没有什么问题,应该一样,从你的程序看,中断肯定是没有的。如果晶振是12M的,波形之间会有几个微妙的差别,不会有像这样的那么大的差别。

胡家

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 552回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2008-03-16 18:30:00
11楼
赞成周公的观点,看了初学者用循环来延时就想到了一个笑话:
  从前有个财主姓万,他请了一个秀才教儿子写字。第一天,秀才教万公子写“一”字,只要用毛笔画一个横杠就行;第二天,秀才教万公子写“二”字,只要用毛笔画两个横杠就行;第三天,秀才教万公子写“三”字,只要用毛笔画三个横杠就行;第四天秀才正准备教万公子写“四”子,万公子得意地对秀才说:“写字真是
太容易了,先生你不用教我写四字,我现在就会写万字了”。
        秀才赶紧报告财主:“贵公子真是聪明绝顶,我还没有教他写‘四’字,他自己就会写万字了”。财主喜出望外,兴匆匆地跑到书房看儿子的写字,只见万公子趴在地上不停地画横杠。万公子对财主埋怨道:“画一万个横杠太麻烦了,咱们能不能不姓万改姓一啊。”
   这种鸟延时都是书店里面那些书本给害的

吾辈向前走

  • 精华:1帖
  • 求助:0帖
  • 帖子:31帖 | 370回
  • 年度积分:0
  • 历史总积分:763
  • 注册:2003年3月04日
发表于:2008-03-17 21:47:00
12楼
她只是想搞清楚为何会有那个结果

反汇编,看汇编程序的流程,可找出原因

samen

  • 精华:1帖
  • 求助:0帖
  • 帖子:8帖 | 56回
  • 年度积分:0
  • 历史总积分:128
  • 注册:2003年12月03日
发表于:2008-03-25 16:11:00
13楼
u didn't write it on a good  way. try this

for(i = 32000;--i;)

陈德军

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:73
  • 注册:2008年2月29日
发表于:2008-03-31 13:28:00
14楼
下面引用由吾辈向前走在 2008-3-17 21:47:00 发表的内容:
  她只是想搞清楚为何会有那个结果<br><br>反汇编,看汇编程序的流程,可找出原因
--------------------------------------------------------------------------------------------

支持!
你用反汇编就可以看出来了。在c里面讨论是没有意义的。

热门招聘
相关主题

官方公众号

智造工程师