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

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

    Các bạn thân mến!
    Vào các diễn đàn tui thấy số người hỏi về 8051 khá nhiều, đa số họ toàn là những người lần đầu tiên tiếp xúc với 8051.Vì vậy tui mạo muội mở topic này để giúp đỡ những người mới tiếp xúc với 8051.Thực ra tui cũng mới làm wen với 8051 thôi, nhưng thiết nghĩ ít ra thì cũng giúp chút gì nho nhỏ cho người mới học 8051.
    Đối với những người mới học, theo tôi đây là những vd cụ thể, rõ ràng giúp bạn nắm bắt nhanh nhất về phần cứng, các tính năng của 8051,lập trình, còn những đã học qua 8051 rất mong dc sự góp ý của các bạn, để tui, bạn, tất cả chúng ta cùng tiến bộ.
    Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

  • #2
    Lý do tại sao tôi lại chọn 8051 để bắt đầu??
    theo tui nó vừa rẻ, dễ mua, tài liệu lại nhiều.
    Đố bạn nào trong quá trình làm việc lần đầu với các họ vdk mà ko có chú nào ra đi đấy.Tui sơ sơ cũng cho die hàng chục con rùi.
    Tất nhiên các bạn cũng có thể bắt đầu với PIC, AVR,....điều đó là tùy vào sở thích của mỗi người, và túi tiền nữa.
    Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

    Comment


    • #3
      Lúc nãy đến giờ tui nói hơi nhiều phải không??Nói nhiều là tật xấu, nhưng như thế chúng ta sẽ hiểu nhau hơn.
      Rồi bây giờ vào chuyên môn.
      Tài liệu bạn có thể dùng quyển "Họ vdk 8051" của thầy Tông Văn On, hay của tác giả Nguyễn Tăng Cường bên ktqs.Thực ra 2 quyển này đều cùng 1 nơi mà ra.Trên diễn đàn này có bạn đã đưa lên quyển này rồi đó, tui ko nhớ link, các bạn chịu khó tìm nhé.Nếu ko tìm dc liên hệ với tui, tui send cho.
      Về ngôn ngữ lập trình cho nó, bạn có thể dùng C,asm.Tui ko muốn so sánh 2 ngôn ngữ này, cái này tùy thuộc vào thói quen, sở thích của mỗi ngừơi.Còn tui, tui dùng Kiel C.Phần mền này trên mạng nhiều rùi, ao thích tui send cho.Nếu viết bằng C bạn có thể coi lại các tài liệu về lập trình C, các câu lệnh hoàn toàn như nhau, chỉ khác 1 chút về lấy dl vào và ra..
      Còn nữa, bạn phải có 1 hoặc nhiều chú 89c51-52-55;mạch nạp:có thể bạn tự làm hoặc đi mua(Bạn có thể tham khảo tại:http://dientuvietnam.net/board/showthread.php?t=672).
      Đó là sự chuẩn bị về công cụ làm việc.
      Bây giờ chúng ta sẽ viết chương trình đầu tiên.
      Tôi sẽ đi từ dễ đến khó.
      -điều khiển led
      -led 7 thanh, quét led 7 thanh
      -giao tiếp phím,ma trận phím
      -ma trận led
      -LCD
      -...
      Các bạn lưu ý rằng tui đang dùng máy ngoài cửa hàng, nên những bài tập đơn giản sẽ có thể ko có mạch kèm theo, nhưng tôi sẽ mô tả trong chương trình, mong mọi nười thông cảm.
      Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

      Comment


      • #4
        Ví dụ đầu tiên:Nối A của led với P1.0 ,K nối với GND, và cho nó nhấp nháy nhanh hay chậm, tùy bạn.
        ___________________
        Code:
        #include<regx51.h>//khai báo cho chương trình mình dùng thư viện của 8051
        #define led P1_0//Led được nối với P1_0,chú ý viết hoa chữ "P"nhé
        void delay(unsigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms
        {
          unsigned int i;
          unsigned char j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte
          for(i=0;i<ms;i++)
             for(j=0;j<120;j++)
                 {}//không làm gì cả
        }
        main()//Chương trình chính
        {
          While(1)//tạo vòng lặp vô hạn
        {
            led=0;//tắt led
            delay(1000);//tạo độ trễ 1000ms=1s
            led=1;//bật led
            delay(1000);
        }
        }
        Thế là xong ct đầu tiên, bạn chỉ việc copy,paste, và dịch nó thành file hex ,nạp vào chip,cắm vào mạch và thấy thành quả của mình.
        Last edited by VNarmy; 10-10-2007, 09:54. Lý do: Lỗi code
        Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

        Comment


        • #5
          Bây giờ bạn lại muốn 8 con led cùng nhấp nháy thì làm sao?cực kỳ đơn giản.
          Nối các led như vd trên vào P1(từ P1.0->P1.7)
          và chương trình sẽ là:
          ________________
          Code:
          #include<regx51.h>
          void delay(unsigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms
          {
            unsigned int i;
              unsigned char j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte
             for(i=0;i<ms;i++)
                 for(j=0;j<120;j++)
                   {}//không làm gì cả
          }
          main()//Chương trình chính
          {
          While(1)//tạo vòng lặp vô hạn
          {
          P1=0x00;//"0x00"là giá trị viết trong hệ hex, cái này=00000000
          delay(1000);//tạo độ trễ 1000ms=1s
          P1=0xff;//"0xff"là giá trị viết trong hệ hex, cái này=11111111
          delay(1000);
          }
          } 
             
          }
          Last edited by VNarmy; 10-10-2007, 09:59.
          Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

          Comment


          • #6
            Bây giờ tui fair về đi học rùi.
            Hôm sau ta tiếp tục nhé.
            Chúc các bạn học tốt
            Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

            Comment


            • #7
              Ví dụ 3:Bây gờ bạn cũng nối 8 led như trên vd2 vào P1.(Ta ký hiệu led nối vào P1.0 là led0,vào P1.1 là led1,...)
              Bài toán đặt ra là:Đầu tiên led0 sáng(các led còn lại tắt), tiếp theo led1 sáng(tất nhiên các led còn lại tắt),...cho đến led7 và lặp lại như ban đầu.
              Các bạn lưu ý 1 điều này:bạn có thể nối trực tiếp A của led vào P1,K xuống GND ko cần treo trở.Nếu thích bạn treo cho nó con trở 1k,hay bao nhiêu đấy tùy các bạn(nhưng dừng lớn lắm).Tuy nhiên dù ko treo trở hay có trở thì bạn cũng thấy led sáng yếu.Nếu ban làm ngược lại,A led->P1,K led->5v thì bạn sẽ led sáng hơn nhiều, điều này được giải thích là do dòng hút bởi 8051 lớn hơn dòng do nó đẩy ra.
              Và chương trình của nó như sau:
              _____________________________________
              Code:
              #include<regx51.h>
              //8 dòng "define" dưới đây bạn có thể bỏ qua,nhưng tui làm như thế 
              //bạn sẽ dễ theo dõi hơn(Nếu thế trong ct bạn ko dc dùng các từ như led0,..
              //vì nó chưa đựoc định nghĩa
              #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(usnigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms
              {
              usigned char i,j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte
              for(i=0;i<ms;i++)
              for(j=0;j<120;j++)
              {}//không làm gì cả
              }
              main()//chương trình chính
              {
                 while(1)//tạo vòng lặp vô hạn
                   {
                        //đầu tiên là ledo sáng,các led khác đều tắt
                       led0=sang;led1=led2=led3=led4=led5=led6=led7=tat;
              delay(1000);/thời gian trễ là 1s
              //tiếp theo là led1 sáng,các led khác đều tắt
              led1=sang;led0=led2=led3=led4=led5=led6=led7=tat;
              delay(1000);/thời gian trễ là 1s
              //tiếp theo là led2 sáng,các led khác đều tắt
              led2=sang;led1=led0=led3=led4=led5=led6=led7=tat;
              delay(1000);/thời gian trễ là 1s
              //tiếp theo là led3 sáng,các led khác đều tắt
              led3=sang;led0=led2=led1=led4=led5=led6=led7=tat;
              delay(1000);/thời gian trễ là 1s
              //tiếp theo là led4 sáng,các led khác đều tắt
              led4=sang;led0=led2=led3=led1=led5=led6=led7=tat;
              delay(1000);/thời gian trễ là 1s
              //tiếp theo là led5 sáng,các led khác đều tắt
              led5=sang;led0=led2=led3=led4=led1=led6=led7=tat;
              delay(1000);/thời gian trễ là 1s
              //tiếp theo là led6 sáng,các led khác đều tắt
              led6=sang;led0=led2=led3=led4=led5=led1=led7=tat;
              delay(1000);/thời gian trễ là 1s
              //tiếp theo là led7 sáng,các led khác đều tắt
              led7=sang;led0=led2=led3=led4=led5=led6=led1=tat;
              delay(1000);/thời gian trễ là 1s
                   }
              
              }
              ________________________________
              Chương trình này như thé là khá dài, nhưng với người mới học thì nó khá trực quan và dễ hiểu.
              ________________________________
              http://dientuvietnam.net/board/showt...2&page=1&pp=10
              Last edited by quynh; 03-11-2005, 10:47.
              Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

              Comment


              • #8
                Chương trình trên có thể viết ngắn gọn lại như sau:
                __________________
                Code:
                #include<regx51.h>
                void delay(usnigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms
                {
                usigned char i,j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte
                for(i=0;i<ms;i++)
                for(j=0;j<120;j++)
                {}//không làm gì cả
                main()
                {
                   while(1)
                    {
                    P1=0x01;delay(1000);//led0 sang
                 P1=0x02;delay(1000);//led1 sang
                 P1=0x04;delay(1000);//led2 sang
                 P1=0x08;delay(1000);//led3 sang
                 P1=0x10;delay(1000);//led4 sang
                 P1=0x20;delay(1000);//led5 sang
                 P1=0x40;delay(1000);//led6 sang
                 P1=0x80;delay(1000);//led7 sang
                    }
                }
                _____________________________________
                Tuy nhiên ct trên lại còn được viết gọn hơn nữa bằng lệnh dịch bit trong C.Các bạn xem lại lệnh này và tự làm nhé, coi đây là 1 bài tập về nhà cũng được.
                Xin các bạn lưu ý các ct trên tui đều viết cho trường hợp A led->P1,K led->GND.
                _________________________________
                http://dientuvietnam.net/board/showt...2&page=1&pp=10
                Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

                Comment


                • #9
                  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 đó
                  Những gi mà chúng ta học được chỉ là một phần rất nhỏ trong đại dương kiến thức loài người!!

                  Comment


                  • #10
                    CHO THAM GIA VỚI NHE CÔ BẠN
                    Khi báo phần mở đầu để bộ dịch biết là chúng ta đang sử dụng loại VDK nào
                    Phần 1: HEADER
                    #include<regx51.h>
                    Phan 2: Khai bao các hàm
                    Đây là delay- ước lượng 1 vòng for 1 lần lặp<=> mất 8us
                    Như vậy ta có: ms*(125*8)=1000*1000 ~= 1s
                    Code:
                    void delay(usnigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms
                    {
                       usigned char i,j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte
                       for(i=0;i<ms;i++)
                          {
                            for(j=0;j<120;j++);
                         }  }
                    Phan 3: PHAN CHINH  CUA CHUONG TRINH- LUON LUON MO DAU BANG TU KHÓA main()
                    
                    main()
                    {
                      unsigned char m,tem;
                      tem=0x01;      
                      while(1)
                        {    P1=tem;delay(1000);
                              tem<<=1;if(tem==0x00)then tem=0x01;   //dich sang trai 1 bit
                        }     
                    } // DAY LA DAU KET THUC CHUONG TRINH : THE END
                    ---------------- Chuong tinh duoc viet lai la-------------------
                    Code:
                    #include<regx51.h>
                    void delay(usnigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms
                    {
                       usigned char i,j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte
                       for(i=0;i<ms;i++)
                          {
                            for(j=0;j<120;j++);
                         } 
                    }
                    main()
                    {
                    unsigned char m,tem;
                    tem=0x01;     
                    while(1)
                    {    P1=tem;delay(1000);
                         tem<<=1;if(tem==0x00)then tem=0x01;   //dich sang trai 1 bit
                    }

                    Comment


                    • #11
                      Để tạo hàm Delay chúng ta đã dùng hàm "For" với một cách là ước lượng.
                      Vậy còn cách nào khác để tạo delay chính xác hơn không?
                      TIMER, vâng đó là một cách khá hay, mời các bạn cùng nhau trao đổi tiếp:
                      CHƯƠNG TRÌNH LÀM LED TẮT CHỚP DÙNG: TIMER
                      1) Làm Led tắt chớp trong 1s
                      * For
                      * while
                      * timer
                      2) Tạo mạch đa hài 2 led tắt chớp dùng vòng lặp

                      Comment


                      • #12
                        Code:
                        int_timer0 hay 1 hay 2 tùy ý
                        {
                        Nạp lại giá trị bộ dịnh thời
                        Flag_1s = TRUE;
                        ( Nếu dùng thạch anh 12MHz thì 1 chu kỳ ngắt không được 1 s do vậy có thể đặt ngắt 10ms hay 100 ms. Và cứ sau n chu kỳ ngắt thì đặt FLAG_1S = TRUE; n các bạn tự tính lấy nhé)
                        }
                        WHILE(1){
                        ì(Flag_1s){
                        
                        Flag_1s = FALSE;  // Clear Flag  
                        Flash_LED(); // Gọi hàm nháy LED
                        }
                        }
                        Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.

                        Biến tần
                        Máy giặt
                        Lò vi sóng
                        Bếp từ.
                        Tủ lạnh.
                        Điều hòa

                        Comment


                        • #13
                          Xin các bạn lưu ý các ct trên tui đều viết cho trường hợp A led->P1,K led->GND.
                          Chết chết, AT89 có IOH bé lắm, khi phải phun ra 100uA, VOH chỉ còn được bảo đảm ở khoảng 2.5V, không thể nối LED kiểu đó được mà phải nối ngược lại: Anode lên Vcc, Cathode qua trở hạn dòng về chân I/O.
                          Chỉ có thể nối theo kiểu của các hạ với những họ vi điều khiển có I/O với đặc tính vào ra đối xứng về công suất (dòng phun được ra cũng lớn như dòng nuốt vào được) như PIC hay AVR...
                          Các đại hiệp post tutorial cho anh em học hỏi nên cẩn thận một chút kẻo hậu quả khó lường.
                          Giang hồ hiểm ác, bảo trọng.

                          Comment


                          • #14
                            * XIN LỖI TRÍCH PHI NGANG
                            Lý ra Phi sẽ cùng MINHHA bàn tiếp phần Timer.


                            Nhưng tạm thời để Phi nói luôn một chút chỗ này:
                            * Trong sách thường hay nói con AT8951 tích cực mức 0. Nghĩa là dòng "hút vào/rút vào" rất lớn khoảng 20-25mA, điều đó cho phép ta kéo một tải có dòng khoảng 20-25mA.
                            * Còn đối với mức 1, thì "dòng ra " rất nhỏ, Max cở 1mA, do đó khi ta cho tích cực mức 1, thì con AT89 chỉ có thể kéo 1 tải trực tiếp có dòng 1mA đổ lại mà thôi.
                            * Trong khi đó con Led của cúng ta để có độ sáng bình thường thì cần có dòng trung bình khoảng 10mA như vậy có 2 giải pháp:
                            Gải pháp 1- Đấu chân Anod(dương cực) của Led vào 1 chân của At89, chân kia(catod) của Led đấu đi Mass. Như vậy kết quả Led không được sáng cho lắm, và chúng ta cũng cần lưu ý 2 điều là: Khi đó không cần điện trở hạn dòng cho Led, như vậy đối với người bắt đầu mà nói thì việc đấu nối hết sức đơn giản dễ thành công hơn khi kết nối bỏad mạch. Phi nghi Quynh rất hay khi nghĩ ra cách làm này, và đồng thời ở trên Quynh cũng đã nhắc nhở chúng ta rồi và Blachmoon cũng muốn nhắc nhở chúng ta : "Nếu đảo cách mắc con Led lại thì Led sẽ sáng hơn", chỗ này các bạn cho mình nói thêm là:
                            Gải pháp 2: Chân Anod của Led nối đi Vcc+, còn chân Catod nối với 1 chân của AT89 thông qua 1 con điện trở hạn dòng, thông thường trị số này là 300ohm nhưng 300ohm không có phổ biến, do đó có thể chọn 270 ohm hoặc 330ohm cho con điện trở này.
                            Kết quả là Led sẽ sáng hơn rất nhiều với giải pháp 2 này.

                            Tóm lại cách làm của Quynh ở trên cũng được. Nhưng sau này cần phải chỉnh lại, nên cho Led đươc tích cự ở mức 0 . Tuy nhiên nếu dùng 1 con đệm dòng ở ngõ ra thì khi đó tích cực mức nào cũng được cả.
                            Last edited by MicroDuyphi; 04-11-2005, 19:59.

                            Comment


                            • #15
                              Nguyên văn bởi MinhHa
                              int_timer0 hay 1 hay 2 tùy ý
                              {
                              Nạp lại giá trị bộ dịnh thời
                              Flag_1s = TRUE;
                              ( Nếu dùng thạch anh 12MHz thì 1 chu kỳ ngắt không được 1 s do vậy có thể đặt ngắt 10ms hay 100 ms. Và cứ sau n chu kỳ ngắt thì đặt FLAG_1S = TRUE; n các bạn tự tính lấy nhé)
                              ..........
                              Bộ Timer của 89 max 16 bit, như vậy giá trị đặt không thể vượt quá:
                              2^16= 65536, tức là cở 65ms là tối đa . Và sau n chu kỳ ngắt ta sẽ được 1s với xtal 12mhz.

                              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