Thông báo

Collapse
No announcement yet.

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

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

  • 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
    http://picasaweb.google.com/bartholo...88821555383682
    Last edited by kass; 11-10-2010, 22:15.

  • #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


    • #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


      • #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


        • #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


          • #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


            • #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


              • #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


                • #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


                  • #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...
                    X