<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        51單片機與串口通信代碼

        作者:佚名   來源:本站原創   點擊數:  更新時間:2007年06月17日   【字體:

        1.       發送:向總線上發命令

        2.       接收:從總線接收命令,并分析是地址還是數據。

        3.       定時發送:從內存中取數并向主機發送.


         經過調試,以上功能基本實現,目前可以通過上位機對單片機進行實時控制。

         程序如下:

         //這是一個單片機C51串口接收(中斷)和發送例程,可以用來測試51單片機的中斷接收

        //和查詢發送,另外我覺得發送沒有必要用中斷,因為程序的開銷是一樣的

        #i nclude <reg51.h>

        #i nclude<stdio.h>

        #i nclude <string.h>

        #define INBUF_LEN 4   //數據長度

        unsigned char inbuf1[INBUF_LEN];

        unsigned char checksum,count3 , flag,temp,ch;

        bit          read_flag=0;

        sbit  cp=P1^1;

        sbit  DIR=P1^2;

        int i;

        unsigned int xdata *RAMDATA;     /*定義RAM地址指針*/

         

        unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ;

         

         

        void init_serialcomm(void)

        {

             SCON=0x50;              //在11.0592MHz下,設置串行口波特率為9600,方式1,并允許接收

             PCON=0x00;

             ES=1;

             TMOD=0x21;   //定時器工作于方式2,自動裝載方式

             TH0=(65536-1000)%256;

             TL0=(65536-1000)/256;

                TL1=0xfd;

             TH1=0xfd;

             ET0=1;

                TR0=1;

                TR1=1;

        //     TI=0;

                EA=1;

          //   TI=1;

           RAMDATA=0x1F45;

        }

        void serial () interrupt 4 using 3

        {   

           if(RI)

          { RI=0;

            ch=SBUF;

               TI=1;           //置SBUF空

            switch(ch)

           {

           case 0x01 :printf("A");  TI=0;break;

           case 0x02 :printf("B");  TI=0;break;

           case 0x03 :printf("C");  TI=0;break;

           case 0x04 :printf("D");  TI=0;break;

           default  :printf("fg");   TI=0;break;

           }

         }

         

        }

        //向串口發送一個字符

        void timer0() interrupt 1 using 3{

             // char i;

               flag++;

               TH0=0x00;

               TL0=0x00;

                  if(flag==10)

                 {// cp=!cp;

                      // for(i=0;i<6;i++)

                          P2=0x25;

                             TI=1;

                          temp=*RAMDATA;

                            printf("%c",temp);

                               TI=0;

                              //   RAMDATA--;

                          flag=0;

                        }

               }

             

        //主程序

        main()

        {   

         

          init_serialcomm();  //初始化串口

        //向6264中送數據

          {

                   *RAMDATA=0x33;

              

                  }

               

            while(1)

            {

               

                  *RAMDATA=0x33;;   

            }

        }

         調試過程中遇到的問題:

        1.       發送過程:在發送時必須保證TI=1:即發送緩沖器為空,否則將導致數據發不出去,如果想強制發送可以用:TI=1.具體發送數據:利用printf(“akjdfaklfj”);函數直接發送即可。

        2.       接收過程:在接收時多選用中斷方式,這樣可以節約CPU的時間,提高效率,

         
        1 Windows API通信函數方法

        與通信有關的Windows API函數共有26個,但主要有關的有:

        CreateFile() 用 “comn”(n為串口號)作為文件名就可以打開串口。
        ReadFile() 讀串口。
        WriteFile() 寫串口。
        CloseHandle() 關閉串口句柄。
        初始化時應注意CreateFile()函數中串口共享方式應設為0,串口為不可共享設備,其它與一般文件讀寫類似。以下給出API實
        現的源代碼。

        1.1 發送的例程

        //聲明全局變量

        HANDLE m_hIDComDev;
        OVERLAPPED m_OverlappedRead, m_Over lappedWrite;

        //初始化串口

        void CSerialAPIView::OnInitialUpdate()
        {
        CView::OnInitialUpdate();
        Char szComParams[50];
        DCB dcb;
        Memset(&m_OverlappedRead, 0, sizeof (OVERLAPPED));
        Memset(&m_OverlappedWrite, 0, sizeof (OVERLAPPED));

        m_hIDComDev = NULL;
        m_hIDComDev = CreateFile(“COM2”, GENERIC_READ│GENERIC_WRITE, 0, NULL,
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL│FILE_FLAG_OVERLAPPED, NULL);

        if (m_hIDComDev == NULL)
        {
        AfxMessageBox(“Can not open serial port!”);
        goto endd;
        }

        memset(&m_OverlappedRead, 0, sizeof (OVERLAPPED));
        memset(&m_OverlappedWrite, 0, sizeof (OVERLAPPED));
        COMMTIMEOUTS CommTimeOuts;
        CommTimeOuts.ReadIntervalTimeout=0×FFFFFFFF;
        CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
        CommTimeOuts.ReadTotalTimeoutConstant = 0;
        CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
        CommTimeOuts.WriteTotalTimeoutConstant = 5000;
        SetCommTimeouts(m_hIDComDev, &CommTimeOuts);
        Wsprintf(szComparams, “COM2:9600, n, 8, 1”);

        m_OverlappedRead. hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        m_OverlappedWrite. hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

        dcb. DCBlength = sizeof(DCB);
        GetCommState(m_hIDComDev, &dcb);
        dcb. BaudRate = 9600;

        dcb. ByteSize= 8;
        unsigned char ucSet;

         

         

         

        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