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

📄 wanterhub.c

📁 水控HUB的程序
💻 C
📖 第 1 页 / 共 3 页
字号:

     TMOD=0x21;
     TH1=0xfe;
     TL1=0xfe;
    // WDCON=0x80;     //将串口1波特率翻倍

     TH2=0xff;
     TL2=0xf4;//0xfa;//;         //ff:fd  ff:fa ff:f7 ff:f4 ff:ee ff:dc
     RCAP2H=0xff;                //115200 57600 38400 28800 19200 9600
     RCAP2L=0xf4;//0xfa;
     T2CON=0x34;       //tf2 exf2 rclk tclk exen2 tr2 c/t2 cp/rl2
     //PCON=0x80;      /*smod * * * gf1 gf0 pf idl smod=1 baud double 57600bps*/

     TR1=1;
     ES1=1;
     ES=0;
}


/********************************************************/
/*Function:  串口1发送一字节                            */
/*Input:     uchar data1                                */
/*Output:    Nun.                                       */
/*Description:                                          */
/********************************************************/
void SendByte(uchar data1)
{
     re184_dn=1;
     NOP5();
     SBUF1=data1;
     while(!TI_1);TI_1=0;

     NOP5();
     re184_dn=0;
     NOP5();
}

/********************************************************/
/*Function:  串口1接收1字节                             */
/*Input:     Nun.                                       */
/*Output:    uchar data1                                */
/*Description:                                          */
/********************************************************/
uchar ReceiveByte(void)
{
      uchar data data1;
      uint  data count;
      s_err=1;

      for (count=0;count<800;count++)                /*delay 5.5ms       */
      {
          if (RI_1)
          {
             s_err=0;
             RI_1=0;
          }

          if (!s_err)
              break;
          watchdog=~watchdog;
      }

      data1=SBUF1;
      return (data1);
}

/********************************************************/
/*Function:  串口1接收一帧数据                          */
/*Input:     Nun.                                       */
/*Output:    Nun.                                       */
/*Description:                                          */
/********************************************************/
void ReceiveData(void)
{
     uchar data i;
     uchar data pf;
     uchar data length;
     uchar idata *pnt=Ri1Buf;

     f_ri1=0;
     *pnt=ReceiveByte();                   //接收帧数据长度

     if (!s_err)
     {
        pf=*pnt;

        length=(*pnt-2);

        if (length>19)
            length=18;

        for (i=0;i<length;i++)
        {
            *pnt=ReceiveByte();

            if (!s_err)
            {
               pf+=*pnt++;
            }
            else
                break;
        }                                     //接收帧命令和帧数据

        if (!s_err)
        {
           *pnt=ReceiveByte();                //接收校验和

           if (s_err==0&&*pnt==pf)
           {
              f_ri1=1;                        //正确接收到一帧数据
           }
           else
              f_ri1=0;                        //帧数据错误
        }
        else
            f_ri1=0;
     }
}

