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

  • ý em hỏi là tại sao lại có số 33000. tức là mình tính như thế nào để có 1 khoảng thời gian gần 1s. nó dùng thạch anh 12Mhz!!
    unsigned int x;
    for(x=0;x<33000;x++)

    Comment


    • ô! cho em hỏi toán tử "<<" này làm gì vậy? và mình dùng câu lệnh nào tương đương với lệnh RR hay Rl của assembler? em đang cần dịch bít nên các sư huynh chỉ giáo!!1

      Comment


      • hic!!ko ai giải thích dùm em vậy!!
        cho em hỏi ; trong keil C làm sao mình có thể truy xuất các giá trị của các thanh ghi R0,R1,.. mình phải include thư viện nào vậy! em tìm trong atmel mà ko thấy. em dùng 89c51. sư huynh nào chỉ dùm em với. thanks!!!

        Comment


        • Nguyên văn bởi cong1810 Xem bài viết
          ô! cho em hỏi toán tử "<<" này làm gì vậy? và mình dùng câu lệnh nào tương đương với lệnh RR hay Rl của assembler? em đang cần dịch bít nên các sư huynh chỉ giáo!!1
          Bạn kiếm quyển học về lập trình C mà tìm hiểu thêm. Mình giới thiệu cuốn Ngôn ngữ lập trình C của Quách Tuấn Ngọc rất là cơ bản.
          Nguyên văn bởi cong1810 Xem bài viết
          hic!!ko ai giải thích dùm em vậy!!
          cho em hỏi ; trong keil C làm sao mình có thể truy xuất các giá trị của các thanh ghi R0,R1,.. mình phải include thư viện nào vậy! em tìm trong atmel mà ko thấy. em dùng 89c51. sư huynh nào chỉ dùm em với. thanks!!!
          C ko có hàm truy cập vào thanh ghi này. Bạn có thể khai báo biến và truy cập trực tiếp vào địa chỉ của nó.
          AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
          Xem thêm tại Online Store ---> Click here
          Mob: 0982.083.106

          Comment


          • em có chép được một đoạn code viết bằng C++ cho mạch hẹn giờ đồng hồ (khoang 3 trang A4); (em làm thử mạch rồi, nhưng chưa nạp chương trình)
            neu em viet bang C++ roi chuyen qua file .hex de nap cho 892051 thì có đầy ko nhi?
            co bác nào biết viết code hẹn giờ này bằng assembly ko, chỉ em với
            thanks!

            Comment


            • Nguyên văn bởi cong1810 Xem bài viết
              ý em hỏi là tại sao lại có số 33000. tức là mình tính như thế nào để có 1 khoảng thời gian gần 1s. nó dùng thạch anh 12Mhz!!
              unsigned int x;
              for(x=0;x<33000;x++)
              Hi,
              Số 33000 chính là số lần lặp, còn bao nhiêu là do tần số thạch anh. Cách tính thế nào để ra số 33000 thì bác thử như cách dưới đây.
              Tui đã thử viết ra đoạn code đó (nhưng chỉ 250 thôi không phải 33000) và cho KeilC biên dịch, xem file list thì biết được mã asm như sau:

              CALL 2
              CLR A 1
              MOV i,A 1
              ?C0001:
              INC i 1
              MOV A,i 1
              CJNE A,#250,?C0001 2
              RET 2

              Cột số bên phải chính là số chu kỳ của lệnh, theo đoạn lệnh này thì có một phần được lặp lại và một phần chỉ thực hiện một lần duy nhất. Nếu bác muốn tính khoảng delay thì phải tính được cần có bao nhiêu chu kỳ máy ứng với khoảng đó rồi áp dụng vào để tính số vòng lặp trên. Nếu số chu kỳ quá lớn tức số vòng lặp lớn hơn 255 thì bác phải dùng hai vòng lặp for. Nếu dùng hai vòng lặp thì mã lệnh sẽ như sau:

              CALL 2

              CLR A 1
              MOV i,A 1
              LOOP1:
              CLR A 1
              MOV j,A 1
              LOOP2:
              INC j 1
              MOV A,j 1
              CJNE A,#232,LOOP2 2
              INC i 1
              MOV A,i 1
              CJNE A,#128,LOOP1 2
              RET 2

              Cũng phương pháp tính như trên thì bác sẽ biết được giá trị của từng vòng lặp như thế nào.
              Cách dùng một vòng lặp với biến kiểu int (như ví dụ của bác) thì mã lệnh sẽ như sau:
              ======================================
              5 void delay()
              6 {
              7 1 unsigned int i;
              8 1 for(i = 0; i < 33000; i++);
              9 1 }
              ======================================
              ; FUNCTION delay (BEGIN)
              ; SOURCE LINE # 5
              ; SOURCE LINE # 6
              ; SOURCE LINE # 8
              ;---- Variable 'i' assigned to Register 'DPTR' ----
              0000 900000 MOV DPTR,#00H
              0003 ?C0001:
              0003 AF82 MOV R7,DPL
              0005 AE83 MOV R6,DPH
              0007 E4 CLR A
              0008 FC MOV R4,A
              0009 FD MOV R5,A
              000A 7BE8 MOV R3,#0E8H
              000C 7A80 MOV R2,#080H
              000E F9 MOV R1,A
              000F F8 MOV R0,A
              0010 D3 SETB C
              0011 120000 E LCALL ?C?SLCMP
              0014 4003 JC ?C0004
              0016 A3 INC DPTR
              0017 80EA SJMP ?C0001
              ; SOURCE LINE # 9
              0019 ?C0004:
              0019 22 RET
              ; FUNCTION delay (END)

              Cái này thì tui bó tay vì không biết cái dòng lệnh LCALL ?C?SLCMP làm như thế nào.

              Tóm lại, cách tạo delay này không chính xác, chỉ áp dụng được với những bài toán không cần độ chính xác về thời gian lắm. Nếu muốn delay chính xác thì phải dùng Timer hoặc RTC.
              Chúc bác thành công.
              Thân ái.
              Đường đến những ngày vinh quang không còn xa
              Con đường chúng ta... chúng ta đã chọn.

              Comment


              • Nguyên văn bởi cong1810 Xem bài viết
                ô! cho em hỏi toán tử "<<" này làm gì vậy? và mình dùng câu lệnh nào tương đương với lệnh RR hay Rl của assembler? em đang cần dịch bít nên các sư huynh chỉ giáo!!1
                Hi,
                Dấu '<<' tương đương với dịch sang trái trong ASM
                Dấu '>>' tương đương với dịch phải trong ASM
                Tuy nhiên trong Keil C thì thuận lợi hơn ASM, ví dụ: Bác muốn dịch biến Temp sang trái 3 bit thì mã lệnh là:
                Temp <<= 3;
                Còn trong ASM bác phải dùng vòng lặp để dịch 3 lần hoặc là thực hiện 3 lệnh dịch liên tiếp.

                Muốn quay thì bác phải dùng hàm _cror_, _crol_ cho biến kiểu char, _irol_, _iror_ cho kiểu int và _lrol_, _lror_ cho kiểu long.
                Ví dụ muốn quay trái biến Temp 3 bit ta dùng mã:
                Temp = _crol_(Temp, 3);
                Bác nhớ #include <intrins.h> trước khi dùng các hàm này.

                Thân ái.
                Last edited by Hard; 12-03-2008, 09:58.
                Đường đến những ngày vinh quang không còn xa
                Con đường chúng ta... chúng ta đã chọn.

                Comment


                • Nguyên văn bởi cong1810 Xem bài viết
                  hic!!ko ai giải thích dùm em vậy!!
                  cho em hỏi ; trong keil C làm sao mình có thể truy xuất các giá trị của các thanh ghi R0,R1,.. mình phải include thư viện nào vậy! em tìm trong atmel mà ko thấy. em dùng 89c51. sư huynh nào chỉ dùm em với. thanks!!!
                  Hi,
                  Các thanh ghi này được Keil C gán giá trị các biến trong quá trình thực thi. Bác nên khai báo biến mà dùng cho dễ nhớ và dễ hiểu tội gì phải nhớ R1, R2 là cái gì cho mệt, mình đang làm trên ngôn ngữ C chứ có phải là ASM đâu. Cái gì trong ASM có thì trong Keil cũng có cách để làm, bác nên tư duy theo hướng ngôn ngữ C đừng nghĩ tới ASM làm gì nữa. Trước đây tui cũng rất nghiền ASM và xem nhẹ C nhưng khi làm việc với C và xem xét kỹ thì thấy Keil C biên dịch mã khá tối ưu so với các trình biên dịch khác như microC, sdcc, vv...
                  Thân ái
                  Đường đến những ngày vinh quang không còn xa
                  Con đường chúng ta... chúng ta đã chọn.

                  Comment


                  • mình đang làm bài tập về Asembler có 1 bài toán là hãy vẽ mô phỏng chuyển động của chiếc xe đạp . ai biết thì cho mình với

                    Comment


                    • mình đang làm bài tập veAsembler vẽ mô phỏng chuyển động của chiếc xe đạp, ai biết chỉ cho mình với. thanks

                      Comment


                      • help me
                        tui có viết thử một chương trình như sau
                        ===============================================
                        #include <REGX51.H>
                        #define high(x) (((65536-x) & 0xFF00) >> 8)
                        #define low(x) ((unsigned char)(65536-x))
                        void delay (unsigned int time)
                        { while (time--)
                        { TMOD = 0X01;
                        TH0 = high(1000);
                        TL0 = low(1000);
                        TF0 = 0;
                        TR0 = 1;
                        while(!TF0);
                        TR0 = 0;
                        }
                        }
                        main ()
                        {
                        char x,y; //khai bao int or char chay khong bi loi, unsigned int or unsigned char bi lois
                        char A[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
                        P0 = 0xff; //tat port 0
                        P1 = 0xff; //tat port 1
                        P2 = 0xff; //tat port 2
                        P3 = 0xff; //tat port 3
                        while (1)
                        {
                        //----------------------------------------
                        //sang dan tu duoi len tren, tat dan tu tren xuong duoi
                        for (x=3;x>=0;x--) //sang dan
                        for (y=7;y>=0;y--)
                        { if (x==3) P3 = A[y];
                        if (x==2) P2 = A[y];
                        if (x==1) P1 = A[y];
                        if (x==0) P0 = A[y];
                        delay (100);
                        }
                        delay(100);
                        for (x=3;x>=0;x--) //tat dan
                        for(y=1;y<=8;y++)
                        { if (x==3) P0 = A[y];
                        if (x==2) P1 = A[y];
                        if (x==1) P2 = A[y];
                        if (x==0) P3 = A[y];
                        delay (100);
                        }
                        }
                        }
                        minh da lam di lam lai nhiều lần, nếu khai báo là char/int x,y; thì không sao
                        nhưng nếu thêm unsigned vô thì cái này nó không chạy

                        for (x=3;x>=0;x--) //sang dan
                        for (y=7;y>=0;y--)
                        { if (x==3) P3 = A[y];
                        if (x==2) P2 = A[y];
                        if (x==1) P1 = A[y];
                        if (x==0) P0 = A[y];
                        delay (100);
                        }

                        Comment


                        • lần trước đã có hỏi rồi nhưng chưa thấy ai trả lời dùm
                          rất mong được các bạn chỉ cho mình biết tại sao đi

                          Comment


                          • Nguyên văn bởi Kiên Hoàng Xem bài viết
                            Mình thức đến 1h30 sáng để làm cho bạn đấy...
                            Code: đây
                            Code:
                            #include <REGX51.H>
                             void delay (unsigned int ms)
                             {  unsigned int i;
                                 unsigned char j;
                                  for(i=0;i<ms;i++)
                                   for(j=0;j<30;j++);{}
                               }
                             void main(void)
                            { unsigned int x,y,m,n;
                              unsigned int AA[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};
                              unsigned int dd[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
                             while (1)
                            {   
                              P0=P1=P2=P3=0xff;
                               for (x=0;x<=2;x++)
                                    for (y=0;y<=7;y++)
                                      { if (x==0)P3 = AA[y];
                                        if (x==1)P2 = AA[y];
                                        if (x==2)P1 = AA[y];
                                        delay (1000);}
                              P0=P1=P2=P3=0x00;
                               for (m=0;m<=2;m++)
                                  for (n=0;n<=7;n++)
                                     { if(m==0)P1 = dd[n];
                                       if(m==1)P2 = dd[n];
                                       if(m==2)P3 = dd[n];
                                       delay (1000);}
                                      } 
                            	}
                            Chạy ngon rồi...Ảnh đây.... nhấn nút cám ơn đi....
                            Xin lỗi vì đã lâu mình không lên mạng để cảm ơn bạn được, rât cảm ơn nhưng ta có thể khai báo chỉ một mảng thôi, không cần phải khai báo hai mảng, nhưng mình gặp rắc rối ở chỗ là
                            main ()
                            {
                            unsigned char i,j; //khai báo int or char chạy không bị lỗi, unsigned int or unsigned char bị lỗi
                            // char A[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
                            P0 = 0xff;
                            P1 = 0xff;
                            P2 = 0xff;
                            P3 = 0xff;
                            while (1)
                            {
                            for (x=3;x>=0;x--) //bị lỗi ở vòng for này
                            for (y=7;y>=0;y--)
                            { if (x==3) P3 = A[y];
                            if (x==2) P2 = A[y];
                            if (x==1) P1 = A[y];
                            if (x==0) P0 = A[y];
                            delay (100);
                            }
                            for (x=3;x>=0;x--)
                            for(y=1;y<=8;y++)
                            { if (x==3) P0 = A[y];
                            if (x==2) P1 = A[y];
                            if (x==1) P2 = A[y];
                            if (x==0) P3 = A[y];
                            delay (100);
                            }
                            }

                            Comment


                            • Nguyên văn bởi khachau306 Xem bài viết
                              help me
                              tui có viết thử một chương trình như sau
                              ===============================================
                              Code:
                              #include <REGX51.H>
                              #define high(x) (((65536-x) & 0xFF00) >> 8)
                              #define low(x) ((unsigned char)(65536-x))
                              void delay (unsigned int time)
                              {   while (time--)
                              	{   TMOD = 0X01;
                              		TH0 = high(1000);
                              		TL0 = low(1000);
                              		TF0 = 0;
                              		TR0 = 1;
                              		while(!TF0);
                              		TR0 = 0;
                              	}
                              }
                              main ()
                              {
                                  char x,y; //khai bao int or char chay khong bi loi, unsigned int or unsigned char bi lois
                                  char A[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
                                  P0 = 0xff; //tat port 0
                                  P1 = 0xff; //tat port 1
                                  P2 = 0xff; //tat port 2
                                  P3 = 0xff; //tat port 3
                                  while (1)
                                  {   
                              //----------------------------------------
                              //sang dan tu duoi len tren, tat dan tu tren xuong duoi        
                                     for (x=3;x>=0;x--) //sang dan
                                          for (y=7;y>=0;y--)
                                          {   if (x==3)   P3 = A[y];
                                              if (x==2)   P2 = A[y];
                                              if (x==1)   P1 = A[y];
                                              if (x==0)   P0 = A[y];
                                              delay (100);
                                          }
                                      delay(100);
                                      for (x=3;x>=0;x--) //tat dan
                                          for(y=1;y<=8;y++)
                                          {   if (x==3)   P0 = A[y];
                                              if (x==2)   P1 = A[y];
                                              if (x==1)   P2 = A[y];
                                              if (x==0)   P3 = A[y];
                                              delay (100);
                                          }  
                                  }
                              }
                              minh da lam di lam lai nhiều lần, nếu khai báo là char/int x,y; thì không sao
                              nhưng nếu thêm unsigned vô thì cái này nó không chạy

                              Code:
                              for (x=3;x>=0;x--) //sang dan
                                          for (y=7;y>=0;y--)
                                          {   if (x==3)   P3 = A[y];
                                              if (x==2)   P2 = A[y];
                                              if (x==1)   P1 = A[y];
                                              if (x==0)   P0 = A[y];
                                              delay (100);
                                          }
                              Bạn sửa x-- và y-- thành --x và --y xem nó có chạy ko?
                              AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                              Xem thêm tại Online Store ---> Click here
                              Mob: 0982.083.106

                              Comment


                              • Nếu mình đổi lại thành --x và --y thì nó sẽ giảm x rồi mới thực hiện vòng for đúng không, nếu như vậy thì không được, và mình mới thử xong cũng không được luô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