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

  • Nguyên văn bởi vodienDT4 Xem bài viết
    thất ra em biết cái ấy,vấn đề delay sẽ làm tăng thời gian hơn so với cờ bận,mà thấy ct cờ bận cũng đơn giản,có điều không biết sao nó hổng chạy ,đang có gắng có được cái code tốt nhất mà a ,khi xài cờ bận,ta sẽ không cần quan tâm đến thời gian thực hiện câu lệnh của LCD nữa,như thế nó tiện hơn mà,hơi cầu toàn một chút,biết thêm 1 cách cũng tốt mà
    Mình cũng chỉ dùng hàm trì hoãn thôi. Trong cái while(BF) của bạn thấy kì kì. Sao lại cho RW=0: vậy là viết chứ đâu phải đọc! Còn bạn "Multi System" cũng vậy: EN=0; rồi EN=1 => cấm LCD rồi còn gì!
    Đọc BF của giao tiếp 4 bit thì khác với giao tiếp 8 bit. Bạn nên coi lại phần đó.
    !e

    Comment


    • Nguyên văn bởi zemen Xem bài viết
      Mình cũng chỉ dùng hàm trì hoãn thôi. Trong cái while(BF) của bạn thấy kì kì. Sao lại cho RW=0: vậy là viết chứ đâu phải đọc! Còn bạn "Multi System" cũng vậy: EN=0; rồi EN=1 => cấm LCD rồi còn gì!
      Đọc BF của giao tiếp 4 bit thì khác với giao tiếp 8 bit. Bạn nên coi lại phần đó.
      Mình nhớ mang máng là làm gì đó thì làm sau đó cần 1 xung cao xuống thấp vứt vào chân E mà. Sai à ? Sao nó vẫn chạy nhỉ?
      RW = 0 là đọc mà.

      Comment


      • Đây là đoạn chương trình kiểm tra cờ bận LCD viết trên ASEMBLY và đã chạy oke.

        Code:
        ;*************************************
        READY:
              SETB BUSY
              SETB RW
              CLR  RS
           HERE:
              CLR  ENB
              SETB ENB
              JB   BUSY,HERE
              RET
        ;********************************************
        Khi đổi sang C:
        Code:
        ***************************************
        void READY(){
            BUSY = 1
            RW = 1
            RS = 0
        while(BUSY)
           {
            ENB = 0
            ENB = 1
           }
        };
        *********************************************
        Hình như mấy bài trước mình thấy có sự nhầm lẫn gì đó khác với ở đây?
        Last edited by mrcuongcon; 12-09-2009, 19:09.

        Comment


        • Nguyên văn bởi mrcuongcon Xem bài viết
          Đây là đoạn chương trình kiểm tra cờ bận LCD viết trên ASEMBLY và đã chạy oke.

          Code:
          ;*************************************
          READY:
                SETB BUSY
                SETB RW
                CLR  RS
             HERE:
                CLR  ENB
                SETB ENB
                JB   BUSY,HERE
                RET
          ;********************************************
          Khi đổi sang C:
          Code:
          ***************************************
          void READY(){
              BUSY = 1
              RW = 1
              RS = 0
          while(BUSY)
             {
              ENB = 0
              ENB = 1
             }
          };
          *********************************************
          Hình như mấy bài trước mình thấy có sự nhầm lẫn gì đó khác với ở đây?
          của mình sai về giải thuật,để chân e ra ngoài nên nó chỉ kiểm tra đc 1 lần ,cái của bạn giống cái của anh multi ,rất tiếc là hổng chạy
          bạn có thể làm 1 code hoàn chỉnh = C đc không,cảm ơn nhìu

          Comment


          • Nguyên văn bởi Multi System Xem bài viết
            Mình nhớ mang máng là làm gì đó thì làm sau đó cần 1 xung cao xuống thấp vứt vào chân E mà. Sai à ? Sao nó vẫn chạy nhỉ?
            RW = 0 là đọc mà.
            Có thể nó không chạy lắm chứ!
            - Khác với gitiếp LCD 8 bit, ta chỉ đọc 1 lần (1 xung EN lên cao). Trong giao tiếp LCD 4 bit, ta sẽ đọc 2 lần (2 xung EN lên cao) nhưng ta chỉ cần quan tâm tới bít cuối của lần đọc thứ nhất. Đó chính là bit BF.
            - Khi cho EN=0; rồi EN=1; rồi EN=0; trở lại cộng với việc có thể tốc độ xử lí của VDK quá nhanh => xung EN quá ngắn => có thể làm LCD không kịp trả dữ liệu lên bus mà đã bị cấm rồi => không đọc được BF.
            - Theo mình thì chỉ cần chỉnh trong cái vòng lặp
            while(BF){
            EN=1;
            delay(); //trì hoãn vài lệnh
            EN=0;
            }
            !e

            Comment


            • chào cac bác
              Các bác sao k thực nghiệm những con IC mới hơn.

              Comment


              • thanksyou

                cam on ban nhe
                Nguyên văn bởi quynh Xem bài viết
                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

                Comment


                • Nguyên văn bởi tranhunghoai Xem bài viết
                  cam on ban nhe
                  Nguyên văn bởi quynh
                  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
                  A led vào P1 K led vào 5v , vậy thì khi nào thì led sáng bạn nhỉ ?????
                  mình nghĩ mắc led : A led vào 5v, K vào P1(khi led sáng vdk sẽ hút dòng ) mới đúng chứ nhỉ
                  0945061338(vocam.h@gmail.com,lehanhdtk3@gmail.com)
                  ||
                  PROGRAMING(C,ASM),HARDWARE,LMD,RTC,GPRS,GPS....ALL OF VDK

                  Comment


                  • chung quy lại vẫn là vấn đề hút dòng và đẩy dòng của 89
                    các bạn nên nhớ rằng con 89 hay họ 8051 việc đẩy dòng của nó rất thấp tính theo đơn vị uA.còn việc hút dòng của nó thì lại khỏe có thể lên đc 20mA
                    vấn đề này bạn nên cẩn thận khi vẽ mạch điều khiển.nhất là P0 của 89 được thiết kế theo điện cực máng hở.khi 89 xuất ra mức 0 thì điện áp trên các chân P0 ~ 0V
                    nhưng khi xuất ra là mức 1 thì trên các chân của nó lại là trạng thái cao trở.các bạn nên cho 1 con trở thanh 10k vào đây và kéo nó lên 5V khi thiết kế

                    Comment


                    • Nguyên văn bởi MicroDuyphi Xem bài viết
                      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
                      }
                      mấy ông này toàn nói về VDK lập trình bằng C sao ko nói thêm về asm nhỉ. Vì có phải ai cũng học lập trình VDK bằng C đâu. Thôi đã làm thì làm cho chót. Làm bằng asm đi. Tui cũng đang học nhưng làm asm
                      Dân ta phải biết sử ta
                      Cái gì không biết thì tra google.

                      Comment


                      • chuyển sang C đi ông bạn C hay asm thì cũng phải ngâm cứu VDK như nhau mà chỉ khác mỗi chỗ C giúp ta thảnh thơi hơn để nghĩ cho future

                        Comment


                        • luồng này hay quá trời lun

                          Comment


                          • Nguyên văn bởi anhtuan0423 Xem bài viết
                            mấy ông này toàn nói về VDK lập trình bằng C sao ko nói thêm về asm nhỉ. Vì có phải ai cũng học lập trình VDK bằng C đâu. Thôi đã làm thì làm cho chót. Làm bằng asm đi. Tui cũng đang học nhưng làm asm
                            Việc dùng ngôn ngữ nào thì trên diễn đàn đã trao đổi rất nhiều rồi, mình xin tóm tắt lại như sau :

                            - C là ngôn ngữ cao cấp hơn, dễ debug hơn, dễ viết hơn, và tiếp cận vxl bằng C thì dễ dàng hơn là tiếp cận bằng asm. Tuy nhiên mã viết bằng C khi biên dịch ra sẽ khá dài (so với mã biên dịch từ asm), do vậy thường thì vxl được lập trình bằng C sẽ chạy chậm hơn. Nhưng tốc độ vxl khá nhanh nên bạn ko thể thấy được điều này, trừ khi là đối với những chương trình lớn.

                            - khi viết bằng asm thì người viết phải nắm khá rõ về cấu trúc vxl, do vậy thường thì những người đã làm việc nhiều với asm sẽ nắm vững về cấu trúc vxl. Hơn nữa các file .hex khi dịch từ asm sẽ nhẹ hơn các file .hex khi dịch từ C.

                            - Thầy giáo mình cũng nói rằng "Lập trình bằng C giống như làm giám đốc, còn lập trình bằng asm giống như làm công nhân vậy, người ta nên làm công nhân trước rồi mới làm giám đốc thì sẽ tốt hơn".

                            - Đương nhiên là khi làm "giám đốc" rồi thì ít ai lại muốn trở lại làm "công nhân", đúng ko nào ? Thế nên mấy bậc cao thủ đã đắc đạo thành "giám đốc" (như bác Phi chẳng hạn) ko mún làm bằng asm nữa.

                            - Việc lựa chọn ngôn ngữ nào là do bạn quyết định, hơn nữa các phần mềm (như Keil C) có thể chuyển các câu lệnh trong C thành các câu lệnh trong asm tương ứng, (mình chưa nghe thấy phần mềm nào có thể chuyển ngược lại), do đó, bạn có thể vừa học C, vừa học asm. Ở trường dạy là 1 chuyện, nhưng bạn tự học lại là chuyện khác.

                            Comment


                            • Nguyên văn bởi le hung dung Xem bài viết
                              luồng này hay quá trời lun
                              hay gì hả DŨng

                              Email:
                              Tel: 0983.497.310

                              Comment


                              • Nguyên văn bởi vodienDT4 Xem bài viết
                                của mình sai về giải thuật,để chân e ra ngoài nên nó chỉ kiểm tra đc 1 lần ,cái của bạn giống cái của anh multi ,rất tiếc là hổng chạy
                                bạn có thể làm 1 code hoàn chỉnh = C đc không,cảm ơn nhìu
                                READY: SETB BUSY ;P1.7: CHON LAM BIT KIEM TRA CO BUSY
                                CLR RS ;RS = 0: LENH
                                SETB RW ;R/W = 1:CHON CHUC NANG DOC TU LCD
                                BACK: CLR E ;EN = 0 - > TAO CANH LEN
                                SETB E ;EN = 1
                                JB BUSY,BACK ; Nhảy về lable back nếu busy vẫn =1
                                NOP ;CHO DEN KHI CO BUSY = 0,KHONG BUSY
                                RET
                                code đã chạy với lcd 2 dòng
                                nếu dùng C bạn chuyển các câu lệnh trên sang ngôn ngữ C!
                                Chúc thành công!
                                0945061338(vocam.h@gmail.com,lehanhdtk3@gmail.com)
                                ||
                                PROGRAMING(C,ASM),HARDWARE,LMD,RTC,GPRS,GPS....ALL OF VDK

                                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