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

  • Nguyên văn bởi daominhchien Xem bài viết
    bạn hoang_hai hình như ko biết bấm nút màu vàng hay sao ý
    dạo này ở trường bạn quá ko lên diễn đàn dc
    ma cha thấy ai giúp đỡ mình cả nên cũng nản ko muốn lên nữa
    còn bấm nut vàng thì đơn giản thôi
    chả có j khó khăn cả nhưng phải giúp đúng luc thì mới cảm ơn chứ chả lẽ cứ bấm lung tung len thì thành .....

    Comment


    • [QUOTE=Trích:
      Nguyên văn bởi vubinhtn04
      tài liệu của bạn huy vô cùng bổ ích và lý thú cảm ơn nhìu'. mong phát huy tối đa

      quá khen ,bạn Bình đưa tôi lên mây mất rồi. Cảm ơn lời khên của bạn, không biết tài liệu của tôi có giúp gì cho bạn không

      [/QUOTE]

      mình thấy bạn vubinh11 nói quả ko sai
      đọc các giải đáp của tienhuypro mình hiểu được nhiều thứ lắm
      cảm ơn tienhuypro nhìu mong tienhuypro phát huy tối đa và share kiến thức cho mọi người được tầm sư học đạo

      Comment


      • Nguyên văn bởi le hung dung Xem bài viết
        mình thấy bạn vubinh11 nói quả ko sai
        đọc các giải đáp của tienhuypro mình hiểu được nhiều thứ lắm
        cảm ơn tienhuypro nhìu mong tienhuypro phát huy tối đa và share kiến thức cho mọi người được tầm sư học đạo
        không biết lehungdung là ai mà cứ khen tôi hoài thế, thẹn quá

        Email:
        Tel: 0983.497.310

        Comment


        • Kìa ! Là 2 girl đó.
          Đợt này trúng mánh rồi, xin chúc mừng

          Comment


          • Nguyên văn bởi ngohaibac Xem bài viết
            Chào các bạn, hôm nay tôi xin giới thiệu cho các bạn một hàm nữa là các hàm ngắt.

            Trong 8051 có 5 nguyên nhân sinh ra ngắt: ngắt ngoài 0, timer0, ngắt ngoài 1, timer1, ngắt nối tiếp.

            Các bạn lại mở file regx51.h ra ở phần cuối của file như sau:

            Code:
            /*------------------------------------------------
            Interrupt Vectors:
            Interrupt Address = (Number * 8) + 3
            ------------------------------------------------*/
            #define IE0_VECTOR	0  /* 0x03 External Interrupt 0 */
            #define TF0_VECTOR	1  /* 0x0B Timer 0 */
            #define IE1_VECTOR	2  /* 0x13 External Interrupt 1 */
            #define TF1_VECTOR	3  /* 0x1B Timer 1 */
            #define SIO_VECTOR	4  /* 0x23 Serial port */
            Địa chỉ của ngắt trong bảng vector ngắt = 8 * số thứ tự ngắt + 3,

            số thứ tự ngắt = 0,1,2,3,4 như kí hiệu trong file đó. Như vậy địa chỉ trong RAM từ 0x03 đến 0x30 là dành cho bảng vector ngắt.

            Cú pháp của hàm thực hiện ngắt như sau, hàm này không có tham số, không có kiểu trả về nên là dạng
            Code:
            void tềnham(void)
            Cú pháp chính như sau:

            Code:
            void inter0(void) interrupt 0 using 1{
            
            }  // ngắt ngoài 0, dùng bank 1
            Tương tự với các ngắt khác. Bạn thay số 0 bằng số thứ tự các ngắt tương ứng các ngắt tương ứng.

            Code:
            void inter1(void) interrupt 1 using 1{
            }
            
            void inter2(void) interrupt 2 using 1{
            }
            Tiếp tục với 2 ngắt còn lại

            Các bạn lưu ý là để vdk nhảy đến bảng vector ngắt thì bạn phải enable ngắt đó.

            Ví dụ: bạn muốn ngắt nối tiếp thì phải cho như sau:
            Các bạn xem lạ thanh ghi IE ở trong file regx51.h, thanh ghi này định được địa chỉ bit

            Code:
            EA = 1;// cho phép dùng ngắt
            ES = 1;// dùng ngắt nối tiếp
            Mai tôi sẽ viết tiếp. Bọn FPT chưa mắc ADSL cho nên viết bài hơi chậm, mong thông cảm, đợi vài ngày nữa khi mắc rồi mình sẽ viết bài liên tục về chủ đề này. Cung phu hơn nữa.

            Chúc các bạn thành công

            Comment


            • Nguyên văn bởi iamchenjen Xem bài viết
              Kìa ! Là 2 girl đó.
              Đợt này trúng mánh rồi, xin chúc mừng
              Không biết có phải là girl hay không nữa mà nghe cái tên ớn quá, Lê Hùng Dũng. khekhe

              Email:
              Tel: 0983.497.310

              Comment


              • Nguyên văn bởi tienhuypro Xem bài viết
                Không biết có phải là girl hay không nữa mà nghe cái tên ớn quá, Lê Hùng Dũng. khekhe
                chắc là 2 đứa em gái hoặc e gái và ghẹ nó. xông vô đi ka ka . đợt này trúng mánh rồi he he. nếu được share bớt một em hen

                Comment


                • chào các pác !
                  đề tài đồ án của mình "xếp hàng tự động dùng động cơ bước"
                  vậy pác nào có tài liệu về đề tài này xin hãy send cho mình với !
                  gui về địa chỉ nguyendieppro@gmail.com
                  cám ơn các pác rất nhiều !


                  Comment


                  • Tôi có 1 chút tài liệu về ĐCB nè, bạn vọc thoải mái nhé:
                    http://www.mediafire.com/?ybjlvzjn2tk
                    Chúc vui!
                    ThươngPhạm
                    MT05 - HCM UTE - EDU - VN

                    Comment


                    • Nguyên văn bởi ngohaibac Xem bài viết
                      Mình sửa qua về cú pháp cho bạn nhé.

                      Code:
                      #include <AT89x52.H> // thay bằng #include "regx52.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;
                                          
                                        }
                               }
                       }        
                      main()
                      {
                         if (P0!=0xFF)  P1_0=0;
                         {
                           if (P0_0 ==0)    P1_1=0;
                          elseif (P0_1==0)  P1_2=0; // thay elseif = else if
                          elseif (P0_2==0)  P1_3=0; // tương tự
                          elseif (P0_3==0)  P1_4=0;
                          elseif (P0_4==0)  P1_5=0;
                          //Endif  // làm gì có endif :D.
                        }
                      
                       delay(10);
                         P1=0xFF; P0=0xFF
                         //goto main() ;       // trời đất làm gì có goto main(), muốn nhảy tại chỗ chỉ cần  while(1);
                      }

                      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 đó.

                      Nếu theo ý của bạn là dùng lặp trong main thì bạn nên cho toàn bộ code đó vào trong vòng lặp như sau:
                      Code:
                      while(1){
                       
                      }
                      Để mình xem kĩ lại xem vì thấy chương trình viết lung tung, chắc bạn chưa học C thì phải, ngôn ngữ viết giống viết với Matlab quá.

                      Chúc bạn thành công.
                      Anh ngohaibac ơi, em thấy anh trả lời nhiều bài về keil c hay quá, em cũng học được khá nhiều đấy. Anh có thể xem giúp em đoạn code sau đây sai chổ nào không mà em mô phỏng trên proteus thì nó chạy lung tung, đây code đếm sản phẩm, em dùng ngắt ngoài 0 để tăng số đếm lên 1 khi có sp đi qua, còn ngắt timer0 dùng để hiển thị sp. Thanks. !

                      Comment


                      • Nguyên văn bởi toilq30 Xem bài viết
                        Anh ngohaibac ơi, em thấy anh trả lời nhiều bài về keil c hay quá, em cũng học được khá nhiều đấy. Anh có thể xem giúp em đoạn code sau đây sai chổ nào không mà em mô phỏng trên proteus thì nó chạy lung tung, đây code đếm sản phẩm, em dùng ngắt ngoài 0 để tăng số đếm lên 1 khi có sp đi qua, còn ngắt timer0 dùng để hiển thị sp. Thanks. !
                        // khai bao Header
                        #include<reg51.h>
                        #include<stdio.h>

                        #define m 3 // dinh nghia m de sau nay tien cho viec chinh sua thoi gian quyet led
                        // Khai bao Bit can dung
                        sbit start = P0^0; // nut nhan bat dau
                        sbit Led1 = P1^0; // Cac dau ra quyet led
                        sbit Led2 = P1^1;
                        sbit Led3 = P1^2;
                        sbit Led4 = P1^3;
                        sbit Led5 = P1^4;
                        sbit Led6 = P1^5 ;

                        const unsigned char M[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0}; // Ma data cua led 7 thanh anode chung
                        unsigned int sp1; //bien dem so san phan/thùng, max = 24
                        unsigned long int sp2; // bien dem so thung/ngày , max = 9999
                        unsigned int thousand2,hundred2,tens2,unit2,tens1,unit1;

                        // Ham tao tre de quyet led, ham nay chi mang tinh chat tao tre, chu thoi gian thuc trong ham khong dung voi thoi gian tre thuc su trong VDK
                        void delay_ms(unsigned int time)
                        {
                        unsigned int i;
                        unsigned int j;
                        for(i = time;i>0;i--)
                        for(j=0;j<300;j++);
                        }
                        // Ham xoa Led de giam hieu ung chop cua LED ( Do lech so voi tan so nhin thay cua mat )
                        void clear_led(void)
                        {
                        P1=0xFF;
                        P2=0xFF;
                        }
                        // Ham quet LED
                        void Display(void)
                        {
                        clear_led();
                        thousand2 = sp2/1000;

                        if (thousand2 == 0) // Neu gia tri trong hang nghin = 0 thi led hang nghin khong sang
                        clear_led();
                        else
                        { P1 = 0x1F; //Led6 = 0; Led5 = 1; Led4=1; Led3 = 1;Led2 = 1;Led1 = 1;
                        P2=M[thousand2];
                        delay_ms(m);
                        clear_led();
                        }

                        hundred2 =(sp2%1000)/100;

                        if ((thousand2 == 0)&&(hundred2 == 0)) // Neu gia tri trong hang nghin, va hang tram deu = 0 thi led hang nghin, hang tram khong sang
                        clear_led();
                        else
                        { P1 = 0x2F; //Led6 = 1; Led5 = 0; Led4=1; Led3 = 1;Led2 = 1;Led1 = 1;
                        P2=M[hundred2];
                        delay_ms(m);
                        clear_led();
                        }

                        tens2 = ((sp2%1000)%100)/10;

                        if ((thousand2 == 0)&&(hundred2 == 0)&&(tens2 == 0)) // Neu gia tri trong hang nghin, va hang tram, hang chuc deu = 0 thi led hang nghin, hang tram, hang chuc khong sang.
                        clear_led();
                        else
                        { P1 = 0x37; //Led6 = 1; Led5 = 1; Led4=0; Led3 = 1;Led2 = 1;Led1 = 1
                        P2=M[tens2];
                        delay_ms(m);
                        clear_led();
                        }

                        unit2 sp2%1000)%100)%10;
                        P1 = 0x3B; //Led6 = 1; Led5 = 1; Led4=1; Led3 = 0;Led2 = 1;Led1 = 1
                        P2=M[unit2];
                        delay_ms(m);
                        clear_led();

                        tens1 = sp1/10;
                        if (tens1 ==0)
                        clear_led();
                        else
                        {
                        P1 = 0x3D; //Led6 = 1;Led5 = 1; Led4 = 1;Led3 = 1;Led2 = 0;Led1 = 1;
                        P2=M[tens1] ;
                        delay_ms(m);
                        clear_led();
                        }
                        unit1 = (sp1%10);
                        P1 = 0x3E; //Led6 = 1;Led5 = 1; Led4 = 1;Led3 = 1;Led2 = 1;Led1 = 0;
                        P2 = M[unit1];
                        delay_ms(m);
                        clear_led();
                        }

                        // Khoi tao chuong trinh
                        void init(void)
                        {
                        TMOD=0x01; // Cho phep Timer0 hoat dong o che do timer 16 bit
                        IE=0x83; // Cho phep ngat ngoai tu chan INT0, ngat trong boi Timer0,ngat ngoai tu INT1
                        IP=0x04; // Cho phep ngat ngoai uu tien hon ngat trong
                        TH0=-5000/256; // Tre 1s
                        TL0=-5000%256;
                        sp1 = 0; //gia tri khoi tao ban dau = 0
                        sp2 = 0; // Gia tri khoi tao ban dau bang 0
                        clear_led(); // Xoa LED
                        IT0=1; // cho phep ngat bang canh xuong timer 0
                        TF0=1; // Timer0 Overfllow Flag
                        TR0=1; // Start Timer0
                        }
                        // Ham xuat gia tri ra hien thi su dung ngat Timer
                        void Outdata(void) interrupt 1
                        {
                        TR0=0;
                        Display();
                        TH0=-5000/256;
                        TL0=-5000%256;
                        TR0=1;
                        }
                        // Ham dem su dung ngat ngoai
                        void Count(void) interrupt 0
                        {
                        EA=0; // cam ngat ngoai
                        sp1++;
                        if(sp1 >= 25)
                        { sp1=0; //reset lai bien dem so sp/thung
                        sp2++; //tang bien dem so thung/ngày lên 1.
                        if(sp2>=9999) // reset lai bien dem so thùng/ngày.
                        {
                        sp2=0;
                        }
                        }
                        delay_ms(10);
                        EA=1; // cho phep ngat ngoai tro lai
                        }
                        // Chuong trinh chinh
                        void main(void)
                        {
                        EA = 0; // Cam ngat ngoai, cho chuong trinh khoi tao xong
                        init();
                        delay_ms(100);
                        while(start); // Khi nhan nut start, moi cho phep ngat ngoai, khi do chuong trinh moi bat dau chay
                        delay_ms(10);//thoi gian tre de loai bo hien tuong rung phim
                        while(!start); //neu nut da duoc nha ra thi hien thi so 9999
                        sp2 = 0; // Gia tri khoi tao cua bien ban dau.
                        while(start); // Khi nhan nut start, moi cho phep ngat ngoai, khi do chuong trinh moi bat dau chay
                        sp1 = 0;
                        EA = 1; // Cho phep ngat ngoai tro lai
                        while(1)
                        {
                        }
                        }

                        Comment


                        • Nguyên văn bởi tienhuypro Xem bài viết
                          Không biết có phải là girl hay không nữa mà nghe cái tên ớn quá, Lê Hùng Dũng. khekhe
                          Ờ, mình cũng đoán thế? cái tên hay thể hiện ước mơ, chắc tên con trai nào đó ước đặt tên Lê Hùng Dũng, chứ lại gọi là Lê Ẻo Lả chắc?
                          Vũ xuân Lợi
                          YM!:

                          Comment


                          • Nguyên văn bởi toilq30 Xem bài viết
                            // khai bao Header
                            #include<reg51.h>
                            #include<stdio.h>

                            #define m 3 // dinh nghia m de sau nay tien cho viec chinh sua thoi gian quyet led
                            // Khai bao Bit can dung
                            sbit start = P0^0; // nut nhan bat dau
                            sbit Led1 = P1^0; // Cac dau ra quyet led
                            sbit Led2 = P1^1;
                            sbit Led3 = P1^2;
                            sbit Led4 = P1^3;
                            sbit Led5 = P1^4;
                            sbit Led6 = P1^5 ;

                            const unsigned char M[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0}; // Ma data cua led 7 thanh anode chung
                            unsigned int sp1; //bien dem so san phan/thùng, max = 24
                            unsigned long int sp2; // bien dem so thung/ngày , max = 9999
                            unsigned int thousand2,hundred2,tens2,unit2,tens1,unit1;

                            // Ham tao tre de quyet led, ham nay chi mang tinh chat tao tre, chu thoi gian thuc trong ham khong dung voi thoi gian tre thuc su trong VDK
                            void delay_ms(unsigned int time)
                            {
                            unsigned int i;
                            unsigned int j;
                            for(i = time;i>0;i--)
                            for(j=0;j<300;j++);
                            }
                            // Ham xoa Led de giam hieu ung chop cua LED ( Do lech so voi tan so nhin thay cua mat )
                            void clear_led(void)
                            {
                            P1=0xFF;
                            P2=0xFF;
                            }
                            // Ham quet LED
                            void Display(void)
                            {
                            clear_led();
                            thousand2 = sp2/1000;

                            if (thousand2 == 0) // Neu gia tri trong hang nghin = 0 thi led hang nghin khong sang
                            clear_led();
                            else
                            { P1 = 0x1F; //Led6 = 0; Led5 = 1; Led4=1; Led3 = 1;Led2 = 1;Led1 = 1;
                            P2=M[thousand2];
                            delay_ms(m);
                            clear_led();
                            }

                            hundred2 =(sp2%1000)/100;

                            if ((thousand2 == 0)&&(hundred2 == 0)) // Neu gia tri trong hang nghin, va hang tram deu = 0 thi led hang nghin, hang tram khong sang
                            clear_led();
                            else
                            { P1 = 0x2F; //Led6 = 1; Led5 = 0; Led4=1; Led3 = 1;Led2 = 1;Led1 = 1;
                            P2=M[hundred2];
                            delay_ms(m);
                            clear_led();
                            }

                            tens2 = ((sp2%1000)%100)/10;

                            if ((thousand2 == 0)&&(hundred2 == 0)&&(tens2 == 0)) // Neu gia tri trong hang nghin, va hang tram, hang chuc deu = 0 thi led hang nghin, hang tram, hang chuc khong sang.
                            clear_led();
                            else
                            { P1 = 0x37; //Led6 = 1; Led5 = 1; Led4=0; Led3 = 1;Led2 = 1;Led1 = 1
                            P2=M[tens2];
                            delay_ms(m);
                            clear_led();
                            }

                            unit2 sp2%1000)%100)%10;
                            P1 = 0x3B; //Led6 = 1; Led5 = 1; Led4=1; Led3 = 0;Led2 = 1;Led1 = 1
                            P2=M[unit2];
                            delay_ms(m);
                            clear_led();

                            tens1 = sp1/10;
                            if (tens1 ==0)
                            clear_led();
                            else
                            {
                            P1 = 0x3D; //Led6 = 1;Led5 = 1; Led4 = 1;Led3 = 1;Led2 = 0;Led1 = 1;
                            P2=M[tens1] ;
                            delay_ms(m);
                            clear_led();
                            }
                            unit1 = (sp1%10);
                            P1 = 0x3E; //Led6 = 1;Led5 = 1; Led4 = 1;Led3 = 1;Led2 = 1;Led1 = 0;
                            P2 = M[unit1];
                            delay_ms(m);
                            clear_led();
                            }

                            // Khoi tao chuong trinh
                            void init(void)
                            {
                            TMOD=0x01; // Cho phep Timer0 hoat dong o che do timer 16 bit
                            IE=0x83; // Cho phep ngat ngoai tu chan INT0, ngat trong boi Timer0,ngat ngoai tu INT1
                            IP=0x04; // Cho phep ngat ngoai uu tien hon ngat trong
                            TH0=-5000/256; // Tre 1s
                            TL0=-5000%256;
                            sp1 = 0; //gia tri khoi tao ban dau = 0
                            sp2 = 0; // Gia tri khoi tao ban dau bang 0
                            clear_led(); // Xoa LED
                            IT0=1; // cho phep ngat bang canh xuong timer 0
                            TF0=1; // Timer0 Overfllow Flag
                            TR0=1; // Start Timer0
                            }
                            // Ham xuat gia tri ra hien thi su dung ngat Timer
                            void Outdata(void) interrupt 1
                            {
                            TR0=0;
                            Display();
                            TH0=-5000/256;
                            TL0=-5000%256;
                            TR0=1;
                            }
                            // Ham dem su dung ngat ngoai
                            void Count(void) interrupt 0
                            {
                            EA=0; // cam ngat ngoai
                            sp1++;
                            if(sp1 >= 25)
                            { sp1=0; //reset lai bien dem so sp/thung
                            sp2++; //tang bien dem so thung/ngày lên 1.
                            if(sp2>=9999) // reset lai bien dem so thùng/ngày.
                            {
                            sp2=0;
                            }
                            }
                            delay_ms(10);
                            EA=1; // cho phep ngat ngoai tro lai
                            }
                            // Chuong trinh chinh
                            void main(void)
                            {
                            EA = 0; // Cam ngat ngoai, cho chuong trinh khoi tao xong
                            init();
                            delay_ms(100);
                            while(start); // Khi nhan nut start, moi cho phep ngat ngoai, khi do chuong trinh moi bat dau chay
                            delay_ms(10);//thoi gian tre de loai bo hien tuong rung phim
                            while(!start); //neu nut da duoc nha ra thi hien thi so 9999
                            sp2 = 0; // Gia tri khoi tao cua bien ban dau.
                            while(start); // Khi nhan nut start, moi cho phep ngat ngoai, khi do chuong trinh moi bat dau chay
                            sp1 = 0;
                            EA = 1; // Cho phep ngat ngoai tro lai
                            while(1)
                            {
                            }
                            }
                            Lâu lắm không có để ý đến điện tử, muốn đọc thử quá nhưng câu hỏi có chủ rồi nên không dám đọc,
                            Vũ xuân Lợi
                            YM!:

                            Comment


                            • giup em lap trinh cho p89v51rd2

                              em đang học lập trình cho p89v51rd2 nhg ko biet sử dụng prog Studio? cac bro giup em với? em dùng keil C thi ko dc mà rõ ràng là em đã chọn chip p89v51rd2 của philip roi mà.
                              các huynh giup cho!
                              thankkkkkkk nhieu!

                              Comment


                              • ham macro cua 8051 trong KEIL

                                xin cac cao thu chi giao cho em (ngohaibac ,queduong,MicroDuyphi ....)

                                em viet chuong trinh cho 8051 bang ngon ngu assembler tren KEIL
                                tao ham macro trong file co ten: HAM_MACRO.asm
                                viet chuong trinh thu 2 co ten goi la: MAIN.asm
                                ca hai chuong trinh deu o trong 1 project
                                lam sao de em goi duoc ham macro trong ct HAM_MACRO tu ct MAIN ?
                                (o trong file nay goi ham macro trong file kia)

                                neu dung chi dan public & exturn chi goi duoc bang lenh call (lcall) thoi chu khong goi ten ham macro duoc
                                vi du :
                                day la chuong trinh trong file main.asm :

                                ;exturn code (push_dprt,pop_dprt) ;thu dung ham nay nhung khong duoc
                                org 0000
                                tiep:
                                push_dptr ;goi ham macro push_dptr
                                pop_dptr ;goi ham macro pop_dptr
                                sjmp tiep
                                end

                                sau day la ct thu 2
                                file ham_macro.asm nhu sau :

                                ;public push_dprt,pop_dprt ; thu dung ham nay nhung khong duoc
                                push_dprt macro
                                push dph
                                push dpl
                                endm
                                pop_dprt macro
                                pop dpl
                                pop dph
                                endm
                                end

                                mong cac ban trong dien dan cuu giup
                                xin cam on cac ban !

                                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