Thông báo

Collapse
No announcement yet.

cần giúp đỡ về code 8051

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

  • #16
    Cốt

    P1=P1>>1;
    dịch sang phải 1 bít.

    Comment


    • #17
      Mình nhầm

      Sáng lần lượt từ P1.0 đến P1.7 nhá

      Comment


      • #18
        Nguyên văn bởi kimman3 Xem bài viết
        cám ơn bác đã quan tâm tại e ko có học qua trường lớp tự nghiên cứu để viết code thôi ạ à mà bác có cách nào để viết led sáng tuần tự rồi tắt tuần tự ko
        theo mình suy nghĩ thủ công hoặc làm gộp đều được :
        + thủ công: lệnh set và clr lần lượt từng chân ,xen kẽ là các hàm trễ delay(). là có thể làm sáng lần lượt
        + làm gộp: dùng lệnh dịch phải, dịch trái một byte . byte = byte << 1 ; tức là byte = byte được dịch sang trái 1 đơn vị.
        byte = byte >> 1 ; dịch phải 1 đơn vị.
        nếu 2 lệnh dịch này vẫn chưa ổn thì phải đọc tài liệu về lập trình C thêm.

        Comment


        • #19
          Nguyên văn bởi maingochoc Xem bài viết
          Sáng lần lượt từ P1.0 sang P1.2
          While(1)
          {
          P1=0x01;
          For(i=0;i<8;i++) P1=P1>>1;
          }
          Bạn chắc cái này sáng được chứ?
          Code:
          p1=1; => P1=00000001b;
          sau đó
          P1>>=1; => (0000001b>>=1) = 00000000; bit 1 khi nãy sẽ tràn xuống CY giờ P0 sẽ =0 nên các phép dịch bit sau thì P0 vẫn là 0-> chả có đèn nào sáng
          Và quan trọng là nếu code có chạy đi chăng nữa thì cũng không có chuyện nhìn thấy sáng tuần tự đâu vì bạn có làm chậm chuơng trình đâu mà nhìn thấy? nếu có thấy thì nó cũng là sáng đồng thời tất cả.

          Có lẽ do bạn viết nhầm dấu << thành >> cũng nên.

          Comment


          • #20
            Nguyên văn bởi myth-coder Xem bài viết
            Bạn chắc cái này sáng được chứ?
            Code:
            p1=1; => P1=00000001b;
            sau đó
            P1>>=1; => (0000001b>>=1) = 00000000; bit 1 khi nãy sẽ tràn xuống CY giờ P0 sẽ =0 nên các phép dịch bit sau thì P0 vẫn là 0-> chả có đèn nào sáng
            Và quan trọng là nếu code có chạy đi chăng nữa thì cũng không có chuyện nhìn thấy sáng tuần tự đâu vì bạn có làm chậm chuơng trình đâu mà nhìn thấy? nếu có thấy thì nó cũng là sáng đồng thời tất cả.

            Có lẽ do bạn viết nhầm dấu << thành >> cũng nên.
            vậy a có thể giải thích cho e cái này ko ạ unsigned char Mang[10] = {0,1,2,3,4,5,6,7,8,9};
            nếu các số 0,1,2...,9 mỗi số tương ứng với 1 mã hex vậy thì led nó sẽ sáng như thế nào ạ cái phần mảng này nó sẽ chạy làm sao và căn cứ vào đâu thì mình có thể biết dc nó sẽ chạy mã hex nào trong 10 cái mã hex đó ạ giúp e với e vẫn ko hiểu chỗ này

            Comment


            • #21
              vậy cái này e sửa thế này dc ko ạ
              While(1)
              {
              P1=0xff;
              For(i=0;i<8;i++) P1=P1>>1;
              }

              Comment


              • #22
                Nguyên văn bởi kimman3 Xem bài viết
                vậy cái này e sửa thế này dc ko ạ
                While(1)
                {
                P1=0xff;
                For(i=0;i<8;i++) P1=P1>>1;
                }
                Cái này nên sửa thành
                Code:
                While(1)
                {
                    P1=0xff;
                    For(i=0;i<8;i++){
                        P1=P1>>1;
                        delay(x_mini_giay);// x_mini_giay là thời gian bạn muốn làm chậm chưong trình, hàm delay bạn có thể kiếm ở trên diễn đàn có rất nhiều bài về delay
                    }
                }
                với bài như trên thì các bóng đèn sẽ tắt dần từ P1.7 về tới P1.0
                Hoặc bài trên kia của Maingochoc có thể sửa thành
                Code:
                While(1)
                {
                  P1=0x01;
                  For(i=0;i<8;i++) {
                    P1=P1<<1;// Viết ngắn là P1<<=1;
                    delay(x_mini_giay);
                  }
                }
                với cách viết này thì các đèn sẽ sáng(xong tắt) từ P1.0->P1.7.
                Còn đối với
                Code:
                unsigned char Mang[10] = {0,1,2,3,4,5,6,7,8,9};// có thể khai báo là unsigned char Mang[] = {0,1,2,3,4,5,6,7,8,9}; không cần khai báo số phần tử.
                Đối với cái này thì chưa có đèn nào sáng cả mà mình phải code để đưa các giá trị của mảng ra Port ví dụ ở đây là Port P1
                Code:
                unsigned char Mang[10] = {0,1,2,3,4,5,6,7,8,9};
                
                unsigned char x=0;
                while(1)
                {
                	P1=Mang[x%10];// khi x%10 x "chia lấy dư cho" 10 thì các giá trị trả lại có thể có là 0,1,2,3,...9
                	// trường hợp này bạn đưa ra mảng hơi đặc biệt nên rất dễ gây nhầm lẫn thay đổi lại giá trị của mảng Mang[] bằng các  giá trị khác
                	// để dễ giải thích hơn giả sử ( unsigned char Mang[]={10,15,34,68,32,65,32,76,3, 35}; )
                	// Khi x=0 -> x%10=0; nên P1=Mang[0]; -> P1=10; vì 10 là phần tử thứ 0 của mảng Mang[]
                	// Khi x=1 -> x%10=1; nên P1=Mang[1]; -> P1=15; vì 15 là phần tử thứ 1 của mảng Mang[]
                	// ....................................
                	// Khi x=9 -> x%10=9; nên P1=Mang[9]; -> P1=35; vì 35 là phần tử thứ 9 của mảng Mang[]
                	// Đến x=10 thì lặp lại quá trình như trên
                	x+=1;// Viết ngắn của x=x+1;
                }
                Còn đèn nào sáng thì sẽ giải thích như sau:
                Giả sử khi gán P1=23; bạn mở chương trình máy tính của window ra (bằng cách giữ phím window sau đó đè tiếp phím R rồi nhả cả 2 phím ra có 1 hộp thoại hiện lên bạn gõ calc<enter>)
                bạn vào menu "view" chọn Programer
                sau đó nhập vào máy tính giá trị 23 Xem ảnh nhéClick image for larger version

