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

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

        PIC16F877A與PC機串行通信C語言源程序

        作者:huqin   來源:本站原創   點擊數:  更新時間:2014年03月25日   【字體:

        //*******串口通信程序*********
        //*******定義變量*************
        #include <pic16f877.h>
        #define  unchar unsigned  char
        #define  uint   unsigned  int
        unchar   RC_label;//標志位起始位為1結束位為0
        unchar   caiji_label;//采集幀格式標志位正確為1錯誤為0
        unchar data RC[100];//存儲接收到的數據
        unchar data TX1[100];//存儲自身參數
        unchar data TX2[100];//存儲出錯指示ERROR
        int    RC_buff;//
        int    i=0,j=0,k=0;//
        //*****變量定義完畢************
        //*****子程序區****************
        //*****串口初始化程序開始**********
        void initRS232()
        {
         //設置TXSTA
         CSRC=0;//
         TX9=0;//8位數據發送
         TXEN=1;//發送使能
         SYNC=0;//選擇異步模式
         BRGH=1;//高速
         TRMT=1;//發送寄存器空
         TX9D=0;//
         //設置RCSTA
         SPEN=1;//允許串口工作
         RX9=0;//接收8位數據
         SREN=1;//
         CREN=1;//使能連續接收
         ADDEN=0;//
         FERR=0;//
         OERR=0;//無超速錯誤
         RX9D=0;//
         TRISC=0X80;//設置C口
         SPBRG=0X19;//設置波特率為9600
        }
        //*******初始化232完畢********
        //*******延時子程序開始*********
        void delay(int i)
        {for(i;--i;) continue;}
        //******延時子程序完畢*******
        //******中斷初始化子程序開始******
        void int_interrupt(void)
        {
         GTE=1;//
         PEIE=1;//
         RCIE=1;//
        }
        //*******中斷初始化子程序完畢********
        //********中斷服務子程序開始*********
        void  interrupt receive(void)
        {
         if(OERR==1)//判斷有無超速錯誤
           {
            CREN=0;
            CREN=1;
            }
         if(RCIF==1)
           {
            RC_buff=RCREG;
              if(RC_buff==0x2a)//判斷是否是起始標志*
                {
                 RC_label=1;
                }
              if(RC_buff==0x23)//判斷是否是結束標志#
                {
                 RC_label=0;
                }
            }
         
          if(RC_label==1)
             RC[k++]=RC_buff;//將接收到的數據存儲在數組中
          else if(RC_label==0)
                k=0;
         if(RC[1]==0XFE&&RC[2]==0XC0&&RC[3]==0X34&&RC[5]==0X12)//判斷數據采集幀格式是否正確
             caiji_label=1;
         else caiji_label=0;
        //********中斷服務子程序完畢**********
        //********參數發送子程序開始**********
        void  TX_serve(void)
          {
           TX1[]={0X2A,0XFD,0X26,0X30,0X31,0X32};//自身參數存儲在TX1中
           TX2[]={0X56,0X52,0X52,0X4F,0X52};//出錯指示存儲在TX2中
           if(caiji_label==1)//如果數據采集幀格式正確則發送自身參數幀
              {
               for(j=0;j<6;j++)
                   {
                    TXREG=TX1[j];
                     delay(20);
                    }
              }
            if(caiji_label==0) //如果數據采集幀格式錯誤則發送出錯指示
              {
               for(j=0;j<5;j++)
                   {
                    TXREG=TX2[j];
                     delay(20);
                    }
               }
          }
        //********參數發送子程序完畢**********
        //********主程序開始**************
        void main()
           {
            int_interrupt();
            initRS232();
            TX_serve();
           end
        }

        關閉窗口

        相關文章

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