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

📄 posgsm.c

📁 用于无线POS 数据传输的原程序。通过调制解条芯片实现
💻 C
字号:
#include <reg52.h>
#include "POSGSM.h"

extern  unsigned char bdata ISR580;

static unsigned char data RX580DATA[BUFDATA_LEN];
 static unsigned char data RX2901DATA[BUFDATA_LEN];

void Recover2901(void);
void sendto2901(void);
void Recovermc35(void);
void sendtomc35(void);
void waitforpos(void);

unsigned char getFdata(unsigned char *fifobuf);
putFdata(unsigned char RXdata, unsigned char *fifobuf);
//unsigned char testFdata(unsigned char *fifobuf);
initFdata(unsigned char *fifobuf);

unsigned char code Init2901[12]={12,'A','T','V','1','E','0','Q','0','X','0',0x0D};
unsigned char code ATE0[6]={6,'A','T','E','0',0x0D};
unsigned char code ATV1[6]={6,'A','T','V','1',0x0D};
unsigned char code ATX0[6]={6,'A','T','X','0',0x0D};
unsigned char code ATC1[7]={7,'A','T','&','C','1',0x0D};
unsigned char code ATD2[7]={7,'A','T','&','D','2',0x0D};
unsigned char code ATS0[7]={7,'A','T','&','S','0',0x0D};
unsigned char code AT2400[13]={13,'A','T','+','I','P','R','=','2','4','0','0',0x0D};
unsigned char code ATCSQ[8]={8,'A','T','+','C','S','Q',0x0D};
unsigned char code ATJ0[6]={6,'A','T','J','0',0x0D};
unsigned char code ATJ6[6]={6,'A','T','J','6',0x0D};
unsigned char code ATS65[8]={8,'A','T','S','6','5','?',0x0D};
unsigned char code RELASTAT[3]={3,'A','/'};
unsigned char code ATD[4]={4,'A','T','D'};
unsigned char code ATA[5]={5,'A','T','A',0x0D};
unsigned char code ATH[5]={5,'A','T','H',0x0D};
unsigned char code ATH1[6]={6,'A','T','H','1',0x0D};
unsigned char code ATZ[5]={5,'A','T','Z',0x0D};
unsigned char code CONNECT[8]={8,'C','O','N','N','E','C','T'};
unsigned char code OK[4]={4,'O','K',0x0D};
unsigned char code *(code InitMC35[7])={ATE0,ATV1,ATX0,ATC1,ATD2,ATS0,AT2400};

void Inittimer2TOdial(void)//定时2初始化
{
   T2MOD=2;              //00000010,gate,c/t,m1,m0
   T2CON=0;               
   RCAP2L=0xb7;          //初值有错误,要产生的是450KHZ的拨号音
   RCAP2H=0xfb;

}

void InitSerial(void)//串行初始化
{   
	SCON = 0x50;//方式3,接收允许
	PCON = 0x00;
	TMOD = TMOD & 0x0f;
	TMOD = TMOD | 0x20;
	TH1 = 0xf4;                   //com is 2400 b/s
	TL1 = 0xf4;
	TR1 = 1;
//	ES = 1;

}



void delayx(unsigned char ddlt)
{   unsigned char i,j;
 for (j=0;j<ddlt;j++)  
    for (i=0;i<120;i++)
     {
	    i++;
		i--;
	 }
}	

unsigned char init9201(void)//初始化2901输入ATZ, ATV1E0X0Q0
{  unsigned char i,ret1;

 delayx(1);
 	for(i=1;i<ATZ[0];i++)
	{
	   TI=0;
	   SBUF=ATZ[i];
   	   while(TI==0);//等待发送完毕当TI=1时,不执行WHILE 语句。
      
	}
  	
	RI=0;
 	for(i=1;i<OK[0];i++)
	{
	    while(RI==0); 
      	
		ret1=SBUF;
	     if (OK[i]!=ret1)
           { MRST=1;             //reset 2901
             delayx(0);
			 MRST=0;  
			 return 1;
		   }
   	     RI=0;
 	}

for(i=1;i<Init2901[0];i++)
	{
	   TI=0; 
	   SBUF=Init2901[i];
   	   while(TI==0);
 	   //TI=0;
	}
  	
	RI=0;
 	for(i=1;i<OK[0];i++)
	{
	    while(RI==0);
        ////RI=0;//后来添加
		ret1=SBUF;
	     if (OK[i]!=ret1)
           {MRST=1; //reset 2901
		    delayx(0);
			MRST=0;  
			return 1;
		   }
   	     RI=0;

	}
TI=0;
return 0;
}



 
unsigned char L580read(unsigned char rsadd)//
{ unsigned char data temp;
  P0=0xFF;
  P2=rsadd;
  RD=0;
  temp=P0;
  RD=1;
  return temp;

}
void L580write(unsigned char rsadd,unsigned char temp)
{ 
  P2=rsadd;
  P0=temp;
  WR=0;
  ;
  WR=1;
}
void init580(void)        //X16L580初始化
{
  //// while(L580read(2)!=1);//P2=010,(A0A1A2)返回值为P1的值若是非1
   L580write(3,0x83); //set serial rate,(A0A1A2=011)把10000011写入P0
   L580write(0,1);     //(A0A1A2=000),把00000001写入P0
   L580write(1,0x20);  //(A0A1A2=001), 把00100000写入P0
   L580write(3,3);    //set data format to 8,n,1
   L580write(1,3);    //set to no fifo and no dma
   L580write(2,0);    //set INT
}

