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

📄 car.c

📁 This code it to make a car parking system using 8051 microcontroller. It s an Embedded System projec
💻 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 + -