Showing posts with label Toll plaza system based on vehicle category interface with 8051 microcontroller. Show all posts
Showing posts with label Toll plaza system based on vehicle category interface with 8051 microcontroller. Show all posts

Toll plaza system based on vehicle category interface with 8051 microcontroller (AT89C51)


 
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();
                                }
                }

}