unsigned char  initMC35by580(void)
{  unsigned char i,j;
delayx(100);  
for (j=0;j<7;j++)
{
 for(i=1;i<InitMC35[j][0];i++)
	{  L580read(2);
	   L580write(0,InitMC35[j][i]);
	   while(INT0);
       
	}
	L580read(2);

 for(i=1;i<OK[0];i++)
	{
	    while(INT0); 
	     if (OK[i]!=L580read(0))
           { PD=1;                     //POWER  OFF MC35
		   for (j=0;j<35;j++)
		     delayx(100);
			 PD=0;
		   delayx(100);
		   RST=0;
           delayx(100);
		   RST=1;
		   return 1;
		   }
   	     L580read(2);
	}
}
return 0;
}

void main(void)
{  // uint8 i,j,*atsp,ret1;
//AUXR1=0;
PD=0;
 delayx(10);
// while(MRST);  //WAIT FOR 2901 RESET COMPLETE
 MRST=0;
 
 RST=0;          //power on MC35
 delayx(100);
 RST=1;

Inittimer2TOdial();

	InitSerial();

   // while(init9201());

	init580();
delayx(100);
   ////while( initMC35by580());
POSON=0;
	TMOD = (TMOD & 0XF0) | 0X01;
/*	TL0 = 0x0;
	TH0 = 0x4C;
	TR0 = 1;
	ET0 = 1;
	TF0 = 0;*/


while(1)
{
 
 EX1=1;
 EA=1;

initFdata(RX580DATA);
initFdata(RX2901DATA);

while(!POSON);

waitforpos();

while(IE1)     //
{ if(TX2901RDY)
  {	   EA=0; 
       if(RX580DATA[0]>0)
	      {
           SBUF=getFdata(RX580DATA);
	       TX2901RDY=0;
		  }
	EA=1; 
   }
  if(TX580RDY)
  {
         EA=0; 
       if(RX2901DATA[0]>0)
	      {L580write(0,getFdata(RX2901DATA)); }
	       TX580RDY=0;
		EA=1; 	 


   }

}
EA=0;
ES=0;
EX0=0;
TF2=0;
         TI=0;
		  SBUF='A';
		  while(TI==0);
          TI=0;
		  SBUF='T';
		  while(TI==0);   
          TI=0;
		  SBUF='H';
		  while(TI==0);
		  POSON=0;
		  TI=0;

	   L580read(2);
	   L580write(0,'A');
	   while(INT0);
	   	   L580read(2);
	   L580write(0,'T');
	   while(INT0);
	   	   L580read(2);
	   L580write(0,'H');
	   while(INT0);
	   	   L580read(2);
	   L580write(0,0x0D);
	   while(INT0);
}

}


void comm(void) interrupt 4
{
   
    if (RI== 1)
    {  RI = 0;
	   EA=0;
	   putFdata(SBUF,RX2901DATA);
	   TX580RDY=1;
       EA=1;
    }
    if (TI == 1)
    {  TI = 0;
	   EA=0; 
       TX2901RDY=1;
	   EA=1; 

    }
   
}



void comm580(void) interrupt 0  //INT0
{ unsigned char temp;
    
    ISR580=ISR580|(L580read(2)&0x0f);
    if (RI2==1)
    {  RI2=0;
	   	   EA=0;
	   putFdata(L580read(0),RX580DATA);
	   TX2901RDY=1; 
       EA=1; 
 temp=L580read(0);

    }
    if (TI2==1)
    {  TI2=0;
       EA=0;
       TX580RDY=1; 
       EA=1;
    }
    
}







void Posup(void) interrupt 2  //INT1 POS 摘机
{
 
 
  EX1=0;

  EX0=0;      //desable int0(580 int) 
  ES=0;       //desable serial int  
  POSON=1;

   T2MOD=2;
   T2CON=0;
   RCAP2L=0xFB;
   RCAP2H=0xB7;
   TR2=1;
   ET2=1;
   

}