/********************************************************/
/*Function:  HUB轮寻POS                                 */
/*Input:     Nun.                                       */
/*Output:    Nun.                                       */
/*Description:                                          */
/********************************************************/
void LookForPos(void)
{
     uchar data pf;
     uchar data i,j;
     uchar idata pos_status;

     ES1=0;
     if (PosName<32)
     {
        TB8_1=1;
        SendByte(PosName);                 //发送POS地址

        TB8_1=0;
        SendByte(0x5);                     //发送数据帧长度

        TB8_1=0;
        SendByte(0x1);                     //发送帧命令
        pf=0x6;

        TB8_1=0;
        SendByte(status);                  //发送POS功能状态
        pf+=status;

        TB8_1=0;
        SendByte(address);                 //发送HUB地址
        pf+=address;

        TB8_1=0;
        SendByte(pf);                      //发送校验和

       ReceiveData();                     //接收POS应答信息


       //脱机联机状态标志判别
       i=PosName/4;
       j=PosName%4;

       if (f_ri1)
       {
          uchar idata *pnt=Ri1Buf;
          switch(*pnt)
          {
               case 1: //轮寻空闲应答
                 if(*(pnt+2)==0x00)
		 switch(j)
		 {
                         case 0:
                              pos_status=InOrOff[i];
                              pos_status=pos_status&0xfc;
                              InOrOff[i]=pos_status|0x01;

                              break;

                         case 1:
                              pos_status=InOrOff[i];
                              pos_status=pos_status&0xf3;
                              InOrOff[i]=pos_status|0x04;

                              break;
                         case 2:
                              pos_status=InOrOff[i];
                              pos_status=pos_status&0xcf;
                              InOrOff[i]=pos_status|0x10;

                              break;
                         default:
                              pos_status=InOrOff[i];
                              pos_status=pos_status&0x3f;
                              InOrOff[i]=pos_status|0x40;
                              break;

                        }

	         else if(*(pnt+2)==0xfe)
                       switch(j)
                       {
                         case 0:
                              pos_status=InOrOff[i];
                              pos_status=pos_status&0xfc;
                              InOrOff[i]=pos_status|0x02;
                              break;
                         case 1:
                              pos_status=InOrOff[i];
                              pos_status=pos_status&0xf3;
                              InOrOff[i]=pos_status|0x08;
                              break;
                         case 2:
                              pos_status=InOrOff[i];
                              pos_status=pos_status&0xcf;
                              InOrOff[i]=pos_status|0x20;
                              break;
                         default:
                              pos_status=InOrOff[i];
                              pos_status=pos_status&0x3f;
                              InOrOff[i]=pos_status|0x80;
                              break;
                       }
                 else
                       switch(j)
                       {
                          case 0:
                              pos_status=InOrOff[i];
                              pos_status=pos_status&0xfc;
                              InOrOff[i]=pos_status|0x03;
                              break;
                          case 1:
                              pos_status=InOrOff[i];
                              pos_status=pos_status&0xf3;
                              InOrOff[i]=pos_status|0x0c;
                              break;
                          case 2:
                              pos_status=InOrOff[i];
                              pos_status=pos_status&0xcf;
                              InOrOff[i]=pos_status|0x30;
                              break;
                          default:
                              pos_status=InOrOff[i];
                              pos_status=pos_status&0x3f;
                              InOrOff[i]=pos_status|0xc0;
                              break;
                       }
		     break;
              case 2:
                        poszhGet();
                        break;
              case 3:
                     {
			uchar data i;
			uchar data pf;
			pf=0;
                        if(f_over==0)
                        {
			   if ((ListCode[Ri1Buf[2]]!=Ri1Buf[14])&&((Ri1Buf[12]<0xc3)&&(Ri1Buf[11]==0)))//判断本次消费流水和上次消费流水是否一致
                           {
				ListCode[Ri1Buf[2]]=Ri1Buf[14];   //更新消费流水号
				SalePoint=0x1000;
                                SalePoint+=SaleBeg*(SaleLength+1);//计算地址
                                pnt++;
                                fm_cs=0;
                                for (i=0;i<SaleLength;i++)
                                {
                                   *SalePoint++=*pnt;
                                   pf+=*pnt++;
				}
                                *SalePoint++=pf;

                                i=(SALEBEG_H-SALEBEG_H1)|(SALEBEG_H-SALEBEG_H2);
                                pf=(SALEBEG_L-SALEBEG_L2)|(SALEBEG_L-SALEBEG_L2);
                                if(i||pf)
                                    f_err=1;
                                else
                                {
                                     SaleBeg+=1;
                                     SaleBeg=SaleBeg%2000;
                                     SALEBEG_H=SaleBeg/0x100;
                                     SALEBEG_L=SaleBeg%0x100;
                                     SALEBEG_H1=SaleBeg/0x100;
                                     SALEBEG_L1=SaleBeg%0x100;
                                     SALEBEG_H2=SaleBeg/0x100;
                                     SALEBEG_L2=SaleBeg%0x100;
                                }
                                fm_cs=1;                      //更新表头
                                if ( (SaleBeg+1)==SaleEnd)
                                {
                                    f_over=1;                 //判断消费存储区域有无满
                                    beepp(400);
                                }
                                else
                                    f_over=0;
			   }
			   else
                             _nop_();

                       //    ES1=0;
                           TB8_1=1;
                           SendByte(PosName);        //发送POS地址
                           TB8_1=0;
                           SendByte(0x4);                  //长度
                           TB8_1=0;
                           SendByte(0x4);                  //功能号
                           TB8_1=0;
                           SendByte(0x55);                  //应答
                           TB8_1=0;
                           SendByte(0x5d);                  //pf
                       //    ES1=1;
                        }
		    }
		    break;
               default:
		    break;
               }
	}
	else    //对应(if ri1)
        {
              InOrOff[i]=(InOrOff[i]&(~(3<<(j*2))));//保存离线标志
        }

        PosName++;
     }

     else     //对应posname<32
     {
            PosName=0x00;
     }

     ES1=1;

}


