Thông báo

Collapse
No announcement yet.

HƯỚNG DẪN LẬP TRÌNH KEIL C CHO 8051-[Chỉ dành post bài hướng dẫn]

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

  • ok, giải thích nhanh nhé.
    Ví dụ: P1 = b7b6b5b4b3b2b1b0; (bi là bít thứ i)
    => P1 & 1100 0000 (tức 0xC0) = b7b600 0000 (xóa các bit b0 -> b5)

    Sau đó, thực hiện lệnh or với các bit của temp (:d post nhầm tẹo). Mình edit lại ngay.

    nên (P1 & 0xC0) | temp sẽ có tác dụng chỉ biến đổi 6 bít thấp của P1 mà không ảnh hưởng đến 2 bít cao.

    Chắc bạn biết là:
    Code:
    0 or X = X
    1 or X = 1
    0 and X = 0
    1 and X = X
    Như thế, muốn xóa bít nào đó thì ta and bit đó với 0, muốn giữ bít đó thì and với 1.


    Chúc bạn thành công.
    Technical sale at WT Microelectronics S'pore
    Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
    Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

    Comment


    • Trích lời Ngô Hải Bắc:
      "Như vậy bạn định dùng một vòng lặp để quét phím sao? Như thế thật là phí tài nguyên chíp. Bạn nên dùng ngắt để tạo ra một vòng quét xác định đừng dùng delay. Khi đó thời gian rảnh rỗi có thể làm được khối việc đó."
      Bạn có thể giải thích rõ ý trên được không?! Tiện thể bạn chỉ giúp mình cách trích lời dẫn của mọi người nhé?! Mình xin hỏi thêm một điều nữa là: Các lệnh logic trong C với VĐK(AND, OR, Not, Nor, #) ??
      Thanks!!

      Comment


      • Nguyên văn bởi baccuc1 Xem bài viết
        Trích lời Ngô Hải Bắc:
        "Như vậy bạn định dùng một vòng lặp để quét phím sao? Như thế thật là phí tài nguyên chíp. Bạn nên dùng ngắt để tạo ra một vòng quét xác định đừng dùng delay. Khi đó thời gian rảnh rỗi có thể làm được khối việc đó."
        Bạn có thể giải thích rõ ý trên được không?! Tiện thể bạn chỉ giúp mình cách trích lời dẫn của mọi người nhé?! Mình xin hỏi thêm một điều nữa là: Các lệnh logic trong C với VĐK(AND, OR, Not, Nor, #) ??
        Thanks!!
        Thực ra cũng chẳng có gì cả. Các lệnh logic trong C hay ở đâu thì cũng giống nhau thôi. Cái này khi bạn học ASM thì đã biết rùi chứ.

        Trong C các toán hạng bit như sau:
        Code:
        &  => and bit
        |   => or bit
        ^   => xor bit
        !   => đảo bít
        Bạn tạo vòng quét theo kiểu dùng ngắt Timer, bạn tạo một Timer khoảng 10ms hay gì đó, trong mỗi ngắt Timer xảy ra thì bạn kiểm tra phím bấm và thực hiện việc điều khiển led và chuông thôi.

        Chúc bạn thành công.
        Technical sale at WT Microelectronics S'pore
        Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
        Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

        Comment


        • Tôi tìm ra một lỗi(không biết có phải chính xác là lỗi) trong keilC. Các bạn thử xem có đung không nhé. tôi có viết một chương trình đơn giản thế này thôi.

          #include <regx51.h>
          char Data;
          void IsrSerial(void) interrupt 4 using 2
          {
          if(RI==1) //neu co du lieu
          {
          Data=SBUF; //lay du lieu luu vao bien Data.
          RI=0; //xoa co ngat cua bo nhan noi tiep.
          }
          }

          void main(void)
          {
          while(1)
          {
          P1=Data; //dua du lieu nhan duoc ra cong P1.
          }
          }

          khi chay debug. Dùng cửa sổ watch để đặt SBUF=0xAA. và RI=1. có nghĩa là ngắt đã xẩy ra. và con trỏ chương trình nhảy đến chương trình con phục vụ ngắt nối tiếp để thực hiện việc nhận dữ liệu. Nhưng khi lệnh Data=SBUF thực hiện xong thì Biến Data không bằng 0xAA mặc dù SBUF vẫn bằng 0xAA. Các bạn thử check xem thế nào. xem có đúng là lỗi thật không?

          Comment


          • Hải Bắc ơi!
            Cho mình hỏi chút phần thuật giải bạn viết cho mình:
            "temp = P0;
            temp &= 0x1F; // and để lấy 5 bít thấp của P0
            temp= temp<<1; // dịch 1 bít sang trái "
            Mình hiểu thế này không biết có đúng không?!
            1, Ví dụ mình ấn phím nối với chân P1_0 khi đó :
            P0=1111 1110
            Đến câu lệnh "temp &= 0x1F" nó sẽ thực hiện:
            (1111 1110 AND 0001 1111) = 0001 1110
            2, Còn câu lệnh "temp= temp<<1" Mình muốn hỏi khi dịch sang trái 1 bít thì nó có giống với lệnh RL trong ASM kô?!
            Ví dụ: mình dùng lệnh temp= temp<<1 để dịch trái đoạn bít sau:
            1011 1100 => 0111 1001
            Rất mong các bạn chỉ giáo cho!
            Thanks!

            Comment


            • Cho mình hỏi thêm câu nữa?!
              Phần bài tâp nút ấn của mình, mình viết lại như này khi chạy không có báo lỗi gì cả nhưng khi lắp thật thì đèn nối với các chân của Port P1 cứ tự nhấp nháy hoài mặc dù mình không ấn phím gì cả!

              #include <AT89X51.H>
              void delay(unsigned char giay)
              {
              while(giay--)
              {
              //day la chuong trinh tao tre 1s
              unsigned char temp;
              temp=1000;
              while(temp--)
              {
              //day la doan chuong trinh tao tre 1 ms
              TMOD=0x01; //su dung timer0,che do 16 bit

              TH0=0xFC;
              TL0=0x18 ;
              TR0=1; // Day la bit khoi dong bo dinh thoi 0
              while(!TF0);
              TR0=0;
              TF0=0;

              }
              }
              }

              void main()
              {
              while(1)
              {
              if (P0!=0xFF) P1=0xFE;
              {
              if(P0_0 ==0) P1=0xFC;
              else if(P0_1==0) P1=0xFA;
              else if(P0_2==0) P1=0xF6;
              else if(P0_3==0) P1=0xEE;
              else if(P0_4==0) P1=0xDE;
              delay(100);
              P1=P0= 0xFF;
              }
              }
              }
              Mong các bạn chỉ bảo giúp?!
              Thanks!

              Comment


              • Nguyên văn bởi baccuc1 Xem bài viết
                Cho mình hỏi thêm câu nữa?!
                Phần bài tâp nút ấn của mình, mình viết lại như này khi chạy không có báo lỗi gì cả nhưng khi lắp thật thì đèn nối với các chân của Port P1 cứ tự nhấp nháy hoài mặc dù mình không ấn phím gì cả!

                #include <AT89X51.H>
                void delay(unsigned char giay)
                {
                while(giay--)
                {
                //day la chuong trinh tao tre 1s
                unsigned char temp;
                temp=1000;
                while(temp--)
                {
                //day la doan chuong trinh tao tre 1 ms
                TMOD=0x01; //su dung timer0,che do 16 bit

                TH0=0xFC;
                TL0=0x18 ;
                TR0=1; // Day la bit khoi dong bo dinh thoi 0
                while(!TF0);
                TR0=0;
                TF0=0;

                }
                }
                }

                void main()
                {
                while(1)
                {
                if (P0!=0xFF) P1=0xFE;
                {
                if(P0_0 ==0) P1=0xFC;
                else if(P0_1==0) P1=0xFA;
                else if(P0_2==0) P1=0xF6;
                else if(P0_3==0) P1=0xEE;
                else if(P0_4==0) P1=0xDE;
                delay(100);
                P1=P0= 0xFF;
                }
                }
                }
                Mong các bạn chỉ bảo giúp?!
                Thanks!
                Bạn học C lâu chưa mà viết khó chịu thế. Lệnh này là như thế nào.

                if(P0!=0xFF) P1=0xFE
                {
                //tất cả mọi thứ trong này đều chả có ý nghĩa gì với lệnh if ở trên cả, lệnh if đấy chỉ có tác dụng với mỗi một lệnh P1=0xFE thôi.
                }

                Chương trình của bạn bạn bảo chạy không có lỗi gì, bạn thử chạy debug lại xem. hàm delay của bạn nó chả ra cái gì cả. tốt nhất bạn nói yêu cầu của bạn để mọi người viết luôn code cho bạn.
                Last edited by hungnp; 26-11-2006, 13:21.

                Comment


                • Trích lời Hungnp:
                  "Bạn học C lâu chưa mà viết khó chịu thế. Lệnh này là như thế nào."

                  Mình mới học C nên trình còn non lắm, rất mong các bạn chỉ bảo giúp??!
                  Bài toán của minh là:
                  Mình có 5 phím ấn. Khi ấn cùng một lúc các phím trên thì phím nào ấn trước sẽ được ưu tiên nghĩa là đèn sáng và chuông kêu trong vòng 10s còn các phím khác nếu ấn cũng không có tác dụng gì cả( chuông không kêu và đèn không sáng) Sau 10s thì đèn tắt và chuông tắt trở về trạng thái ban đầu(chuông không kêu và đèn không sáng) để chờ đợt ấn phím mới!
                  Mong nhận được sự chỉ bảo của mọi người!
                  Thanks!

                  Comment


                  • Giải thích:

                    - Tại sao lại sử dụng biến Dummy_P0:
                    Biến này có mục đích lưu dữ liệu của cổng P0, Do mục đích của bạn là nếu các nút bấm được bấm trong khoảng thời gian gần nhau(chứ không phải cùng một lúc như bạn nói) thì phím nào bấm trước thì nút bấm đó được xử lý. Do vậy tôi phải dùng biến này để lưu lại giá trị của P0 tại một thời điểm thay vì so sánh trực tiếp giá trị của P0, vì điều này sẽ tránh được vấn đề: Khi một nút bấm xong thì nó có một giá trị xác định, nhưng khi chạy đến đoạn code để kiểm tra thì nó lại có một giá trị khác do có một nút khác được bấm ngay sau đó.
                    - Tại sao lại phải sử dụng ngắt timer0:
                    Cái này có 2 lý do.
                    1. Nếu bạn dùng còi mà chỉ đơn giản bật tắt nó, mà yêu cầu của bạn là kêu trong 10s thì nó chỉ te te trong 10s. nghe ra không hay lắm. nên tôi dùng ngắt timer0 để ON/OFF còi với một chu kỳ nhất định, trong chương trình tôi dùng là 200us-ON/200us-OFF. Thực tế thì với tần số này ta sẽ không phát hiện được khoảng on và off của còi nên bạn phải điều chỉnh làm sao để nghe rõ được. Phần này tôi dành cho bạn phát triển thêm.
                    2. Vì cần delay 10s nên tôi sử dụng luôn ngắt này để tăng biến đếm ValueForDelay10us, do mỗi lần ngắt là 200us nên đếm đến 50000 thì được 10s, thực tế chắc chắn thời gian này sẽ lớn hơn 10s, nên bạn cũng phải điều chỉnh lại cho hợp lý hơn. Trong chương trình ở hình tôi có thiếu một lệnh là lệnh xóa biến đếm ValueForDelay10s, nhưng tôi đã thêm vào trong file .C có gửi kèm theo.

                    xin nói rõ chương trình trong hình chỉ để phân tích. trong khi phân tích tôi có tìm thấy một số chỗ còn thiếu nên đã bổ sung vào file kèm theo. Các bạn xem và thấy chỗ nào chưa được thì bổ sung thêm. các bạn tải file về và đổi đuôi thành .c thì sẽ xem được.
                    Attached Files

                    Comment


                    • đây là file gửi kèm theo bài viết trên.
                      Attached Files

                      Comment


                      • Trước tiên mình xin gửi lời cám ơn tới bạn Hungnp đã chỉ bảo rất chi tiết cho mình!
                        Trong phần code bạn viết có đoạn lệnh sau mình vẫn chưa hiểu. Mong bạn chỉ bảo giúp!
                        Thanks!

                        "unsigned int ValueForDelay10s;
                        void IsrTimer0(void) interrupt 1 using 2
                        {

                        }
                        .
                        .
                        .
                        .
                        break;
                        default:
                        break; "

                        Comment


                        • hic!Lệnh đấy là bác ấy đang viết hàm ngắt mà (ngắt timer 0)
                          Khó nhất trên đời làm trang nam tử
                          Ý chí vững vàng mà tình cảm lại mênh mang

                          Comment


                          • đúng là cái cậu này. Cậu mới học C thật rồi. SVNGHEO nói đúng đấy. Đấy là ngắt của timer0. cơ chế hoạt động của ngắt này như sau:
                            - timer đếm --> tràn--> xẩy ra ngắt--> thực hiện các công việc khi xẩy ra ngắt.
                            - Để ngắt timer0 làm việc thì cần làm những công việc sau:
                            1. thiết lập các thông số cho timer như: mode, giá trị ban đầu, và cho nó đếm. Công việc này được thực hiện bởi các lệnh từ dòng 28,29 và 31.
                            2. Thiết lập ngắt: khi muốn một ngắt hoạt động thì phải bật cờ của ngắt đó lên, đối với ngắt timer0 thì bật 2 bit 1 và 7 của thanh ghi IE, công việc này được thực hiện bởi lệnh 30.
                            3. Khai báo hàm ngắt. cú pháp như sau: void IsrTimer0(void) interrupt 1 using 2. Lệnh này có tác dụng khai báo hàm ngắt cho timer0, khi timer 0 tràn thì nó sẽ tự động nhảy đến hàm này và làm những công việc ở đó.
                            4. Còn về hàm switch...case thì bạn phải đọc lại trong sách C thôi. kiến thức cơ bản mà. bạn vào trong trình soạn thảo TC3.0 gõ vào switch và ấn tổ hợp phím ctrl+F1 thì nó sẽ cho bạn help của lệnh này. Chúc bạn thành công.

                            Comment


                            • Nguyên văn bởi baccuc1 Xem bài viết
                              Trước tiên mình xin gửi lời cám ơn tới bạn Hungnp đã chỉ bảo rất chi tiết cho mình!
                              Trong phần code bạn viết có đoạn lệnh sau mình vẫn chưa hiểu. Mong bạn chỉ bảo giúp!
                              Thanks!

                              "unsigned int ValueForDelay10s;
                              void IsrTimer0(void) interrupt 1 using 2
                              {

                              }
                              .
                              .
                              .
                              .
                              break;
                              default:
                              break; "
                              chao ban !truoc tien ban nen doc trong tai lieu di kem cua bo keil c trong file c51.pdf co phan huong dan su dung cac ngat chuc ban thanh cong

                              Comment


                              • Nguyên văn bởi TDH-BN
                                chào các bác
                                các bác xem giúp em doan code sau co sai ko?
                                cho em load file:
                                Attached Files
                                Học thầy không tày học bạn ...

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X