This topic is an extension to Simple toll plaza system. The
toll amount is charged based on the category of the vehicle driving through the
plaza. The vehicle categories taken here are two-wheeler & four-wheeler.
When a user scans his ID at the toll plaza, some amount is charged from his
account depending upon his vehicle category. User also has the facility to
recharge his account.
The project has been developed by interfacing RFID with
AT89C51. The relevant messages are also displayed on a 16x2 LCD. The free
source code for the program is available in C.
Simple toll plaza system charges the toll tax from the user
irrespective of the type of his vehicle. This project also considers the
vehicle type while charging the toll amount. The RFID tag is used as a unique
identity for account of a particular user.
C Code:
//Program for Toll plaza system based on vehicle category
interface with 8051 microcontroller (AT89C51)
#include<reg51.h>
#define port P1
#define key P0 // Port for keypad
void memory();
sfr lcd_data_pin=0xA0;
sbit rs = P1^3;
sbit rw = P1^4;
sbit en = P1^5;
sbit col1=key^4;
sbit col2=key^5;
sbit col3=key^6;
sbit row1=key^0;
sbit row2=key^1;
sbit row3=key^2;
sbit row4=key^3;
unsigned int number=0,pointer=1;
unsigned char card_mem[4][12];
unsigned char
card_id[12],index=0,key1=0,lcd,print=0,new_user=0,recharge=0,user_index,t,tool=0,type=0;
unsigned int amount[4];
unsigned char card_type[4];
unsigned char current_byte = 0,money[6];
unsigned char pos=0,set=0;
void delay(unsigned char count) //Function to provide time delay
{
unsigned int j;
unsigned
char i;
for(i=0;i<count;i++)
for(j=0;j<1275;j++);
}
void lcd_command(unsigned char comm) //LCD command funtion
{
lcd_data_pin=comm;
en=1;
rs=0;
rw=0;
delay(1);
en=0;
}
void lcd_data(unsigned char disp) //LCD data function
{
lcd_data_pin=disp;
en=1;
rs=1;
rw=0;
delay(1);
en=0;
}
lcd_string(unsigned char *disp) //LCD string function
{
char x;
for(x=0;disp[x]!=0;x++)
{
lcd_data(disp[x]);
}
}
void lcd_ini() //Function to inisialize the LCD
{
lcd_command(0x38);
delay(5);
lcd_command(0x0F);
delay(5);
}
void timer_on()
{
TMOD=0x20; //Enable
Timer 1
TH1=0xFD;
SCON=0x50;
TR1=1;
IE=0x94;
}
void timer_off()
{
TMOD=0x00; //Disable
timer 1
TH1=0x00;
SCON=0x00;
TR1=0;
IE=0x00;
}
void lcd_display(unsigned int val)
{
unsigned
char flg=0;
lcd_command(0xCC);
if(val==0)
lcd_data('0');
while(val>0)
{
lcd=val%10;
val=val/10;
lcd_command(0xCC-flg);
lcd_data(lcd+'0');
flg++;
}
}
void recieve() interrupt 4
//Function to recieve data serialy from RS232
{
card_id[current_byte]=SBUF;
RI=0; // Reset the
serial interrupt after recieving the byte
current_byte++;
}
void display(unsigned char value)
{
lcd_command(0x80+pos);
if(value==10
&& type==0)
{
print=1;
}
if(value==12)
{
set=1;
}
if(type==0
&& value<=2)
{
set=1;
card_type[index]=value;
lcd_data('0'+value);
delay(250);
}
if(value<=10
&& type==1)
{
if(value<10)
{
lcd_data('0'+value);
money[pos]=value;
pos++;
}
if(value==10)
{
pos--;
lcd_command(0x80+pos);
lcd_data('
');
lcd_command(0x80+pos);
}
}
}
check_col1()
{
row1=row2=row3=row4=1;
row1=0;
if(col1==0)
display(1);
row1=1;
row2=0;
if(col1==0)
display(4);
row2=1;
row3=0;
if(col1==0)
display(7);
row3=1;
row4=0;
if(col1==0)
display(10);
row4=1;
}
check_col2()
{
row1=row2=row3=row4=1;
row1=0;
if(col2==0)
display(2);
row1=1;
row2=0;
if(col2==0)
display(5);
row2=1;
row3=0;
if(col2==0)
display(8);
row3=1;
row4=0;
if(col2==0)
display(0);
row4=1;
}
check_col3()
{
row1=row2=row3=row4=1;
row1=0;
if(col3==0)
display(3);
row1=1;
row2=0;
if(col3==0)
display(6);
row2=1;
row3=0;
if(col3==0)
display(9);
row3=1;
row4=0;
if(col3==0)
display(12);
row4=1;
}
keypad()
{
row1=row2=row3=row4=0;
if(col1==0)
check_col1();
if(col2==0)
check_col2();
if(col3==0)
check_col3();
}
void show()
{
unsigned
char count,i,key,flag=0,in;
unsigned
int j;
timer_off();
lcd_command(0x01);
for(i=0;i<index;i++)
{
key=0;
for(count=0;count<12;count++)
{
if(card_id[count]==card_mem[i][count])
{
key++;
}
}
if(key==12)
{
flag=1;
if((amount[i]<=10
&& card_type[i]==1)||(amount[i]<=20 && card_type[i]==2))
{
user_index=i;
lcd_string("Insuff.
balance");
delay(250);
lcd_command(0x01);
lcd_string("To
recharge");
lcd_command(0xC0);
lcd_string("press
*");
for(in=0;in<250;in++)
{
for(j=0;j<1275;j++)
{
row1=row2=row3=row4=0;
if(col1==0)
{
tool=1;
recharge=1;
t=1;
keypad();
break;
}
}
if(t==1)
break;
}
t=0;
lcd_command(0x01);
lcd_string("Scan
your ID");
break;
}
if(tool==0)
{
lcd_string("Thank
you User ");
lcd_command(0x8F);
lcd_data(49+i);
delay(250);
lcd_command(0x01);
if(card_type[i]==1)
{
lcd_string("Charge
10.00");
amount[i]=amount[i]-10;
}
if(card_type[i]==2)
{
lcd_string("Charge
20.00");
amount[i]=amount[i]-20;
}
lcd_command(0xC0);
lcd_string("Amt
left ");
lcd_display(amount[i]);
lcd_command(0xCD);
lcd_string(".00");
delay(250);
lcd_command(0x01);
if(amount[i]<=30)
{
user_index=i;
lcd_string("Low
balance");
delay(250);
lcd_command(0x01);
lcd_string("To
recharge");
lcd_command(0xC0);
lcd_string("press
*");
for(in=0;in<250;in++)
{
for(j=0;j<1275;j++)
{
row1=row2=row3=row4=0;
if(col1==0)
{
recharge=1;
t=1;
keypad();
break;
}
}
if(t==1)
break;
}
}
}
t=0;
lcd_command(0x01);
lcd_string("Scan
your ID");
break;
}
}
if(flag==0)
{
lcd_string("Wrong
ID");
delay(100);
lcd_command(0x01);
lcd_string("New
user press *");
new_user=1;
}
current_byte=0;
tool=0;
timer_on();
}
recharge_acc()
{
unsigned
char pin;
timer_off();
type=1;
lcd_command(0x01);
delay(40);
lcd_string("Enter
balance");
delay(250);
lcd_command(0x01);
while(set!=1)
{
keypad();
delay(40);
}
set=0;
lcd_command(0x01);
lcd_string("Your
balance is");
for(pin=0;pin<=pos;pin++)
{
number=number+money[pos-pin-1]*pointer;
pointer=pointer*10;
}
amount[user_index]=amount[user_index]+number;
lcd_command(0xC0);
lcd_display(amount[user_index]);
lcd_command(0xCD);
lcd_string(".00");
delay(250);
lcd_command(0x01);
number=0;
pointer=1;
pos=0;
timer_on();
lcd_string("Scan
your ID");
type=0;
}
void memory()
{
unsigned
char i,key=0,count,pin,try=0;
lcd_command(0x01);
lcd_string("New
user scan ID");
current_byte=0;
while(current_byte!=12);
lcd_command(0x01);
for(i=0;i<4;i++)
{
key=0;
for(count=0;count<12;count++)
{
if(card_id[count]==card_mem[i][count])
{
key++;
}
}
if(key==12)
{
lcd_string("Sorry!");
lcd_command(0xC0);
lcd_string("Already
an user");
delay(200);
lcd_command(0x01);
lcd_string("Scan
your ID");
key=0;
try=1;
current_byte=0;
break;
}
}
if(key<12
&& try==0)
{
key=0;
for(i=0;i<12;i++)
{
card_mem[index][i]=card_id[i];
}
current_byte=0;
lcd_string("Scan
again");
while(current_byte!=12);
for(i=0;i<12;i++)
{
if(card_mem[index][i]==card_id[i])
{
key++;
}
}
if(key==12)
{
current_byte=0;
timer_off();
lcd_command(0x01);
lcd_string("You
are User");
lcd_command(0x8C);
lcd_data(index+49);
delay(250);
lcd_command(0x01);
lcd_string("Press
1 2");
lcd_command(0xC0);
lcd_string("
2whlr 4whlr");
delay(150);
lcd_command(0x01);
while(set!=1)
{
keypad();
delay(10);
}
type=1;
set=0;
lcd_command(0x01);
lcd_string("Enter
balance");
delay(150);
lcd_command(0x01);
while(set!=1)
{
keypad();
delay(40);
}
type=0;
set=0;
lcd_command(0x01);
lcd_string("Your
balance is");
for(pin=0;pin<=pos;pin++)
{
number=number+money[pos-pin-1]*pointer;
pointer=pointer*10;
}
lcd_command(0xC0);
lcd_display(number);
lcd_command(0xCD);
lcd_string(".00");
amount[index]=number;
delay(250);
lcd_command(0x01);
number=0;
pointer=1;
pos=0;
lcd_string("Scan
your ID");
}
else
{
lcd_command(0x01);
lcd_string("ERROR");
delay(200);
for(i=0;i<12;i++)
{
card_mem[index][i]=0;
}
lcd_command(0x01);
lcd_string("Scan
your ID");
}
if(key==12)
index++;
}
timer_on();
}
void main()
{
col1=col2=col3=1;
timer_on();
lcd_ini(); //Place
cursor to second position of first line
lcd_string("Scan
your ID");
while(1)
{
row1=row2=row3=row4=0;
if(col1==0)
{
keypad();
}
if(print==1
&& new_user==1)
{
memory();
print=0;
new_user=0;
}
if(print==1
&& recharge==1)
{
recharge_acc();
print=0;
recharge=0;
}
if(current_byte==12)
{
show();
}
}
}
