Thông báo

Collapse
No announcement yet.

Dành cho người mới tìm hiểu 8051

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

  • #16
    Cảm ơn các bác đã góp ý.
    Như tui đã nói từ đầu, những bài viết này dành cho những người mới toe tham khảo là chủ yếu, cho nên tui chỉ đưa ra cách giải quyết bài toán 1 cách đơn giản và dễ hiểu nhất.Những bài toán trên giải quyết 1 cách gần như thuần phần mềm, tức là bạn chỉ cần biết sơ sơ về sơ đồ chân của 8051, và 1 chút kiến thức về lập trình cũng có thể hiểu được và làm được.Như thế sẽ tạo ra 1 niềm hưng phấn cho các bạn mới học để đi sâu vào tìm hiểu phần cứng của 8051.Tui chỉ sợ mới đầu đã đưa ra cách giải quyết bài toán thiên nhiều về cấu trúc của 8051 thì các bạn sẽ khó hiểu, như thế dễ dấn đến tư tưởng chán nản và rất dễ bỏ cuộc.
    Ko biết cách giải quyết vấn đề của tui như vậy có ổn ko, nhưng đó là kinh nghiệm, kinh nghiệm thật sự của tui trong quá trình làm quen với 8051.Tất nhiên, các bạn có thể đi theo hướng riêng của mình, mà theo bạn là đúng và phù hợp với khả năng của mình, tui ko rập khuôn ai cả, và cũng ko muốn ai rập khuôn theo mình.
    Một bài toán có rất nhiều cách giải quyết khác nhau, cái quan trọng là bạn phải tối ưu hóa được giải giải thuật đó.
    Cũng lưu ý với các bạn mới làm quen với 8051 rằng, sau khi xem và hiểu được sơ sơ cách lập trình cho 8051, thì các bạn phải đặc biệt tìm hiểu kỹ về cấu trúc phần cứng của 8051, các tính năng của nó.Như thế thì bạn mới hiểu được thật sự về 8051 và tận dụng được hết các tính năng của nó.
    Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

    Comment


    • #17
      Nguyên văn bởi Diemkieu
      Sao không có ai thảo luận cùng bạn Quynh vậy? Tui khoái nó lắm nhưng chẳng có một tý kinh nghiệm nào cả. Nhưng tui sẽ có gắng. Cảm ơn bạn đã tạo ra topic này.
      Bạn cho mình địa chỉ email nhé. Mình cần tài liệu "họ vđk 8051" của thầy Tống Văn Ôn lắm đó
      email của mình:anhquynh_dt1_k47@yahoo.com
      Liên hệ với mình nhé, mình sẽ gửi cho bạn ngay.
      Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

      Comment


      • #18
        Hôm nay chúng ta sẽ bàn đến chương trình con nhé.
        Để đơn giản chúng ta sẽ làm lại vd3:8 led chạy đuổi nhau.
        _____________________________
        Code:
        //8 led sang duoi nhau
        //tai 1 thoi diem chi duy nhat 1 led sang
        #include <REGX51.H>
        #define led0 P1_0
        #define led1 P1_1
        #define led2 P1_2
        #define led3 P1_3
        #define led4 P1_4
        #define led5 P1_5
        #define led6 P1_6
        #define led7 P1_7
        #define sang 1
        #define tat 0
        //---------------
        void delay( unsigned int ms )
        {
          unsigned int i,j;
          for (i=0;i<ms;i++)
            for (j=0;j<120;j++)
        	 {} 
        }
        //--------------
        void display_led(unsigned char number)
        {
          
          switch (number)
          {
           
           case 1:
             led0=sang;
        	 led1=led2=led3=led4=led5=led6=led7=tat;
        	 break;
           case 2:
             led1=sang;
        	 led0=led2=led3=led4=led5=led6=led7=tat;
        	 break;
           case 3:
             led2=sang;
        	 led1=led0=led3=led4=led5=led6=led7=tat;
        	 break;
           case 4:
             led3=sang;
        	 led1=led2=led0=led4=led5=led6=led7=tat;
        	 break;
            case 5:
             led4=sang;
        	 led1=led2=led3=led0=led5=led6=led7=tat;
        	 break;
        	case 6:
             led5=sang;
        	 led1=led2=led3=led4=led0=led6=led7=tat;
        	 break;
        	case 7:
             led6=sang;
        	 led1=led2=led3=led4=led5=led0=led7=tat;
        	 break;
        	case 8:
             led7=sang;
        	 led1=led2=led3=led4=led5=led6=led0=tat;
        	  break;
        	
        	 
          }
        }
        main ()
        {
          unsigned char m;
        while(1)
        {
        for (m=0;m<8;m++)
        {display_led(m);delay(1000);}
        }
        }
        _________________________________________
        các bạn thấy ko, nếu dùng chương trình con, trông hàm main rất sáng sủa, dễ đọc.
        Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

        Comment


        • #19
          bây giờ chúng ta mở rộng vd3 1 chút nhé:sau khi sáng từ led0->led7 thì lại quay ngược lại, từ led7->led0.Để làm việc này chúng ta chỉ cần thêm vào 1 vòng lặp for nho nhỏ.Và chương trình đầy dủ sẽ là:
          ________________________
          Code:
          //8 led sang duoi nhau
          //tai 1 thoi diem chi duy nhat 1 led sang
          #include <REGX51.H>
          #define led0 P1_0
          #define led1 P1_1
          #define led2 P1_2
          #define led3 P1_3
          #define led4 P1_4
          #define led5 P1_5
          #define led6 P1_6
          #define led7 P1_7
          #define sang 1
          #define tat 0
          //---------------
          void delay( unsigned int ms )
          {
          unsigned int i,j;
          for (i=0;i<ms;i++)
          for (j=0;j<120;j++)
          {} 
          }
          //--------------
          void display_led(unsigned char number)
          {
          
          switch (number)
          {
          
          case 1:
          led0=sang;
          led1=led2=led3=led4=led5=led6=led7=tat;
          break;
          case 2:
          led1=sang;
          led0=led2=led3=led4=led5=led6=led7=tat;
          break;
          case 3:
          led2=sang;
          led1=led0=led3=led4=led5=led6=led7=tat;
          break;
          case 4:
          led3=sang;
          led1=led2=led0=led4=led5=led6=led7=tat;
          break;
          case 5:
          led4=sang;
          led1=led2=led3=led0=led5=led6=led7=tat;
          break;
          case 6:
          led5=sang;
          led1=led2=led3=led4=led0=led6=led7=tat;
          break;
          case 7:
          led6=sang;
          led1=led2=led3=led4=led5=led0=led7=tat;
          break;
          case 8:
          led7=sang;
          led1=led2=led3=led4=led5=led6=led0=tat;
          break;
          
          
          }
          }
          main ()
          {
          unsigned char m;
          while(1)
          {
          for (m=0;m<8;m++)
          {display_led(m);delay(1000);}
          for (m=6;m>=0;m--)//Ở vòng lặp này m=6, chứ ko phải 7
          {display_led(m);delay(1000);}
          }
          }
          Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

          Comment


          • #20
            Còn rất nhiều cách để điều khiển led nữa, vd như led chạy 2 đầu vào, led chạy theo cặp 2, cặp 3,....Những cái này tương đối dễ.Các bạn tự xây dựng giải thuật và viết chương trình nhé.Sau đó các bạn tổng hợp các chương trình này lại thành 1 chương trình lớn gồm các kiểu hiển thị led xuất hiện lần lượt.Sau này sau khi biết cách giao tiếp với bàn phím, chúng ta sẽ dùng phím để chọn kiểu hiển thị của led.
            Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

            Comment


            • #21
              Đây là quyển sách khá hay về lạp trinh C cho 8051.
              Tui up mãi lên đây ko được.Bạn nào cần thì liên hệ với mình nhé.Quyển này viết bằng tiếng anh, khá cơ bản.Dung lượng gần 5MB
              Last edited by quynh; 05-11-2005, 11:28.
              Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

              Comment


              • #22
                Chác các bác!
                Tui cũng mới học lập trình VDK nên mới chỉ biết sơ sơ về ngôn ngữ lập trình Asembler chứ chưa biết lập trình C. Vì vậy tui mong các bác có ai hiểu rõ lập trình về ASembler thì chỉ giáo giúp tui như bạn Quỳnh thì tôt quá.
                Cám ơn các bác nhiều!

                Comment


                • #23
                  Hôm nay chúng ta sẽ bắt đầu làm quen với led 7 thanh.
                  Những thứ bạn cần thêm:led 7 thanh(Loại Anode chung), 1 con 74ls(hc)47, 7 con điện trở 1K.
                  Có 2 loại led 7 thanh:A chung và K chung.Ta có thể hiểu nôm na rằng thực ra 7 "thanh" này giống như là 7 con led.A chung tức là anode của 7 con led này nối với nhau,còn các chân K thì riêng.Đối với K chung chũng có thể hiểu tương tự như vậy.Ở đây tui dùng A chung, và con giải mã kèm theo nó là 74ls(hc)47, con này có đầu ra là tích cực mức thấp.Nếu bạn dùng Loại led 7 thanh K chung thì ko thể dùng con giải mã 7447 hình như con giải mã đi kèm với loại này là 74147 thì phải??
                  Tuy nhiên bạn cũng có thể ko dùng con 7447 cũng được, có thể nối trực tiếp các chân led 7 thanh vào 8051 cũng ko sao.Nhưng như thế sẽ tốn chân của 8051(mất 7 chân, trong khi đó dùng thêm con 7447 chỉ mất 4 chân), và chương trình cũng dài hơn.Tui khuyên bạn nên dùng thêm con này(giá khoảng 2-3K/1con).
                  Về sơ đồ chân của 74ls47 bạn có thể tham khảo tại:
                  http://pdf.alldatasheet.com/datashee...LD/74LS47.html
                  Rồi, bây giờ bạn nối các chân a->g của led 7 thanh với các chân a->g của 7447, tất nhiên mỗi cặp chân nối với nhau phải thông qua 1 con điện trở 1K.
                  Các chân từ D0->D3 của 7447 (Có tài liệu ký hiệu là A,B,C,D hay Q0->Q3, những ký hiệu này ko quan trọng, bạn chỉ cần lưu ý 1 điểm thứ tự từ trái qua phải của các ký hiệu trên là từ bit"trẻ nhất đến bit "già" nhất) lần lượt với các chân từ P1.0->P1.3 của 8051.
                  Cách thức hiển hị số trên led 7 thanh cực kỳ đơn giản:
                  Số cần hiển thị // D3-D2-D1-D0
                  0 // 0 0 0 0
                  1 // 0 0 0 1
                  2 // 0 0 1 0
                  3 // 0 0 1 1
                  .. ..........
                  Các bạn thấy ko, thực ra số cần hiển thị trên led 7 thanh, chính là giá trị của
                  bộ D3D2D1D0.
                  Bây giờ ta viết chương trình để hiển thị số 5 trên led 7 thanh.
                  trước tiên ta tính:5=4+1=0101, tức là Q3=0,Q2=1,Q1=0,Q0=1, hay với cách ghép nối với 8051 trên thì:P1.3=0,P1.2=1,P1.1=0,P1.0=1.
                  Chương trình được viết cụ thể như sau:
                  _______________________________________
                  #include<regx51.h>
                  main()
                  {
                  P1=0xff;//Đặt tất cả đầu ra lên mức cao
                  P1_3=0;
                  P1_2=1;
                  P1_1=0;
                  P1_0=1;
                  }
                  ____________
                  Hoặc viết gọn hơn là:
                  ______________________
                  #include<regx51.h>
                  main()
                  {
                  P1=0xf5//f5=11110101
                  }
                  Last edited by quynh; 05-11-2005, 18:04.
                  Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

                  Comment


                  • #24
                    Bây giờ chúng ta sẽ viết 1 chương trình để đếm từ 0->9 trên led 7 thanh
                    _________________________
                    #include <REGX51.H>
                    #define Q0 P1_0
                    #define Q1 P1_1
                    #define Q2 P1_2
                    #define Q3 P1_3
                    //========khai bao ham delay(tao ra do tre bang phan mem)
                    void delay(unsigned int ms)
                    {
                    unsigned int i,j;
                    for (i=0; i<ms; i++)
                    { for (j=0; j<120; j++);

                    }
                    }
                    //======== hien thi ra led 7 thanh
                    void display(unsigned char number)
                    {
                    switch (number)
                    {
                    case 0:
                    Q0=Q1=Q2=Q3=0;
                    break;
                    case 1:
                    Q1=Q2=Q3=0;
                    Q0=1;
                    break;
                    case 2:
                    Q1=1;
                    Q0=Q2=Q3=0;
                    break;
                    case 3:
                    Q0=Q1=1;
                    Q2=Q3=0;
                    break;
                    case 4:
                    Q0=Q1=Q3=0;
                    Q2=1;
                    break;
                    case 5:
                    Q1=Q3=0;
                    Q2=Q0=1;
                    break;
                    case 6:
                    Q3=Q0=0;
                    Q2=Q1=1;
                    break;
                    case 7:
                    Q3=0;
                    Q0=Q1=Q2=1;
                    break;
                    case 8:
                    Q3=1;
                    Q0=Q1=Q2=0;
                    break;
                    case 9:
                    Q3=Q0=1;
                    Q1=Q2=0;
                    break;
                    default:Q0=Q1=Q2=Q3=0;break;
                    }
                    }
                    main ()
                    {
                    unsigned charm;
                    while(1)
                    {
                    for (m=0;m<10;m++)
                    { display(m);delay(1000);}
                    }
                    }
                    Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

                    Comment


                    • #25
                      Bạn có thể phát triển các bài toán dùng 1 led 7 thanh để hiện số, đếm số(Đếm xuôi, ngược), hoặc kết hợp nhiều led 7 thanh theo kiểu như vậy.
                      Lúc khác chúng ta sẽ nói đến phương quét nhiều led 7 thanh.
                      Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

                      Comment


                      • #26
                        Quỳnh mở topic này hay quá, cho mình tham gia tí nhé

                        /* Chương trình hiển thị số chạy từ 0->9 trên 8 led 7seg,led anod chung,tích cực mức[0]
                        Hoạt động: -led0 sáng số 0
                        -led0 tắt, led1 sáng số 1....
                        -led6 tắt, led7 sáng số 7 -led7 tắt, led3 sáng số 8
                        -led3 tắt,led4 sáng số 9
                        Kết nối phần cứng:
                        P1:control ; P2:data
                        */


                        #include <AT89x51.h>
                        void delay();
                        void delaytat();
                        unsigned char code ma7[10]={0xc0,0xcf,0x64,0x46,0x4b,0x52,0x58,0xc7,0x40,0x4 2};//data
                        //0 1 2 3 4 5 6 7 8 9
                        //mảng ma7 tùy thuộc vào cách kết nối các pin của led7seg

                        unsigned char code chonled[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//control
                        //0xfe=11111110 => sa'ng led dau tien


                        void main()
                        { char i;
                        while(1) //lặp vô hạn
                        { for(i=0;i<10;i++) //quét từ 0->9 để hiển thị
                        { P2=ma7[i]; // đưa data vào port 2
                        if(i>=8) //từ số 8 ta cho sáng ở led thứ3
                        { delaytat();
                        P1=chonled[i-5];
                        delay();
                        goto again;
                        }

                        P1=chonled[i];//chọn led hiển thị thông qua Port 1
                        delay(); //thời gain sáng
                        again: delaytat();//thời gian tắt
                        }
                        }
                        }


                        void delay() //led sáng trong (8*250*8*250)us
                        { unsigned char i,j;
                        for(i=0;i<250;i++)
                        for(j=0;j<250;j++);
                        }


                        void delaytat() //tắt trong (8*1*125)us
                        { unsigned char i,j;
                        P1=0xff;
                        for(i=0;i<1;i++)
                        for(j=0;j<125;j++);
                        }

                        (giải thuật không hay lám, mong được các bro giúp đỡ)

                        @MicroDuyPhi: Chào anh Phi, lâu ngày không gặp,vẫn khỏe chứ hả

                        Comment


                        • #27
                          chao quynh,ban that la tot do
                          minh cung dang can quyen sach nay do.
                          mong ban hay goi cho minh qua dia chi mail
                          thanh_tung907@yahoo.com
                          minh cam on rat nhieu nhe
                          mong rang cac thanh vien trong dien dan se doan ket,chia se kinh nghiem voi nhung thanh vien khac,va se giup do het minh cho nhung ban dang can tim hieu ve ho VDK.
                          nhan day minh cung xin hoi cac ban,ban nao co mot mach hoan chinh ve lap trinh giao tiep voi may tinh ko,va nguyen ly hoat dong cua no nhu the nao.Do minh moi di vao tim hieu nen cung chua biet.mong rang cac ban hay giup do cho minh nhe
                          minh xin cam on nhieu

                          Comment


                          • #28
                            chao quynh,ban that la tot do
                            minh cung dang can quyen sach nay do.
                            mong ban hay goi cho minh qua dia chi mail
                            thanh_tung907@yahoo.com
                            minh cam on rat nhieu nhe
                            mong rang cac thanh vien trong dien dan se doan ket,chia se kinh nghiem voi nhung thanh vien khac,va se giup do het minh cho nhung ban dang can tim hieu ve ho VDK.
                            nhan day minh cung xin hoi cac ban,ban nao co mot mach hoan chinh ve lap trinh giao tiep voi may tinh ko,va nguyen ly hoat dong cua no nhu the nao.Do minh moi di vao tim hieu nen cung chua biet.mong rang cac ban hay giup do cho minh nhe
                            minh xin cam on nhieu
                            mach don gian thoi,de minh de tim hieu,xin cam on nhe

                            Comment


                            • #29
                              Hôm nay chúng ta lại tiếp tục với led 7 thanh.
                              Đây là sơ đồ chân của led 7 thanh với hình dạng thực tế của nó.
                              Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

                              Comment


                              • #30
                                Hôm nay chúng ta sẽ làm quen với phương pháp quét nhiều led 7 thanh.
                                Có bài toán đặt ra :thiết kế 1 đồng hồ số dùng led 7 thanh.
                                Để giải quyết bài toán trên, tất nhiên có nhiều cách, chúng ta sẽ dùng vdk 8051 như thế nào nhé.
                                Chúng ta sẽ phải dùng 6 led 7 thanh:2 led hiển thị giây, 2 hiển thị phút, 2 hiển thị giờ.

                                Trước hết chúng ta bàn về cách lắp ghép phần cứng:theo như cách lắp led 7 thanh với 8051 như phần trứoc đây thì chúng ta sẽ cần thêm 6 con giải mã 7447, và số chân vdk phải dùng sẽ là 6x4=24 chân.Nều tính về công suất, mối thanh led của led 7 thanh tiêu tốn khoảng 15-20mA, áp khoảng 2-3V-> 6 led 7 thanh cần tối thiểu (7x15mA)x6led=630mA, 6 con giải mã tiêu tốn khoảng 20mAx6=120mA->riêng về phần hiển thị led chúng ta đã ngốn gần 1A.
                                Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X