A counter that can change its state in either direction, under control of an up–down selector input, is known as an up–down counter. The circuit given here can count numbers from 0 to 9999 in up and down modes depending upon the state of the selector. It can be used to count the number of persons entering a hall in the up mode at entrance gate. In the down mode, it can count the number of persons leaving the hall by decrementing the count at exit gate. It can also be used at gates of parking areas and other public places.
In this circuit, two infrared (IR) sensor modules are used each for up and down counting, respectively. Whenever an interruption is observed by the first IR sensor, it increments the counter value. Similarly, when the second sensor detects an obstacle, the count is decremented.
Project Source Code
###
// Program to make a bidirectional visitor counter using IR sensor #include <reg51.h> #define msec 1 unsigned int num=0; sbit dig_ctrl_4=P1^3; //declare the control pins of seven segments sbit dig_ctrl_3=P1^2; sbit dig_ctrl_2=P1^1; sbit dig_ctrl_1=P1^0; unsigned int digi_val[10]={0x40,0xF9,0x24,0x30,0x19,0x12,0x02,0xF8,0x00,0x10}; unsigned int dig_1,dig_2,dig_3,dig_4,test=0; unsigned char dig_disp=0; sbit up=P3^5; //up pin to make counter count up sbit down=P3^6; //down pin to make counter count down void init() // to initialize the output pins and Timer0 { up=down=1; dig_ctrl_4 = 0; dig_ctrl_3 = 0; dig_ctrl_2 = 0; dig_ctrl_1 = 0; TMOD=0x01; TL0=0xf6; TH0=0xFf; IE=0x82; TR0=1; } void delay() //To provide a small time delay { TMOD=0x01; TL0=0x36; TH0=0xF6; TR0=1; while(TF0==0); TR0=0; TF0=0; } void display() interrupt 1 // Function to display the digits on seven segment. For more details refer seven segment multiplexing. { TL0=0x36; TH0=0xf6; P2=0xFF; dig_ctrl_1 = dig_ctrl_3 = dig_ctrl_2 = dig_ctrl_4 = 0; dig_disp++; dig_disp=dig_disp%4; switch(dig_disp) { case 0: P2= digi_val[dig_1]; dig_ctrl_1 = 1; break; case 1: P2= digi_val[dig_2]; dig_ctrl_2 = 1; break; case 2: P2= digi_val[dig_3]; dig_ctrl_3 = 1; break; case 3: P2= digi_val[dig_4]; dig_ctrl_4 = 1; break; } } void main() { init(); while(1) { if(up==0&&down==1) //check if up pin is pressed { test++; num=test; dig_4=num%10; num=num/10; dig_3=num%10; num=num/10; dig_2=num%10; dig_1=num/10; if(test==9999) test=0; } if(up==1&&down==0) //check if down pin is pressed { test--; num=test; dig_4=num%10; num=num/10; dig_3=num%10; num=num/10; dig_2=num%10; dig_1=num/10; if(test==0) test=9999; } } }###
Circuit Diagrams
Project Components
Project Video
Filed Under: 8051 Microcontroller.
Filed Under: 8051 Microcontroller.
Questions related to this article?
👉Ask and discuss on Electro-Tech-Online.com and EDAboard.com forums.
Tell Us What You Think!!
You must be logged in to post a comment.