void TIMER2(void) interrupt 5
{
TF2=0;
if(T2)
   {T2=0;}
 else
 {T2=1;}
}




void waitforpos(void)
{unsigned char i,ret1,ret2;
  unsigned char RS65;

	for(i=1;i<ATH1[0];i++)
	{
	   TI=0; 
	   SBUF=ATH1[i];
   	   while(TI==0);
	}
	for(i=1;i<OK[0];i++)
	{
	    while(RI==0); 
		ret1=SBUF;
	     if (OK[i]!=ret1)
           { AUXR1|=8;  }
   	     RI=0;
 	}

	for(i=1;i<ATJ0[0];i++)
	{
	   TI=0; 
	   SBUF=ATJ0[i];
   	   while(TI==0);
	}
	for(i=1;i<OK[0];i++)
	{
	    while(RI==0); 
		ret1=SBUF;
	     if (OK[i]!=ret1)
           { AUXR1|=8;  }
   	     RI=0;
 	}

	for(i=1;i<ATJ6[0];i++)
	{
	   TI=0; 
	   SBUF=ATJ6[i];
   	   while(TI==0);
	}

	for(i=1;i<OK[0];i++)
	{
	    while(RI==0); 
		ret1=SBUF;
	     if (OK[i]!=ret1)
           { AUXR1|=8;  }
   	     RI=0;
 	}

		for(i=1;i<ATS65[0];i++)
	{
	   TI=0; 
	   SBUF=ATS65[i];
   	   while(TI==0);
	}
	   
	     L580read(2);
       L580write(0,'A');
       while(INT0);
   
       L580read(2);
       L580write(0,'T');
	   while(INT0);

       L580read(2);
       L580write(0,'D');

    while(SBUF!=128)  
     { while(RI==0);
          RI=0;
      }
  TR2=0;                   //CLOSE DIAL TONE
  T2=0;
  RS65=0;
 while(RS65!=255)
{	 while(RI==0); 
         RI=0;
	   ret1=SBUF;
       if (ret1==0)
	       RS65++;
		   
	   if(ret1>127)
        { 
		  RS65=0;
		  ret2=ret1;
		  ret1=ret1&0X0F;
 
       while(ret2!=0)
		 { TI=0;
		   SBUF='A';
		   while(TI==0);
           TI=0;
		   SBUF='/';
		   while(TI==0);
           TI=0;
		   RI=0;
		   while(RI==0); 
           RI=0;
	       ret2=SBUF; 
          } 

	  if(ret1!=0)
	  {if (ret1==10)
	     ret1=0;
	     ret1=ret1+0x30;

		 while(INT0);
         L580read(2);
		 L580write(0,ret1);
          }

        }
          TI=0;
		  SBUF='A';
		  while(TI==0);
          TI=0;
		  SBUF='/';
		  while(TI==0);
         
}

		 while(INT0);
         L580read(2);
		 L580write(0,0x0D);

  while(INT0);

 L580read(2);

 while(INT0);

 L580read(2);
if ( L580read(0)!='C')
   {

		  return;
   }

          TI=0;
		  SBUF='A';
		  while(TI==0);
          TI=0;
		  SBUF='T';
		  while(TI==0);   
          TI=0;
		  SBUF='A';
		  while(TI==0);
    

	for(i=1;i<CONNECT[0];i++)
	{   RI=0;
	    while(RI==0); 
		ret1=SBUF;
	     if (CONNECT[i]!=ret1)
           {i--;
		   }
	}

TI=0;
RI=0;
ES=1;
EX0=1;
}
unsigned char getFdata(unsigned char *fifobuf)

{  unsigned char j;
  
    fifobuf[0]--;
    j=fifobuf[fifobuf[1]];
	fifobuf[1]++;

    if (fifobuf[1]>=BUFDATA_LEN)
	   { fifobuf[1]=3;
	   }
 
     return j;
}

putFdata(unsigned char RXdata,unsigned char *fifobuf)
{ 
   fifobuf[0]++;
   fifobuf[fifobuf[2]]=RXdata;
   fifobuf[2]++;
   if(fifobuf[2]>=BUFDATA_LEN)
       {fifobuf[2]=3;}
 
}

/*unsigned char testFdata(unsigned char *fifobuf)
{
  if (fifobuf[0]==0)
      { return 0;
	  }
	  return 1;
}
*/

initFdata(unsigned char *fifobuf)

{ unsigned char i;
 fifobuf[0]=0;
 fifobuf[1]=3;
 fifobuf[2]=3;
 for (i=3;i<BUFDATA_LEN;i++)
 {fifobuf[i]=0;}
}





⌨️ 快捷键说明

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