8051 instruction set
 simple programs of 8051
 introduction to keil
 sample programs in keil
 interfacing programs in Keil
 working with IC 555
 working with UMPS
 interfacing LCD with 8051
 working with unknown stepper motor
 working with bipolar stepper motor

~: Keil interfacing programs for 8051 :~

After going through sample programs in keil now, you should be aware of how to write simple codes in C language for 8051. So now, let us see some more programs in C language for 8051. These programs are interfacing programs means different peripheral devices are connected with 8051 and we have to write the C program to properly interface these devices with it. different devices are push buttons, keypad, LEDs, 7-segment display, LCD, ADC, DAC etc. here I am not giving the schematic diagrams of interfacing but just a short description of hardware connection is given that tells how the device is connected with 8051.  

LED Interfacing:

Hardware:- total 32 LEDs are connected one with each i/o line. Anodes of all 32 LEDs are tied to Vcc and cathode is connected with port pin. Here is the program to generate different chasing effects one after another continuously.

#include<reg51.h>

void delay(void);

 

void delay()

  {

            int a,b;

            for(a=0;a<100;a++)

               for(b=0;b<1000;b++);

  }

void main()

  {

            int i, j, k, l;

            for(i=0;i<50;i++)                      // ON-OFF effect

              {

                        P0=0x00;

                        P1=0x00;

                        P2=0x00;

                        P3=0x00

                        Delay();

                        P0=0xFF;

                        P1=0xFF;

                        P2=0xFF;

                        P3=0xFF;

                        Delay();

              }

            for(j=0;j<50;j++)                     // alternate blinking effect

              {

                        P0=0x55;

                        P1=0x55;

                        P2=0x55;

                        P3=0x55

                        Delay();

                        P0=0xAA;

                        P1=0xAA;

                        P2=0xAA;

                        P3=0xAA;

                        Delay();

              }

            for(k=0;k<50;k++)                  // ON-OFF effect for port lower and upper nibble

              {

                        P0=0xF0;

                        Delay();

                        P0=0x0F;

                        Delay();

                        P0=0xFF

                        P1=0xF0;

                        Delay();

                        P1=0x0F;

                        Delay();

                        P1=0xFF

                        P2=0xF0;

                        Delay();

                        P2=0x0F;

                        Delay();

                        P2=0xFF

                        P3=0xF0;

                        Delay();

                        P3=0x0F;

                        Delay();

                        P3=0xFF;

                }

            for(l=0;l<50;l++)                      // alternate switching of ports one by one

              {

                        P0=0x00

                        Delay();

                        P0=0xFF;

                        P1=0x00;

                        Delay();

                        P1=0xFF;

                        P2=0x00

                        Delay();

                        P2=0xFF;

                        P3=0x00;

                        Delay();

                        P3=0xFF;

              }

 

Push button keypad and 7-segment interfacing:

Hardware:-8 push buttons are connected with P2 with one terminal as common ground. A common anode type 7-segment display is connected to P0. the program displays number 1 to 8 on 7-segment depending upon the key is pressed

 

#include<reg51.h>
void main(void)
    {
     loop:P2=0xFF;             // send all 1's to P1            
         while(P21==0xFF);     // remain within loop till key is not pressed
         switch(P1)            // when key pressed detect is
             {
                 case 0xFE:
                       P0=0xF9; // and display digit from 1 to 8
                       break;
                  case 0xFD:
                       P0=0xA4;
                       break;
                  case 0xFB:
                       P0=0xB0;
                       break;
                  case 0xF7:
                       P0=0x99;
                        break;
                  case 0xEF:
                       P0=0x92;
                       break;
                   case 0xDF:
                       P0=0x82;
                        break;
                  case 0xBF:
                        P0=0xF8;
                        break;
                   case 0x7F:
                        P0=0x80;
                        break;
               }
               goto loop;
        }

LCD interfacing:

Hardware:- normally all types of text LCDs have 8 data pins and 3 control signals. here data pins are connected with P0 and three control pins RS, R/W and EN are connected with P2.7, P2.6 & P2.5 respectively. Its a 16X2 LCD.

 

#include <reg51.h>
#include <string.h>


sbit rs = P2^7;  // declare P2.7 as rs pin
sbit en = P2^5;  // declare p2.5 as enable pin
sbit rw = P2^6;  // declare p2.6 as read/write pin
sbit b = P0^7;   // busy flag 

 

void writecmd(unsigned char a); // function to send command to LCD
void writedat(unsigned char b);  // function to send data to LCD
void busy();   // function to check LCD is busy or not
void writestr(unsigned char *s); // function to write string on LCD

 

void writecmd(unsigned char a)
{
 busy();   // check for LCD is busy or not
 rs = 0;   // clear rs pin for command
 rw = 0;   // clear rw pin to write
 P0 = a;   // send command character
 en = 1;   // strob LCD
 en = 0;
}
void writedat(unsigned char b)
{
 busy();   // check for LCD is busy or not
 rs = 1;   // set rs pin for data
 rw = 0;   // clear rw pin to write
 P0 = b;   // send data character
 en = 1;   // strob LCD
 en = 0; 
}
void busy()
{
 en = 0;   // disable display
 P0 = 0xFF;  // configur P0 as input
 rs = 0;   // clear rs pin for command
 rw = 1;   // set rw pin to read
 while(b==1)
 {
  en=0;   // strob LCD till P0.7 is 1
  en=1;
 }
 en=0;
}
void writestr(unsigned char *s)
{
 unsigned char l,i;
 l = strlen(s);               // get the length of string
 for(i=1;i<l;i++)
 {
  writedat(*s);              // write every char one by one
  s++;  
 }
}
    
main()
{
    P0=0x00;                      // P0 and P0 as output ports
    P2=0x00;
    writecmd(0x3C);               // initialize LCD
    writecmd(0x0E);    
    writecmd(0x01);              // clear memory and home cursor
    writestr("Wel-Come to LCD"); // write message in first line  
    writecmd(0xC4);              // move cursor to second line 4th pos    
    writestr("Program");  

    while(1)                     // continuous loop
   } 

ADC interfacing:

Hardware:- here I have interfaced 8 bit ADC 0804 with 8051 and given program displays digital equivalent value (HEX) of any analog input on 2-digit multiplex seven segment. Usually ADC has four control signals. CS (chip select-active low), WR (SOC-start of conversion-active low), RD(OE-o/p enable-active low)and INT. from these four only INT is o/p form ADC all other are inputs. The CS is connected with ground. WR, RD and INT signals are connected with P3.0, P3.1 and P3.2 respectively. 8 data pins are connected with P1. Multiplex 7-segment has 8 data pins and 2 display select pins. data pins are connected with P0 and display select pins are connected to P2.7 and P2.6 respectively. 

#include <reg51.h>
#include <string.h>


sbit wr = P3^0;  // ADC write enable
sbit rd = P3^1;  // ADC read enable

sbit d1 = P2^7   // display 1 select bit

sbit d2 = P2^6   // display 2 select bit

unsigned char data d;

unsigned int a=0,b=0,c=0;

void int1(void) interrupt 1           //external interrupt 1 subroutine
  {
    EA=0                              // first disable any other interrupt

    rd = 0;                           // send read signal  
    d=P1;                             // read the data from port
    rd=1; 

    a = (d & 0x0F);                   // saperate upper and lower
    b = d >> 4;                       // nibbles 

    EA=1;                             // again enable interrupts

  } 

void tmr1(void) interrupt 3            // timer 1 overflow interrupt

  {

     c++;                              // count no of timer 1 interrupts 

     TH1=0xEC;                         // reload timer

     TL1=0x77;

     TF1=0;                            // clear timer 1 overflow flag

     if((c%2)==0)                      // check interrupt has arrived even

        {                              // times or odd times

           d1=1;                       // alternatively change display 

           d2=0;                       // for even times 

           P0=b;

        }

      else                             // and odd times

        {

           d1=0;

           d2=1;

           P0=a;

        }

    }        
main()
{
    P0=0x00;                      // P0 output ports   

    P1=0xFF;                      // P1 input port

    TMOD=0x90;                    // initialize T1 as 16 bit timer

    TH1=0xEC;                     // load count 60535(=EC77h)

    TL1=0x77;                     // so it will overflow after 5 ms 

    TR1=1;                        // start timer

    d1=0;

    d2=1;                         //enable first display 

    P0=a;                         //display 0 initially

    IE=0x89;                      // enable external and timer interrupts   
    wr = 0;                       // send write signal   
    wr = 1; 

    while(1);                     // wait in continuous loop

  }

DAC interfacing:

Hardware:-a 8 bit DAC is connected to P2. Its two control signals WR and CS are tied to ground. Here I am writing a program to generate three different types of waveforms square, triangular and staircase type. To select desire waveform three push buttons are connected at P3.0 to P3.2.

#include<reg51.h>

 

void delay1();                                                   //key debounce delay

void delay2();                                                   // delay for frequency

void sqrarwave();                                             // function to generate square wave

void triwave();                                                  // function to generate triangular wave

void stairwave();                                               // function to generate staircase wave

 

void delay1()                                                    // approx. 100 ms delay

  {

            int a,b;

            for(a=0;a<100;a++)

                        for(b=0;b<1000;b++);

  }

void delay2()                                                    // approx 1 ms delay

  {

            int c;

            for(c=0;c<1000;c++);

  }

void squarwave()

  {

            while(P3==0xFF)                                 // till any button is not pressed

              {

                        P2=0xFF;                                // first send all high to P2

                        Delay2();

                        P2=0x00;                                 // then send all low to P2

                        Delay2();

              }

  }

void triwave()

  {

            unsigned char d;

            while(P3==0xFF)

              {

                        for(d=0x00;d<0xFF;d++)        // send values 00 to FF

                          {

                                    P2=d;                           // one by one for positive ramp             

                          }

                        for(d=0xFF;d<0x00;d--)          // send values FF to 00

                          {

                                    P2=d;                           // one by one for negative ramp

                          }

              }

void stairwave()

  {

            while(P3==0xFF)

              {

P2=0x00;                                 // step by step increment

                        Delay2();

                        P2=0x20;                                 // values sent to P2

                        Delay2();

                        P2=0x40;

                        Delay2();

                        P2=0x80;

                        Delay2();

              }

  }

 

void main()

  {

            P2=0x00;                                 // P2 as output port

            P3=0xFF;                                // P3 as input port

            While(P3=0xFF);                     // wait till any button is pressed

            Switch(P3)

              {

                        case 0xFE:                   // for first button

                                    delay1();           // key debounce delay

                                    P3=0xFF;        // send all 1’s again to P3

                                    squarwave();    // generate square wave

                                    break;

                        case 0xFD:

                                    delay1();

                                    P3=0xFF;

                                    triwave();

                                    break;

                        case 0xFB:

                                    delay1();

                                    P3=0xFF;

                                    stairwave();

                                    break;

              }

  }     

All the projects are designed and developed by sight owner and they are thoroughly tested by him. ©Copyrights Ashutosh Bhatt 2010. All rights reserved.