📄 posgsm.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 + -