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

📄 zjq_bc.c

📁 利用福星晓程芯片3105开发多功能表时B、C相CPU的软件程序
💻 C
📖 第 1 页 / 共 2 页
字号:
       IE=0x82;

   if (IP!=2)
       IP=2;

   if (EIP!=1)
       EIP=1;                             // 外部中断2 为高级中断

   if (TR0!=1)
       TR0 = 1;                           // 启动 T0 定时器

   if (LED_LCD!=0)
       LED_LCD=0;                         // 关显示使能重置
}

/**************************************************************************************
 *
 * FUNCTION:    txdbyte
 *
 * DESCRIPTION: 一字节串口发送函数
 *
 * PARAMETERS:
 *              in:  dachar——要发送的1字节数据
 *              out: none
 *
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void txdbyte(uchar dachar)
{
   SBUF=dachar;
   ystxd=10;
                                      // 500毫秒钟发送不成功退出
   while(!TI)
   {
     if(ystxd==0)
        break;
   }

   TI=0;
}



/**************************************************************************************
 *
 * FUNCTION:    ys
 *
 * DESCRIPTION: 延时程序 ( 延时115us )
 *
 * PARAMETERS:  none
 *
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void ys(void)
{
   uchar data i;
   i=0;

   for (i=0;i<30;i++);
   i++;
}




/**************************************************************************************
 *
 * FUNCTION:    zb_pro
 *
 * DESCRIPTION: 载波接收数据包后的处理函数
 *              1. 进行数据包的校验和合法性判断
 *              2. 点亮上传指示灯
 *              3. 进行数据包的向上转发
 *              4. COM_Buf[]
 *
 * PARAMETERS:  in:  plmrxd=1 ; COM_Buf[]接收到的数据
 *              out: none
 *
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void zb_pro(void)
{
     uchar data i;
     uchar data j;
     //uint  data K;
     uchar data k;

     uchar data Len_Receive;
     uint  data CRC_H;
     uint  data CRC_L;
     uint  data CRC_Count;
     uint  data CRC_Receive;

     EIE=0x01;                               // 打开载波中断
     plmrxd=0;
     CRC_H=0;
     CRC_L=0;
     CRC_Count=0;
     CRC_Receive=0;

     if(D_F_Sign==0)
        goto D_FL_DESIGN;
     else
        goto F_FL_DESIGN;

     D_FL_DESIGN:

     i=COM_Buf[0]&0x20;

     if(i==0)                                           // 下行命令
     {
        j=COM_Buf[0]&0x18;
        k=COM_Buf[0]&0x07;

        if(j==0x00)                                     // 设置表底
           Len_Receive=14;
        else if(j==0x08)                                // 设置表号
           Len_Receive=8;
        else if(j==0x10)                                // 实时抄表
           Len_Receive=8+(2*k);
        else if(j==0x18)                                // 冻结抄表
           Len_Receive=8+(2*k);
        else
           return;

     }
     else
        Len_Receive=14;                                 // 上行命令

     CRC_H=0x0;
     CRC_L=0x0;

     for (i=0; i<(Len_Receive-2); i++)
     {
        CRC_L+=COM_Buf[i];
        CRC_H^=COM_Buf[i];
     }

     CRC_L=CRC_L&0x0FF;                                 // 屏蔽掉高位,只保留低8位

     if(COM_Buf[ (Len_Receive-1) ]==CRC_L)              // 单费率校验判断
     {
        if(COM_Buf[ (Len_Receive-2) ]==CRC_H)
           goto  send_data;
        else
           return;
     }
     else
        return;

     F_FL_DESIGN:

     Len_Receive=COM_Buf[4];
     Len_Receive+=5;
     CRC_Count=0x0;

     for (i=0;i<Len_Receive;i++)
     {
        CRC_Count+=COM_Buf[i];
     }

     CRC_Receive=COM_Buf[i+1]*256+COM_Buf[i];

     if(CRC_Receive==CRC_Count)               // 复费率校验判断
     {
        Len_Receive+=2;
        goto send_data;
     }
     else
        return;

     send_data:

     {                                        // 向上传送
         led=0;
         up_ok_txd=0;                         // 开显示和置向上标志 P35
         x=0;
         n=0;                                 // 停止串口接收

         txdbyte(0XFF);
         ys();

         txdbyte('D');
         ys();

         txdbyte('A');
         ys();

         txdbyte('T');
         ys();

         txdbyte( Len_Receive );

         for(i=0 ; i<Len_Receive ; i++)
         {
             ys();
             txdbyte(COM_Buf[i]);
         }

         up_ok_txd=1;                             // 向上标志结束 P35
     }

     for(i=0;i<60;i++)
         COM_Buf[i]=0;

     led=1;                                       // P05
}

/**************************************************************************************
 *
 * FUNCTION:    upok_zbpog
 *
 * DESCRIPTION: 下级数据包向上转发函数
 *              1. 进行下级数据包的转发
 *
 * PARAMETERS:  in:  up_ok_txd=0
 *              out: none
 *
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void upok_zbpog(void)
{
      if(up_ok_rxd==0)                 // 下级有数据发送,进行转发 P32
      {
         x=0;
         n=0;                          // 停止串口接收
         up_ok_txd=0;                  // 置向上传送指示 P35

         while(!up_ok_rxd)             // P32
         {
            if(txd_up==0)              // 下级数据接收口 P34
               up_txd_10=0;
            else
               up_txd_10=1;
         }

         up_ok_txd=1;                  // 清向上传送指示 P35
      }
}

/**************************************************************************************
 *
 * FUNCTION:    jzqrxd_pro
 *
 * DESCRIPTION: 接收及载波转发设置处理函数
 *              1. 接收集中器下发的串口数据包并做载波转发设置
 *
 * PARAMETERS:  in:  RI=1
 *              out: none
 *
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void jzqrxd_pro(void)
{
}

/**************************************************************************************
 *
 * FUNCTION:    main
 *
 * DESCRIPTION: 主程序
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void main(void)
{
   uchar data i;
   uchar data j;
   uchar data k;
   uchar data h;

   D_F_Sign=1;

   for(i=0;i<10;i++)
   {
       WDT_RST=0xa1;                          // 清看门狗
       for(j=0;j<255;j++);
   }


   if(D_F_Sign==0)
      D_LED_DISPLAY();
   else
      F_LED_DISPLAY();

   initsys();

   x=0;
   n=0;
   plmrxd=0;
   r_x=0;
   YS_SET_DF=0;

   while(1)
   {
       wdi=0x9a;

       initsys_ref();            // 设置重置

       up_ok_txd=1;              // 向上OK发设置 P35
       up_ok_rxd=1;              // 向上OK收设置接收判断  P32
       up_txd_10=1;              // 重置串口
       rxd_10=1;
       txd_up=1;

       if(up_ok_rxd==0)          // 下级有数据发送,进行转发
          upok_zbpog();          // 下级接收数据包向上转发函数

       if(plmrxd)
          zb_pro();              // 载波接收处理
    }
}



/**************************************************************************************
 *
 * FUNCTION:    D_LED_DISPLAY
 *
 * DESCRIPTION: 单费率程序开机指示
 *              指示灯闪烁一次
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void  D_LED_DISPLAY()
{

   uchar data i;
   uchar data j;
   uchar data k;

   led=0;                           // 开机指示灯P0^5打开

   for(i=0;i<4;i++)
   {
       for(j=0;j<250;j++)
       {
           WDT_RST=0xa1;            // 清看门狗
           for(k=0;k<0xff;k++);
       }
   }


    led=1;                           // 开机指示灯P0^5关闭

    for(i=0;i<4;i++)
    {
       for(j=0;j<250;j++)
       {
           WDT_RST=0xa1;            // 清看门狗
           for(k=0;k<0xff;k++);
       }
    }


}


/**************************************************************************************
 *
 * FUNCTION:    F_LED_DISPLAY
 *
 * DESCRIPTION: 复费率程序开机指示
 *              指示灯闪烁三次
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void  F_LED_DISPLAY()
{
   uchar data i;
   uchar data j;
   uchar data k;
   uchar data h;


   for(h=0;h<3;h++)
   {
       led=0;                        // 开机指示灯闪耀 P05

       for(k=0;k<4;k++)
       {
          for(j=0;j<250;j++)
          {
            WDT_RST=0xa1;            // 清看门狗
            for(i=0;i<0xff;i++);
          }
       }


       led=1;

       for(k=0;k<4;k++)
       {
          for(j=0;j<250;j++)
          {
            WDT_RST=0xa1;            // 清看门狗
            for(i=0;i<0xff;i++);
          }
       }
   }                                 // P05
}


// 复费率规约数据格式如下:
/* 44 41 54                                                      ( 3位报文头       )
 * 1F                                                            ( 1位报文总长度   )
 * 09 AF                                                         ( 2位载波同步字节 )
 * BB BB BB                                                      ( 3位集中器地址   )
 * 81                                                            ( 1位控制码       )
 * 16                                                            ( 1位规约数据长度 )
 * 1F 90                                                         ( 2为规约数据项   )
 * 25 25 00 0F 00 39 00 00 00 12 00 00 00 13 00 00 00 14 00 00   ( 规约数据体内容  )
 * 42 04                                                         ( 2位校验码       )
*/



⌨️ 快捷键说明

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