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

  • Ai giúp mình quét led với.

    Chào các bạn, mình đang làm cái mạch đếm từ 00 đến 99, dùng 4 cổng của 8051 mà mãi vẫn chưa đạt, kết quả là mạch đếm được nhưng đèn hiển thị bị nhấp nháy (mình mô phỏng = proteus), ai biết thì chỉ giáo giùm với. Mình cảm ơn nhiều nhiều. Đây là code:
    //P2_0 dieu khien A1015 mo cho LED1
    //P2_1 dieu khien A1015 mo cho LED2
    #include<regx51.h>
    #define Q0 P1_0
    #define Q1 P1_1
    #define Q2 P1_2
    #define Q3 P1_3
    #define led1 P2_0
    #define led2 P2_1
    //************************************************** ******
    void delay(unsigned int ms) //tao tre 1ms
    {
    unsigned int i,j;
    for (i=0;i<ms;i++)
    for (j=0;j<120;j++)
    {}
    }
    //************************************************** *******
    void hienso(unsigned char n)
    {
    Q0=n%2;n=n/2;
    Q1=n%2;n=n/2;
    Q2=n%2;n=n/2;
    Q3=n%2;

    }
    //**************************************************
    main()
    {
    unsigned char k,j,i;
    while(1)
    {
    for(i=0;i<10;i++) //dem tu 0 den 10
    {
    for(j=0;j<10;j++)
    {
    for (k=0;k<10;k++)
    {
    hienso(i);
    led2=1;
    delay(50);
    led2=0;
    hienso(j);
    led1=1;
    delay(50);
    led1=0;
    }
    }
    }
    }
    }
    Attached Files
    Học thày không tày học bạn

    Comment


    • cậu mô phổng thấy nhấp nháy à? làm mạch thật mà thử lúc ấy canh chỉnh delay cho chuẩn.
      mình mô phổng chạy ko được nhưng mạch thật lại chạy ngon, có khi mô phổng chạy tốt thì mạch thật tịt luôn.

      Comment


      • tình hình là e đang làm đề tài! nhưng e viết thử 1 chương trình kiểm tra phím ấn!
        trái lên phải xuống tương ứng với p0.3 p0.2 p0.1 và p0.0!! đoạn code dưới đây chỉ là thử phím ấn thôi! nên nếu có phím ấn ở p0.3 thì dẫy led đơn nối với port 1 sáng
        p0.2 p2 sang
        p0.1 p3 sang
        em dùng chương trình ngắt timer 0 để quét phím!
        mong mấy pro coi lại dùm e sai chỗ nào!
        pro nào có kinh nghiệm trong cách quét phím,nhận phím thì bày e!! làm sao để hạn chế đc nẩy! bấm 1 mà chạy cả ngàn lần Hu hu Hu hu
        Thank you Thank you Thank you Thank you

        //chuong trinh kiem tra phim bam
        #include <REGX51.H>
        #define T P0_0
        #define L P0_1
        #define P P0_2
        #define X P0_3
        unsigned char getkey;
        void delay();
        void inter_1(void) interrupt 1 using 2
        {
        if(!T) getkey=0;
        if(!L) getkey=1;
        if(!P) getkey=2;

        }
        void main()
        {

        P0=0xff;
        while(1)
        {
        getkey=-1;
        //khai bao cho ngat timer 0
        EA=0x82;
        TMOD=0x01; // chon time 0 che' do 1 tu nap
        TH0=0;
        TL0=0;
        TR0=1; //khoi dong cho ngat'
        TF0=0;
        P1=0; //trai la` P1 sang'
        P2=0; //len p2 sang
        P3=0; // phai p3 sang
        switch(getkey)
        {
        case 0:{P1=0xff;delay();break;}
        case 1:{P2=0xff;delay();break;}
        case 2:{P3=0xff;delay();break;}
        }
        }
        }

        Comment


        • hix U_U post bài giờ hành đạo này ko ai trả lời! huhu Hu hu Hu hu
          ghét wóa hỏi thêm mấy câu nữa! hihi He he He he

          Cho e hỏi! khi biên dịch á! nó báo lỗi này:

          LAPTRINHGAME.C(105): error C249: 'DATA': SEGMENT TOO LARGE

          Không biết lỗi đó phải là bộ nhớ đầy ko nữa!em dang dùng con 89V51RB2 a'! viết bằng ngôn ngữ C nên em ko quản lý đc bộ nhớ Hu hu Hu hu
          sẵn tiện hỏi câu nữa! biến khai báo khi viết VDK bang C thì nó lưu vô đâu!
          Mấy pro giúp e nhanh nha! cần gấp! Thank you Thank you Thank you Thank you

          Comment


          • Nguyên văn bởi xicupleo Xem bài viết
            tình hình là e đang làm đề tài! nhưng e viết thử 1 chương trình kiểm tra phím ấn!
            trái lên phải xuống tương ứng với p0.3 p0.2 p0.1 và p0.0!! đoạn code dưới đây chỉ là thử phím ấn thôi! nên nếu có phím ấn ở p0.3 thì dẫy led đơn nối với port 1 sáng
            p0.2 p2 sang
            p0.1 p3 sang
            em dùng chương trình ngắt timer 0 để quét phím!
            mong mấy pro coi lại dùm e sai chỗ nào!
            pro nào có kinh nghiệm trong cách quét phím,nhận phím thì bày e!! làm sao để hạn chế đc nẩy! bấm 1 mà chạy cả ngàn lần Hu hu Hu hu
            Thank you Thank you Thank you Thank you

            //chuong trinh kiem tra phim bam
            #include <REGX51.H>
            #define T P0_0
            #define L P0_1
            #define P P0_2
            #define X P0_3
            unsigned char getkey;
            void delay();
            void inter_1(void) interrupt 1 using 2
            {
            if(!T) getkey=0;
            if(!L) getkey=1;
            if(!P) getkey=2;

            }
            void main()
            {

            P0=0xff;
            while(1)
            {
            getkey=-1;
            //khai bao cho ngat timer 0
            EA=0x82;
            TMOD=0x01; // chon time 0 che' do 1 tu nap
            TH0=0;
            TL0=0;
            TR0=1; //khoi dong cho ngat'
            TF0=0;
            P1=0; //trai la` P1 sang'
            P2=0; //len p2 sang
            P3=0; // phai p3 sang
            switch(getkey)
            {
            case 0:{P1=0xff;delay();break;}
            case 1:{P2=0xff;delay();break;}
            case 2:{P3=0xff;delay();break;}
            }
            }
            }
            choy ơi , u lãng phí quá , dùng ngắt timer để quét phím !
            có thể dùng ngắt ngoài , hoặc kiểm tra phím hỏi vòng cũng đc mà , để ngắt timer cho scan led7segment chẳng hạn
            Chống nảy phím như sau
            Code:
             if(!T) { delay_ms(50);
                        while(!T) continue ; 
                        delay_ms(10); 
                        bật hay tắt led gì gì đó.....;
                      };

            Comment


            • Nguyên văn bởi xicupleo Xem bài viết
              sẵn tiện hỏi câu nữa! biến khai báo khi viết VDK bang C thì nó lưu vô đâu!
              Mấy pro giúp e nhanh nha! cần gấp! Thank you Thank you Thank you Thank you
              lưu vào RAM từ địa chỉ 0x30H đến 0x7F

              Comment


              • Cho e hỏi! khi biên dịch á! nó báo lỗi này:

                LAPTRINHGAME.C(105): error C249: 'DATA': SEGMENT TOO LARGE

                Không biết lỗi đó phải là bộ nhớ đầy ko nữa!em dang dùng con 89V51RB2 a'! viết bằng ngôn ngữ C nên em ko quản lý đc bộ nhớ! Hu hu Hu hu! chỉ có cỡ 130 biến kiểu char à!

                nghe thằng ban nói mình vô target-> memory model chọn cái large ... XDATA! nhưng e nhớ là vùng XDATA là bộ nhớ ngoài mà! còn PDATA là j` thì ko nhớ Hu hu Hu hu ! đúng là chọn vung XDATA là hết báo lồi trên! nhưng liẹu xài bộ nhớ trong có đc ko!
                mấy pro giúp e nhanh!

                Comment


                • <>thường thì khi báo 1 mảng thì mảng ấy sẽ được đặt trong ram, bây giờ mình muốn nó nằm trong rom thì làm sao
                  vì chương trình mình dùng nhiều bản tham chiếu nên rất tốn ram nếu làm như bình thường giờ mình muốn nó nằm trong rom và khi cần dùng thì load lên.

                  <>à mà sao mình dùng 2 ngắt ngoài đồng thời là chip mìng chạy loạn cả lên, khong hiểu tại sao, còn 1 ngắt ngoài 1 ngắt timer thì ko sao,giải thích hộ mình
                  <>và nhúng asm và C đó ngoài việc #pragma asm........#pragma asmdend ta còn làm gì khác ko, sao mình làm vậy mà nó bảo pragma chưa định nghĩa, việc chèn asm vào C có gây xung đột với chương trình C hiện tại ko vậy (cùng dùng 1 thanh ghi cùng dùng 1 vung nhớ).

                  <>mong các pro giải thích hộ.

                  <>mình cảm ơn!

                  Comment


                  • Nguyên văn bởi anh_tran Xem bài viết
                    <>thường thì khi báo 1 mảng thì mảng ấy sẽ được đặt trong ram, bây giờ mình muốn nó nằm trong rom thì làm sao
                    vì chương trình mình dùng nhiều bản tham chiếu nên rất tốn ram nếu làm như bình thường giờ mình muốn nó nằm trong rom và khi cần dùng thì load lên.

                    <>à mà sao mình dùng 2 ngắt ngoài đồng thời là chip mìng chạy loạn cả lên, khong hiểu tại sao, còn 1 ngắt ngoài 1 ngắt timer thì ko sao,giải thích hộ mình
                    <>và nhúng asm và C đó ngoài việc #pragma asm........#pragma asmdend ta còn làm gì khác ko, sao mình làm vậy mà nó bảo pragma chưa định nghĩa, việc chèn asm vào C có gây xung đột với chương trình C hiện tại ko vậy (cùng dùng 1 thanh ghi cùng dùng 1 vung nhớ).

                    <>mong các pro giải thích hộ.

                    <>mình cảm ơn!
                    - khai báo mảng trong Rom
                    Code:
                     const unsigned char array[] = {..}
                    - dùng 2 ngắt đồng thời , ct trình nhảy loạn , thật ra là do cách viết ct của u thui , vd :
                    + khi nhận tín hiệu INT1 , đồng thời lại nhận tiếp IN0 , thì ct thực hiện INT0 sau đó lại thực hiện INT1
                    + nếu trong khi ct vẫn đang làm INT1 lại có tiếp tín hiệu từ chân INT0 --> ngắt trong ngắt ---> ct nhảy loạn là đúng
                    Tóm lại , u phải quản lý stack chặt chẽ thi ct ko nhảy laọn nữa

                    Comment


                    • Nguyên văn bởi anh_tran Xem bài viết
                      <>và nhúng asm và C đó ngoài việc #pragma asm........#pragma asmdend ta còn làm gì khác ko, sao mình làm vậy mà nó bảo pragma chưa định nghĩa, việc chèn asm vào C có gây xung đột với chương trình C hiện tại ko vậy (cùng dùng 1 thanh ghi cùng dùng 1 vung nhớ).
                      Để nhúng asm vào C bạn còn phải làm những việc sau đây nữa:
                      In µVision you may set a file specific option for C source files that contain ASM/ENDASM sections as follows:

                      1.Right click on the file in the Project Window — Files tab
                      2.Choose Options for... to open Options — Properties page
                      3.Enable Generate Assembler SRC file
                      4.Enable Assemble SRC file.
                      µVision generates an assembler source file (.SRC) and translates this file with the Assembler which generates an object file (.OBJ). The linker links this object file with other object files from the project and creates the target application program.
                      Hãy vào help/search/và gõ vào #pragma end để tìm hiểu thêm

                      Comment


                      • bác nào có thể cắt hộ tui mảng thành nhìu dòng , chứ để nó dài quá
                        Code:
                        code unsigned char cobemuadong[]=
                        {"5g^,5F^,5g^,5b<,5b!,5a~,5g^,5F^,5e^,5F^,6C^,6d$,6d^,6e^,6d<,6d!,6d^,6e^,6d^,6C^,5b^,5a:,5g@,5F@,5g@,5a@,5b@,5a:,5g^,5F^,5g^,5b<,5b!,5a~,5g^,5F^,5e^,5F^,6C^,6e^,6d!"}
                        tui đã thử cắt với 2 cách như sau
                        C1 :
                        Code:
                         {"5g^,5F^,5g^,5b<,5b!,5a~,5g^" ,
                          "5F^,5e^,5F^,6C^,6d$,6d^,6e^"
                                  };
                        --> báo lỗi array string out of bounds
                        C2 :
                        Code:
                         {"5g^,5F^,5g^,5b<,5b!,5a~,5g^"   // dòng 1
                             "5F^,5e^,5F^,6C^,6d$,6d^,6e^" // dòng 2
                                  };
                        --> bỏ dấu "," ở cuối dòng 1 --> ko lỗi , nhưng loa chỉ phát note ở dòng 1
                        Last edited by Zz_Bi_zZ; 30-05-2008, 17:09.

                        Comment


                        • mình ko hiểu sao lại báo lỗi này khi mình đang ký License management như đã chỉ dẫn, vậy làm sao đây?????, thông báo lỗi thế này"*** ERROR R208: RENEW LICENSE ID CODE (LIC)", mình đã đổi LIC liên tục nhưng cái nào cũng bị thế, tháo ra cài lại vẫn như vậy??????

                          Comment


                          • Nguyên văn bởi nmhoang Xem bài viết
                            mình ko hiểu sao lại báo lỗi này khi mình đang ký License management như đã chỉ dẫn, vậy làm sao đây?????, thông báo lỗi thế này"*** ERROR R208: RENEW LICENSE ID CODE (LIC)", mình đã đổi LIC liên tục nhưng cái nào cũng bị thế, tháo ra cài lại vẫn như vậy??????
                            Hình như sau mỗi lần đổi code mới , thời hạn sẽ tăng lên , cứ đổi tiếp đi, chú ý thời hạn xem có tăng lên ko
                            Cung cấp Oscilocope , Inverter , Switching , DC power supply , AC millivolt meter ....

                            Comment


                            • Cái này là mảng ký tự chứ, bao gồm "," cũng là 1 ký tự
                              Code:
                              code unsigned char cobemuadong[]=
                              {"5g^,5F^,5g^,5b<,5b!,5a~,5g^,5F^,5e^,5F^,6C^,6d$,6d^,6e^,6d<,6d!,6d^,6e^,6d^,6C^,5b^,5a:,5g@,5F@,5g@,5a@,5b@,5a:,5g^,5F^,5g^,5b<,5b!,5a~,5g^,5F^,5e^,5F^,6C^,6e^,6d!"}
                              Vậy thì với
                              C1 :
                              Code:
                               {"5g^,5F^,5g^,5b<,5b!,5a~,5g^" ,
                                "5F^,5e^,5F^,6C^,6d$,6d^,6e^"
                                        };
                              --> báo lỗi array string out of bounds
                              cái dấu "," gây lỗi là phải,
                              còn ở C2

                              C2 :
                              Code:
                               {"5g^,5F^,5g^,5b<,5b!,5a~,5g^"   // dòng 1
                                   "5F^,5e^,5F^,6C^,6d$,6d^,6e^" // dòng 2
                                        };
                              tương đương với

                              Code:
                               {"5g^,5F^,5g^,5b<,5b!,5a~,5g^""5F^,5e^,5F^,6C^,6d$,6d^,6e^"};
                              thì trình dịch sẽ bỏ qua 2 dấu "" tức là ký tự hiểu như sau
                              Code:
                               {"5g^,5F^,5g^,5b<,5b!,5a~,5g^5F^,5e^,5F^,6C^,6d$,6d^,6e^"};
                              Việc nối chuỗi thì có thể như sau, giống như cách 1 nhưng

                              Code:
                               {"5g^,5F^,5g^,5b<,5b!,5a~,5g^ ,"
                                "5F^,5e^,5F^,6C^,6d$,6d^,6e^"
                                        };
                              cái dấu "," phải đặt trong nháy kép
                              Diễn đàn Vi điều khiển:

                              Comment


                              • lập trình keil C

                                e dang bắt đầu học về lập trình keil C.Hiện giờ e chưa biết một tí gì về nó cả.Các bác có thể cho e một chút tài liệu về lập trình keil C không?Bác nào có lòng tốt thì chỉ bảo cho e kinh nghiệm để có thể học C một cách nhanh nhất không?sắp tới e phải làm đồ án tốt nghiệp rồi.

                                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