<track id="vsrno"><strike id="vsrno"><tt id="vsrno"></tt></strike></track>
    1. <p id="vsrno"><strong id="vsrno"><xmp id="vsrno"></xmp></strong></p><acronym id="vsrno"><label id="vsrno"></label></acronym>
      1. <p id="vsrno"></p>
      2. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        51串口通信程序(帶詳細注釋)

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

        #include<reg51.h>
        #include<string.h> //后面有一個比較函數
        #define uchar unsigned char
        #define uint unsigned int
        bit  UART_Flag=0;  //定義串口接收標志位

        uchar  str[50];   //定義一數組
        uchar length=0;  //數組長度從0開始
        void init() //初始化uart
        {
         
         
           TMOD=0X20;  //定時器1定時器方式  工作模式2,可自動重載的8位計數器常把定時/計數器1以模式2作為串行口波特率發生器

         SCON=0X50; //選擇工作模式1使能接收,允許發送,允許接收

            EA=1; //開總中斷

         ES=1;  //打開串口中斷
         ET1=0;  //打開定時器中斷

                PCON=0X80; //8位自動重載,波特率加倍

         TH1=0XFF;  //用22.1184 mhz波特率

         TL1=0XFF;
          
         TR1=1; //打開中時器

            


        }
        void UART_Putch(uchar dat)  //輸出一個字符
        {
         SBUF=dat; //把數據送給sbuf緩存器中

         while(TI!=1);//發送標志位 TI如果發送了為1,沒發送為0,沒發送等待,到了退出循環

         TI=0;  //到了,TI清為0

        }
        void init1() interrupt 4  //uart中斷 ,4為串口中斷
        {
         
          if(RI==1)  //收到數據
          {
             uchar m=SBUF; //m為計算機發送給串口的數據,例,open //總體思想是,計算機通知串口,我要發數據了
          RI=0;   //收到清0
         
             if(m=='\r')   //判斷m這位數據有無\r
               {
               UART_Putch('\r');  //回車
               UART_Putch('\n');  // 換行
            str[length]='\0'; //數據最后位加0標志位表示發完了數據
            UART_Flag=1;  // 傳 完 標 志 位
                }
           else if(m=='\n')
          {
         
          }
             else if(m=='\b')//b表退格 //下面幾句表刪鋤
               {
                 UART_Putch('\b');

            UART_Putch(' ');

            UART_Putch('\b');

            length=length-1; //刪鋤了后總長度減一
               }
         
           
             else
             {
             str[length++]=m; //比如m為open,先傳0后傳p,length加一
          UART_Putch(m);    //輸出 比如open
             }
         
         }
        }
        void check(char *str)  //計算機發一數據,我來檢查,
        {
           if( strcmp("open",str)==0 ) //比較兩數是否相同,相同為0,不同為1 //要加string.h頭文件
           {
               UART_Putch('o'); //計算機中寫入open我回復ok
            UART_Putch('k');
               UART_Putch('\r'); //回車是跑到這一行的最前      UART_Putch('\n'); //換行是跳到下一行
          }
           else if( strcmp("close",str)==0 )
           {
               UART_Putch('o');
            UART_Putch('k');
               UART_Putch('\r');
               UART_Putch('\n');
         
         
           }
           else    //否則出錯
           {
               UART_Putch('e');
            UART_Putch('r');
               UART_Putch('r');
               UART_Putch('o');
               UART_Putch('r');
               UART_Putch('!');
            UART_Putch('\r');
            UART_Putch('\n');
           }


        }
        void main()
        {
          init();
          while(1)
          {
            if(UART_Flag==1)  //接收標志位表示接收完成
             {
             check(str);//檢查
             length=0; //長度清0
             UART_Flag=0;//標志位清0
          }
         
          }


        }

        關閉窗口

        相關文章

        真实国产乱子伦对白视频不卡|国产欧美日韩一区二区搜索|狼狼狼色在线精品视频免费|欧美老人巨大XXXX做受|五月天婷婷一区二区三区久久
        <track id="vsrno"><strike id="vsrno"><tt id="vsrno"></tt></strike></track>
        1. <p id="vsrno"><strong id="vsrno"><xmp id="vsrno"></xmp></strong></p><acronym id="vsrno"><label id="vsrno"></label></acronym>
          1. <p id="vsrno"></p>