Sao mÌnh quÉt led 7 ĐoẠn khÔng ĐƯỢc vẬy ?

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • kass
    Thành viên mới
    • Mar 2010
    • 17

    #1

    Sao mÌnh quÉt led 7 ĐoẠn khÔng ĐƯỢc vẬy ?

    Chương trình này sai chỗ nào mà mình không quét led 7 đoạn không được ;
    Mình muốn cho led chạy từ 00-99;
    Thời gian nhảy số không cần thiết ;nhưng nếu được thì 1s là vui rồi ;
    Mọi người giúp với ! ( mình mới tập tọe)
    PHP Code:
    #include <REGX52.H>
    sbit led1=P2^0;
    sbit led2=P2^1;
    unsigned char font[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
    unsigned char nghin,tram,chuc,donvi;
    void delay()
        {
            unsigned int k;
            for(k=0;k<3300;k++);
        }
    void count(void)
        {
         int i,j;
        //i=j=0;
            
              for ( i=0;i<100;i++)
              
              {
                  chuc=i/10;
                donvi=i%10;
                   
                 
                  while(j<5)
                
                    P1=font[donvi];
                    led2=0;led1=1;
                    delay();
                    led2=1;
                    P1=font[chuc];
                    led1=0;led2=1;
                    delay();
                    led1=1;
                    
                    j++;
            
            }
                    
        }     
        
    void main()
        { while (1)
            {
        count();
            
            }
                    
        
        } 
    
    Các bạn dùng tạm hình này vậy
    Last edited by kass; 11-10-2010, 21:15.
  • hoasua_2005
    Thành viên tích cực
    • Mar 2008
    • 487

    #2
    #include <REGX52.H>
    sbit led1=P2^0;
    sbit led2=P2^1;
    unsigned char font[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};
    unsigned char nghin,tram,chuc,donvi,k;
    void delay(int ms)
    {
    int i,j;
    for(i=0;i<=ms;i++)
    for(j=0;j<=120;j++)
    {;}
    }
    void count(int i)
    {
    chuc=i/10;
    donvi=i%10;

    P2 = 0x01;
    P1 = font[donvi];
    delay(20);

    P2 = 0x02;
    P1=font[chuc];
    delay(20);

    }
    void main()
    { while (1)
    {
    count(k);
    k++;
    }

    }


    bạn xem lại nha, giá trị điện trở ở chân E của 2 bjt quá lớn, tham khảo đoạn code trên xem sao nhé

    Comment

    • kass
      Thành viên mới
      • Mar 2010
      • 17

      #3
      Chưa được ,bạn ơi , từ 00-99 thì chạy tốt nhưng sau 99 thì nó chạy lộn xộn hết .
      Sau quá trình lộn xộn đó ,nó lại chạy từ 00- 99
      NNhưng dù sao cũng cám ơn bạn nhiều giúp thêm lần nữa đi !

      Comment

      • kass
        Thành viên mới
        • Mar 2010
        • 17

        #4
        Ah ! mình thấy rồi !~
        PHP Code:
        void main()
        { while (1)
        {
        for(k=0;k<100;k++)
        count(k);
        //k++;
        } 
        
        Thế này phải không ?
        Làm sao cho nó nhảy lên 1 đơn vị sau 1 giây nhỉ?

        Comment

        • qmk
          Thành viên tích cực
          • Dec 2005
          • 790

          #5
          Bật timer lên.
          Tính thời gian khoảng 10ms.
          Dùng một biến đếm mỗi khi cờ Timer set (nhớ clear).
          Sau 100 lần thì tăng giá trị led lên và reset biến đếm.
          Thế sẽ được 1s.

          Pseudo code thế này;
          timer_set(10ms);
          timer_enable();
          while (1)
          {
          // Làm việc khác
          if (timer_tick())
          {
          timer_1s++;
          if (timer_1s >=100)
          {
          timer_1s = 0;
          led_set(++value);
          if (value >=99) value = 0;
          }
          }
          }
          Vẫn biết mỗi lần xa là một lần về lại...

          Comment

          • vu_spiderman
            Banned
            • Oct 2010
            • 56

            #6
            cai nay chạy rui ne
            #include<AT89X51.h>
            unsigned char thoi_gian;
            unsigned int over=0;
            unsigned char ma[10]={192,249,164,176,153,146,130,248,128,144};

            void delay(unsigned char time)
            {
            unsigned char x,y;
            for(x=0;x<time;x++)
            {
            for(y=0;y<13;y++);

            }
            }
            void time0() interrupt 1
            {
            over++;
            if(over==4950) {
            over=0;
            thoi_gian--;
            }
            }

            void h_thi()
            {
            unsigned char k,chuc,donvi;
            for(k=0;k<2;k++)
            {
            donvi=thoi_gian%10;
            chuc=thoi_gian/10;
            }
            P2=ma[donvi];
            P0_0=0;
            delay(1);
            P0_0=1;
            P2=ma[chuc];
            P0_1=0;
            delay(1);
            P0_1=1;
            }

            void main()
            {
            P0=255;
            P2=255;
            TMOD=2; //timer0 o che do 2 tu nap lai
            TH0=54; //gia tri nap lai
            TR0=1; //cho phep timer0 chay
            ET0=1; //cho phep ngat timer0
            EA=1;
            while(1)
            {
            thoi_gian=30;
            do
            {
            h_thi();
            }
            while(thoi_gian!=0);
            }
            }

            Comment

            • hoangdai
              Thành viên tích cực
              • Nov 2005
              • 2720

              #7
              Sao ko thấy mọi người cho cái thuật toán để rõ ràng hơn nhỉ. Túm lại để quét và đếm led thì ntn:
              B1: Khởi tạo timer, tạo ra khoảng thời gian đếm(step) mong muốn, dùng biến J nào đó để làm giá trị đếm.
              B2: Viết cho 1 hàm quét led( Dùng hàm cho gọn), giả sự quét từ trái qua phải. Nguyên tắc là xuất dữ liệu ra led, sau đó cấp nguồn, delay rồi tắt nó đi rồi chuyển sang con led bên cạnh.
              B3:CT chính đây rồi: Hãy chia số J đang đếm thành các phần nghìn, trăm, chục...ở đây nhé. Sau đó gọi cái hàm quét led kia ra
              B4: Enjoy!


              Add: 97 Quán Nam - Lê Chân - Hải Phòng.
              Tel: 031 518648 Phone: 0904 283 505

              Comment

              • ngochai0712
                Thành viên chính thức
                • May 2009
                • 97

                #8
                Đo tần số và quét led đây

                Mô phỏng và code, Bạn nào cần thì down về tham khảo, đơn vị Khz
                Attached Files

                Comment

                • kass
                  Thành viên mới
                  • Mar 2010
                  • 17

                  #9
                  Cám ơn mọi người nha !
                  Dạo này mình hơi bận nên không viết bài cám ơn các bạn được
                  Mình hiểu thuật toán của các bạn rồi
                  Mình đã làm và ...............................................nó đã chạy .MỪNG QUÁ !
                  Khi nào có vấn đề gì khác ,mong mọi người chiếu cố .
                  ================Thanks===================

                  Comment

                  • hungnp
                    Thành viên tích cực
                    • Nov 2005
                    • 178

                    #10
                    Để quét led nên dùng ngắt timer. mỗi lần timer ngắt thì xuất dữ liệu ra 1 led. lần ngắt tiếp theo của timer thì xuất dữ liệu ra led tiếp theo và cứ thế cho đến hết. Tuân thủ theo quy tắc của điện ảnh >=24hình/s thì led sẽ không bao giờ nháy.

                    Comment

                    Về tác giả

                    Collapse

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

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

                    Collapse

                    Đang tải...