6a
1.Interrupt with level triggering
org 0000h
sjmp 0030h ;main program
--------------interrupt service routine for INT1 to turn on/off led
org 0013h ;INT1 vector address
mov p0,#0aah ;LED ON/OFF
mov r4,#255 ;delay for 1 sec
repeat: mov r5,#255
next: mov r6,#04h
c2: djnz r6,c2
djnz r5,next
djnz r4,repeat
mov p0,#55h ;LED ON/OFF
reti ; return on interrupt
---------------main program for initialization
org 0030h
mov p0,#00 ;configure port as output port
mov ie,#10000100b ; enable external interrupt 1
here: sjmp here ;stay here until interrupted
end
2.Interrupt with edge triggering
org 0000h
sjmp 0030h ;main program
-----------interrupt service routine for INT1 to turn on/off led
org 0013h ;INT1 vector address
mov p0,#0aah ;LED ON/OFF
mov r4,#255 ;delay for 1 sec
repeat: mov r5,#255
next: mov r6,#04h
c2: djnz r6,c2
djnz r5,next
djnz r4,repeat
mov p0,#55h ;LED ON/OFF
reti ; return on interrupt
---------------main program for initialization
org 0030h
setb tcon.2 ;make INT1 edge triggered interrupt
mov p0,#00 ;configure port as output port
mov ie,#10000100b ; enable external interrupt 1
here: sjmp here ;stay here until interrupted
end
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
6b
Transmit serially
#include<reg51.h>
void main()
{
char A[]="microcontrollerlab,0";
unsigned char i=0;
//P3=0x03;
TMOD=0x20;
TH1=0xFD;
SCON=0x50;
TR1=1;
while(1)
{
while(A[i]!='\0')
{
SBUF=A[i];
while(TI==0);
TI=0;
i++;
}
i++;
}
i=0;
}
Receive serially
#include<reg51.h>
sbit rs=P3^7;
sbit en=P3^5;
sbit rw=P3^6;
void delay(unsigned int time)
{ unsigned int i,j;
for(i=0;i<time;i++)
for(j=0;j<5;j++); }
void lcdcmd(unsigned char value) {
P2=value;
rs=0;
rw=0;
en=1;
delay(50);
en=0;
delay(50); }
void display(unsigned char value) {
P2=value;
rs=1;
rw=0;
en=1;
delay(50);
en=0;
delay(50); }
void lcdinit(void) {
P2=0x00;
P3=0x03;
delay(1500);
display(0x30);
delay(450);
display(0x30);
delay(300);
display(0x30);
delay(650);
lcdcmd(0x38);
delay(50);
lcdcmd(0x0E);
delay(50);
lcdcmd(0x01);
delay(50);
lcdcmd(0x06);
delay(50);
lcdcmd(0x00);
delay(50); }
void main()
{
char data1;
lcdinit();
TMOD=0x20;
TH1=0xFD;
SCON =0x50;
TR1=1;
while(1)
{
while(SBUF!=0x0D)
{
while(RI==0);
data1=SBUF;
RI=0;
display(data1);
delay(50);
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
6c
1.sine wave
org 0000h
sjmp 30h
org 30h
mov p1,#00 ; configure p1 as o/p port
again:mov dptr, #table
mov r2,#36
back: clr a
movc a, @a+dptr ; send data from table to DAC to
generate sine wave
mov p1,a
inc dptr
djnz r2,back
sjmp again
org 300h
table: db 128,151,172,192,210,226,239,248,254,255,254,248,239,226,210
db 192,172,150,128,106,84,64,46,30,17,8,2,0,2,8,17,30,46,64,84,106
end
2.square wave
org 0000h
sjmp 0030h
org 0030h
mov p1,#00h ; configure p1 as o/p port
//mov p2,#00h
repeat: clr a
mov p1,a ; send 00 an p1
call delay ; delay
mov a,#0ffh ; send FFh(high) an p1
mov p1,a
call delay ; delay
sjmp repeat ; repeat to generate square wave
delay: mov r1,#05h
back1: mov r2,#0e5h
back: djnz r2,back
djnz r1,back1
ret
end
3.Triangle wave
org 0000h
sjmp 030h
org 0030h
mov p1,#00h ; configure p1 as o/p port
repeat: mov a,#00h ; generate triangular wave an port p1
up: mov p1,a
inc a
call delay
cjne a,#0ffh,up
dec a ; generate up ramp
down: mov p1,a
dec a
acall delay
cjne a,#0ffh,down ; generate down ramp
sjmp repeat
delay: mov r3,#0e0h ; delay between steps
back: djnz r3,back
ret
end
4.Up ramp
org 0000h
sjmp 030h
org 0030h
mov p1,#00h ; configure p1 as o/p port
clr a ; A=0
again: mov p1,a ; o/p increment value of A
inc a
acall delay ; delay between steps
sjmp again ; repeat forever
delay: mov r3,#0e0h ;delay program
back: djnz r3,back
ret
end
5.Down ramp
org 0000h
sjmp 030h
org 0030h
mov p1,#00h ; configure p1 as o/p port
mov a,#0ffh ; A= 0ffh
again: mov p1,a ; output high at port 1
dec a
acall delay ; decrement Accumulator
sjmp again ; Delay between steps
delay: mov r3,#0e0h
back: djnz r3,back
ret
end
6d.Write ALP to interface an LCD display and to display a message on it
org 0000h
sjmp 0030h
org 0030h
mov dptr,#mcomm
c1: clr a
movc a,@a+dptr
acall commwrt ; call command subroutine
acall delay ; give LCD some time
jz send_dat
inc dptr
sjmp c1
send_dat: mov dptr,#mdata
d1: clr a
movc a,@a+dptr
acall datawrt ; call data with subroutine
acall delay ; give LCD some time
inc dptr
jz again
sjmp d1
again: sjmp again ;stay here
commwrt: mov p2,a ; send command to lcd through p2
clr p3.7 ; RS=0 for command
clr p3.6 ; R/W= for write
setb p3.5 ; E=1
acall delay ; delay
clr p3.5 ; E=0 for H to L
ret
datawrt: mov p2,a ; send data to p2
setb p3.7 ; RS=1 for data
clr p3.6 ; R/W=0 for write
setb p3.5 ; E=1
acall delay ; delay
clr p3.5 ; E=0 for H to L pulse
ret
delay: mov r3,#50 ; Long delay
here2: mov r4,#255
here: djnz r4,here
djnz r3,here2
ret
org 0300h
mcomm: db 38h,0eh,01h,06h,00h,0 ; commands and null
mdata: db " microcontroller " ; data and null
end
6e
i.continous rotation
org 0000h
sjmp 30h
org 0030h
setb p3.2 ; p3.2 configured as i/p port
mov p0,#00h ; port 0 configured as o/p port
mov a,#88h ; load step sequence
cw: jnb p3.2, ccw ; check status of switch, if switch is not pressed
p3.2=1
mov p0,a ; issue sequence to motor
rr a ; for rotate right clockwise
acall delay
acall delay
sjmp cw
ccw: rl a ; if p3.2=0(switches pressed)
acall delay ; issue sequence to motor
acall delay
mov p0,a ; for rotateing counter clockwise
sjmp cw
delay: mov r4,#07h ; repeat
repeat: mov r5,#0ffh ; delay between steps
next: djnz r5,next
djnz r4,repeat
ret
end
ii.90º rotation
org 0000h
sjmp 30h
org 0030h
mov p0,#00h ; port 0 configured as o/p port
mov a,#88h ; Load step sequence.
mov r0,#50 ; for 90º degree of rotation
step angle =
90
1.8
=50)
back: rr a
mov p0,a ; issue sequence to motor
acall delay ; wait
acall delay
djnz r0,back
again: sjmp again ; stay here
delay: mov r4,#07h
repeat: mov r5,#0ffh
next: djnz r5,next
djnz r4,repeat
ret
end
Comments
Post a Comment