?? car.c
字號:
#include<reg52.h>
sbit RS=P3^7;
sbit EN=P3^6;
//---------------------------------------
// Forward function declaration
//---------------------------------------
void Retry(void);
void Txmsg(unsigned int i);
unsigned int Rxmsg(void);
void lcdinit(void);
void lcdData(unsigned char l);
void lcdcmd(unsigned char k);
void DelayMs(unsigned int count);
void InitModem(void);
int Parity(unsigned char ino);
//---------------------------------------
// Main rotine
//---------------------------------------
void main()
{
unsigned char ret,status;
unsigned int i;
TMOD=0x20;
TH1=0xFD;
SCON=0x50;
TR1=1;
lcdinit();
InitModem();
P0=0xff; // Make port 0 as input port
status=P0; // Store the current status
while(1)
{
Rxtimeout:
if(status!=P0)
{
Txmsg(5); // Send the change in status message if status changes
status=P0; // Update the current status in status byte
}
ret=0; // Waiting for message to come
do
{
i=0;
while(RI==0)
{
if(i>=1000)
goto Rxtimeout;
DelayMs(1);
i++;
}
ret=SBUF;
RI=0;
lcdData(ret);
}while(ret!='+');
i=Rxmsg();
if(i!=0)
Txmsg(i);
}
}
//----------------------------------------------------
// Retry subroutine to check the connectivity of modem
//----------------------------------------------------
void Retry(void)
{
unsigned int i=0,j=0;
unsigned char a[]="at";
unsigned char b[6];
retry:
i=0;
j=0;
while(a[i]!='\0')
{
SBUF=a[i];
while(TI==0); // AT sending
TI=0;
lcdData(a[i]);
i++;
}
lcdData('E'); // Enter
SBUF=0x0d;
while(TI==0);
TI=0;
for(i=0;i<5;i++) //command to recv data
{
j=0;
while(RI==0)
{
if(j>=1000)
goto retry;
DelayMs(1);
j++;
}
b[i]=SBUF;
RI=0;
lcdData(b[i]);
}
DelayMs(100);
for(i=0;i<5;i++) //command to recv data
{
if(b[i]=='E' || b[i]=='R')
goto retry;
if(b[i]=='O' || b[i]=='K')
return;
}
}
//---------------------------------------
// Modem initialization subroutine
//---------------------------------------
void InitModem(void)
{
unsigned int i=0,j=0,k=0;
unsigned char a[]="ate0";
unsigned char b[]="at+cpms=\"ME\",\"ME\",\"ME\"" ;
unsigned char c[]="AT+CNMI=1,1,0,0,1";
unsigned char e[]="at+cmgd=1" ;
unsigned char d[6];
ReInit:
Retry();
i=0;
while(a[i]!='\0')
{
SBUF=a[i];
while(TI==0); // ATE0 sending to turn off the echo
TI=0;
lcdData(a[i]);
i++;
}
lcdData('E'); // Enter
SBUF=0x0d;
while(TI==0);
TI=0;
for(i=0;i<5;i++) //command to recv data
{
j=0;
while(RI==0)
{
if(j>=1000)
goto ReInit;
DelayMs(1);
j++;
}
d[i]=SBUF;
RI=0;
lcdData(d[i]);
}
for(i=0;i<5;i++) //command to compare data
{
if(d[i]=='E' || d[i]=='R')
goto ReInit;
if(d[i]=='O' || d[i]=='K')
goto InitS;
}
InitS:
DelayMs(1000);
lcdcmd(0x01);
DelayMs(10);
lcdcmd(0x80);
DelayMs(10);
i=0;
while(b[i]!='\0')
{
SBUF=b[i];
while(TI==0); // sending AT+CPMS to set the preffered memory location
TI=0;
lcdData(b[i]);
i++;
}
lcdData('E'); // Enter
SBUF=0x0d;
while(TI==0);
TI=0;
for(i=0;i<5;i++) //command to recv data
{
j=0;
while(RI==0)
{
if(j>=1000)
goto InitS;
DelayMs(1);
j++;
}
d[i]=SBUF;
RI=0;
lcdData(d[i]);
}
for(i=0;i<5;i++) //command to compare data
{
if(d[i]=='E' || d[i]=='R')
goto InitS;
if(d[i]=='O' || d[i]=='K')
goto InitS2;
}
InitS2:
DelayMs(1000);
lcdcmd(0x01);
DelayMs(10);
lcdcmd(0x80);
DelayMs(10);
i=0;
while(c[i]!='\0')
{
SBUF=c[i];
while(TI==0); // sending AT+CNMI to enable the intrupt on message received
TI=0;
lcdData(c[i]);
i++;
}
lcdData('E'); // Enter
SBUF=0x0d;
while(TI==0);
TI=0;
for(i=0;i<5;i++) //command to recv data
{
j=0;
while(RI==0)
{
if(j>=1000)
goto InitS2;
DelayMs(1);
j++;
}
d[i]=SBUF;
RI=0;
lcdData(d[i]);
}
for(i=0;i<5;i++) //command to compare data
{
if(d[i]=='E' || d[i]=='R')
goto InitS2;
if(d[i]=='O' || d[i]=='K')
goto InitS3;
}
InitS3:
DelayMs(1000);
lcdcmd(0x01);
DelayMs(10);
lcdcmd(0x80);
DelayMs(10);
i=0;
while(e[i]!='\0')
{
SBUF=e[i];
while(TI==0); // sending AT+CMGD to delete message
TI=0;
lcdData(e[i]);
i++;
}
lcdData(0x0d); // Enter
SBUF=0x0d;
while(TI==0);
TI=0;
for(i=0;i<5;i++) //command to recv data
{
j=0;
while(RI==0)
{
if(j>=1000)
goto timeoutd;
DelayMs(1);
j++;
}
c[i]=SBUF;
RI=0;
lcdData(c[i]);
}
timeoutd:
for(j=0;j<=5;j++) //command to compare data
{
if(c[j]=='O' || c[j]=='K' || c[j]=='E' || c[j]=='R')
return;
}
goto InitS3;
}
//---------------------------------------
// Transmit message subroutine
//---------------------------------------
void Txmsg(unsigned int k)
{
unsigned int i=0,j=0,rec,lower,higher;
unsigned char a[]="at+cmgs=16";
unsigned char b[]="0001000C91198911725177000003";
unsigned char c[10];
lcdinit();
retryTx:
Retry();
lcdcmd(0x01);
DelayMs(10);
lcdcmd(0x80);
DelayMs(10);
i=0;
while(a[i]!='\0')
{
lcdData(a[i]);
SBUF=a[i];
while(TI==0);
TI=0;
i++;
}
lcdData('E');
SBUF=0x0d;
while(TI==0);
TI=0;
lcdcmd(0xc0);
i=0;
do
{
j=0;
while(RI==0)
{
if(j>=1000)
goto retryTx;
DelayMs(1);
j++;
}
c[i]=SBUF;
RI=0;
lcdData(c[i]);
} while(c[i]!='>');
DelayMs(1000);
lcdcmd(0x01);
DelayMs(10);
lcdcmd(0x80);
DelayMs(10);
i=0;
while(b[i]!='\0')
{
SBUF=b[i];
while(TI==0);
TI=0;
lcdData(b[i]);
i++;
}
if(k==1)
rec=0x01;
else
if(k==2)
rec=0x02;
else
if(k==3)
rec=0x04;
else
if(k==4)
rec=0x10;
else
if(k==5)
rec=0x08;
i=Parity(P0);
if(i==1)
rec=rec|0x80;
lower=rec&0x0f;
if(lower<=0x09)
lower=lower+0x30;
else
lower=lower+0x37;
higher=(rec>>4)& 0x0f;
if(higher<=0x09)
higher=higher+0x30;
else
higher=higher+0x37;
lcdData(higher);
SBUF=higher;
while(TI==0);
TI=0;
lcdData(lower);
SBUF=lower;
while(TI==0);
TI=0;
rec=P0; //Status of port
lower=rec&0x0f;
if(lower<=0x09)
lower=lower+0x30;
else
lower=lower+0x37;
higher=(rec>>4)& 0x0f;
if(higher<=0x09)
higher=higher+0x30;
else
higher=higher+0x37;
lcdData(higher);
SBUF=higher;
while(TI==0);
TI=0;
lcdData(lower);
SBUF=lower;
while(TI==0);
TI=0;
lcdData('Z');
SBUF=26;
while(TI==0);
TI=0;
lcdcmd(0xc0);
for(i=0;i<10;i++)
{
j=0;
while(RI==0)
{
if(j>=1000)
break;
DelayMs(1);
j++;
}
c[i]=SBUF;
RI=0;
lcdData(c[i]);
}
for(i=0;i<5;i++) //command to recv data
{
if(c[i]=='E' || c[i]=='R')
goto retryTx;
}
return;
}
//---------------------------------------
// Recieve message subroutine
//---------------------------------------
unsigned int Rxmsg(void)
{
unsigned int i=0,j=0,ret=0;
unsigned char c[95],Rxdata1,Rxdata2;
lcdinit();
TMOD=0x20;
TH1=0xFD;
SCON=0x50;
TR1=1;
Retry:
Retry();
lcdcmd(0x01);
DelayMs(10);
lcdcmd(0x80);
DelayMs(10);
lcdData('a');
SBUF='a';
while(TI==0);
TI=0;
lcdData('t');
SBUF='t';
while(TI==0);
TI=0;
lcdData('+');
SBUF='+';
while(TI==0);
TI=0;
lcdData('c');
SBUF='c';
while(TI==0);
TI=0;
lcdData('m');
SBUF='m';
while(TI==0);
TI=0;
lcdData('g');
SBUF='g';
while(TI==0);
TI=0;
lcdData('r');
SBUF='r';
while(TI==0);
TI=0;
lcdData('=');
SBUF='=';
while(TI==0);
TI=0;
lcdData('1');
SBUF='1';
while(TI==0);
TI=0;
lcdData(0x0d);
SBUF=0x0d;
while(TI==0);
TI=0;
lcdcmd(0x80);
for(i=0;i<95;i++)
{
j=0;
while(RI==0)
{
if(j>=1000)
goto timeout;
DelayMs(1);
j++;
}
c[i]=SBUF;
RI=0;
lcdData(c[i]);
}
DelayMs(1000);
timeout:
for(i=0;i<5;i++) //command to recv data
{
if(c[i]=='E' || c[i]=='R')
goto Retry;
}
for(i=0;i<95;i++)
{
if(c[i]=='8' && c[i+1]=='9' && c[i+2]=='1' && c[i+3]=='1' && c[i+4]=='7' && c[i+5]=='2' && c[i+6]=='5' && c[i+7]=='1' && c[i+8]=='7' && c[i+9]=='7' )
{
lcdData(c[i]);
goto sucessRx1;
}
}
goto delete;
sucessRx1:
for(i=0;i<95;i++)
{
if(c[i]=='2' && c[i+1]=='2' && c[i+2]=='0' && c[i+3]=='3')
{
lcdData(c[i]);
goto sucessRx;
}
}
goto delete;
sucessRx:
Rxdata1=c[i+4];
if(Rxdata1<='9')
Rxdata1=Rxdata1 - 0x30;
else
Rxdata1=Rxdata1 - 0x37;
Rxdata1=Rxdata1 & 0x0f;
Rxdata1= Rxdata1<<4;
Rxdata1= Rxdata1 & 0xf0;
Rxdata2=c[i+5];
if(Rxdata2<='9')
Rxdata2=Rxdata2 - 0x30;
else
Rxdata2=Rxdata2 - 0x37;
Rxdata2=Rxdata2 & 0x0f;
Rxdata1= Rxdata1 | Rxdata2;
lcdcmd(0xc0);
lcdData(Rxdata1 + 0x30);
DelayMs(1000);
if((Rxdata1 & 0x01) == 0x01)
ret=1;
else
if((Rxdata1 & 0x02) == 0x02)
ret=2;
else
if((Rxdata1 & 0x04) == 0x04)
ret=3;
if((Rxdata1 & 0x80) == 0x80)
j=1;
else
j=0;
if(ret==3)
{
Rxdata1=c[i+6];
if(Rxdata1<='9')
Rxdata1=Rxdata1 - 0x30;
else
Rxdata1=Rxdata1 - 0x37;
Rxdata1=Rxdata1 & 0x0f;
Rxdata1= Rxdata1<<4;
Rxdata1= Rxdata1 & 0xf0;
Rxdata2=c[i+7];
if(Rxdata2<='9')
Rxdata2=Rxdata2 - 0x30;
else
Rxdata2=Rxdata2 - 0x37;
Rxdata2=Rxdata2 & 0x0f;
Rxdata1= Rxdata1 | Rxdata2;
i=Parity(Rxdata1);
if(i==j)
P2=Rxdata1;
else
ret=4;
}
for(i=0;i<95;i++)
{
c[i]=0;
}
delete:
lcdcmd(0x01);
DelayMs(10);
lcdcmd(0x80);
DelayMs(10);
lcdData('a');
SBUF='a';
while(TI==0);
TI=0;
lcdData('t');
SBUF='t';
while(TI==0);
TI=0;
lcdData('+');
SBUF='+';
while(TI==0);
TI=0;
lcdData('c');
SBUF='c';
while(TI==0);
TI=0;
lcdData('m');
SBUF='m';
while(TI==0);
TI=0;
lcdData('g');
SBUF='g';
while(TI==0);
TI=0;
lcdData('d');
SBUF='d';
while(TI==0);
TI=0;
lcdData('=');
SBUF='=';
while(TI==0);
TI=0;
lcdData('1');
SBUF='1';
while(TI==0);
TI=0;
lcdData(0x0d); // Enter
SBUF=0x0d;
while(TI==0);
TI=0;
for(i=0;i<6;i++) //command to recv data
{
j=0;
while(RI==0)
{
if(j>=1000)
goto timeoutd;
DelayMs(1);
j++;
}
c[i]=SBUF;
RI=0;
lcdData(c[i]);
}
timeoutd:
for(j=0;j<=5;j++) //command to recv data
{
if(c[j]=='O' || c[j]=='K' || c[j]=='E' || c[j]=='R')
return ret;
}
goto delete;
}
//---------------------------------------
// Lcd initialization subroutine
//---------------------------------------
void lcdinit(void)
{
lcdcmd(0x38);
DelayMs(250);
lcdcmd(0x0E);
DelayMs(250);
lcdcmd(0x01);
DelayMs(250);
lcdcmd(0x06);
DelayMs(250);
lcdcmd(0x80);
DelayMs(250);
}
//---------------------------------------
// Lcd data display
//---------------------------------------
void lcdData(unsigned char l)
{
P1=l;
RS=1;
EN=1;
DelayMs(1);
EN=0;
return;
}
//---------------------------------------
// Lcd command
//---------------------------------------
void lcdcmd(unsigned char k)
{
P1=k;
RS=0;
EN=1;
DelayMs(1);
EN=0;
return;
}
//---------------------------------------
// Delay mS function
//---------------------------------------
void DelayMs(unsigned int count)
{ // mSec Delay 11.0592 Mhz
unsigned int i; // Keil v7.5a
while(count) {
i = 115; // 115 exact value
while(i>0) i--;
count--;
}
}
//---------------------------------------
// Parity calculator function
//---------------------------------------
int Parity(unsigned char ino)
{
int noofones = 0;
unsigned char mask = 0x01; // start at first bit
while(mask != 0) // until all bits tested
{
if(mask & ino) // if bit is 1, increment noofones
{
noofones++;
}
mask = mask << 1; // go to next bit
}
return (noofones & 1); // if noofones is odd, least significant bit will be 1
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -