專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

PIC16F877A與PC機(jī)串行通信C語(yǔ)言源程序

作者:huqin   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年03月25日   【字體:

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

關(guān)閉窗口

相關(guān)文章