⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sci.c

📁 w77e58 双串口 液晶显示源程序 c语言编写
💻 C
📖 第 1 页 / 共 2 页
字号:
void sci_int(void) interrupt 4  using 3 //串行口0中断处理程序
{
   uchar temp;
   bit md_temp=1;

 if(RI)             //接收中断
   {
      RI=0;
      temp=SBUF;
      switch(re_temp)
      {
       case 0:                         //如果re_temp=0表示还没有收到同步字,判断是否为同步字
        {
          switch(re_temp1)
          {case 0: {
                     if(temp==0xD7)
                       re_temp1=1;
                     else re_data();
                    } break;
           case 1: {
                     if(temp==0x09)
                      {
                        re_temp1=0;
                        re_temp2++;
                        if(re_temp2==3)
                           re_temp=1;
                       }
                    else if(temp==0xD7)
                       {
                         re_temp1=1;re_temp2=0;
                        }
                    else re_data();
                      }  break;
              default:{re_data();}break;
              }
            }  break;
        case 1:
          {
           re_buf[re_no++]=temp;       //如果re_temp=1表示已经收到同步字,对控制字进行处理
          /***************判断6个数据是否收完********************/
             if(re_no==6)
              {
               re_no=0;
                if(!((re_buf[0]^0x01)&0x8e)) //控制字节低四位是否为0001,E=0?  if1
                {                               //控制字正确,对控制字处理
                   L=(re_buf[0]&0x40);
                   S=(re_buf[0]&0x20);
                   D=(re_buf[0]&0x10);
                   if(D)
                     {
                     if(re_buf[4]!=sn)
                     {re_data();md_temp=0; }
                     }
                   if(md_temp)
                    {

                     temp=crc(re_buf);
                     if(re_buf[5]==crc(re_buf))              //收到一组6个数据以后crc校验
                     {
                      if(S) {re_yuan=re_buf[3];}             //有源地址,反馈信息以此为目的地址
                      if(L) {re_xinxi=re_buf[2];re_temp=2;}  //本帧有信息字
                      re_zlb=re_buf[1];
                      switch(re_zlb)
                       {
                       case 0x01:
                           {
                             tx_data(0x01,re_yuan);
                             re_data();
                            };break;
                       case 0xf0:{tx_data(tx_zlb_end,tx_add_end);re_data();} break;
                       default:break;
                       }
                      }
                     else
                     {                //校验错误,反馈信息给上位机
                      if((re_buf[3]==re_yuan)&&(re_yuan!=sn))
                          tx_data(0xf0,re_yuan);
                      re_data();
                     }
                    }
                  }
             else {
                   re_data();    //不符合控制字节规则,else1
                  }
             }
                           } break;
            //*****************判断6个数据收完,何种命令结束***************************//
        case 2:              //如果re_temp=2表示帧中包含信息字,对信息字处理
            {
              re_buf[re_no++]=temp;
          /***************判断6个数据是否收完********************/
             if(re_no==6)
              {
                re_no=0;
                temp=crc(re_buf);
                if(re_buf[5]==crc(re_buf))              //收到一组6个数据以后crc校验
                {
                 switch(re_zlb)
                  {
                  case 0x10:
                    {
                     if((re_buf[0]==0xf0)&&(re_buf[1]==re_buf[3])&&(re_buf[2]==re_buf[4])&&(re_xinxi==0x01))
                       {
                        re_xinxi=0;
                        set_ov[0]=re_buf[1];
                        set_ov[1]=re_buf[2];
                        sci_set1=1;
                        tx1_data(0x10,tx_mudi);
                        re_data();
                       }
                    }break;
                  case 0x12:
                    {
                     if((re_buf==0xf2)&&(re_buf[1]==re_buf[3])&&(re_buf[2]==re_buf[4])&&(re_xinxi==0x01))
                       {
                         re_xinxi=0;
                        set_lv[0]=re_buf[1];
                        set_lv[1]=re_buf[2];
                        sci_set2=1;
                        tx1_data(0x12,tx_mudi);
                         re_data();
                       }
                    }break;
                  case 0x14:
                    {
                     if((re_buf==0xf2)&&(re_buf[1]==re_buf[3])&&(re_buf[2]==re_buf[4])&&(re_xinxi==0x01))
                       {
                        re_xinxi=0;
                        set_ovv[0]=re_buf[1];
                        set_ovv[1]=re_buf[2];
                        sci_set3=1;
                        tx1_data(0x14,tx_mudi);
                        re_data();
                       }
                    }break;
                  case 0x30:tx1_data(0x30,tx_mudi);
                  case 0x32:tx1_data(0x32,tx_mudi);
                  case 0x34:tx1_data(0x34,tx_mudi);
                  default: {re_data();} break;
                  }
                 }
                else                                   //校验错误
                {
                 re_data();
                 tx_data(0xf0,re_yuan);
                 }
             }   }break;
        default: break;
        }
    }
   else                               //发送中断
   {
    TI=0;
    //DE=1;
   switch(tx_temp)
      {case 0: {
               if(tx_temp1==0)
                   {SBUF=0xD7;tx_temp1=1;}
               else
                 {
                    SBUF=0x09;tx_temp1=0;tx_temp2++;
                    if(tx_temp2==3)
                     {
                      tx_no=0;
                      tx_temp=1;
                      tx_temp2=0;
                      tx_buf[0]=0x01;
                      tx_buf[1]=tx_zlb;
                      switch(tx_buf[1])
                         {
                          case 0x01: {tx_buf[0]=(tx_buf[0]|0x40);tx_buf[2]=0x08;tx_xinxi=0x08;}break;
                          case 0x30: {tx_buf[0]=(tx_buf[0]|0x40);tx_buf[2]=0x01;tx_xinxi=0x01;}break;
                          case 0x32: {tx_buf[0]=(tx_buf[0]|0x40);tx_buf[2]=0x01;tx_xinxi=0x01;}break;
                          case 0x34: {tx_buf[0]=(tx_buf[0]|0x40);tx_buf[2]=0x01;tx_xinxi=0x01;}break;
                          default:   tx_buf[2]=0x00;break;
                         }
                      if(S){tx_buf[0]=(tx_buf[0]|0x20);tx_buf[3]=sn;}
                         else  tx_buf[3]=0x00;
                      if(D){tx_buf[0]=(tx_buf[0]|0x10);tx_buf[4]=tx_add;}
                         else  tx_buf[4]=0;
                      tx_buf[5]=crc(tx_buf);
                      }
                   }
                } break;
       case 1: {
                SBUF=tx_buf[tx_no++];
                if(tx_no==6)
                 {
                   tx_no=0;
                   switch(tx_zlb)
                   {case 0x01:{tx_temp=2;
                              data_no=0;
                              tx_xinxi=0x08;
                              get_tx();} break;
                    case 0x30:{tx_temp=2;
                              tx_buf[0]=0xf0;
                              tx_buf[1]=o_v[0];
                              tx_buf[2]=o_v[1];
                              tx_buf[3]=o_v[0];
                              tx_buf[4]=o_v[1];
                              tx_buf[5]=crc(tx_buf);} break;
                   case 0x32:{tx_temp=2;
                              tx_buf[0]=0xf2;
                              tx_buf[1]=l_v[0];
                              tx_buf[2]=l_v[1];
                              tx_buf[3]=l_v[0];
                              tx_buf[4]=l_v[1];
                              tx_buf[5]=crc(tx_buf);} break;
                   case 0x34:{tx_temp=2;
                              tx_buf[0]=0xf4;
                              tx_buf[1]=ov_v[0];
                              tx_buf[2]=ov_v[1];
                              tx_buf[3]=ov_v[0];
                              tx_buf[4]=ov_v[1];
                              tx_buf[5]=crc(tx_buf);} break;
                   default:   tx_temp=3; break; }
                  }
                 }  break;
       case 2: {
                SBUF=tx_buf[tx_no++];
                if(tx_no==6)
                 {
                 tx_no=0;
                 if(--tx_xinxi)
                    get_tx();
                 else
                    tx_temp=3;
                 }
                } break;
      case 3:  {
               tx_flag=0;
               tx_temp=0;
               tx_temp1=1;
               tx_temp2=0;
               if(tx_zlb!=0xf0)            //如果帧类别不为0xf0,则将最终发送的帧类别代码暂存tx_zlb_end
                  {
                  tx_zlb_end=tx_zlb;       //如果收到校验错误帧类别,以该帧类别发送数据
                  tx_add_end=tx_add;
                  }
               if(tx_fifo)
                 {tx_fifo=0;tx_data(tx_zlb_temp,tx_add_temp);}
               else DE=1;
                } break;
      default: break; 
    } 
   }
}


void sci1_int(void) interrupt 7  using 3 //串行口1中断处理程序
{
   uchar temp,temp2,i;
   bit md1_temp=1;
   if(RI1)             //接收中断
   {
    RI1=0;
    temp=SBUF1;
     switch(re1_temp)
      {
       case 0:                         //如果re1_temp=0表示还没有收到同步字,判断是否为同步字
         { switch(re1_temp1)
             {case 0: {if(temp==0xD7)
                         re1_temp1=1;
                       else {re1_temp=0;re1_temp1=0;re1_temp2=0;}} break;
              case 1: {if(temp==0x09)
                         {
                          re1_temp1=0;
                          re1_temp2++;
                          if(re1_temp2==3)
                           re1_temp=1;
                          }
                        else if(temp==0xD7)
                           {
                           re1_temp1=1;re1_temp2=0;
                            }
                        else{re1_temp=0;re_temp1=0;re_temp2=0;}} break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -