線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1334
推到 Plurk!
推到 Facebook!

請問有沒有人用過單晶片16F877的計數器功能呢

缺席
barryHsu
一般會員


發表:55
回覆:49
積分:20
註冊:2005-01-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-29 02:58:08 IP:163.18.xxx.xxx 未訂閱
有沒有人有用過16F877的計數器功能,使用的軟體試用CCS C寫的,小弟我有寫了一段簡單的程式,但是執行出來不是我預期的這樣,想要請問各位大大,我做的功能是,給五個訊號給同一個腳位之後會帶動另外一個腳位是HIGH的程式  
 
#include<16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT
#use delay(clock=4000000)
void main()
{
  int a=0;
  do
  {
    if (input(PIN_D2))
    {
      a=a 1;
      if(a==5)
      {
        output_high(PIN_D3);
      }
    }
  }while(1);
}
P.S: po程式碼請做好縮排動作.您有用code指令,但沒有做好縮排. 發表人 - ㊣ 於 2005/06/29 10:21:52

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-29 08:03:03 IP:220.134.xxx.xxx 未訂閱
請清楚描述問題.所謂執行不是你預期的,那執行結果是怎樣呢? "給五個訊號給同一個腳位之後會帶動另外一個腳位是HIGH"-->你所謂的5個訊號是指?? 你的寫法看起來,只要PIN_D2 high一段時間後,PIN_D3便會輸出high,且一直為high
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
barryHsu
一般會員


發表:55
回覆:49
積分:20
註冊:2005-01-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-29 08:43:07 IP:163.18.xxx.xxx 未訂閱
我希望给五個訊號給PIN_D2,算是五個HIGH-LOW(觸碰PIN_D2五次),也可以說是五個PLUSE,訊號的值算是累加的,計數五次之後會帶動PIN_D3是HIGH,假如可以的話我就會將光遮斷器方上去,利用光遮斷器給訊號。不知道這樣說的話可以了解嗎?? 我執行出來的結果當PIN_D2給訂一個高電位後,PIN_D3就會HIGH 那假如我要做到上述所說的化程式應該要怎嚜樣修改,我需要用到CCP1嗎 ???

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-29 09:51:03 IP:211.22.xxx.xxx 未訂閱
1>改用中斷的方式,每次觸發才使a+1,a=5時PIN_D3才輸出high.(觸發可為low active或high active)    2>PIN_D2為high後,等其變為low 才做a=a+1
    do
{
  if (input(PIN_D2))
  {
    a=a 1;
    if(a==5)
    {
      output_high(PIN_D3);
    }
  }
}while(1);    第二個方法將上面的部分修改為下面的部分試試    do
{
  if (input(PIN_D2))
  {
    while(input(PIN_D2));
    a=a 1;
    if(a==5)
    {
      output_high(PIN_D3);
    }
  }
}while(1);    
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
barryHsu
一般會員


發表:55
回覆:49
積分:20
註冊:2005-01-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-29 10:35:14 IP:163.18.xxx.xxx 未訂閱
㊣您好: 你所說的中斷方式,我應該要怎嚜樣撰寫呢?因為我沒有用中斷的方式寫過,不知道是可以跟我說一下他所撰寫的方式。那假如我用這樣做的話我就不用用到他單晶片內部的計數器功能或是CCP1了,因為我地軟體裡面有一個指令是setup_counters(),但是我看不懂他的意思,所以我才會改成我之前寫的那個程式看看可不可行。

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-29 13:18:19 IP:211.22.xxx.xxx 未訂閱
barryHsu您好 : 16F877我沒有用過, 對於它的interrupt function並不熟悉. 您可以先用方法2試試看.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
barryHsu
一般會員


發表:55
回覆:49
積分:20
註冊:2005-01-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-29 15:15:16 IP:163.18.xxx.xxx 未訂閱
㊣您好: 因為我寫這個程式是要搭配光遮斷器做的,因為我想要用光遮斷器作位置回饋,所以我才會想說我這樣寫行不行,你所說的第二種方法,不知道你可不可以舉各範例,不好意思...

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-29 17:14:40 IP:211.22.xxx.xxx 未訂閱
引言: ㊣您好: 因為我寫這個程式是要搭配光遮斷器做的,因為我想要用光遮斷器作位置回饋,所以我才會想說我這樣寫行不行,你所說的第二種方法,不知道你可不可以舉各範例,不好意思...
你沒看清楚我回的嗎?我已經寫在下面了........ 請看清楚我的回應...
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
barryHsu
一般會員


發表:55
回覆:49
積分:20
註冊:2005-01-25

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-29 18:16:33 IP:163.18.xxx.xxx 未訂閱
㊣您好: i got it. thx
barryHsu
一般會員


發表:55
回覆:49
積分:20
註冊:2005-01-25

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-29 20:17:53 IP:163.18.xxx.xxx 未訂閱
㊣您好: 我將程式修改過了,不知道我有沒有誤會您的意思,我將程式修改成如下所示。  
 
#include<16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT
#use delay(clock=4000000)
void main()
{
int a=0;
int b=0;
   do
   {
       output_low((PIN_D2));
       output_low((PIN_C4));
       if(input(PIN_D0))
       {
       while(input(PIN_D2))
       a=a 1;
       if(a==5)
       {
       output_high(PIN_D3);
       }
       }
       if(input(PIN_D1))
       {
       output_low((PIN_D2));
       while(input(PIN_C4))
       b=b 1;
       if(b==5)
       {
       output_low(PIN_D3);
       }
       }
   }while(1);
}

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-29 22:27:11 IP:220.134.xxx.xxx 未訂閱
你這次的功能又是什麼?你這樣寫應該達不到你要的動作.... 看仔細....我寫的是:
do
{
  if (input(PIN_D2))
  {
    while(input(PIN_D2));
    a=a 1;
    if(a==5)
    {
      output_high(PIN_D3);
    }
  }
}while(1);
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
barryHsu
一般會員


發表:55
回覆:49
積分:20
註冊:2005-01-25

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-06-29 23:08:35 IP:163.18.xxx.xxx 未訂閱
㊣您好: 我執行出來的結果,當電源插上去後,PIN_D3會一直的亮著,不用用到按鈕就會一直地亮.....所以還是怪怪的...好像沒有用到計數的功能
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-06-30 13:45:21 IP:61.66.xxx.xxx 未訂閱
試試看吧 < class="code"> #include<16F877.h> #fuses HS,NOWDT,NOPROTECT,NOBROWNOUT #use delay(clock=4000000) void main() { int a=0; int b=0; while(1) { whlie (input(PIN_D2)==1) { if (b==0) a=a 1; b=1; } whlie (input(PIN_D2)==0) { if (b==1) a=a 1; b=0; } if (a>=10) output_high(PIN_D3); } } ------------------- 美好的事物 稍縱即逝
系統時間:2024-05-04 4:17:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!