Thông báo

Collapse
No announcement yet.

giúp mạch đếm ngược dùng pic16f877a

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • giúp mạch đếm ngược dùng pic16f877a

    em chưa rành về web này lắm. có đăng bài sai chỗ các bác bỏ qua cho. tình hình là em định viết code cho 4 con led 7 đoạn đếm giảm dần theo kỉu tương tự đèn giao thông
    nhưng mà đếm bị sai. bác nào cao tay chỉ em cái này với ạ. em mới học nên chưa rành lắm
    code:
    #include <16f877a.h>
    #fuses XT,HS,NOWDT,PUT
    #use delay(clock=4000000)
    #use fast_IO(a)
    #use fast_IO(d)
    #byte portd=0x08
    #bit RA0=0x05.0
    #bit RA1=0x05.1
    #bit RA2=0x05.2
    #bit RA3=0x05.3
    int u[10]={0b11000000,0b11111001,0b10100100,0b10110000,0b10 011001,0b10010010,0b10000010,0b11111000,0b10000000 ,0b10010000};
    signed int x,i,y;
    int chuc1,donvi1,chuc2,donvi2;
    void main()
    {
    set_tris_a(0b0000);
    set_tris_d(0);
    while(1)
    { x=50;
    y=45;
    while(x>0 && y>0)
    {
    chuc1=x/10;
    donvi1=x%10;
    chuc2=y/10;
    donvi2=y%10;
    for(i=0;i<50;i++)
    {

    portd=u[chuc1];
    RA0=0;
    delay_ms(5);
    RA0=1;

    portd=u[donvi1];
    RA1=0;
    delay_ms(5);
    RA1=1;


    portd=u[chuc2];
    RA2=0;
    delay_ms(5);
    RA2=1;

    portd=u[donvi2];
    RA3=0;
    delay_ms(5);
    RA3=1;
    }
    x--;
    y--;
    }
    }
    }

  • #2
    Bạn dùng sai mã led rồi. mã led trên của bạn là của led 7seg anot chung mà chân điều khiển của bạn lại on khi RAx = 0.
    Cách giải quyết
    1. đổi sang mã led catot chung
    2. đảo lại RAx
    RA3=1;
    delay_ms(5);
    RA3=0;

    Comment


    • #3
      Nguyên văn bởi phuphuongbk Xem bài viết
      Bạn dùng sai mã led rồi. mã led trên của bạn là của led 7seg anot chung mà chân điều khiển của bạn lại on khi RAx = 0.
      Cách giải quyết
      1. đổi sang mã led catot chung
      2. đảo lại RAx
      RA3=1;
      delay_ms(5);
      RA3=0;
      điều đó không quan trọng ạ...cái chính là em đã viết lại...nhưng nó quét mỗi lần chỉ 2 con. em không biết sửa sau cho nó quét cùng lúc 4 ocn ạ
      code đã viết lại đây ạ
      #include <16f877a.h>
      #fuses XT,HS,NOWDT,PUT
      #use delay(clock=4000000)
      #use fast_IO(a)
      #use fast_IO(d)
      #use fast_io(c)
      #byte portd=0x08
      #byte portc=0x06
      #bit RA0=0x05.0
      #bit RA1=0x05.1
      #bit RA2=0x05.2
      #bit RA3=0x05.3
      int u[10]={0b11000000,0b11111001,0b10100100,0b10110000,0b10 011001,0b10010010,0b10000010,0b11111000,0b10000000 ,0b10010000};
      signed int x,i,y,z,n,m,l;
      int chuc,donvi,chuc1,donvi1,chuc2,donvi2,chuc4,donvi4, chuc5,donvi5,chuc6,donvi6;
      void main()
      {
      set_tris_a(0b0000);
      set_tris_d(0);
      set_tris_c(0b00000000);
      while(true)
      { x=30;
      y=27;
      z=3;
      n=27;
      m=3;
      l=30;
      //----------cot1---------
      //---------------do1--------------
      while(x>=0)
      {

      output_c(0b00000100);

      chuc=x/10;
      donvi=x%10;
      for(i=0;i<50;i++)
      {

      portd=u[chuc];
      RA0=0;
      delay_ms(5);
      RA0=1;

      portd=u[donvi];
      RA1=0;
      delay_ms(5);
      RA1=1;
      }
      x--;
      output_c(0b00000000);
      }
      //--------------xanh1-----------
      while(y>=0)
      {
      output_c(0b00000010);
      chuc1=y/10;
      donvi1=y%10;

      for(i=0;i<50;i++)
      {

      portd=u[chuc1];
      RA0=0;
      delay_ms(5);
      RA0=1;

      portd=u[donvi1];
      RA1=0;
      delay_ms(5);
      RA1=1;

      }
      y--;
      output_c(0b00000000);
      }

      //--------vang1--------
      while(z>=0)
      {
      output_c(0b01000000);
      chuc2=z/10;
      donvi2=z%10;
      for(i=0;i<50;i++)
      {

      portd=u[chuc2];
      RA0=0;
      delay_ms(5);
      RA0=1;

      portd=u[donvi2];
      RA1=0;
      delay_ms(5);
      RA1=1;

      }

      z--;
      output_c(0b00000000);
      }
      //----------cot2---------------------
      //----------xanh2----------------
      while(n>=0)
      {
      output_c(0b00100000);
      chuc4=n/10;
      donvi4=n%10;

      for(i=0;i<50;i++)
      {

      portd=u[chuc4];
      RA2=0;
      delay_ms(5);
      RA2=1;

      portd=u[donvi4];
      RA3=0;
      delay_ms(5);
      RA3=1;

      }
      n--;
      output_c(0b00000000);
      }
      //-----------vang2--------------
      while(m>=0)
      {
      output_c(0b00010000);
      chuc5=m/10;
      donvi5=m%10;
      for(i=0;i<50;i++)
      {

      portd=u[chuc5];
      RA2=0;
      delay_ms(5);
      RA2=1;

      portd=u[donvi5];
      RA3=0;
      delay_ms(5);
      RA3=1;
      }
      m--;
      output_c(0b00000000);
      }
      //------do2-----------------
      while(l>=0)
      {
      output_c(0b00001000);

      chuc6=l/10;
      donvi6=l%10;
      for(i=0;i<50;i++)
      {
      portd=u[chuc6];
      RA2=0;
      delay_ms(5);
      RA2=1;

      portd=u[donvi6];
      RA3=0;
      delay_ms(5);
      RA3=1;
      }
      l--;
      output_c(0b00000000);
      }
      }
      }

      Comment


      • #4
        Bạn làm thế này thì rõ ràng trong 1s thì chỉ có 2led sáng thôi. Phương pháp quét led là bạn phải bố chí time sao cho trong 1 khoảng time nhất định thì các led phải được bật lên vs số lần như nhau. Bạn có thể tham khảo đoạn code mình viết về hiện thị 4led để đếm time.Bạn để ý phần mình chia time sáng 1 led,chia sao cho hợp lý và để hiện thị ko bị nhấp nháy là đc.Led 7seg.zip

        Comment


        • #5
          Nguyên văn bởi phuphuongbk Xem bài viết
          Bạn làm thế này thì rõ ràng trong 1s thì chỉ có 2led sáng thôi. Phương pháp quét led là bạn phải bố chí time sao cho trong 1 khoảng time nhất định thì các led phải được bật lên vs số lần như nhau. Bạn có thể tham khảo đoạn code mình viết về hiện thị 4led để đếm time.Bạn để ý phần mình chia time sáng 1 led,chia sao cho hợp lý và để hiện thị ko bị nhấp nháy là đc.[ATTACH]76921[/ATTACH]
          vậy có cách nào sửa đaọn code của em đc không. tại đoạn code trên me không dùng temir...nói chung là không cần đếm đúng thời gian thực. em chỉ làm cho biết thôi
          Click image for larger version

