Thông báo

Collapse
No announcement yet.

Hỏi về giao tiếp máy tính (89c51)

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

  • Hỏi về giao tiếp máy tính (89c51)

    Em đang cần tìm hiểu gấp phần giao tiếp giữa máy tính và 89c52 qua max232 để hoàn thành bài tập, ai rảnh chỉ giúp em với.

    Hiện tại em đang mắc chỗ giao tiếp khi lập trình code nạp bằng keil C, cụ thể như sau :
    Chương trình máy tính gửi 1 chữ cái ra cổng COM, thông qua max232 dữ liệu được truyền đến 89c52, và ở đây nhận dữ liệu, so sánh dữ liệu đó với 1 giá trị có sẵn, nếu giống thì làm việc 1, không giống thì làm việc 2. Em bị mắc là không biết được kiểu dữ liệu được gửi xuống như thế nào để có thể viết biểu thức logic trong lệnh điều kiện
    VD: máy gửi chữ 'a', 89c52 nhận được và so sánh điều kiện, nếu đúng là chữ a thì cho chân P1 = 0xfd;

    chương trình của em như sau :
    CODE nạp cho 89c52:
    Code:
    #include <regx52.h>
    unsigned char uart_data_receive;
    //***************Thie^'t la^.p cho UART****************
    void uart_init()//dung trong truyen thong noi tiep
    {
    	SCON=0x50;//che do 8 bit du lieu,1 bit sart,1 bit stop
    	TMOD&=0x0F;//
        TMOD|=0x20;//timer1 in mode2
        TH1=0xFD;//set baut rate at 9600(11.0592Mhz)
        TL1=0xFD;
        ES=1;//cho phep ngat noi tiep
    	EA=1;//cho fep tat ca cac ngat
    	TR1=1;//chay timer1
    }
    //***************Gu+?i 1 ký tu+. *********************
    void send_data(char uart_data)//gui du lieu qua cong COM
    {
    	TI=0;
    	SBUF=0x00;
    	SBUF=uart_data;
    	while(TI==0){}//cho trong khi dang gui du lieu
    	TI=0;
    }
    //*************Nha^.n 1 ký tu+.*********************
    void receive_data() interrupt 4//nhan du lieu
    {
    	
    	if(RI==1)
    		{
    			RI=0;
    			uart_data_receive=SBUF;
    		}
    }
    
    main(void)
    {
    	uart_init();
    	P2=uart_data_receive;
    }

    CODE chương trình điều khiển (viết = C#):
    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Ports;
    using System.IO;
    using System.Threading;
    
    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                if (serialPort1.IsOpen) serialPort1.Close();
                serialPort1.Open();
                serialPort1.DataReceived += new SerialDataReceivedEventHandler(dulieuden);
            }
    
            private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                if (serialPort1.IsOpen) serialPort1.Close();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                serialPort1 .Write("a");//Đúng ra là serialPort1 .Write(textbox1.text); nhưng mình đặt luôn thữ a để thử
            }
            string data;
            private void dulieuden(object sender, SerialDataReceivedEventArgs e)
            {
                data = "";
                data = serialPort1.ReadExisting();
            }
            
            private void button2_Click(object sender, EventArgs e)
            {
                textBox2.Text = data;
            }
        }
    }
    Mạch như sau :





    Tất cả ở file đính kèm (mạch vẽ = proteus)

    Ai chỉ giúp em với, em xin cảm ơn nhiều nhiều !!!
    Attached Files

  • #2
    Hik, cuối cùng thì em cũng tìm ra lỗi rồi. nó là do cái hàm ngắt receive_data lúc nào nó cũng gán uart_receive_data=SBUF cho nên lúc nào uart_receive_data cũng bằng 0x00;

    Ai phương án giải quyết không, chỉ giáo cho em với.
    Em cần là mỗi khi nhận đc tín hiệu thì sẽ lưu vào 1 biến nào đó để dùng trong Main()

    Comment


    • #3
      em cũng đang nghiên cứu cái này, cái anh làm là code chương trình nhận cho con 8501. Còn chương trình giao tiếp cho máy tính thì sao ạ ???
      --- --- --- --- --- --- --- --- ---
      Lê Bá Tiến Triển
      11 Lý
      PTNK - ĐHQG HCM

      Comment


      • #4
        Nguyên văn bởi Huntress1 Xem bài viết
        Hik, cuối cùng thì em cũng tìm ra lỗi rồi. nó là do cái hàm ngắt receive_data lúc nào nó cũng gán uart_receive_data=SBUF cho nên lúc nào uart_receive_data cũng bằng 0x00;

        Ai phương án giải quyết không, chỉ giáo cho em với.
        Em cần là mỗi khi nhận đc tín hiệu thì sẽ lưu vào 1 biến nào đó để dùng trong Main()
        Không biết bạn có cần câu trả lời nữa ko.
        Mà hình như trước mắt là mình thấy phần cứng của bạn nó sao sao đó, hình như có vấn đề, sao lại có 2 cổng not vào thế kia?

        Comment


        • #5
          Nguyên văn bởi dt_love Xem bài viết
          Không biết bạn có cần câu trả lời nữa ko.
          Mà hình như trước mắt là mình thấy phần cứng của bạn nó sao sao đó, hình như có vấn đề, sao lại có 2 cổng not vào thế kia?
          Đó là vẻ trên Protues đó bạn bỏ nó đi cũng chẳng ảnh hưởng gì đến mạch đâu. Mạch này mình đã thử mô phỏng trên Protues rồi.

          Chúc mừng năm mới.
          WHO AM I ??????????????

          Comment


          • #6
            Mình cũng thấy là lạ là sao lại có 2 cổng not, hồi trước mình làm với 232 có cần thêm cổng not vào đâu, vẫn truyền nhận bình thường mà ta!
            "Cái quý nhất của con người ta là sự sống. Đời người chỉ sống có một lần.Phải sống sao cho khỏi xót xa ân hận..."
            Lê lết, lay lất sống qua ngày! >:)

            Comment


            • #7
              Nguyên văn bởi 89v51 Xem bài viết
              Đó là vẻ trên Protues đó bạn bỏ nó đi cũng chẳng ảnh hưởng gì đến mạch đâu. Mạch này mình đã thử mô phỏng trên Protues rồi.

              Chúc mừng năm mới.
              Protues thì mình không rành.
              Nhưng mà mình không nghĩ là nó không ảnh hưởng. Vì nếu bạn thêm cổng not như vậy thì phần cứng giao tiếp UART của 89 sẽ không thể xác định chính xác xung start và stop cũng như các mức dữ liệu. khi đó data nhận về và gửi đi là hoàn toàn bị sai lệch.

              Comment


              • #8
                Nguyên văn bởi dt_love Xem bài viết
                Protues thì mình không rành.
                Nhưng mà mình không nghĩ là nó không ảnh hưởng. Vì nếu bạn thêm cổng not như vậy thì phần cứng giao tiếp UART của 89 sẽ không thể xác định chính xác xung start và stop cũng như các mức dữ liệu. khi đó data nhận về và gửi đi là hoàn toàn bị sai lệch.
                Chính xác!
                "Cái quý nhất của con người ta là sự sống. Đời người chỉ sống có một lần.Phải sống sao cho khỏi xót xa ân hận..."
                Lê lết, lay lất sống qua ngày! >:)

                Comment


                • #9
                  Hi. Bài tập này e làm xong rất lâu rồi, hnay vào thấy bạn tientrien hỏi thì mới vào lại luồng này.
                  2 cái cổng not ở đoạn nối giữa max232 và 89 ấy ở trong proteus phải có thì tín hiệu nó mới nhận đúng, nhưng khi làm mạch thực tế thì phải bỏ đi nó mới đúng (k sửa j` chương trình giữa 2 trường hợp nhé) ~> không giải thik đc
                  Phần code keil C thì đúng ròi, còn phần C# thì lâu lắm mình k động đến nên cũng quên rùi, k biết nó có đúng không nữa, bạn tìm thêm các bài viết về object Serialport trong C# ấy

                  Comment


                  • #10
                    chao ca nha
                    may em chi dum em phan truyen nhan noi tiep tong 89c51 voi
                    cho em va vi du ban ASM phan nay lun
                    giup em voi

                    Comment


                    • #11

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X