/*********************************************************/
/*Function:  HUB收到POS申请帐号的处理                    */
/*Input:     Nun.                                        */
/*Output:    Nun.                                        */
/*Description: 一个PCI轮寻周期里面每POS就允许申请一次帐号*/
/*********************************************************/

void poszhGet(void)
{
	uchar data  i,pf;
	uchar idata *pnt=Ri1Buf;
	uchar xdata *pnt1=AccountBuf;

	pnt1+=Ri1Buf[1]*7;
	pf=0;
        for(i=1;i<7;i++)
        {
           *pnt1++=Ri1Buf[i];
           pf+=Ri1Buf[i];
        }
	*pnt1=pf;
	f_zhstate=1; //帐户申请区非空
}

/********************************************************/
/*Function:  比较发送消费信息                           */
/*Input:     Nun.                                       */
/*Output:    Nun.                                       */
/*Description:                                          */
/********************************************************/
void SendSaleRecord(void)
{
	uchar data i,j;
	uchar xdata Buf[14];
	uchar xdata *pnt=&SaleBuf;
	uchar xdata *pnt2=&Buf;
	uchar data pf,checksum;
        fm_cs=0;
        i=(SALEEND_H-SALEEND_H1)|(SALEEND_H-SALEEND_H2);
        j=(SALEEND_L-SALEEND_L1)|(SALEEND_L-SALEEND_L2);
        fm_cs=1;
        if(i||j)
              f_err=1;
        if((!f_err)&&(!f_sal)&&(SaleBeg!=SaleEnd))
	{
		SaleCount=0;
		pf=0;
		checksum=0;

		SalePoint=0x1000;
		SalePoint+=SaleEnd*(SaleLength+1);
                pnt+=3;
		while((SaleCount<10)&&(SaleBeg!=SaleEnd))
		{
                        pf=0;
                        pnt2=&Buf;
                        if (SalePoint>=0x7D60)
			{
				SalePoint=SalePoint-0x7D60+0x1000;
			}
                        fm_cs=0;
			for (i=0;i<SaleLength;i++)
			{
				pf+=*SalePoint;
				*pnt2++=*SalePoint++;
			}
                        *pnt2=*SalePoint++;
			pnt2=&Buf;
			if((*pnt2!=0xc1)&&(*pnt2!=0x41))
			{
				SaleEnd=(SaleEnd+1)%2000;
                                *(SalePoint-14)=0xff;
			}
			else if(pf!=Buf[13])
			{
				SaleEnd=(SaleEnd+1)%2000;
				*(SalePoint-14)=0xff;
			}
			else
			{
				*pnt++=17;                      //单包数据长度
				*pnt++=0x3;                     //功能号
				*pnt++=address;                 //管理机地址
				pf=20+address;
				for (i=0;i<SaleLength;i++)
				{
					pf+=*pnt2;
					*pnt++=*pnt2++;
				}
                                *pnt++=pf;
                                checksum+=2*pf;
				SaleEnd=(SaleEnd+1)%2000;
				SaleCount++;
				*(SalePoint-14)=0xff;
			}

		}
		if(SaleCount!=0)
		{
                        pnt=&SaleBuf;
                        Serial0SendNum=5+SaleCount*17;
                         *pnt++=Serial0SendNum;
                        checksum+=(5+SaleCount*17);
                        *pnt++=0x3;
                        checksum+=0x3;

⌨️ 快捷键说明

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