Name:	calc.png
Views:	1
Size:	4.0 KB
ID:	1379024
                bạn để ý cái vùng màu đỏ gồm có 8 số đó tuơng ứng với các bit nhị phân của giá trị 23 bạn đọc giá trị từ phải sang trái thì nó sẽ tưong ứng với P1.0 -> P1.7 của VDK (vì mình đang dùng PORT 1) nếu bit tuơng ứng nào mang giá trị 1 thì đèn ở vị trí đó sẽ sáng.
                đối với P1=23 thì các đèn ở P1.0, P1.1, P1.2, P1.4 sẽ sáng và sáng đồng loạt luôn. Đối với P1=xxx (các giá trị khác thì cũng tưong tự)

                Comment


                • #23
                  có lẽ em nên học assambly trước đi. vì nó có thể giúp em hiểu đc nguyên lý hoạt động của IC.

                  Comment


                  • #24
                    dạ anh myth coder cho e hỏi là thời gian mini giây mình để bao nhiêu cho chuẩn ạ

                    Comment


                    • #25
                      và code e đã viết lại thành như vầy mà khi mô phỏng chạy nhưng ra mạch thật thì tịt ngòi ạ

                      #include <REGX52.H>
                      #include <stdio.h>
                      #include <string.h>
                      unsigned int i;
                      void delay (unsigned int ms)
                      {
                      for(i=0; i<ms; i++)
                      {
                      }
                      }

                      main()
                      {
                      while(1)
                      {
                      P1=0x01;
                      for(i=0;i<8;i++)
                      P1=P1<<1;// Vi?t ng?n là P1<<=1;
                      delay(500);
                      }
                      }

                      Comment


                      • #26
                        Code:
                        #include <REGX52.H>
                        
                        void delay (unsigned int ms)
                        { 
                        unsigned int x,i;
                        for(i=0; i<ms; i++)
                        	{
                                        for(x=0;x<1000;x++);     
                        	}
                        }
                        
                        main()
                        {    
                                unsigned int i;
                                while(1)
                                {
                                          P1=0x01;
                                         for(i=0;i<8;i++) 
                                         {     
                                                 P1=P1<<1;// Vi?t ng?n là P1<<=1;
                                                 delay(500);
                                         }
                                }
                        }
                        bạn thử code này nhé.
                        bạn thêm biến i như vầy nhé
                        Last edited by dt3k4; 20-05-2013, 20:49.

                        Comment


                        • #27
                          Nguyên văn bởi dt3k4 Xem bài viết
                          Code:
                          #include <REGX52.H>
                          
                          void delay (unsigned int ms)
                          { 
                          unsigned int x,i;
                          for(i=0; i<ms; i++)
                          	{
                                          for(x=0;x<1000;x++);     
                          	}
                          }
                          
                          main()
                          {
                                  while(1)
                                  {
                                            P1=0x01;
                                           for(i=0;i<8;i++) 
                                           {     
                                                   P1=P1<<1;// Vi?t ng?n là P1<<=1;
                                                   delay(500);
                                           }
                                  }
                          }
                          bạn thử code này nhé.
                          lỗi anh ạ
                          Build target 'Target 1'
                          compiling man.c...
                          MAN.C(17): error C202: 'i': undefined identifier
                          Target not created

                          Comment


                          • #28
                            Nguyên văn bởi kimman3 Xem bài viết
                            lỗi anh ạ
                            Build target 'Target 1'
                            compiling man.c...
                            MAN.C(17): error C202: 'i': undefined identifier
                            Target not created
                            bạn thêm biến i như mình vừa sửa ở đoạn code trên nhé

                            Comment


                            • #29
                              Nguyên văn bởi dt3k4 Xem bài viết
                              bạn thêm biến i như mình vừa sửa ở đoạn code trên nhé
                              oke e đã xong đã chạy rồi ạ và bây h a có thể chỉ e muốn làm chạy tuần tự từ port0 đến port 3 thì làm sao ạ chạy xong led đó lại sáng ví dụ thế này cho a dễ hiểu nè chỉ cho e cách code như thế nào với loại này :
                              trước khi chạy 00000001
                              sau khi chạy 00000011 rồi tiếp tục cứ thế tăng lên thàh 00000111 tiếp tục lại 00001111 cứ thế đến hết ạ

                              Comment


                              • #30
                                mình làm 1 đoạn tựa theo gợi ý của bạn. ở cổng P1 nhé. đây là dạng thủ công,
                                Code:
                                #include <REGX52.H>
                                
                                void delay (unsigned int ms)
                                { 
                                unsigned int x,i;
                                for(i=0; i<ms; i++)
                                	{
                                                for(x=0;x<1000;x++);     
                                	}
                                }
                                main()
                                {
                                        while(1)
                                        {
                                               P1=0;       // 00000000b
                                               delay(500);
                                               P1=0x01;  // 00000001b
                                               delay(500);
                                               P1=0x03;  // 00000011b
                                               delay(500);
                                               P1=0x07;  // 00000111b
                                               delay(500);
                                               P1=0x0f;   // 00001111b
                                               delay(500);
                                               P1=0xf1;
                                               delay(500);
                                               P1=0xf3;
                                               delay(500);
                                               P1=0xf7;
                                               delay(500);
                                               P1=0xff;
                                               delay(500);
                                        }
                                }

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X