Friday 19 April 2013

Interfacing of ADC with 8051 Microcontroller

ADC (Analog To Digital Conversion)

ADC takes an analog signal, such as an electrical current, and digitize it into a binary format so that the machine can understand it.
Here we have aprogram to interface an ADC with 8051 microcontroller using a simlator.


ORG 00H
SETB P2.2
MOV P1,#0FFh
MOV A,#06H
ACALL CMD
ACALL DELAY
MOV A,#0EH
ACALL CMD
ACALL DELAY

MOV A,#38H
ACALL CMD
ACALL DELAY

GO:
ACALL ADCDATA
ACALL HEXTOASCII
ACALL DISPLAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
SJMP GO

ADCDATA: CLR P2.1
SETB P2.1
JB P2.2,$
CLR P2.0
ACALL DELAY
MOV A,P1
SETB P2.0
RET

HEXTOASCII:
MOV B,#10
DIV AB
MOV R5,B
MOV B,#10
DIV AB
MOV R6,B
MOV R7,A

MOV A,R5
ORL A,#30H
MOV R2,A
MOV A,R6
ORL A,#30H
MOV R1,A
MOV A,R7
ORL A,#30H
MOV R0,A
RET


CMD:

MOV P3,A
CLR P2.3
CLR P2.4
SETB P2.5
ACALL DELAY
CLR P2.5
RET

DATA1:
MOV P3,A
SETB P2.3
CLR P2.4
SETB P2.5
ACALL DELAY
CLR P2.5
RET

DELAY:
MOV R4,#0FFH
DJNZ R4,$
MOV R4,#0FFH
DJNZ R4,$
RET

DISPLAY:
MOV A,#01H
ACALL CMD
ACALL DELAY
MOV A,#80H
ACALL CMD
ACALL DELAY

MOV A,R0
ACALL DATA1
MOV A,R1
ACALL DATA1
MOV A,R2
ACALL DATA1
RET
END

Thursday 18 April 2013

Interfacing of LCD with 8051 Microcontroller

PROGRAM CODE:
ORG 0000H
MOV A,#38H
ACALL COM
MOV A,#0EH
ACALL COM
MOV A,#01H
ACALL COM
MOV A,#10H
ACALL COM
MOV A,#80H
ACALL COM
AGAIN: ACALL DISPLAY
MOV A,#01H
ACALL COM
SJMP AGAIN
COM: ACALL DELAY
CLR P2.0
CLR P2.1
SETB P2.2
MOV P1,A
ACALL DELAY
CLR P2.2
ACALL DELAY
RET
DATA1: ACALL DELAY
SETB P2.0
CLR P2.1
SETB P2.2
MOV P1,A
ACALL DELAY
CLR P2.2
ACALL DELAY
RET
DELAY: MOV R0,#15H
GO: MOV TMOD,#01H
MOV TL0,#0FFH
MOV TH0,#0DBH
SETB TR0
BACK: JNB TF0,BACK
CLR TR0
CLR TF0
DJNZ R0,GO
RET
DISPLAY: MOV R1,#14D
MOV A,#00H
MOV DPTR,#MYDATA
NEXT: CLR A
MOVC A,@A+DPTR
JZ OUT
ACALL DATA1
INC DPTR
CLR A
DJNZ R1,NEXT
OUT: RET
MYDATA:DB "Amit Kr Bharti"
END


Interfacing of keyboard with lcd

PROGRAM CODE:
org 0000h
acall lcd
acall keyboard
lcd:
mov a,#38h //2*16 matrix lcd
acall command
mov a,#0eh //dispaly on cursor on
acall command
mov a,#01h
acall command
mov a,#06h
acall command
mov a,#80h
acall command
ljmp code2
code2:
ret
command:
acall delay
mov p1,a
clr p3.0
clr p3.1
setb p3.2
acall delay
clr p3.2
ret
data1:
acall delay
mov p1,a
setb p3.0
clr p3.1
setb p3.2
acall delay
clr p3.2
acall delay
ret
delay:
mov r0,#15h
go:mov tmod,#01h
mov tl0,#0ffh
mov th0,#0dbh
setb tr0
back:jnb tf0,back
clr tr0
clr tf0
djnz r0,go
ret
keyboard:
mov p2,#0ffh
k1:mov p0,#00h //checking of keyboard's
mov a,p2
anl a,#03h
cjne a,#03h,k1
k2:
acall delay
mov a,p2
anl a,#03h
cjne a,#03h,over
sjmp k2
over:acall delay //checking for row
mov a,p2
anl a,#03h
cjne a,#03h,over1
sjmp k2
over1:
mov p0,#0feh
mov a,p2
anl a,#03h
cjne a,#03h,row0
mov p0,#0fdh
mov a,p2
anl a,#03h
cjne a,#03h,row1
ljmp k2
row0:
mov dptr,#code0
sjmp find
row1:
mov dptr,#code1
sjmp find
find:
rrc a
jnc match
inc dptr
sjmp find
match:
clr a
movc a,@a+dptr
acall data1
ljmp k1
code0:
db '1','2'
code1:
db '4','5'
end


VISITOR COUNTER


VISITOR COUNTER


Figure 1: MICRO CONTROLLER CIRCUITRY


Figure 2: SENSING CIRCUITRY AT ENTRY AND EXIT POINT OF GATES



Abstract:

Visitor counter is a reliable circuit that takes over the task of counting number of persons in the room. When somebody enters into the room then the counters incremented by one. The total number of persons inside the room is displayed on the seven segment display module. The microcontroller does the above job it receives the signal from the sensors, and this signals operated under the control of software which is stored in ROM.

Application:

·         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.

Components required:


S.NO.
COMPONENTS
SPECIFICATION
QUANTITY
1.

2
2.
(RX-TX PAIR)
2
3.
TRANSISTOR
BC 547
4
4.
Op Amp
LM358
2
5.
CAPACITOR
10UF
33UF
1
2
6.
CRYSTAL
11.0592
1
7.
RESISTOR
330OHM
10K
1K
7
6
4
8.
VOLTAGE REGULATOR
7805
1
9.
VAR RESISTOR
4.7K
10K
2
1
10.
COMMON ANODE
4
11.
AT89S52
1

Working:                                           

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. The count value is calculated depending upon the sensors input and is displayed on a set of four seven segment displays.
 The data pins of each 7-segment display are connected to port P2 of the microcontroller AT89S52.
 The first four pins of port P1 (P1^0-P1^3) are connected to control pins to enable a particular 7-segment.
P3^5 & P3^6 are configured as input pins at which the sensors are connected.
The sensor inputs are defined as up and down selector modes for the counter in the code. Each time the first sensor is blocked, it gives a high signal at P3^5 and the count value gets incremented. The value gets decremented when P3^6, connected to second sensor, gives high input. At each step, the value of the counter is sent to be displayed on the segments.

Program to make a visitor counter using IR sensor and 8051 microcontroller
#include <reg51.h>
#define msec 1
unsigned int num=0;
sbit dig_ctrl_4=P1^3;  //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;  //pin to make counter count up
sbit down=P3^6;  //pin to make counter count down
void init()  // initialize of 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()  //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
{
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)
   {             unsigned int i;
   for(i=0;i<100;i++)
   {
       delay();
 }
  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;
 
  }
}
}