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

📄 pdemo_df.c

📁 此程序为晓成公司的参考程序资料
💻 C
📖 第 1 页 / 共 2 页
字号:
   // 定时器0重置
   if (TR0!=1)     TR0 = 1;        // 启动 T0 定时器
   // 关显示使能重置
   if (LED_LCD!=0) LED_LCD=0;
}        //  */

/////////////////////////////////
// 一字节串口发送函数
// 入口: 要发送的一字节数据
// 返回: 无
/////////////////////////////////
void txdbyte(uchar dachar)            // 单片机串口发送
{
  SBUF=dachar;
  ystxd=10;                           // 500毫秒钟发送不成功退出
  while(!TI)
  { if(ystxd==0) break;
  }
  TI=0;
}

//////////////////////////////////////////////
// 载波接收数据包后的处理函数
// 入口: plmrxd=1; pl_buf[]数据存入接收和数据
// 功能: 1。进行数据包的校验和合法性判断
//        2。点亮上传指示灯
//        3。进行数据包的向上转发
//        4。清pl_buf[]
// 返回: 无
//////////////////////////////////////////////
void zb_pro(void)
  {  uchar data i;
     EIE=0X00;                         // (A9H 使能INT2中断(EX2=1)
     tlamp=0;                          // 发送指示灯亮
     plmrxd=0;
     x=0; n=0;                         // 停止串口接收
     txdbyte('D'); txdbyte('A'); txdbyte('T');
     r_len1=r_len1+2;
     txdbyte(r_len1);
     txdbyte(0x09);  txdbyte(0xaf);
     r_len1=r_len1-2;
     for(i=0;i<r_len1;i++)
        { txdbyte(pl_buf[i]);
          wdi=0x9a;
        }
     for(i=0;i<20;i++)  pl_buf[i]=0;
     tlamp=1;                          // 发送指示灯灭
     EIE=0X01;                         // (A9H 使能INT2中断(EX2=1)
  }

void zb_pro_d(void)
  {  uchar data i;
     EIE=0X00;                         // (A9H 使能INT2中断(EX2=1)
     tlamp=0;                          // 发送指示灯亮
     plmrxd=0;
     x=0; n=0;                         // 停止串口接收
     txdbyte(0XFF);
     txdbyte('A'); txdbyte('N'); txdbyte('S');
     txdbyte(r_len1);
     for(i=0;i<r_len1;i++)
        txdbyte(pl_buf[i]);
     for(i=0;i<14;i++)  pl_buf[i]=0;
     tlamp=1;                          // 发送指示灯灭
     EIE=0X01;                         // (A9H 使能INT2中断(EX2=1)
  }

////////////////////////////////////////////////
// 接收及载波转发设置处理函数
// 入口:RI=1
// 功能:接收集中器下发的数据包并做载波转发设置
// 返回:无
////////////////////////////////////////////////
void jzqrxd_pro(void)
{    if(RI)   // 有集中器下发命令处理
         {  RI=0;
            if((x==0)&&(SBUF=='S')) { x=1; n=1; goto qqq;}
            if(((x==1)&&(SBUF=='N'))||((x==1)&&(SBUF=='E')))
              { x=2; n=1; goto qqq; }
            if(x==1)  { x=0; n=0; goto qqq; }
            if(((x==2)&&(SBUF=='D'))||((x==2)&&(SBUF=='T')))
              { x=3; n=1; goto qqq; }
            if(x==2)  { x=0; n=0; goto qqq; }
            if(x==3)
              { x=4; ti_len=SBUF;     // 接收长度
                if ((ti_len==0)||(ti_len>240))
                     { x=0; rlamp=1;  goto qqq; }
                n=0;
                rlamp=0;         // 接收指示灯亮
                goto qqq;
              }
            if(x==4)
              { r[n]=SBUF; n++; x=5;
                goto qqq;
              }
            if(x==5)
              { r[n]=SBUF; n++;
                if (n>=ti_len)
                  { x=6;  rlamp=1;         // 接收指示灯灭
                    goto qqq;
                  }
                if (n>40)   { x=0; rlamp=1;         // 接收指示灯灭
                              goto qqq; }
                goto qqq;
              }
         }
       qqq:;
}

void jzqrxd_pro_d(void)
{    if(RI)   // 有集中器下发命令处理
         {  RI=0;
            if((x==0)&&(SBUF=='S')) { x=1; n=1; goto qqq;}
            if(((x==1)&&(SBUF=='N'))||((x==1)&&(SBUF=='E')))
              { x=2; n=1; goto qqq; }
            if(x==1)  { x=0; n=0; goto qqq; }
            if(((x==2)&&(SBUF=='D'))||((x==2)&&(SBUF=='T')))
              { x=3; n=1; goto qqq; }
            if(x==2)  { x=0; n=0; goto qqq; }
            if(x==3)
              { x=4; ti_len=SBUF;     // 接收长度
                if ((ti_len==0)||(ti_len>40))
                     { x=0; rlamp=1;  goto qqq; }
                n=0;
                //n=6;
                rlamp=0;         // 接收指示灯亮
                goto qqq;
              }
            if(x==4)
              { r[n]=SBUF; n++; x=5;

                goto qqq;
              }
            if(x==5)
              { r[n]=SBUF; n++;
                //if (n>=ti_len+6)
                if (n>=ti_len)
                  { x=6;  rlamp=1;         // 接收指示灯灭
                    goto qqq;
                  }
                if (n>40)   { x=0; rlamp=1;         // 接收指示灯灭
                              goto qqq; }
                goto qqq;
              }
         }
       qqq:;
}

