×
单片机 > 单片机程序设计 > 详情

PIC16F877A与PC机串行通信C语言源程序

发布时间:2020-05-16 发布时间:
|
//*******串口通信程序*********
//*******定义变量*************
#include
#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
}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计