Hardware Interfaces To 8051: 1. LCD 2. Keyboard 3. ADC 4. DAC 5. Stepper Motor 6. DC Motor

Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 32

HARDWARE INTERFACES TO

8051
1. LCD
2. KEYBOARD
3. ADC
4. DAC
5. STEPPER MOTOR
6. DC MOTOR
• When data is supplied to data pins, a high- to –
low pulse must be applied to ENABLE pin in
order to latch data present at the data lines.
• Rs=0 to check busy flag bit, the busy flag is D7 &
can be read when R/w =1. if D7=1, lCD is busy
doing some other task, so will not accept any
other data. When D7 goes to 0 , LCD is ready to
receive new data.
• Few commands:
1 clear display
6 increment cursor
38  2 lines 5x7 matrix
In LCD one can put data at any location.
RS R/w DB7 Db6 to Db0
0 0 1 Laaaaaa
L=0 for line 1
L=1 for line 2
# include<reg52.h>
Sfr ldata=0x80;
sbit rs=P3^7;
Sbit rw=P3^6;
sbit en=P3^5;
sbit busy=P0^7;
void delay(unsigned int);
void lcdcmd(unsigned char value);
void lcddata(unsigned char value);
void lcdready();
unsigned char idata msg[15]="HELLO EVERYONE";
unsigned char i;
void main()
{
lcdcmd(0x38);
lcdcmd(0x0e);
lcdcmd(0x01);
lcdcmd(0x06);
lcdcmd(0x80);

for(i=0;i<=13;i++)
{
lcddata(msg[i]);
}
}
void lcdcmd(unsigned char value)
{
lcdready();
ldata=value;
rw=0;
en=1;
rs=0;
delay(1);
en=0;return;
}

void lcddata(unsigned char value)


{
lcdready();
ldata=value;
rw=0;
en=1;
rs=1;
delay(1);
en=0;
return;
}
void lcdready()
{
busy=1;
rs=0;
rw=1;
while(busy==1)
{
en=0;
delay(1);
en=1;
}
return;
}

void delay (unsigned int value)


{
unsigned int x,y;
for(x=0;x<50;x++)
for(y=0;y<value;y++);
return;
}
+5V +5V +5V +5V

1 2 3 /
P 2.0
4 5 6 *
P 2.1

7 8 9 --
P 2.2

C 0 % +
P 2.3

P 2.4 P 2.5 P 2.6 P 2.7


# include<reg52.h>
sfr ldata=0x80;
sbit rs=P3^7;
sbit rw=P3^6;
sbit en=P3^5;
sbit busy=P0^7;
void delay(unsigned int);
void lcdcmd(unsigned char value);
void lcddata(unsigned char value);
void lcdready();
unsigned char getkey();
unsigned char i,j,key=0;
unsigned char idata msg[11]="KEY PRESSED";
unsigned char idata keypad[4][4]={'1','2','3','/','4','5','6','*','7','8','9','-','c','0','%','+'};
void main()
{
lcdcmd(0x38);
lcdcmd(0x0e);
lcdcmd(0x01);
lcdcmd(0x06);
lcdcmd(0x80);
void lcdcmd(unsigned char value)
{
lcdready();
ldata=value;
for(i=0;i<=11;i++)
{ rw=0;
lcddata(msg[i]); en=1;
} rs=0;
delay(1);
en=0;return;
}
while(1) void lcddata(unsigned char value)
{
{
lcdcmd(0xc3);
getkey(); lcdready();
lcddata(key); ldata=value;
delay(10); rw=0;
} en=1;
rs=1;
} delay(1);
en=0;
return;
}
void lcdready()
{
busy=1;
rs=0;
rw=1;
while(busy==1)
{
en=0;
delay(1);
en=1;
}
return;
}

void delay (unsigned int value)


{
unsigned int x,y;
for(x=0;x<50;x++)
for(y=0;y<value;y++);
return;
}
Keyboard
unsigned char getkey() Do // wait till key is pressed

