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

  • #16
    Các bác dịch dùm tôi mọt đoạn mã ASSemly sau ra C dùm tôi nhá:
    P_0 equ P0
    org 0
    jmp $
    db 'Anh Tuyen'
    end
    Ai bảo chăn trâu là khổ ...!?

    Comment


    • #17
      Có khi viết chương trình trong Keil C, có đoạn Warning như sau:
      multiple call to segment "hàm gì đó"
      caller1 : ...
      caller2: ...
      thông báo này không thấy có ảnh hưởng gì nhưng mỗi lần thấy nó là thấy ghét, vậy vì sao có nó vậy, và khi nào xóa được nó ?
      Ai bảo chăn trâu là khổ ...!?

      Comment


      • #18
        Trong Keil C, hình như hỗ trợ download mã nguồn xuống vi điều khiển, mà sao lên mạng chẳng thấy mạch nạp của nó gì hết, hay là tôi lầm chăng ?
        [QUOTE]
        Ai bảo chăn trâu là khổ ...!?

        Comment


        • #19
          Nguyên văn bởi diode1447
          Các bác dịch dùm tôi mọt đoạn mã ASSemly sau ra C dùm tôi nhá:
          P_0 equ P0
          org 0
          jmp $
          db 'Anh Tuyen'
          end
          Người ta thường hỏi dịch từ C sang ASM chứ ít ai lại làm ngược lại.
          #define P_0 P0 //P_0 equ P0
          while(1); //jmp $
          Khai báo mảng kiểu hằng số
          ví dụ: const char a[]='Anh Tuyen';//db 'Anh Tuyen'
          main()
          {
          }//tức là end
          ...
          Ngoài ra, bạn có thể nhúng các đoạn mã asm vào C.
          Bạn nên đọc một ví dụ về lập trình C nào đó để hiểu.

          Comment


          • #20
            Cách trình bày!

            Nguyên văn bởi thaithutrang
            Có tới 2-3 anh đều bảo em sai, vậy do đâu? có lẽ chưa chuẩn hóa được ngôn ngữ,hay một lý do "thấy tên con gái" nên ko đọc kỹ vội phán xét.
            Chuẩn hóa theo cách của em về 8951:

            -Cờ cho phép ngắt toàn cục: EA
            -Cờ cho phép ngắt: timer1 thì ET1,Timer0 thì ET0...
            -Cờ ngắt: Timer1: TF1,Timer0: TF0...
            Ngắt xảy ra khi,ví dụ Timer1: EA=1 and ET1=1 and ET1=1

            Vào một số ngắt tự động xóa =0
            Nếu ko dùng ngắt thì nó sẽ ko tự động xóa,nên mình phải xóa bằng tay.

            Ví dụ:chương trình phục vụ ngắt cho timer1 cho 89.
            Thường thì người ta hay viết thế này:

            void delay(unsigned char time){
            while(time--){
            TH0 = 0xFC;// nạp giá trị cho timer
            TL0 = 0x66;
            TR0 = 1; // Chạy bộ định thời
            while(!TF0); // chờ khi nào cờ TF0 =1
            TR0=0;
            TF0=0;
            }
            }

            Em viết khác thông thường một chút nên mới dẫn tới tranh luận.

            Theo anh thì trong chương trình em đưa ra chỉ có 1 điểm dẫn tới tranh luận, còn xóa cờ tràn trước hay sau ko ảnh hưởng lắm tới kết quả, đó là dòng lệnh:

            while( TF0);

            Trong chương trình của em, trước dòng lệnh này là :

            TF0=0


            Như vậy lệnh đó tương đương : while(0) hoặc while(false)--> nó không chờ gì cả thoát luôn và thực hiện lệnh tiếp theo.

            Vì vậy em nên viết lại là :

            void delay(unsigned char time){
            while(time--){
            TR0=0;
            TH0 = 0xFC;// nạp giá trị cho timer
            TL0 = 0x66;
            TF0=0;
            TR0 = 1; // Chạy bộ định thời
            while(!TF0); // chờ khi nào cờ TF0 =1

            }
            }
            Càng biết nhiều càng thấy mình biết ít.

            Comment


            • #21
              Cảm ơn anh ATYLA

              Ối trời, hình như tất cả các anh và em đều copy,paste nên ko để ý đến cái:
              while( TF);
              Nay sửa thành:
              while(!TF);
              mới đúng

              Hi hi...nhưng do bấy lâu tranh luận về vấn đề "cờ tràn có bị xóa hay ko xóa" khi không dùng ngắt nên "ko ai để ý đến cái đó".(Hơn nữa ở đó có dấu cách trước chữ TF nên càng ko ai để ý)
              Cảm ơn anh ATYLA phát hiện được.

              Comment


              • #22
                Cô nương 3T cho tại hạ hỏi tí xíu nữa nhá:
                org 544h
                db 'Anh Tuyen'
                Cảm ơn nhiều và ăn tết dui dẻ
                Ai bảo chăn trâu là khổ ...!?

                Comment


                • #23
                  Tớ đã trả lời câu hỏi của bạn rồi. Ở chỗ nào đó, bạn xem lại.

                  Comment


                  • #24
                    Nguyên văn bởi kien_tran
                    Chào ban N_H_B! mình đã thực hiện các bước bạn hướng dẫn và copy cả bài của bạn vào chạy thử nữa nhưng khi dịch nó cứ báo lỗi. Mình đã kiểm tra lại quá trình thực hiện và cú pháp khi lập trình thậm chí còn cài lại nữa (KeilC v 7.08) bản cracked. Lỗi cụ thể như sau:

                    Build target 'Target 1'
                    Compiling leddon.C...
                    ***WARNING C318 IN LINK 1 OF LEDDON.C: CAN'T OPEN FILE 'REGX51.H'
                    leddon.C(14):error C202 : 'P1_0' : undefined identifier
                    leddon.C(15):error C202 : 'P1_0' : undefined identifier
                    Target not create

                    Chỉ giúp nhé.
                    Bạn thân mến, có lẽ ai ,mới làm quen với KeilC đều gặp lỗi như bạn.
                    Sau khi thực hiện các bước như NHB đã hướng dẫn, bạn làm tiếp 2 bước này nưa nhé:
                    Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

                    Comment


                    • #25
                      Trong "Tool Base folder" bạn phải chọn đúng đường dẫn của C51 rồi OK.
                      Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

                      Comment


                      • #26
                        Hàm ngắt trong keilC

                        undefinedundefinedundefinedBạn huytoan_dtvt có gửi tin nhắn cho tôi hỏi về cách dùng hàm ngắt và một số đoạn code mẫu. Bài này tôi xin giới thiệu chi tiết hơn cho các bạn về hàm ngắt này.

                        Hàm ngắt là một hàm không có tham số, không có kiểu trả về. Vì thực chất các biến mà hàm này thao tác chính là các biến toàn cục (các thanh ghi, các port).
                        Cấu trúc một hàm ngắt như sau:

                        Code:
                        void tenham(void) interrupt a using b{
                        // code
                        }
                        Trong đó: những chữ in nghiêng là bắt buộc phải có và using b có thể có hoặc không có.

                        tên hàm: tùy các bạn chọn.
                        a : là thứ tự của ngắt trong bảng vector ngắt

                        a = 0 : ngắt ngoài 0
                        a = 1 : ngắt timer0
                        a = 2 : ngắt ngoài 1
                        a = 3 : ngắt timer1
                        a = 4 : ngắt nối tiếp

                        b: là bank được chọn dùng để thực hiện hàm ngắt. Do 8051 có 4 bank là bank 0, 1, 2, 3. Do đó : b có thể là một trong các giá trị 0,1,2,3.

                        Lưu ý: nếu không viết thêm using b thì mặc định là hàm ngắt thực hiện tại bank0.

                        Do đó, một thí dụ về hàm ngắt nối tiếp sẽ có dạng như sau:

                        void inter4(void) interrupt 4 using 2{
                        // mã thực hiện hàm
                        }


                        Và sau đây tôi xin giới thiệu một đoạn chương trình tạo một xung ở chân P1.0 và khi nhận được dữ liệu nối tiếp thì chuyển sang port P2. Tần số thạch anh là 11.0592 MHz. Dùng AT89C51

                        Code:
                        # include "regx51.h"
                        
                        // ham gay tre
                        void delay(int time){
                        	while(time--){
                        		unsigned char j = 122;
                        		while(j--);
                        	};
                        }
                        
                        // ham thiet lap ban dau
                        void init(){
                        	EA = 1; // cho phep dung ngat
                        	ES = 1; // dung ngat noi tiep
                        	// Thiet lap tan so bus
                        	TMOD = 0x02; // dung timer1, che do 8 bit tu nap lai
                        	TH1 = 253;  // chon tan so bus = 9600
                        	TR1 = 1 ; // khoi dong timer1
                        }
                        
                        // Ham ngat
                        void inter4(void) interrupt 4 using 2{
                        	if (RI){  // kiem tra co tran nhan RI.
                        		P2 = SBUF;  // lay du lieu tu SBUF
                        		RI = 0; // xoa co ngat
                        		};
                        }
                        
                        // ham main
                        void main(){
                        	// tao xung tren chan P1.0
                        	init();
                        	while(1){
                        		P1_0 = 1;  
                        		delay(500);
                        		P1_0 = 0;
                        		delay(500);
                        	}
                        }
                        Gửi bác MicroDuyPhi: em không hiểu tại sao anh lại không để luồng này lên cao? Hay là anh đang trong quá trình dọn dẹp box. Em nghĩ vấn đề về lập trình keil C là vấn đề mà các bạn mới hhọc về 8051 bắt gặp rất nhiều.

                        Hi vọng là bài viết đưa cho các bạn một kiến thức đầy đủ.

                        Chúc các bạn thành công.
                        Technical sale at WT Microelectronics S'pore
                        Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
                        Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

                        Comment


                        • #27
                          Chào các bạn!Mình tham gia vào VDK đầu tiên nên có gì cũng bỡ ngỡ .Monh các bạn chỉ giúp.Mình cũng đx biét chút ít về VDK và bây giờ không biết dùng ngôn ngữ nào để thực hiện đây.Thây bác Ngô Hải Bắc mở luồng này để giúp anh em thật tốt quá .Bac hướng dẫn cụ thể ghê.Hy vọng bác giúp anh em nhiều hơn nữa .Em cũng đã làm theo trình tự như bác đã hướng dẫn và em thấy chạy chương trình ví dụ đúng như bác đã đưa.Bác cho em hỏi là tới giai đoạn cuối cùng bác chạy debug nó ra một cửa sổ gồm mấy cái checkbox đã được tick như vậy là thế nào em không hiểu .Bác giải thích giùm em vói .À bac có bài ví dụ nào nữa không có thể gởi lên diễn đàn hay la gởi mail cho em (vudtd43984@yahoo.com) .Cám ơn bác!
                          Khó nhất trên đời làm trang nam tử
                          Ý chí vững vàng mà tình cảm lại mênh mang

                          Comment


                          • #28
                            Ví dụ nha, khi bạn chọn xem Port1 chẳng hạn, thì khi check box được check thì tức là chân đó có mức logic là 1, còn không check tức là có mức logic là 0.

                            Bạn ấn F10 để chạy từng dòng lệnh thì sẽ biết mức logic của các chân thay đổi thế nào ngay.

                            Đây là câu hỏi của bạn gửi bằng PM cho tôi:
                            Em có bài toán như thế này :
                            Em có một biến trở sẽ điều chỉnh mức điện áp từ 0-10v sau khi được chuẩn hóa qua con A/D đưa vào vi điều khiển và hiển thị qua led các số từ 0 tới 10 .
                            Quá trình được lặp lại theo chiều ngược từ 7 công tắc qua vi điều khiển wa con D/A wa khâu khuếch đại hiển thị qua đồng hồ vôn.
                            Theo bác thuật toán cho vi điều khiển khiển thế nào.Bác có thể cho em một đoạn code được không!
                            Bạn nào có code thì share cho bạn này với. Mình đang bận không có thời gian viết cho bạn. Thông cảm nha.

                            Chúc thành công.
                            Last edited by ngohaibac; 02-03-2006, 20:15.
                            Technical sale at WT Microelectronics S'pore
                            Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
                            Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

                            Comment


                            • #29
                              Thấy mấy cao thủ nạp giá trị THx và TLx khi sử dụng ở chế độ 16 bít phải tính toán vất vả quá.tặng mấy bác cái macro này , khi viết ta nạp cho timer giống như sử dụng hàm high với hàm low trong chương trình A51. và chỉ làm việc với số dương thôi.

                              #define high(x) (((65536-x) & 0xFF00) >> 8)
                              #define low(x) ((unsigned char)(65536-x))

                              Muốn timer chạy bao nhiêu chu kì xung clock thì cứ việc...
                              ví du chương trình sau:
                              #include <AT89X51.H>
                              #define high(x) (((65536-x) & 0xFF00) >> 8)
                              #define low(x) ((unsigned char)(65536-x))

                              void delayus(unsigned int time )
                              {
                              TMOD=0x01;
                              TH0=high(time);
                              TL0=low(time);
                              TF0=0;
                              TR0 = 1; // Chạy bộ định thời
                              while(!TF0); // chờ khi nào cờ TF0 =1
                              }


                              void main()

                              delay(500);' delay 500 chu ky may!!
                              {


                              while(1)
                              {
                              'xxxxx
                              }
                              }

                              Comment


                              • #30
                                bác Ngô Hải Bắc cố gắng duy trì và đăng bài hướng dẫn giúp thêm ,em cố gắng theo dõi luồng này .Bác giảng dể hiểu lắm!
                                Khó nhất trên đời làm trang nam tử
                                Ý chí vững vàng mà tình cảm lại mênh mang

                                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