Name:	Untitled.jpg
Views:	2
Size:	128.0 KB
ID:	1387580

          Comment


          • #6
            Nguyên văn bởi phuphuongbk Xem bài viết
            Bạn làm thế này thì rõ ràng trong 1s thì chỉ có 2led sáng thôi. Phương pháp quét led là bạn phải bố chí time sao cho trong 1 khoảng time nhất định thì các led phải được bật lên vs số lần như nhau. Bạn có thể tham khảo đoạn code mình viết về hiện thị 4led để đếm time.Bạn để ý phần mình chia time sáng 1 led,chia sao cho hợp lý và để hiện thị ko bị nhấp nháy là đc.[ATTACH]76921[/ATTACH]
            đại ca ơi cái này của 89c52 mà....em học bên 16f877a nên nhìn cái này em đâu có hiểu đâu

            Comment


            • #7
              Nguyên văn bởi minh2208 Xem bài viết
              đại ca ơi cái này của 89c52 mà....em học bên 16f877a nên nhìn cái này em đâu có hiểu đâu
              Phương pháp quét led thì dùng con nào mà chả như nhau.nó ko liên quan đến đặc trưng phần cứng như thế nào cả.thậm trí bạn có thể coi cái vd của mình là 1 cái file header rồi chỉnh sửa 1 chút cho phù hợp vs con bạn dùng là ok ngay.

              Comment


              • #8
                Nguyên văn bởi phuphuongbk Xem bài viết
                Phương pháp quét led thì dùng con nào mà chả như nhau.nó ko liên quan đến đặc trưng phần cứng như thế nào cả.thậm trí bạn có thể coi cái vd của mình là 1 cái file header rồi chỉnh sửa 1 chút cho phù hợp vs con bạn dùng là ok ngay.
                bác nói thế thì em chịu....em mới học nên không biết mới hỏi mà. nếu em biết sửa thì lên đây làm gì nữa bác @@

                Comment

                Về tác giả

                Collapse

                minh2208 Tìm hiểu thêm về minh2208

                Bài viết mới nhất

                Collapse

                Đang tải...
                X