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.
When a vehicle drives through the toll plaza, its driver is prompted to scan his RFID tag. If the identity (serial number of the tag, i.e., 12 byte data) is matched with the one already stored in the system, the toll amount is deducted from his account. After this, the vehicle gets immediate access to drive through. All the features of the Simple toll plaza system are also provided in this project by interfacing RFID with AT89C51.
Project Source 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(); } } }
###
Circuit Diagrams
Project Components
Project Video
Filed Under: 8051 Microcontroller
Filed Under: 8051 Microcontroller
Questions related to this article?
👉Ask and discuss on EDAboard.com and Electro-Tech-Online.com forums.
Tell Us What You Think!!
You must be logged in to post a comment.