2014-11-25 36 views
-2

我想打一個人的計數器使用c和 這裏我的代碼使用c PIC加上光電二極管: 假設我們有拖二極管一個在門的前面算進來的人,一個 在門的後面,以減少給人們留下的通過碼數,我的問題:人們計數器使用產品圖和C

while(1) 
{ 
//suppose we declare a count variable to hold the count 
    if(d1 == 1) //suppose it's the first diode and when it's cut it's value will be one 
    { 
     count++; 
    } 
    if(d2 == 1)// represent d2 
    { 
     count--; 
    } // now my problem is when the count is increase by one it will decrease also by one 
} 

能否請你幫忙嗎?

+0

無法您確定基於其中二極管被觸發順序是否進入或離開一個人嗎?也許用計時器來指定一個人必須走過兩個二極管的有效時間間隔。 – Michael 2014-11-25 12:21:44

+0

我希望不拖延,我想使用一個標誌,但它也不適用於我,如果你有更好的想法,改變二極管的順序和位置,這也將有所幫助,並提前致謝 – 2014-11-25 12:24:26

+0

請格式化你的代碼。 – 2014-11-25 12:41:05

回答

0

我並不完全確定你是如何進行此設置的,但我認爲你需要在讀取後清除一個變量。所以,你的代碼需要看起來更像是這樣的:

int inOut = 0; // Positive for in negative for out 

while(1) 
{ 
    if(d1 == 1) 
    { 
     if(d2 == 1) 
     { 
      count += inOut; 
      d1 = 0; 
      d2 = 0; 
     } 
     else 
     { 
      inOut = 1; 
     } 
    } 
    else if(d2 == 1) 
    { 
     inOut = -1; 
    } 
} 
+0

這仍然會多次計算同一個人,因爲在下一次閱讀'd1'和'd2'時,這個人仍然會在兩個二極管的範圍內。人應該移動得非常快(我的意思是超快)註冊一次(根據該Pic頻率,'d1 == 1'和'd2 == 1'將在一秒內註冊數百次)。如果二極管太靠近或人員龐大,這將不起作用。 – bitcell 2014-11-25 13:13:16

0

這應該工作,這不是優雅,但它的東西:

int Entered = 0; 
int Exited = 0; 

while(1) 
{ 
    if(Exited == 0 && d1 == 1 && d2 == 0) 
    { 
    Entered = 1; 
    } 

    if(Entered == 1 && d1 == 0 && d2 == 1) 
    { 
    count++; 
    Entered = 0; 
    } 

    if(Entered == 0 && d1 == 0 && d2 == 1) 
    { 
    Exited = 1; 
    } 

    if(Exited == 1 && d1 == 1 && d2 == 0) 
    { 
    count--; 
    Exited = 0; 
    } 
} 

如果你不明白的地方,問我。

0

接近你的答案是行不通的,因爲有人輸入它會切斷第二個二極管,它會減少計數器,但最後我想我得到的答案: 我們將改變每個二極管的位置爲每個人的身邊,做一個延遲 //假設我們有3個變量,在,並最終計算

while(1) 
{ 
if(D1 == 1) //somone come 
{ 
count++; 
D1 = D2 = 0; 
} 
delay(time) 
if(D2 == 1) 
{ 
count--; 
D1 = D2 = 0; 
} 
}