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

  • Thạch anh cho 89xxx

    Có bạn nào thấy sự khác nhau khi dùng thạch anh 12M và 11.059M?
    Trước giờ mình vẫn quen sử dụng loại 11.059M (do lúc còn đi học thầy bảo thế). Mình thấy các tài liệu thường đề cập đến loại 12M thôi. Nếu dùng ngắt Timer thì sử dụng loại thạch anh nào sẽ chính xác hơn?
    Có một điều thú vị nữa là bên cạnh thạch anh 24M vẫn có thạch anh 22.118 (11.059x2). Mình thấy có 1 board mạch của Máy chạy bộ (U.S.A) sử dụng loại thạch anh 22.118 đấy nhé (cho con VXL có 4 hàng chân, mình không nhớ rõ lắm)
    Các bạn giải thích giùm nhé.
    Last edited by trong123; 08-04-2008, 00:34.
    Không TÔI là kẻ phàm phu
    Cái TÔI quá lớn làm ngu muội mình!
    - 0983.886.113

    Comment


    • Chế độ nghỉ và nguồn giảm của 89xxx

      Mình đọc sách thấy 89xxx có chế độ nghỉ và chế độ nguồn giảm, có bạn nào test thử vấn để này chưa?
      Chúng ta cùng nhau thảo luận nào!
      Không TÔI là kẻ phàm phu
      Cái TÔI quá lớn làm ngu muội mình!
      - 0983.886.113

      Comment


      • Trước giờ mình vẫn quen sử dụng loại 11.059M (do lúc còn đi học thầy bảo thế). Mình thấy các tài liệu thường đề cập đến loại 12M thôi. Nếu dùng ngắt Timer thì sử dụng loại thạch anh nào sẽ chính xác hơn?

        Thạch anh 11,0592M dùng trong hoạt động truyền nhận dữ liệu
        Ta có tốc độ truyền nhận được tính như trong hình, nếu dùng 12M sẽ cho ra số lẻ, còn dùng 11,0592 sẽ là các số chẵn

        Có một điều thú vị nữa là bên cạnh thạch anh 24M vẫn có thạch anh 22.118 (11.059x2). Mình thấy có 1 board mạch của Máy chạy bộ (U.S.A) sử dụng loại thạch anh 22.118 đấy nhé (cho con VXL có 4 hàng chân, mình không nhớ rõ lắm)

        Mình không biết là có những loại này nữa nhưng chắc cũng giống như trên thôi.
        He he, không biết mình nói có đúng không, mong các cao thủ chỉ giáo thêm

        Comment


        • Bạn khachau306 ơi, không biết bài viết của mình có lạc Box không mà sao không thấy cao thủ nào ghé vào hướng dẫn cho anh em mình hiểu rõ hơn nhỉ.
          Nếu ai biết Box nào khác thảo luận về vấn đề này, chỉ giùm nhé, thanks!
          Không TÔI là kẻ phàm phu
          Cái TÔI quá lớn làm ngu muội mình!
          - 0983.886.113

          Comment


          • Nguyên văn bởi trong123 Xem bài viết
            Mình đọc sách thấy 89xxx có chế độ nghỉ và chế độ nguồn giảm, có bạn nào test thử vấn để này chưa?
            Chúng ta cùng nhau thảo luận nào!
            Tớ chỉ biết chế độ nghỉ thôi ! lệnh là PCON=IDL_ , VDK chỉ thức dậy khi có ngắt , còn ko thì ngủ luôn còn chế độ nguồn giảm có vẻ hay hơn nhỉ nhưng tớ chưa biết.
            Các cao thủ chuyển qua con khác hết rồi ! còn dùng 89 nữa đâu
            Cung cấp Oscilocope , Inverter , Switching , DC power supply , AC millivolt meter ....

            Comment


            • Nguyên văn bởi VNarmy Xem bài viết
              Phép quay thì trong C ko có. Em có thể dùng inline để cài ASM vào hoặc viết đơn giản như sau:
              Code:
              unsigned char RotateRight(unsigned char A, i){
              unsigned char tmp1, tmp2;
              tmp1=A;
              A>>=i;
              tmp2=A;
              A=tmp1;
              A<<=(8-i);
              A|=tmp2;
              return(A);
              }
              Phép quay trái em có thể tự viết nhé.
              anh có thể giải thích em đoạn code giao tiếp 24c08 và 8051 trong đó có lệnh (>>)
              Code:
              /*--------Read data in address "AddrR"-------*/
              unchar ReadByte(unint AddrR)
                { unchar dr;
                  RdByte:
                      SetStart();
                      dr=((AddrR >> 7) & 0x06)| D_ADDR;
                      OutByte(dr);
                      if(ACK==1) goto RdByte;
                      OutByte(AddrR & 0xff);
                      if(ACK==1) goto RdByte;
                      ACK=1; while(ACK==1) {SetStart(); OutByte(dr | 1);}
              
                      dr=InByte();
                      SetStop();
                      return dr;
                }
              //D_ADDR=0xA0
              Last edited by VNarmy; 17-04-2008, 20:17.
              |

              Comment


              • Nguyên văn bởi dienhoahd Xem bài viết
                anh có thể giải thích em đoạn code giao tiếp 24c08 và 8051 trong đó có lệnh (>>)
                Code:
                /*--------Read data in address "AddrR"-------*/
                unchar ReadByte(unint AddrR)
                  { unchar dr;
                    RdByte:
                        SetStart();
                        dr=((AddrR >> 7) & 0x06)| D_ADDR;
                        OutByte(dr);
                        if(ACK==1) goto RdByte;
                        OutByte(AddrR & 0xff);
                        if(ACK==1) goto RdByte;
                        ACK=1; while(ACK==1) {SetStart(); OutByte(dr | 1);}
                
                        dr=InByte();
                        SetStop();
                        return dr;
                  }
                //D_ADDR=0xA0
                Tức là dịch phải 7 bit thôi.
                Còn &0x06 sẽ chỉ giữ lại bit số 2 và số 1 đồng thời xóa các bit còn lại.
                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


                • Nguyên văn bởi dhl Xem bài viết
                  Time_0() interrupt 1
                  {
                  if (--time1==0)
                  {
                  time1=set_time1;
                  if (--time2==0)
                  {
                  flagC=1;
                  TR0=0;
                  }
                  }
                  }

                  Time_1() interrupt 3
                  {

                  if(++dem_taoxung>=taoxung)
                  {
                  dem_taoxung=0;

                  if (tocdo_dcTrai!= dung)
                  {if (chieuquaydcTrai) {dkdcTrai_f=1;dkdcTrai_b=0;} else {dkdcTrai_f=0;dkdcTrai_b=1;}}
                  if (tocdo_dcPhai!=dung)
                  {if (chieuquaydcPhai) {dkdcPhai_f=1;dkdcPhai_b=0;} else {dkdcPhai_f=0;dkdcPhai_b=1;}}
                  if (tocdo_dcNang!=dung)
                  {if (chieuquaydcNang) {dkdcNang_f=1;dkdcNang_b=0;} else {dkdcNang_f=0;dkdcNang_b=1;}}
                  if (tocdo_dcGap!=dung)
                  {if (chieuquaydcGap) {dkdcGap_f=1;dkdcGap_b=0;} else {dkdcGap_f=0;dkdcGap_b=1;}}
                  }

                  if (dem_taoxung>=tocdo_dcTrai) {dkdcTrai_f=0;dkdcTrai_b=0;}
                  if (dem_taoxung>=tocdo_dcPhai) {dkdcPhai_f=0;dkdcPhai_b=0;}
                  if (dem_taoxung>=tocdo_dcNang) {dkdcNang_f=0;dkdcNang_b=0;}
                  if (dem_taoxung>=tocdo_dcGap) {dkdcGap_f=0;dkdcGap_b=0;}

                  ++demgiay;
                  {if (++time>=10000)
                  {
                  time=0;
                  ++demgiay;
                  if (++giay>=60)
                  {
                  giay=0;
                  ++phut;
                  }
                  }
                  }
                  }
                  các bác cho em hoi đoạng trương trinh này vi sao cứ báo lỗi syntax error enaer'='
                  Hi,
                  Trước mấy cái hàm (function) interrupt, bác thêm chữ 'void' vô thì nó sẽ hết báo lỗi ngay mà.
                  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 trong123 Xem bài viết
                    Có bạn nào thấy sự khác nhau khi dùng thạch anh 12M và 11.059M?
                    Trước giờ mình vẫn quen sử dụng loại 11.059M (do lúc còn đi học thầy bảo thế). Mình thấy các tài liệu thường đề cập đến loại 12M thôi. Nếu dùng ngắt Timer thì sử dụng loại thạch anh nào sẽ chính xác hơn?
                    Có một điều thú vị nữa là bên cạnh thạch anh 24M vẫn có thạch anh 22.118 (11.059x2). Mình thấy có 1 board mạch của Máy chạy bộ (U.S.A) sử dụng loại thạch anh 22.118 đấy nhé (cho con VXL có 4 hàng chân, mình không nhớ rõ lắm)
                    Các bạn giải thích giùm nhé.
                    Hi,
                    Nếu các bác muốn dùng định thời chính xác thì nên dùng thạch anh 12M vì 1 chu kỳ máy được tính bằng 1/12 OSC = 1us khi đó sẽ chính xác hơn và dễ tính toán hơn. Tương tự với thạch anh 24M thì 1 chu kỳ máy sẽ là 0,5us. Các thạch anh 11.059M và 22.1184M chỉ thích hợp với các ứng dụng có giao tiếp nối tiếp vì nó cho phép tạo ra tốc độ baud chính xác 100% và có thể truyền số liệu ở tốc độ cao 115200 baud đến 23400baud (tăng gấp đôi bởi cờ... đấy). Nếu dùng thạch anh 12M để tạo tốc độ baud thì ở tốc độ 9600 đã sai 4% (không nhớ chính xác) rồi.
                    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


                    • các anh cho em hỏi: trong keil C viết số dạng nhị phân như thế nào? em đọc help của nó thấy ghi dạng thế này: 10101010y; mà làm thì nó báo lỗi "y undefined identifier"
                      Phạm Minh Tuấn

                      (+84) 982006467

                      Comment


                      • Nguyên văn bởi trong123 Xem bài viết
                        Mình muốn khai báo 1 mảng gồm các phần tử (dạng chuỗi): Giay1, Giay2, Phut1, Phut2, Gio1, Gio2
                        Vd:
                        unsigned char a;
                        a=DuLieu[1];
                        Mình muốn khi chạy CT: a có giá trị là giay1

                        Mình khai báo theo các kiểu sau đây, nhưng khi Build Target đều bị báo lỗi:
                        char const DuLieu[6]={Giay1,Giay2,Phut1,Phut2,Gio1,Gio2};
                        char const DuLieu[6]={'Giay1','Giay2','Phut1','Phut2','Gio1','Gio2'};
                        char const DuLieu[6]={"Giay1","Giay2","Phut1","Phut2","Gio1","Gio2"} ;
                        Còn khai báo theo kiểu dưới đây thì Build target không bị lỗi nhưng sau khi nạp chương trình, test mạch thì bị sai.
                        char const DuLieu[6]={&Giay1,&Giay2,&Phut1,&Phut2,&Gio1,&Gio2};

                        Các bạn giúp mình nhé!
                        Hi,
                        Bác khai báo kiểu đó không lỗi mới lạ, bác phải làm kiểu thế này:
                        const unsigned char DuLieu[] =
                        { 0x01, 0x02, 0x04, 0x08 }; // Gan gia tri ngay khi khai bao
                        hoặc
                        const unsigned char DuLieu[6];
                        Như vậy khi truy cập mảng thì bác dùng biến DuLieu[x] tương ứng với phần tử bác cần truy cập.
                        Bác khai báo kiểu này: char const DuLieu[6]={"Giay1","Giay2","Phut1","Phut2","Gio1","Gio2"} ; càng sai trầm trọng
                        Tui có thể hiểu ý của bác là
                        Giay1 thay cho DuLieu[0],
                        Giay2 thay cho DuLieu[1],...
                        Như vậy thì bác có thể khai báo
                        const unsigned char DuLieu[6];
                        Sau đó bác dùng cách define như sau:
                        #define Giay1 DuLieu[0]
                        #define Giay2 DuLieu[1]
                        #define Phut1 DuLieu[2]
                        #define Phut2 DuLieu[3]
                        #define Gio1 DuLieu[4]
                        #define Gio2 DuLieu[5]

                        Bây giờ bác có thể sử dụng các biến Gio, Phut, Giay trong mã nguồn của mình.
                        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 Hard Xem bài viết
                          Hi,
                          Bác khai báo kiểu đó không lỗi mới lạ, bác phải làm kiểu thế này:
                          const unsigned char DuLieu[] =
                          { 0x01, 0x02, 0x04, 0x08 }; // Gan gia tri ngay khi khai bao
                          hoặc
                          const unsigned char DuLieu[6];
                          Như vậy khi truy cập mảng thì bác dùng biến DuLieu[x] tương ứng với phần tử bác cần truy cập.
                          Bác khai báo kiểu này: char const DuLieu[6]={"Giay1","Giay2","Phut1","Phut2","Gio1","Gio2"} ; càng sai trầm trọng
                          Tui có thể hiểu ý của bác là
                          Giay1 thay cho DuLieu[0],
                          Giay2 thay cho DuLieu[1],...
                          Như vậy thì bác có thể khai báo
                          const unsigned char DuLieu[6];
                          Sau đó bác dùng cách define như sau:
                          #define Giay1 DuLieu[0]
                          #define Giay2 DuLieu[1]
                          #define Phut1 DuLieu[2]
                          #define Phut2 DuLieu[3]
                          #define Gio1 DuLieu[4]
                          #define Gio2 DuLieu[5]
                          Cho mình ý kiến nhé, tại sao lại không dùng thế này nhỉ
                          struct times
                          {
                          unsigned char gio[2];
                          unsigned char phut[2];
                          unsigned char giay[2];
                          };

                          struct times DuLieu[6] =
                          {{{0x00,0x01},{0x10,0x11},{0x20,0x21}},
                          {{0x02,0x03},{0x12,0x13},{0x22,0x23}},
                          {{0x04,0x05},{0x14,0x15},{0x24,0x25}},
                          {{0x06,0x07},{0x16,0x17},{0x26,0x27}},
                          {{0x08,0x09},{0x18,0x19},{0x28,0x29}},
                          {{0x0a,0x0b},{0x1a,0x1b},{0x2a,0x2b}}} ;
                          và bây giờ sử dụng nó thế này
                          unsigned char aData = DuLieu[0].gio[0]; //aData = 0x00
                          unsigned char bData = Dulieu[0].phut[1]; //bData = 0x11
                          unsigned char cData = DuLieu[5].giay[1]; //cData = 0x2b
                          Bạn có thể gán ngược cho lại cho cái table của mình dễ dàng
                          Ah, nhớ #include<stddef.h>
                          Last edited by minhtuan04; 22-04-2008, 03:53. Lý do: Thiếu cái dzụ #include<stddef.h>
                          Diễn đàn Vi điều khiển:

                          Comment


                          • Hi,
                            Đúng thế, thông thường người ta lập trình với các biến thời gian đều sử dụng kiểu cấu trúc (struct) để dể hiểu và đơn giản trong việc truy xuất. Tuy nhiên ở đây bác trong123 muốn làm theo kiểu mảng nên tui cũng làm theo kiểu mảng luôn để bác trong123 biết lập trình với kiểu mảng. Nếu bác trong123 đã làm được với kiểu mảng rồi thì nên chuyển qua làm kiểu cấu trúc như bác minhtuan hướng dẫn. 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 Hard Xem bài viết
                              Hi,
                              Đúng thế, thông thường người ta lập trình với các biến thời gian đều sử dụng kiểu cấu trúc (struct) để dể hiểu và đơn giản trong việc truy xuất. Tuy nhiên ở đây bác trong123 muốn làm theo kiểu mảng nên tui cũng làm theo kiểu mảng luôn để bác trong123 biết lập trình với kiểu mảng. Nếu bác trong123 đã làm được với kiểu mảng rồi thì nên chuyển qua làm kiểu cấu trúc như bác minhtuan hướng dẫn. Chúc bác thành công.
                              Thân ái.
                              Thanks bạn đã giúp đỡ, tại vì mình chưa rành về kiểu cấu trúc. Sau khi làm mảng chạy tốt, mình sẽ thử với kiểu cấu trúc như các bạn hướng dẫn.
                              Không TÔI là kẻ phàm phu
                              Cái TÔI quá lớn làm ngu muội mình!
                              - 0983.886.113

                              Comment


                              • Ban oi co the send cho minh 1 so bai tap ve C cho 89C51 ko? Cac bai co ban ve Led, Led 1 doan, phim nhan.cam on ban rat nhieu,minh thich mon nay lam nhung moi hoc nen chua biet nhieu

                                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