Thông báo

Collapse
No announcement yet.

[Help] Hỏi về mạch đếm LED 7 đoạn dùng 89S52!

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

  • [Help] Hỏi về mạch đếm LED 7 đoạn dùng 89S52!

    Em mới bắt đầu tìm hiểu về VDK 89S52 và ứng dụng em đang làm là mạch đếm từ 0->99 sử dụng 2 led 7 đoạn. Nhưng khi em nạp vào mạch thì nó chỉ chạy có 1 con Led hàng đơn vị , còn Led hàng chục thì ko sáng . Con Led hàng đơn vị tuy sáng nhưng nó nhảy số lung tung và sáng yếu nữa. Bác nào rành về cái này chỉ giúp em với. Thanks trước!
    Mạch của em đây:

    Code C:
    #include "AT89X52.H"
    sbit Led1 = P0^0;
    sbit Led2 = P0^1;

    unsigned char led7_data[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 }; //Decimal to Led7seg
    unsigned char i,k;
    void delay(unsigned int ms)
    {
    unsigned int i,j;
    for(i = 0; i < ms; i++)
    for(j = 0;j < 125;j++);
    }
    void led7seg()
    {

    Led1 = 1; // turn on LED1
    P2 = led7_data[i/10];
    delay(30);
    Led1 = 0;
    P2 = 0xff;
    // LED2
    Led2 = 1; // turn on led2
    P2 = led7_data[i%10];
    delay(30);
    Led2 = 0;
    P2 = 0xff;
    }

    void main(void)
    {
    //P1 = 0x00;
    while(1)
    {
    // Led dem len tu 0->99
    for(i = 0; i <= 99; i++)
    { P1 = i;

    led7seg();
    delay(1000);

    }

    }
    }
    File download: http://www.mediafire.com/?r6x0ri1wchqw4vp

  • #2
    Mạch của bạn phần cứng và phần mềm đều có vấn đề.
    + Phần cứng:
    Trong protues, khi mô phỏng led 7 thanh loại có nhiều hơn 1 số (của bạn là 2 số) thì phải dùng loại led kép, dùng nhiều con đơn như của bạn sẽ ko mô phỏng được(nhưng khi làm mạch thật thì vẫn được). Một điều nữa là mạch của bạn thiếu điện trở thanh(loại 4k7 đến 10k đều được) ở Port0 ==> mạch thật và mô phỏng đều ko chạy. Con điện trở R11 ở chỗ mạch reset bạn nên để giá trị là 10k(khi mô phỏng ko cần cho phần mạch reset và mạch dao động vào đâu).
    + Phần mềm:
    Mình sửa lại qua chương trình của bạn, bạn tham khảo này.

    http://www.mediafire.com/?tqlbgdp8l295rwm


    +
    Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
    http://diencongnghiep360.com/
    http://tudienhathe.vn/

    Comment


    • #3
      Nguyên văn bởi vietthanh123 Xem bài viết
      Mạch của bạn phần cứng và phần mềm đều có vấn đề.
      + Phần cứng:
      Trong protues, khi mô phỏng led 7 thanh loại có nhiều hơn 1 số (của bạn là 2 số) thì phải dùng loại led kép, dùng nhiều con đơn như của bạn sẽ ko mô phỏng được(nhưng khi làm mạch thật thì vẫn được). Một điều nữa là mạch của bạn thiếu điện trở thanh(loại 4k7 đến 10k đều được) ở Port0 ==> mạch thật và mô phỏng đều ko chạy. Con điện trở R11 ở chỗ mạch reset bạn nên để giá trị là 10k(khi mô phỏng ko cần cho phần mạch reset và mạch dao động vào đâu).
      + Phần mềm:
      Mình sửa lại qua chương trình của bạn, bạn tham khảo này.

      http://www.mediafire.com/?tqlbgdp8l295rwm


      +
      Ở đây mình không muốn nói đến Proteus vì có những mô phỏng chạy ngon lành nhưng mạch thực tế thì không được như thế
      Về phần cứng:
      Mình làm mạch theo sơ đồ mạch Orcad ở trên, chứ ko theo sơ đồ trong Proteus. Bạn nhìn hình trên có thể thấy mình đã mắc 2 điện trở 10k vào Port0 rồi .
      Về phần mềm:
      Code của bạn chạy mô phỏng rất Ok, nhưng khi mình nạp thử vào mạch thực tế thì chỉ chạy có 1 con Led hàng đơn vị và vẫn nhảy số lung tung lắm. Vấn đề này mình vẫn chưa tìm ra được câu trả lời. Nghe thằng bạn nói do tần số quét ko đúng

      Comment


      • #4
        Code:
        #include<AT89X52.H>
         sbit Led1 = P0^0;
         sbit Led2 = P0^1;
         
         unsigned char led7_data[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };
        int i,x;
        void delay(unsigned int ms)
        {
        unsigned int i,j;
         for(i = 0; i < ms; i++)
          for(j = 0;j < 125;j++);
        } 
        void led7seg()
        {
         
         Led1 = 1; 
         P2 = led7_data[i/10];
         delay(3);
         Led1 = 0;
         P2 = 0xff;
         Led2 = 1;	  
         P2 = led7_data[i%10];
         delay(3);
         Led2 = 0;
         P2 = 0xff;	 
        }  
        
        void main(void)
        {	
        i=0;
         while(1)
         {
          for(x = 0; x <=100; x++)
          {	 
           	led7seg();
          }
          i++;
          if(i==100) i=0;
         }
        }
        tần số quét sai trầm trọng, quét 1ms mà delay(30) thì chạy sao đc, 2 con led =60ms =>1000/60=16 lần
        nó nháy là phải
        với lại P0 bạn bắt buộc phải có trở kéo, ở đây tốt nhất là dùng trở 10k, chứ ko nên đấu trực tiếp thế kía vào Tran, led bạn sáng yếu là do bạn lắp phần cứng sai
        với các mạch cơ bản thế này thì ko có lý gì protues ko chạy được, ko chạy là do bạn làm sai mà thôi, ko lên khinh thường nó như vậy chứ
        Website chính thức đổi địa chỉ website thành
        Mời các bạn ghé thăm !!!

        Comment


        • #5
          Ý kiến của bác mast090 đúng rồi đấy. Trong bài toán quét led phải đảm bảo tần số quét >= 24 hình/s. Mình thì thường quét 50 hình/s.

          Comment


          • #6
            Mình có project viết bằng ASM đây ko biết bạn có đọc được không.

            DV EQU R2
            CHUC EQU R3
            TRAM EQU R4
            ORG 000H
            MAIN:
            MOV TRAM,#0
            X1: MOV CHUC,#0
            X2: MOV DV,#0
            X3: CALL BCD_7DOAN
            MOV R5,#0FFH ;TOC DO DEM
            X4: CALL HIENTHI
            DJNZ R5,X4
            INC DV
            CJNE DV,#10,X3
            INC CHUC
            CJNE CHUC,#10,X2
            INC TRAM
            CJNE TRAM,#10,X1
            JMP MAIN
            ;*********************************************
            BCD_7DOAN:
            MOV DPTR,#MA7DOAN
            MOV R0,#02H ;DIA CHI THANH GHI R2
            MOV R1,#20H
            GM: MOV A,@R0
            MOVC A,@A+DPTR
            MOV @R1,A
            INC R0
            INC R1
            CJNE R0,#05H,GM
            RET
            ;*********************************************
            HIENTHI:
            MOV R0,#20H
            MOV A,#08H
            HT: MOV P0,@R0
            MOV P2,A
            CALL DELAY
            MOV P2,#00H ;CHONG LEM
            INC R0
            RR A
            CJNE A,#01H,HT
            RET
            ;*********************************************
            DELAY:
            MOV R7,#0FFH
            DJNZ R7,$
            RET
            ;*********************************************
            MA7DOAN:
            DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
            END

            Download project http://www.sangthai.com.vn/ste/project-8051/445

            Comment


            • #7
              với lại P0 bạn bắt buộc phải có trở kéo, ở đây tốt nhất là dùng trở 10k, chứ ko nên đấu trực tiếp thế kía vào Tran, led bạn sáng yếu là do bạn lắp phần cứng sai
              Cho mình hỏi cái trở kéo ở P0 mắc như thế nào vậy bạn? Cái mạch mình vẽ Orcad phía trên có trở 10K mắc giữa Trans và P0 mà. Mình giải thích rõ hơn dc không? Mình hơi gà về cái này
              Mình có thắc mắc chút xíu chỗ code của bạn:
              for(x = 0; x <=100; x++)
              {
              led7seg();
              }
              i++;
              if(i==100) i=0;
              Một vòng for là 8us bạn cho chạy có 100 vòng->chỉ quét có 8us*100 = 0.8ms, trong khi thời gian delay 2 con LED là 3+3 = 6ms ->0.8/6 =0.13 lần hả :-/
              Last edited by bombon18; 07-07-2011, 01:32.

              Comment


              • #8
                Nguyên văn bởi bombon18 Xem bài viết
                Cho mình hỏi cái trở kéo ở P0 mắc như thế nào vậy bạn? Cái mạch mình vẽ Orcad phía trên có trở 10K mắc giữa Trans và P0 mà. Mình giải thích rõ hơn dc không? Mình hơi gà về cái này
                trở kéo tức là con trở nối từ VCC xuống pin của port0, mỗi pin sẽ được nối lên VCC thông qua một con trở.Hy vọng bạn hình dung được cách mắc
                góp ý bạn một tí về 8 con led đơn,bạn lên mắc theo kiểu hút dòng vào vi điều khiển chứ đừng mắc như vậy.hút dòng tức là bạn mắc làm sao cho led sáng khi pin xuất mức 0.
                sale of Gobal Automation Solution Company Limited

                Comment


                • #9
                  điện trở kéo VCC là để tạo ra mức logic 1 khi cần, bởi mặc định P0 được sản xuất là I/O có tổng trở cao sử dụng cho giao tiếp bộ nhớ ngoại, chỉ có 2 mức logic Z và 0, mà mức Z thì ko thể coi là logic 1 được, do đó khi sử dụng nó để làm I/O port thì phải mắc thêm pull up resistor.

                  Comment


                  • #10
                    Nguyên văn bởi bombon18 Xem bài viết
                    Ở đây mình không muốn nói đến Proteus vì có những mô phỏng chạy ngon lành nhưng mạch thực tế thì không được như thế
                    Về phần cứng:
                    Mình làm mạch theo sơ đồ mạch Orcad ở trên, chứ ko theo sơ đồ trong Proteus. Bạn nhìn hình trên có thể thấy mình đã mắc 2 điện trở 10k vào Port0 rồi .
                    Về phần mềm:
                    Code của bạn chạy mô phỏng rất Ok, nhưng khi mình nạp thử vào mạch thực tế thì chỉ chạy có 1 con Led hàng đơn vị và vẫn nhảy số lung tung lắm. Vấn đề này mình vẫn chưa tìm ra được câu trả lời. Nghe thằng bạn nói do tần số quét ko đúng
                    Trong trường hợp này mạch mô phỏng protues mà không chạy thì mạch thật sao chạy được.
                    Mạch orcad của bạn còn nhiều chỗ ko ổn lắm. Phần điện trở thanh cho P0, điện trở hạn dòng cho led 7 thanh, con tran ngược bạn mắc ở chế độ khóa điện tử như vậy cũng chưa tối ưu. Led 7 thanh loại A chung bạn nên dùng tran thuận. Bạn tham khảo cái này về cách mắc tran làm khóa điện tử.
                    http://lab3i.com/kien-thuc-co-ban-di...c-dien-tu.html
                    Hàm delay của bạn mình hơi nghi ngờ về độ chính xác??!
                    Mình hay dùng hàm delay như thế này.Mình nghĩ là sẽ chính xác hơn đấy(?Các bạn cho ý kiến)
                    void delay_10ms (unsigned int time)
                    {
                    unsigned int x;
                    for(x=1;x<=time;x++)
                    {
                    TMOD=0x11;
                    TH0=55536/256;
                    TL0=55536%256;
                    TR0=1;
                    while(!TF0);
                    TF0=TR0=0;
                    }
                    }

                    Với trường hợp trên, người ta hay dùng transistor A1015,C1815 để quét led.Cách mắc(như trang web tham khảo) là đơn giản nhất.
                    Last edited by vietthanh123; 07-07-2011, 09:26.
                    Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
                    http://diencongnghiep360.com/
                    http://tudienhathe.vn/

                    Comment


                    • #11
                      Nguyên văn bởi bombon18 Xem bài viết
                      Cho mình hỏi cái trở kéo ở P0 mắc như thế nào vậy bạn? Cái mạch mình vẽ Orcad phía trên có trở 10K mắc giữa Trans và P0 mà. Mình giải thích rõ hơn dc không? Mình hơi gà về cái này
                      Mình có thắc mắc chút xíu chỗ code của bạn:

                      Một vòng for là 8us bạn cho chạy có 100 vòng->chỉ quét có 8us*100 = 0.8ms, trong khi thời gian delay 2 con LED là 3+3 = 6ms ->0.8/6 =0.13 lần hả :-/
                      trời, ai lại chia bớt chia xén ra, phải nhân lên chứ, trong cái hàm led7seg nó gồm rất nhiều lệnh, chỉ tính sơ sơ độc phần delay đã là 6x100=0,6s rồi, cộng thêm time thực hiện các lệnh khác là tơi vào tầm 1s, còn tần số quét thì bạn phải hiểu là tần số quét/1con led chứ ko phải tính chung vì vậy mình mới lấy 3+3, rồi lấy 1000/6=160 lần, thức tế nếu làm với 2 led thì có thể delay 5 hay 6 cũng đc, miễn sao tần số >24h/s, thực ra 24h/s nó vẫn nháy với tùy mắt người, mình thường làm với khoảng 40 50 lần, mắt có tinh đến mấy cũng ko nhìn đc nháy
                      Website chính thức đổi địa chỉ website thành
                      Mời các bạn ghé thăm !!!

                      Comment


                      • #12
                        Bạn ko cần thAY CODE ĐÂU CHỈ CẨN THAY DELAY(30)= dELAY(20) LÀ OK. Bạn sẽ ko bao giờ bị nháy nữa

                        Comment


                        • #13
                          Mình chia sẻ cho bạn code timer 1ms ( bạn nên dùng timer vì ít bị sai số hơn vòng lặp ).
                          void timer()
                          {
                          TMOD=0x01;
                          TL0=0x18;
                          TH0=0xfc;
                          while(TF0==0)
                          {
                          TR0=1;
                          }
                          TR0=0;
                          TF0=0;
                          chúc bạn thành công
                          }

                          Comment


                          • #14
                            Mình chia sẻ cho bạn code timer 1ms ( bạn nên dùng timer vì ít bị sai số hơn vòng lặp ).
                            void timer()
                            {
                            TMOD=0x01;
                            TL0=0x18;
                            TH0=0xfc;
                            while(TF0==0)
                            {
                            TR0=1;
                            }
                            TR0=0;
                            TF0=0;
                            }
                            chúc bạn thành công
                            Last edited by thelaxong; 08-08-2011, 10:08.

                            Comment


                            • #15
                              dem 00-99

                              #include<reg51.h>
                              void tre(void);
                              void main(void)
                              {
                              while(1)
                              {
                              for(a=0;a<=99;a++) //a=xy
                              x=a\10;
                              y=a%10;

                              }
                              }
                              void tre(void);
                              phần sau bạn tự viết

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X