8051 programs
DESCRIPTION
8051 programsTRANSCRIPT
Example-1: generate a square wave of 10 Hz at pin P1.0 of 8051 using timer
#include <reg51.h> // include 8051 register file
sbit pin = P1^0; // decleare a variable type sbit for P1.0
main()
{
P1 = 0x00; // clear port
TMOD = 0x09; // initialize timer 0 as 16 bit timer
loop:TL0 = 0xAF; // load valur 15535 = 3CAFh so after
TH0 = 0x3C; // 50000 counts timer 0 will be overflow
pin = 1; // send high logic to P1.0
TR0 = 1; // start timer
while(TF0 == 0) {} // wait for first overflow for 50 ms
TL0 = 0xAF; // again reload count
TH0 = 0x3C;
pin = 0; // now send 0 to P1.0
while(TF0 == 0) {} // wait for 50 ms again
goto loop; // continue with the loop
}
xample-2: write a program to make 8 to 1 multiplexer with enable signal
#include<reg51.h>
sbit D0 = P0^0; // set P0.0-P0.7 (D0-D7) as input pins of mux
sbit D1 = P0^1;
sbit D2 = P0^2;
sbit D3 = P0^3;
sbit D4 = P0^4;
sbit D5 = P0^5;
sbit D6 = P0^6;
sbit D7 = P0^7;
sbit S0 = P1^0; // set P1.0-P1.2(S0-S2) as select pins of mux
sbit S1 = P1^1;
sbit S2 = P1^2;
sbit EN = P1^7; // set P1.7 as enable pin
sbit pin = P3^5; // set P3.5 as output
main()
{
P3=0x00;P0=0xFF; // clear op and set all ips
TMOD = 0x01; // set timer 0 for 16 bit timer
next:TL0 = 0xAF; // load count
TH0 = 0x3C;
while(EN==1){} // wait till enable pin becomes 0
if((S0==0)&&(S1==0)&&(S2==0)) pin = D0; // if select inputs are 000
op is first ip
else if((S0==1)&&(S1==0)&&(S2==0)) pin = D1; // if select inputs are 001
op is second ip
else if((S0==0)&&(S1==1)&&(S2==0)) pin = D2; // same as above
else if((S0==1)&&(S1==1)&&(S2==0)) pin = D3;
else if((S0==0)&&(S1==0)&&(S2==1)) pin = D4;
else if((S0==1)&&(S1==0)&&(S2==1)) pin = D5;
else if((S0==0)&&(S1==1)&&(S2==1)) pin = D6;
else if((S0==1)&&(S1==1)&&(S2==1)) pin = D7;
else pin = 0; // by default op is cleared
TR0 = 1; // start timer 0
while(TF0==0){} // wait until overflow
means 50ms
TR0 = 0; // stop timer
goto next; // go for next input
}
Example-3: take parallel input from port P1 convert it into serial and send it via
P0.0
#include<reg51.h>
sbit sout = P0^0; // serial out on P0.0
sbit D0 = P1^0; // parallal input from P1 (D0-D7)
sbit D1 = P1^1;
sbit D2 = P1^2;
sbit D3 = P1^3;
sbit D4 = P1^4;
sbit D5 = P1^5;
sbit D6 = P1^6;
sbit D7 = P1^7;
int i;
void delay(void); // 1 ms delay
main()
{
for(i=0;i<8;i++) // rotate loop for 8 times
{
sout = D0; // first bit out
D0 = D1; // shift all bits in sequence
D1 = D2;
D2 = D3;
D3 = D4;
D4 = D5;
D5 = D6;
D6 = D7;
delay(); // generate 1 ms delay after each bit shifted
}
}
void delay()
{
int k
for(k=0;k<1000;k++);
}
Example-4: write a program to simultaneously transmit and receive data.
#include <reg51.h>
main()
{
TMOD=0x20; // set timer1 in 16 bit timer mode
SCON=0x40; // initialize serial communication
TL1=0xFD; // load timer 1 to generate baud rate of 96KBps
TH1 = 0xFD;
TR1 = 1; // start timer 1
loop:REN = 1; // enable reception
while(RI==0){} // wait until data is received
RI=0; // clear receive flag
ACC = SBUF; // get data in to acc
REN = 0; // now disable reception
SBUF = ACC; // start transmission
while(TI==0){} // wait until data transmitted
TI=0; // clear transmission flag
goto loop; // continue this cycle
}
Example-5: detect an external interrupt on P3.2 and P3.3. Indicate on LEDs
connected on P0.0 & P0.1
#include<reg51.h>
sbit op1=P0^0; // LED1 as output on P0.0
sbit op2=P0^1; // LED2 as ouput on P0.1
void delay(void); // 10 ms delay
void intrupt0(void) interrupt 0 // ext interrupt 0 vector
{
op1=0; // indication on LED1
delay();
op1=1;
}
void intrupt1(void) interrupt 2 // ext interrupt 1 vector
{
op2=0; // indication on LED2
delay();
op2=1;
}
void delay() // delay for 10 ms
{
int x;
for(x=0;x<10000;x++);
}
void main()
{
P0=0xFF; // send all 1's to P0
IE=0x85; // enable both ext interrupts
while(1); // continuous loop
}
Example-6: blink a LED on P2.0 for 5 second using timer 1
#include<reg51.h>
int c=0; // initialize counter to 0
sbit LED= P2^0; // LED connected to P2.0
void timer1(void) interrupt 3 // timer 1 overflow vactor
{
TF1=0; // clear overflow flag
c++; // increment counter
if(c==100) // if 100 counts of 50 ms(= 5 sec) are over
{
TR1=0; // stop timer
LED=0; // LED off
}
TH1=0x3C; // other reaload timer 1 with
TL1=0xAF; // 15535 to count 50 ms
}
void main()
{
P2=0x00; // clear op
TMOD=0x90; // set timer 1
TH1=0x3C; // load count 15535
TL1=0xAF;
IE=0x88; // enable timer 1 interrupt
LED=1; // LED on
TR1=1; // timer 1 start
while(1); // continuous loop
}
Example 7: send ultrasonic wave through P1.0 and receive its echo through
P3.2. generate an interrupt. Calculate the distance of object.
#include <reg51.h>
sbit tx = P1^0; // transmitter pin
int c=0,d=0; // counter and distance
void tmr0(void) interrupt 1 // timer 0 interrupt vector
{
TF0=0; // clear timer flag
c++; // increment counter
TL0 = 0xAF; // reload values
TH0 = 0x3C;
}
void int0(void) interrupt 0 // ext interrupt 0 vector
{
TR0 = 0; // stop timer
d = c*30; // get distance = time*velocity
}
main()
{
IE=0x83; // enable interrupts
IP=0x01; // high priority for ext interrupt
TMOD = 0x01; // timer 0 as 16 bit timer
P1 = 0x00; // clear op port
TL0 = 0xAF; // load values for 50 ms
TH0 = 0x3C;
tx = 1; // enable transmission
TR0 = 1; // start timer
while(1);
}