Hướng dẫn sử dụng Keil C cho lập trình họ 8051

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • hoasua_2005
    Thành viên tích cực
    • Mar 2008
    • 487

    #1

    Hướng dẫn sử dụng Keil C cho lập trình họ 8051

    cái này quá cũ rồi nhưng có nhiều bạn vẫn chưa biết cách dùng, mình tạo chủ đề này dành cho cách bạn chưa biết dùng, các cao thủ vào đóng góp cho đầy đủ nhé

    đầu tiên phải có phần mềm trước:
    http://www.mediafire.com/?7sw5jggf6v2bq0z
    đây là link tải Keil C uV3, khi giải nén ra có 2 file
    nhấp đúp vào c51v805 để tiến hành cài đặt, cái này dễ rồi, chắc ko phải hướng dẫn nữa

    sau khi cài đặt xong, mở Keil C lên, chọn File->license management,

    copy phần CID

    nhấp đúp vào Keil_lic-v3.2_2 rồi thiết lập như hình

    paste CID vào external CID code, chọn generate, rồi copy LIC0

    quay lại license management, paste LIC0 vào ô new license ID code, chọn add LIC, như hình dưới là đúng, nếu ko làm bước này, sẽ bị giới hạn chương trình


    thế là xong phần cài đặt vào ***** Keil C
    để tạo project mới:

    sau đó tìm mục data base chọn Atmel rồi thiết lập như hình

    phải chuột vào Target mục output rồi thiết lập như hình

    chọn File-> New rồi lưu file này dưới tên *.c ví dụ test.c

    phải chuột vào Source group 1 rồi chọn add như hình, bước này để add file test.c vừa tạo vào project

    copy đoạn mã sau vào test.c
    PHP Code:
    #include <REGX51.H>
    #define LED1 P1_0          // định nghĩa LED0 gắn vào P1_0
    #define LED2 P1_1
    void delay_ms(int ms)      // hàm tạo trễ
    {
        int i,j;                    // ms,i,j phải cùng kiểu dữ liệu
        for(i=0;i<=ms;i++)
        for(j=0;j<=120;j++)
        {;}
    }
    void main()
    {
        while(1)           // vòng lặp vô hạn
        {
            LED1 = 1;   // P1_0 có 5V
            LED2 = 0;   // P1_1 có 0V
            delay_ms(500);
            LED1 = 0;   // P1_0 có 0V
            LED2 = 1;  // P1_1 có 5V
            delay_ms(500);
        }
    } 
    
    đoạn mã này nhấp nháy 2 led luân phiên nhau, sau khoảng thời gian ~0,5s
    nhấn F7 để biên dịch, sau khi biên dịch mà có báo như hình thì có nghĩa là chương trình ko bị lỗi gì cả (có thể có lỗi về mặt thuật toán nhưng dịch ko báo lỗi)

    quay lại thư mục chứa project vừa tạo, tìm file test.hex, đây là file sẽ nạp vào vi điều khiển.

    chúc các bạn thành công
  • quangnhat
    Thành viên tích cực
    • Jul 2005
    • 940

    #2
    Bác cho 2 ví dụ về timer và ngắt ngoài đi???thanks
    Quang Nhat
    ---------------------------------------
    Yahoo :quangnhat85ls
    Mail :
    Nhận thiết kế và ép nhựa cho đồ điện tử

    Comment

    • hoasua_2005
      Thành viên tích cực
      • Mar 2008
      • 487

      #3
      Ví dụ về timer, ngắt ngoài

      Timer0
      PHP Code:
      ///////////////////////////////////////////////
      // test cac ngat cua ho 89C51   ///////////////
      //  timer                        ///////////////
      //  counter                         ///////////////
      ///////////////////////////////////////////////
      #include <AT89x51.H>
      /*-------------------------test timer1 100Hz of wave------------timer1 mode 1,soft gate, CT1=0---------*/
      //#define     TL    0x77;
      //#define    TH    0xEC;
      //void timer1(void) interrupt 3 {
      //    TR1 = 0;
      //    TL1 = TL;
      //    TH1 = TH;
      //    P1_0=!P1_0;
      //    TF1 = 0;
      //    TR1 = 1;
      //} 
      //void init_timer1()
      //{
      //    EA = 0;
      //    TL1 = TL;
      //    TH1 = TH;
      //    TMOD = 0x11; // che do 16 bit
      //    TR1 = 1;
      //    TF1 = 0;
      //    ET1 = 1;
      //    EA = 1;
      //}
      /*--------------------------test timer0 50Hz of wave-----------timer0 mode 1 soft gate, CT0=0-------*/
      #define TL    0x18;
      #define    TH    0xFC; 
      void timer0(void) interrupt 1 {
          TR0 = 0;     // dung timer0
          TL0 = TL;     // nap lai TL
          TH0 = TH;     // nap lai TH
      
          TF0 = 0;     // xoa co timer0
          TR0 = 1;     //    khoi dong timer0
          P1_0=!P1_0;
      } 
      void init_timer0()
      {
          EA = 0;
          TL0 = TL;
          TH0 = TH;
          TMOD = 0x11; // che do 16 bit
          TR0 = 1;     // khoi dong timer0
          TF0 = 0;     // xoa co de bat dau dem
          ET0 = 1;     // enable timer0
          EA = 1;         // enable tat ca cac ngat
      }
      /*-------------------counter0 mode 1, soft gate, CT0=1-----------------------TEST COUNTER0----------*/
      //    GATE    C/T        M1        M0    ||    GATE    C/T        M1        M0
      //                TIMER1            ||           TIMER0
      // test counter0 input P3_4                    
      //void init_counter0()
      //{
      //    TMOD = 0x05;          //--ACTIVE LOW---
      //    TR0 = 1;
      //}
      /*-------------------counter1 mode 1, soft gate, CT1=1----------------------TEST COUNTER1----------*/                      
      //void init_counter1()      //--ACTIVE LOW---
      //{
      //    TMOD = 0x50;
      //    TR1  = 1;
      //}
      //    GATE    C/T        M1        M0    ||    GATE    C/T        M1        M0
      //                TIMER1            ||           TIMER0
      /*--------------------------------test timer0 mode1, hard gate, CT0=0-------------------------------*/
      //void init_timer0_hardgate()
      //{
      //    TMOD = 0x09;
      //    TL0  = 0xEF;
      //    TH0  = 0xD8;
      //    P3_2 = 0;
      //    ET0  = 1;
      //    EA   = 1;
      //    TR0  = 1;
      //}
      //void timer0_hardgate(void) interrupt 1       /******ACTIVE HIGH*****/
      //{
      //    TL0 = 0xEF;
      //    TH0 = 0xD8;
      //    TF0 = 0;
      //    P0  = ~P0;
      //}
      /*-------------------------------test timer1 mode1,hard gate, CT1=0---------------------------------*/
      //void init_timer1_hardgate()
      //{
      //    TMOD = 0x90;
      //    TL1  = 0xEF;
      //    TH1  = 0xD8;
      //    P3_3 = 0;
      //    ET1  = 1;
      //    EA   = 1;
      //    TR1  = 1;
      //}
      //void timer1_hardgate(void) interrupt 3    /******ACTIVE HIGH*****/
      //{
      //    TL1 = 0xEF;
      //    TH1 = 0xD8;
      //    TF1 = 0;
      //    P0  = ~P0;
      //}
      void main()
      {     
      //    init_timer1();
          init_timer0();
      //    init_counter0();
      //    init_counter1();
      //    init_timer0_hardgate();
      //    init_timer1_hardgate();
          while(1)
          {
      
          }
      } 
      
      ví dụ này cũng siêu cơ bản

      chúc thành công

      Comment

      • qhhqnavy
        Thành viên mới
        • Dec 2010
        • 21

        #4
        ok. bài viết dài quá
        bác cần tối ưu hóa thuật toán đi tí nữa

        Comment

        • hoasua_2005
          Thành viên tích cực
          • Mar 2008
          • 487

          #5
          Nguyên văn bởi qhhqnavy Xem bài viết
          ok. bài viết dài quá
          bác cần tối ưu hóa thuật toán đi tí nữa
          bài nào dài hả bạn, timer hay hướng dẫn?
          nếu bạn nói bài timer dài quá, cần tối ưu thuật toán thì bạn cần phải xem lại đấy

          Comment

          • tienhuypro
            Thành viên tích cực
            • Mar 2009
            • 382

            #6
            Tốt, cố gắng phát huy hoasua_2011 nhé.
            Bạn nào có cần hỏi gì thì hãy hỏi ở đây. Người đi trước có kinh nghiệm sẽ giúp người đi sau.

            Email:
            Tel: 0983.497.310

            Comment

            • lovekieunhu
              Thành viên mới
              • Jan 2011
              • 9

              #7
              cảm ơn bạn nhe! mình mới học vdk nên rất cần tài liệu này.
              Nếu chỉ nhìn vào vẻ bề ngoài của một người thì có lẽ bạn sẽ thất vọng, nhưng nếu bạn nhìn một người theo cách mà bạn mong muốn thì nhất định họ sẽ trở thành người như bạn mong đợi.

              Comment

              • tenngoc286
                Thành viên mới
                • Jun 2009
                • 5

                #8
                bạn ơi minh hỏi nhé nếu mình muon lập trình cho port 1 nháy 8 led thì mình làm nhu thế nào , bạn có code nháy nhiều kiểu khách nhau không cho minh với nhé .
                bạn siêu thật đấy

                Comment

                • hoasua_2005
                  Thành viên tích cực
                  • Mar 2008
                  • 487

                  #9
                  muốn lập trình cho cả port cũng có thể dùng cách đã hướng dẫn, hoặc có thể dùng cách này:
                  giả sử nhấp nháy port1

                  PORT1 = 0xF0;
                  delay_ms(500);
                  PORT1 = 0x0F;
                  delay_ms(500);

                  đoạn mã này xuất ra port1 : 1111 0000 trễ 0,5s 0000 1111 trễ 0,5s

                  Comment

                  • tenngoc286
                    Thành viên mới
                    • Jun 2009
                    • 5

                    #10
                    minh dung 89s52

                    Comment

                    • phongxh
                      Thành viên mới
                      • Feb 2011
                      • 21

                      #11
                      nếu dùng TMODE se ngat sau 10s thì làm sao hả bạn ???

                      Comment

                      • hoasua_2005
                        Thành viên tích cực
                        • Mar 2008
                        • 487

                        #12
                        Nguyên văn bởi phongxh Xem bài viết
                        nếu dùng TMODE se ngat sau 10s thì làm sao hả bạn ???
                        người ta ko dùng timer để tạo đỗ trế lớn như thế đâu.

                        Comment

                        • transisto
                          Thành viên tích cực
                          • Oct 2011
                          • 303

                          #13
                          Cho em hỏi mình mắc Led như nào để quy định mức 1 là Led tắt,còn mức 0 thì Led sáng vậy,anh cho ví dụ về trễ (delay),cách sử sụng hàm char và int thêm được không?!

                          Comment

                          • hoahongnho
                            Thành viên mới
                            • Jun 2012
                            • 16

                            #14
                            H em điều khiển 6 đèn . muốn lần lượt 2 đèn sáng cùng một lúc theo thời gian 20 s , 3s , 15s ( yêu cầu chuẩn xác ) thì làm thế nào hả các bác . thạch anh 12mhz điều khiển mức 0.

                            Comment

                            • linhk13dt6
                              Thành viên chính thức
                              • Nov 2012
                              • 32

                              #15
                              bác có thể nói chi tiết hơn không!

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...