{ {

unsigned char colloc,rowloc; delay(1);

do // to remove previous key colloc=P2;

{ colloc&=0xf0;

P2=0xf0; }while(colloc==0xf0);

colloc=P2;

colloc&=0xf0; delay(10);

}while(colloc!=0xf0); colloc=P2;

Do // switch debounce colloc&=0xf0;

{ }while(colloc==0xf0);
while(1)
{
P2=0xfe;
colloc=P2;
colloc&=0xf0;
if(colloc!=0xf0)
{
rowloc=0;
break;
}
P2=0xfd;
colloc=P2;
colloc&=0xf0;
if(colloc!=0xf0)
{
rowloc=1;
break;
P2=0xfb;
colloc=P2;
colloc&=0xf0;
if(colloc!=0xf0)
{
rowloc=2;
break;
}
P2=0xf7;
colloc=P2;
colloc&=0xf0;
rowloc=3;
break;
}
if(colloc==0xe0)key=(keypad[rowloc][0]);
else if(colloc==0xd0)key=(keypad[rowloc][1]);
else if(colloc==0xb0)key=(keypad[rowloc][2]);
else
key =(keypad[rowloc][3]);
return(key);
}
• ADC0804 Chip
8 bit parallel , needs +5V works, 8 bit
resolution.
CS : Chip select active low input to activate.
RD(read): active low, negative edge
WR ( start of conversion): positive edge triggers
Clk IN & Clk R: to work with external clock
connect to clkIN, OR to use internal clock
connect resistor & capacitor. F= 1/ 1.1 RC
INTR ( end of conversion) : active low, normally high
and when the conversion is finished it goes low.
Vin (+) , Vin (-), Gnd: Vin = Vin(+) – Vin(-)
or Vin(-) is connected to Gnd. Vin(+) is analog signal
Vcc: +5V
Vref/2: reference voltage, it represents the maximum
value of input analog voltage.
if its 2V: analog i/p will be 0 to 4V,
step size 4/256= 15.62mV
D0 – D7: digital data output pins
Dout = Vin / Step size
ADC Program:
RD BIT P2.5
WR BIT P2.6
INTR BIT P2.7
MYDATA EQU P1 CLR RD
MOV P1,#0FFH MOV A, MYDATA
ACALL
SETB INTR CONVERSION
BACK: CLR WR ACALL DISPLAY
SETB WR SETB RD
HERE: JB INTR,HERE SJMP BACK
Programming 0804 in C
#include <reg51.h> {
Sbit RD =P2^5; WR=0;
Sbit WR =P2^6; WR=1;
Sbit INTR =P2^7; WHILE( INTR==1);
SFR MYDATA = P1; RD=0;
Void main() VALUE=MYDATA;
{ MYDATA= 0XFF; CONVERTNDISPLAY(VALUE);
INTR=1; RD=1;
RD=1; }
IN 0 D0

IN 7 D7

Vref (+)
Vref (-)

SC 01
ALE 10 OE 01
EOC

C B A
VCC
RD
CS
CH1
WR
CH2
INTR
CH3
DB0/ MA0
CH4
DB1/ MA1
CH5
DB2/ MA2
CH6
DB3/ MA3, 1
CH7
DB4/ MA4, 0
CH8
DB5
AGND
DB6
Vref
DB7
DGND
ADC

• # include<reg52.h> char);
• sbit rd=P1^1; • void main()
• sbit wr=P1^2; • {
• sbit intr=P1^3; • unsigned char value;
• sbit aen=P1^0; • lcdcmd(0x38);
• sfr mydata1=0xA0; • lcdcmd(0x0e);
• sfr ldata=0x80; • lcdcmd(0x01);
• sbit rs=P3^7; • lcdcmd(0x06);
• sbit rw=P3^6; • lcdcmd(0x83);
• sbit en=P3^5; • lcddata('T');
• sbit busy=P0^7; • mydata1=0xff;
• void delay(unsigned int); • ldata=0x00;
• void lcdcmd(unsigned char value);
• void lcddata(unsigned char value); • while(1)
• void lcdready(); • {
• void convert_display(unsigned
• aen=0; • unsigned char
• wr=0; x,d1,d2,d3,data1,data2,data3;
• wr=1; • x=value/10;
• while(intr==1); • d1=value%10;
• rd=0; • d2=x%10;
• value=mydata1; • d3=x/10;
• value=value-114; • data1=d1|0x30;
• lcdcmd(0xc7); • data2=d2|0x30;
• • data3=d3|0x30;
convert_display(value); • lcddata(data3);
• rd=1; • lcddata(data2);
• delay(10); • lcddata(data1);
• } • return;
• } • }

• void convert_display(unsigned
char value)
• {
Vdd
CH0
SCLK
CH1
CS
CH2
DIN
CH3
SSTRB (END)
CH4
DOUT
CH5
DGND
CH6
AGND
CH7
REFOUT(INTERNAL REF
COM VOLT)
(POWER SAVE) SHDN REFIN (REF I/P)
MAX1112 CONTROL WORD
START SEL2 SEL1 SEL0 UNi/BIP SGL/DF PD1 PD0

START: Must be high to indicate the beginning of control byte


SEL2,SEL1.SEL0 : To select channel
UNI/ BIP: 1: unipolar: digital data output is binary
0: bipolar: digital data output is 2’s complement
SGL/ DF: 1: single ended, 0: differential
PD1: 1= full operational
0= power save
PD0: 1= external clock, SCLK
0= internal clock, SSTRB indicates end of conversion
MC 1408 DAC (DAC 0808)
• Iout= Iref ( D7/2 + D6/4 + D5/8…..+ D0/256)

• MOV A,#00H
• MOV P1,A
• BACK: INC A
• SJMP BACK
Iout=1.99mA
Vout= 1.99mA* 5K= 9.96V
Sine wave

#include<reg52.h>

void main()
{ unsigned char idata table [180]= {128,132,136,141,154,150,150,154,158,163,167,171,175,
180,188,192,195,199,203,206,210,213,216,220,223,226,228,231,234,236,238,241,243,244,246,24,
7,248,249,250,231,228,226,223,220,216,213,210,216,203,199,195,192,188,184,180,175,171,167,
163,158,154,150,145,141,136,132,128,123,119,114,110,105,101,97,92,88,84,83,75,71,67,64,60,
56,52,49,45,39,35,32,29,27,24,21,19,17,14,12,11,9,7,6,4,3,2,1,1,0,0,0,0,0,0,0,1,1,2,3,42,
45,49,52,56,60,64,67,71,75,80,84,88,92,97,101,105,110,114,119,123,128};

unsigned char i;
while(1)
{
for(i=0;i<180;i++)
{
P0=table[i];
}
}
}
SQUARE WAVE
#include<reg52.h>
void delay(unsigned int);
void main()
{

while(1)
{
P0=255;
delay(1);
P0=0;
delay(1);
}
}
void delay (unsigned int value)
{
unsigned int x,y;
for(x=0;x<100;x++)
for(y=0;y<value;y++);
}
TRIANGULAR WAVE

#include<reg52.h>
void main()
{
unsigned char x,i;
while(1)
{
for(x=0;x<255;x++)
{
for(i=0;i<5;i++)
P0=x;
}
for(x=255;x>0;x--)
{
for(i=0;i<5;i++)
P0=x;
}
}
}
DC Motor
# include<reg51.h> msdelay(10);
void msdelay( unsigned int); mtr_1=0;
mtr_2=1;
sbit on = P1^0; msdelay(10);
sbit mtr_1 = P0^7; }
sbit mtr_2 = P0^4; }
void msdelay( unsigned int
void main() count)
{ {
on=1; unsigned int x,y;
while(on) for(x=0;x<5000;x++)
{ for(y=0;y<count;y++);
mtr_2=0; }
mtr_1=1;
Stepper Motor
#include<reg52.h> delay(f);
void delay( unsigned int); P0=0x33;
sbit on = P1^0; delay(f);
void main() P0=0x33;
{ delay(f);
unsigned int f; P0=0x99;
while(on) delay(f);
{ P0=0xcc;
P0=0x66; delay(f);
msdelay(f); P0=0x66;
P0=0xcc; delay(f);
msdelay(f); }
P0=0x99;
void delay( unsigned int count)
{
unsigned int x,y;
for(x=0;x<60;x++)
for(y=0;y<count;y++);
}

You might also like