请教一个编程问题

[复制链接]
2864|11
 楼主| hjsandh 发表于 2008-9-2 20:33 | 显示全部楼层 |阅读模式
谢谢,请各位帮忙看看这个51程序有什么错误:想输出等时长的高低电平

#include<reg51.h>
#define uint unsigned int
sbit pout=P0^0;
void main(void)
{
uint time;
uint time2;
while(1)
  {
  for (time=0;time<600;time++)
   {pout=0;}
  for (time2=0;time2<600;time2++)
   {pout=1;}
  }
}
用Keil调试,为什么p0.0输出高低电平的时间不一样长,大概比例为7:4。
 楼主| hjsandh 发表于 2008-9-2 20:50 | 显示全部楼层

问题继续

接着问 :)
把600改为60000,调试显示的时间就相同了:
#include<reg51.h>
#define uint unsigned int
sbit pout=P0^0;
void main(void)
{
uint time;
//uint time2;
while(1)
  {
  for (time=0;time<60000;time++)
   {pout=0;}
  for (time=0;time<60000;time++)
   {pout=1;}
  }
}


又改成这样,时间就差的更多了.

#include<reg51.h>
#define uint unsigned int
sbit pout=P0^0;
void main(void)
{
uint time;
//uint time2;
while(1)
  {
  for (time=0;time<60000;time++)
   {pout=0;}
  for (time=60000;time>0;time--)
   {pout=1;}
  }
}
 楼主| hjsandh 发表于 2008-9-2 21:03 | 显示全部楼层

更正

更正:把600该为60000,时间也有误差,只是差在Register的sec项小数点后第四位.而600 时误差在小数点后第3位
zidaozhou 发表于 2008-9-2 21:21 | 显示全部楼层

误差时间不会变吧

600改成60000,误差时间应该还是一样,只是误差相对高低电平脉宽长度的比值变小了吧。
gengxuetao 发表于 2008-9-3 13:03 | 显示全部楼层

中断

为什么不用中断呢?
zjjhtony 发表于 2008-9-3 16:41 | 显示全部楼层

这样可能会好些

#include<reg51.h>
#define uint unsigned int
sbit pout=P1^0;
void main(void)
{

while(1)
  {
  uint time=600,time1=600;
  while(time!=0)
      {
        time--;
        pout=0;
    }
      while(time1!=0)
      {
        time1--;
        pout=1;
    }
}
夏虫 发表于 2008-9-3 17:35 | 显示全部楼层

建议用时间中断

如果一定要用LZ那种方式,可以反汇编看一下,是否
for(time=0;time<60000;time++)
   {pout=0;}

  for (time=60000;time>0;time--)
   {pout=1;}
的反汇编不一样
zjh006 发表于 2008-9-3 18:02 | 显示全部楼层

这样应该可以

#include<reg51.h>
#define uint unsigned int
sbit pout=P0^0;
void main(void)
{
uint time;
while(1)
  {pout=~pout;
  for (time=0;time<600;time++);
  }
}
NE5532 发表于 2008-9-3 19:51 | 显示全部楼层

while循环插入的延迟

其中有一半没有经过while回去,另一半就长了这段时间。时间改大以后,你示波器没那么高分辨率,所以认为是一样了。
 楼主| hjsandh 发表于 2008-9-3 20:26 | 显示全部楼层

太感动了

谢谢诸位的帮助.
icmap 发表于 2008-9-3 20:26 | 显示全部楼层

估计是 Keil C 优化了代码

估计是 Keil C 优化了代码,造成这两个循环的代码有比较大的差异。而且你改了数据之后代码再次出现较大改变,这是代码优化的典型现象。
关闭所有优化再试试看看。
ayb_ice 发表于 2008-9-4 10:01 | 显示全部楼层

这种情况要看反汇编

您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

36

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部