/////////////////////////////////////
// 主程序
/////////////////////////////////////
void main(void)
{ uchar data i,j,h;
  for(h=0;h<0xff;h++);
  d_f=1;  d_f_x=0;  x_09af=0;
  for(i=0;i<3;i++)
    { if(d_f==1)
        {  for(h=0;h<0xff;h++);
           if(d_f==1) { d_f_x='F'; goto f_led; }
        }
       else
        {  for(h=0;h<0xff;h++);
           if(d_f==0)
             { d_f_x='D'; goto d_led; }
        }
    }
  d_f_x='F';
  f_led:                              //  复费率开机显示
  for(h=0;h<3;h++)
    {  rlamp=0; tlamp=0;              // 开机指示灯闪耀 P05
       for(j=0;j<255;j++)
         {  WDT_RST=0xa1;             // 清看门狗
            for(i=0;i<0xff;i++);
            for(i=0;i<0x80;i++);
         }
       rlamp=1; tlamp=1;
       for(j=0;j<255;j++)
         {  WDT_RST=0xa1;             // 清看门狗
            for(i=0;i<0xff;i++);
            for(i=0;i<0x80;i++);
         }
     }
  initsys();
  txdbyte('O'); txdbyte('K');  txdbyte('F');
  x=0; n=0; plmrxd=0; plmtxd=0;  r_x=0;
  goto  main_lp;

  d_led:                         // 单费率开机显示
  rlamp=0; tlamp=0;              // 开机指示灯闪耀 P05
  for(j=0;j<240;j++)
     {  WDT_RST=0xa1;            // 清看门狗
        for(i=0;i<0xff;i++);
     }
  rlamp=1; tlamp=1;
  initsys();
  txdbyte('O'); txdbyte('K');  txdbyte('D');
  x=0; n=0; plmrxd=0; plmtxd=0;  r_x=0;

  main_lp:                       // 主循环
  while(1)
    { d_f=1;
      while(1)
         { if(d_f==1)
            { for(h=0;h<0x60;h++);
              if(d_f==1)
                if(d_f_x=='F') goto f_lp;
            }
           else
            { for(h=0;h<0x60;h++);
              if(d_f==0)
                if(d_f_x=='D') goto d_lp;
            }
         }
       f_lp:                     // 复费率循环
       wdi=0x9a;                 // 清看门狗
       initsys_ref();            // 设置重置
       txd=1;                    // 重置串口
       rxd=1;
       if(plmrxd)
           zb_pro();             // 载波接收处理
       if(RI)                    // 有集中器串口下发命令判断
         jzqrxd_pro();           // 接收及载波转发设置处理函数
       if(x==6)
          { // 设置载波发送起始数据
                x=7;
                ti_len++;
                pl_data=r[0];     // 送发送首字节
                pl_len=0;         // 发送字节计数
                pl_8=0;           // 发送位计数
                plmtxd=1;         // 置正在发送标志
                plret_l=0;        // 清载波复位计数器
                // 设置载波发送态
                PLM_RST=0xa2;     // 复位发送计数器
                PLM_RS=1;         // 置载波发送态
                tlamp=0;          // 发送指示灯亮
          }
       if(x==7)
         {  if(plmtxd==0)
                x=0;              // 判断载波是否发送完; 发送完将 x=0;
         }
       continue;

       d_lp:                     // 单费率循环
       wdi=0x9a;                 // 清看门狗
       initsys_ref();            // 设置重置
       txd=1;                    // 重置串口
       rxd=1;
       if(plmrxd)
           zb_pro_d();             // 载波接收处理
       if(RI)                      // 有集中器串口下发命令判断
         jzqrxd_pro_d();           // 接收及载波转发设置处理函数
       if(x==6)
          { // 设置载波发送起始数据
                x=7;
                pl_data=r[0];     // 送发送首字节
                pl_len=0;         // 发送字节计数
                pl_8=0;           // 发送位计数
                plmtxd=1;         // 置正在发送标志
                // 设置载波发送态
                PLM_RST=0xa2;     // 复位发送计数器
                PLM_RS=1;         // 置载波发送态
                tlamp=0;          // 发送指示灯亮
          }
       if(x==7)
         {  if(plmtxd==0)
                x=0;              // 判断载波是否发送完; 发送完将 x=0;
         }
    }
}
//
//}

⌨️ 快捷键说明

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