打印

请教一个编程问题

[复制链接]
1801|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,误差时间应该还是一样,只是误差相对高低电平脉宽长度的比值变小了吧。

使用特权

评论回复
5
gengxuetao| | 2008-9-3 13:03 | 只看该作者

中断

为什么不用中断呢?

使用特权

评论回复
6
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;
    }
}

使用特权

评论回复
7
夏虫| | 2008-9-3 17:35 | 只看该作者

建议用时间中断

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

  for (time=60000;time>0;time--)
   {pout=1;}
的反汇编不一样

使用特权

评论回复
8
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++);
  }
}

使用特权

评论回复
9
NE5532| | 2008-9-3 19:51 | 只看该作者

while循环插入的延迟

其中有一半没有经过while回去,另一半就长了这段时间。时间改大以后,你示波器没那么高分辨率,所以认为是一样了。

使用特权

评论回复
10
hjsandh|  楼主 | 2008-9-3 20:26 | 只看该作者

太感动了

谢谢诸位的帮助.

使用特权

评论回复
11
icmap| | 2008-9-3 20:26 | 只看该作者

估计是 Keil C 优化了代码

估计是 Keil C 优化了代码,造成这两个循环的代码有比较大的差异。而且你改了数据之后代码再次出现较大改变,这是代码优化的典型现象。
关闭所有优化再试试看看。

使用特权

评论回复
12
ayb_ice| | 2008-9-4 10:01 | 只看该作者

这种情况要看反汇编

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

36

帖子

0

粉丝