导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→大侠帮我解释一下while和if的区别,看这个例子。[月如镜]

 *第16012篇: 大侠帮我解释一下while和if的区别,看这个例子。

  
楼 主:月如镜 2003年9月3日22:49
 大侠帮我解释一下while和if的区别,看这个例子。
do
  {while(P3_5)
  while(!P3_5)
  number++;
   }
   while(1);
这一小段程序可以对P3-5的高低电平转换计数,但是如果把其中的while改成if,或者将其中的if改成while都不能准确计数,请问这是何原因。
  
2楼:seandy 2003年9月4日09:27
 你现在代码中都没有IF语句啊!!!
那“或者将其中的if改成while”怎么来的啊????不是很明白你的问题!
  
3楼:月如镜 2003年9月4日23:30
 源程序是这样的,然后按照上述改动。
do
  {while(P3_5)
  if(!P3_5)
  number++;
   }
   while(1);
这样可以计数
  
4楼:yharbour 2003年9月4日12:48
 试试这个

int    temp ;

temp  = P3_5 ;
whlie( 1 ) {
               if( temp != P3_5 )  {
                        number ++ ;
                        temp = P3_5 ;
              }
} ;
这样对上升沿和下降沿都计数。


  
5楼:月如镜 2003年9月4日23:36
 这个算法不错,但请问我跟的帖子的if与while为什么不能互换?
以下是引用yharbour在2003-9-4 12:48:40的发言:
试试这个
 int    temp ;

 temp  = P3_5 ;
 whlie( 1 ) {
                if( temp != P3_5 )  {
                         number ++ ;
                         temp = P3_5 ;
               }
 } ;
 这样对上升沿和下降沿都计数。

 
 


  
6楼:龙芯四十三号 2003年9月5日11:24
 while可以循环执行(多次),if是判断(单次执行)!可以改为
do
{
    while(!P3_5)   // wait p3_5 change high
         ;
    while(P3_5)   // wait p3_5 change low
         ;
    number++;
} while(1);
  
7楼:月如镜 2003年9月5日17:59
 请问我用中断显示来计数的话,用此程序为什么发现计数不正确。
  
8楼:yharbour 2003年9月5日22:28
 不知你说的“用中断显示来计数”是什么意思
不知你说的“用中断显示来计数”是什么意思,能明白一点吗?
  
9楼:月如镜 2003年9月6日00:34
 就是说计数的值的变化用中断显示程序在数码管表示出来。
以下是引用yharbour在2003-9-5 22:28:54的发言:
不知你说的“用中断显示来计数”是什么意思,能明白一点吗?

  
10楼:yharbour 2003年9月6日09:49
 用中断来显示时,中断不知会发生在什么时候
用中断来显示时,中断不知会发生在什么时候,对计数的值有很大的影响,因为可能引脚的电平刚变化,计数还没完成中断就发生了,你可以在计数过程中禁止中断,等到你要的信号沿到来后,在开中断,但是这只能在学习中使用,平时做系统时我们不会这样做。我们可以要使用定时计数器或事件捕捉功能来完成。
  
11楼:月如镜 2003年9月6日17:25
 那就是说我在发生电平转换时先禁止中断,再计数再开中断,对吗
以下是引用yharbour在2003-9-6 9:49:52的发言:
用中断来显示时,中断不知会发生在什么时候,对计数的值有很大的影响,因为可能引脚的电平刚变化,计数还没完成中断就发生了,你可以在计数过程中禁止中断,等到你要的信号沿到来后,在开中断,但是这只能在学习中使用,平时做系统时我们不会这样做。我们可以要使用定时计数器或事件捕捉功能来完成。

还有你所说的事件捕捉功能是什么意思,在这个程序中该如何应用。谢谢。

  
12楼:yharbour 2003年9月6日22:16
 先纠正一个错误,事件捕捉功能不能在这里用。最好用计数器。
CCP在这里不能用但可以介绍一下,我不知你学的什么机型,事件触发也叫事件捕捉,在PIC、AVR和motorola等机型中有一个CCP模块,它的功能是“捕捉”和“比较”,捕捉是指当你指定了对管脚感兴趣的事件(如上升沿、下降沿等),当事件到来时,它记下当时的计数器值,主要是用来测量周期和时间。比较在这里是指你设定了时间和事件,当计数器到你指定的时间时,它按你的要求动作,主要用来产生波形和做PWM。
  
13楼:月如镜 2003年9月6日23:38
 帮我看一下这个程序,到底怎么解决
void sinit(void)
 {SCON=0;
 TMOD=1;
 TH0=0x80;
 TL0=0x20;
 TR0=1;
 EA=1;
 ET0=1;
 TI=0;
 }
这是我用定时器0的初始化程序,加上中断服务程序(显示程序),可以正常运行,但是
如果把定时器换成1的话,就不能运行了,这是怎么回事,用定时器1的话,我把这里面0的参数加到1上去,是否可行,比如th0改成th1等等。
  
14楼:红心J 2003年9月8日08:19
 void sinit(void)
 {

void sinit(void)
 {SCON=0;
 TMOD=0x10;
 TH1=0x80;
 TL1=0x20;
 TR1=1;
 EA=1;
 ET1=1;
 TI=0;
 }
  
15楼:yharbour 2003年9月7日11:47
 关键是TMOD要正确,管Timer1 的是高4位。
  
16楼:guest 2003年9月7日18:12
 我把程序改成这样,你看看
void sinit(void)
 {SCON=0;
 TMOD=0x10;
 TH1=0x80;
 TL1=0x20;
 TR1=1;
 EA=1;
 ET1=1;
 TI=0;
 }
这样的话,应该是直接用计数器2来计数了,但是,我却发现没有效果,你看程序有错吗,原先的是可以用的。
  
17楼:yharbour 2003年9月11日09:28
 TMOD的初始化还是错了

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

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


[上一篇主题]:哪位朋友帮帮忙?谢谢。改日请喝茶。

[下一篇主题]:"NSG N62C64S-70LL 063647"请问是什么