Thông báo

Collapse
No announcement yet.

Giúp mình mô phỏng truyền thông bằng 8051 trong proteus sử dụng Vitual Terminal

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giúp mình mô phỏng truyền thông bằng 8051 trong proteus sử dụng Vitual Terminal

    Mình có mạch như thế này để thử truyền thông trên 8051.Các linh kiện có thông số
    AT89C52, Tụ 33pF, Thạch anh 12MHz



    Mình sử dụng Keil C 8.05, Proteus 7.4 sp3
    Còn đây là chươn trình mình viết bằng C để gửu data tới Vitual Terminal.

    #include <REGX52.H>
    #include <stdio.h>
    void main(void)
    {
    SCON =0x52; // Port noi tiep che do 1, REN =TI =1;
    TMOD = 0x20; //Timer 1 mode 2
    TH1 = TL1 = -3; // Toc do baud la 9600
    TR1 =1;
    while( !TI); // Cho TI =1;
    TI=0; //Xoa TI
    SBUF = 'A'; // Truyen byte du lieu
    }
    Ở đây mình chỉ muốn truyền kí tự A để hiện trên Terminal , nhưng kết quả không như vậy mà trên Terminal hiện như sau


    Các bạn giúp mình sửa lại chương trình hoặc sơ đồ mạch với. Hoặc giải thích tại sao lại lỗi như vây.Cám ơn các bạn rất nhiều
    Last edited by congbinh1989; 01-07-2011, 18:53.

  • #2
    Trong chương trình chỗ SBUF = #'A' mới đúng! Nhớ thêm dấu "#"!

    Comment


    • #3
      Trong mô phỏng Proteus thì không cần mắc thạch anh cho VDK, phần thạch anh chỉnh về 11.0592MHz trong properties của 8951!

      Comment


      • #4
        Nguyên văn bởi bonchen2011 Xem bài viết
        Trong chương trình chỗ SBUF = #'A' mới đúng! Nhớ thêm dấu "#"!
        Mình đã thực hiện rồi.
        Nhưng nó báo lõi sau
        Build target 'Target 1'
        compiling code.c...
        CODE.C(11): error C141: syntax error near '#'
        Target not created

        Comment


        • #5
          Nguyên văn bởi bonchen2011 Xem bài viết
          Trong mô phỏng Proteus thì không cần mắc thạch anh cho VDK, phần thạch anh chỉnh về 11.0592MHz trong properties của 8951!
          Mình cũng tùy chỉnh như vậy rồi nhưng nó vẫn báo lỗi như vậy

          Comment


          • #6
            Bạn thử lại SBUF = "A"; nhá.
            Đoạn lệnh sau xem (code ví dụ của keil C), thay vì move vào sbuf thì bạn dùng lệnh printf luôn!
            Code:
            /*------------------------------------------------------------------------------
            HELLO.C
            
            Copyright 1995-2005 Keil Software, Inc.
            ------------------------------------------------------------------------------*/
            
            #include <REG52.H>                /* special function register declarations   */
                                              /* for the intended 8051 derivative         */
            
            #include <stdio.h>                /* prototype declarations for I/O functions */
            
            
            #ifdef MONITOR51                         /* Debugging with Monitor-51 needs   */
            char code reserve [3] _at_ 0x23;         /* space for serial interrupt if     */
            #endif                                   /* Stop Exection with Serial Intr.   */
                                                     /* is enabled                        */
            
            
            /*------------------------------------------------
            The main C function.  Program execution starts
            here after stack initialization.
            ------------------------------------------------*/
            void main (void) {
            
            /*------------------------------------------------
            Setup the serial port for 1200 baud at 16MHz.
            ------------------------------------------------*/
            #ifndef MONITOR51
                SCON  = 0x50;		        /* SCON: mode 1, 8-bit UART, enable rcvr      */
                TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */
                TH1   = 221;                /* TH1:  reload value for 1200 baud @ 16MHz   */
                TR1   = 1;                  /* TR1:  timer 1 run                          */
                TI    = 1;                  /* TI:   set TI to send first char of UART    */
            #endif
            
            /*------------------------------------------------
            Note that an embedded program never exits (because
            there is no operating system to return to).  It
            must loop and execute forever.
            ------------------------------------------------*/
              while (1) {
                P1 ^= 0x01;     		    /* Toggle P1.0 each time we print */
                printf ("Hello World\n");   /* Print "Hello World" */
              }
            }

            Comment


            • #7
              Vụ SBUF = #'A' là mình nhầm, viết bằng hợp ngữ mới có vụ thêm dấu #!

              Comment


              • #8
                Bạn chú ý. Quá trình truyền từ vi điều khiển lên máy tính chính là truyền mã ASCII của nó lên.
                Chương trình của bạn phải sửa thành như sau:


                #include <REGX52.H>
                #include <stdio.h>
                void main(void)
                {
                char x;
                SCON =0x52; // Port noi tiep che do 1, REN =TI =1;
                TMOD = 0x20; //Timer 1 mode 2
                TH1 = TL1 = -3; // Toc do baud la 9600
                TR1 =1;

                x=0x41;
                while( !TI); // Cho TI =1;
                TI=0; //Xoa TI
                SBUF = x; // Truyen byte du lieu
                } [IMG][/IMG]
                Hãy nhớ khai báo là thạch anh 11.0592 ở keilC và protues.
                Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
                http://diencongnghiep360.com/
                http://tudienhathe.vn/

                Comment


                • #9
                  Cám ơn vietthanh123. Mình làm đc rồi.Bạn có thể giải thích tại sao mình lại phải sử dụng biến trung gian x trong cách làm của bạn đc khong mà không thể sử dụng trực tiếp câu lệnh SBUF=0x41



                  Còn cái ví dụ của bạn bonchen2011 thì lại không chạy đc. hĩ

                  Comment


                  • #10
                    Nguyên văn bởi congbinh1989 Xem bài viết
                    Cám ơn vietthanh123. Mình làm đc rồi.Bạn có thể giải thích tại sao mình lại phải sử dụng biến trung gian x trong cách làm của bạn đc khong mà không thể sử dụng trực tiếp câu lệnh SBUF=0x41



                    Còn cái ví dụ của bạn bonchen2011 thì lại không chạy đc. hĩ
                    Bạn vẫn có thể sử dụng câu lệnh trực tiếp SBUF = 'A', nhưng trước đó bạn phải khai báo ít nhất 1 biến tạm với kiểu Char

                    ví dụ: char KYTU = 0X10;

                    HTML Code:
                    #include <REGX52.H>
                    #include <stdio.h>
                    
                    char KYTU = 0X10
                    
                    void main(void)
                    {
                    SCON =0x52; // Port noi tiep che do 1, REN =TI =1;
                    TMOD = 0x20; //Timer 1 mode 2
                    TH1 = TL1 = -3; // Toc do baud la 9600
                    TR1 =1;
                    
                    while(!TI); // Cho TI =1;
                    	TI=0; //Xoa TI
                    	SBUF ='A' ; // Truyen byte du lieu	
                    }
                    PCT COMPUTER
                    (Để không làm ảnh hưởng đến thời gian và công việc cá nhân. Xin vui lòng không nhắn tin và điện thoại)

                    Comment


                    • #11
                      Nguyên văn bởi congbinh1989 Xem bài viết
                      Cám ơn vietthanh123. Mình làm đc rồi.Bạn có thể giải thích tại sao mình lại phải sử dụng biến trung gian x trong cách làm của bạn đc khong mà không thể sử dụng trực tiếp câu lệnh SBUF=0x41



                      Còn cái ví dụ của bạn bonchen2011 thì lại không chạy đc. hĩ
                      Dùng trực tiếp SBUF = 'A'; cũng được, khỏi mất công nhớ A là 0x41.
                      Còn việc đặt biến x hay không là tùy, không bắt buộc khi điền SBUF là phải thông qua biến trung gian. Đối với các chương trình lớn thì việc dùng biến trung gian sẽ cho nhiều lợi ích hơn đó là tính linh hoạt!

                      Comment


                      • #12
                        Nguyên văn bởi pctcom Xem bài viết
                        Bạn vẫn có thể sử dụng câu lệnh trực tiếp SBUF = 'A', nhưng trước đó bạn phải khai báo ít nhất 1 biến tạm với kiểu Char

                        ví dụ: char KYTU = 0X10;

                        HTML Code:
                        #include <REGX52.H>
                        #include <stdio.h>
                        
                        char KYTU = 0X10
                        
                        void main(void)
                        {
                        SCON =0x52; // Port noi tiep che do 1, REN =TI =1;
                        TMOD = 0x20; //Timer 1 mode 2
                        TH1 = TL1 = -3; // Toc do baud la 9600
                        TR1 =1;
                        
                        while(!TI); // Cho TI =1;
                        	TI=0; //Xoa TI
                        	SBUF ='A' ; // Truyen byte du lieu	
                        }
                        Vậy cho mình hỏi là "việc khai báo biến Char đó có vai trò gì mà bắt buộc phải khai báo"

                        Comment


                        • #13
                          Nguyên văn bởi bonchen2011 Xem bài viết
                          Dùng trực tiếp SBUF = 'A'; cũng được, khỏi mất công nhớ A là 0x41.
                          Còn việc đặt biến x hay không là tùy, không bắt buộc khi điền SBUF là phải thông qua biến trung gian. Đối với các chương trình lớn thì việc dùng biến trung gian sẽ cho nhiều lợi ích hơn đó là tính linh hoạt!
                          Mình đã thử bỏ câu lệnh khai báo biến Char. Rồi sau đó lần lượt thử cả hai trường hợp SBUF = 'A' và SBUF= 0x41 đều không đc. Vẫn báo lỗi như ban đầu

                          Comment


                          • #14
                            Nguyên văn bởi congbinh1989 Xem bài viết
                            Mình đã thử bỏ câu lệnh khai báo biến Char. Rồi sau đó lần lượt thử cả hai trường hợp SBUF = 'A' và SBUF= 0x41 đều không đc. Vẫn báo lỗi như ban đầu
                            Mình cũng gặp trường hợp như bạn, thấy cũng hơi lạ (phải khai báo 1 biến char nào đó thì SBUF = 'A' mới chạy được), vụ này hơi khó hiểu và không logic cho lắm.
                            Cái code mình post không chạy là do tốc độ của nó chưa phải là 9600, mình sửa chỗ đó lại và chạy tốt (code mẫu của keilC mừ, làm sao sai được, và tất nhiên khỏi cần khai báo biến char nào cả.
                            Bạn viết bằng C thì nên dùng printf thì tiện (ghi một lèo nhiều kí tự) và logic hơn. Hồi xưa khi còn viết bằng asm thì cũng chơi với SBUF, nghĩ lại thấy oải thật!
                            Code:
                            void main (void)
                            {
                                SCON  = 0x50;		        /* SCON: mode 1, 8-bit UART, enable rcvr      */
                                TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */
                                TH1   = -3;                /* TH1:  reload value for 9600 baud @ 16MHz   */
                                TR1   = 1;                  /* TR1:  timer 1 run                          */
                                TI    = 1;                  /* TI:   set TI to send first char of UART    */
                            
                              while (1) {
                                P1 ^= 0x01;     		    /* Toggle P1.0 each time we print */
                                printf ("Hello World\n");   /* Print "Hello World" */
                              }
                            }
                            Attached Files

                            Comment


                            • #15
                              Nguyên văn bởi bonchen2011 Xem bài viết
                              Mình cũng gặp trường hợp như bạn, thấy cũng hơi lạ (phải khai báo 1 biến char nào đó thì SBUF = 'A' mới chạy được), vụ này hơi khó hiểu và không logic cho lắm.
                              Cái code mình post không chạy là do tốc độ của nó chưa phải là 9600, mình sửa chỗ đó lại và chạy tốt (code mẫu của keilC mừ, làm sao sai được, và tất nhiên khỏi cần khai báo biến char nào cả.
                              Bạn viết bằng C thì nên dùng printf thì tiện (ghi một lèo nhiều kí tự) và logic hơn. Hồi xưa khi còn viết bằng asm thì cũng chơi với SBUF, nghĩ lại thấy oải thật!
                              Code:
                              void main (void)
                              {
                                  SCON  = 0x50;		        /* SCON: mode 1, 8-bit UART, enable rcvr      */
                                  TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */
                                  TH1   = -3;                /* TH1:  reload value for 9600 baud @ 16MHz   */
                                  TR1   = 1;                  /* TR1:  timer 1 run                          */
                                  TI    = 1;                  /* TI:   set TI to send first char of UART    */
                              
                                while (1) {
                                  P1 ^= 0x01;     		    /* Toggle P1.0 each time we print */
                                  printf ("Hello World\n");   /* Print "Hello World" */
                                }
                              }
                              Mình làm theo bạn. Đã chạy đc ok.Nhưng phải thêm các lênh
                              #include <REGX52.H>
                              #include <stdio.h>
                              vào đầu chương trình , ở đoạn cuối chương trình mình thấy lệnh
                              P1 ^= 0x01; /* Toggle P1.0 each time we print */
                              không cần thiết lắm

                              Comment

                              Về tác giả

                              Collapse

                              congbinh1989 Tìm hiểu thêm về congbinh1989

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X