Temperature Controller
 Liquid Level Controller
 Load Positioning System
 Laser Cutting Machine
 Motion Control System
 DC Motor controller

~: DC motor controller program in KEIL C :~

#include<reg51.h>
#include <string.h>
sbit rs = P3^1;     // rs pin of LCD
sbit en = P3^0;     // en pin of LCD
sbit rw = P3^2;     // rw pin of LCD
sbit b = P0^7;     // busy flag
sbit led1=P2^0;     // run indicator
sbit led2=P2^1;     // stop indicator
sbit led3=P2^2;     // clockwise direction indicator
sbit led4=P2^3;     // anticlockwise direction indicator
sbit PWM=P2^4;     // PWM output
sbit RL1=P2^5;     // relay 1 pin
sbit RL2=P2^6;     // relay 2 pin

unsigned int x=10;    // ontime
unsigned int y=10;    // offtime
unsigned int m=0;    // mode
unsigned int d=0;    // direction
unsigned int t=100;    // time
unsigned int r=0;    // run flag

void start(void);    // function initilization
void mode(void);
void direction(void);
void incspeed(void);
void decspeed(void);
void inctime(void);
void dectime(void);
void time(unsigned int);
void delay(unsigned int);
void keydly(void);
void busy(void);

void writecmd(unsigned char a)  // send command to LCD
  {
 busy();       // check busy flag
 rs = 0;       // select command register
 rw = 0;       // write enable
 P0 = a;       // send byte to LCD
 en = 1;       // apply strobe pulse
 en = 0;
  }
void writedata(unsigned char b)  // send data to LCD
  {
 busy();       // check busy flag
 rs = 1;       // select data register
 rw = 0;       // write enable
 P0 = b;       // write enable 
 en = 1;       // send byte to LCD
 en = 0;       // apply strobe pulse      
  }
void busy()       // check busy flag of LCD
  {
 en = 0;       // disable display
 P0 = 0xFF;      // P0 as input
 rs = 0;       // select command register
 rw = 1;       // read enable
 while(b==1)      // if busy bit is 1
 {
  en=0;       // remain withine loop
  en=1;
 }
 en=0;       
  }
void writestr(unsigned char *s)  // send string message to LCD
 {
 unsigned char l,i;
 l = strlen(s);     // get length of string
 for(i=0;i<l;i++)    
 {
  writedata(*s);    // till the length of string
  s++;      // send characters one by one
 }
 }
void start()      // start rotating motor
  {
   if(m==0)      // for m=0 start continuous mode
   {
    RL1=0;      // switch on RL1
  r=1;      // set run flag
    P1=0xFF;     // send all 1's to P1
  while(P1==0xFF)    // till no key is pressed
      {
   led1=1;     // indication on run LED
   PWM=1;     // send high logic to PWM pin
   delay(x);    // on time delay
   led1=0;     
   PWM=0;     // now send low logic to PWM
   delay(y);    // off time delay
      }
  }
  else if(m==1)    // for m=1 start reversible mode
    {
     r=1;     // set run flag
   P1=0xFF;    // send all 1's to P1
   while(P1==0xFF)   // till no key is pressed
     {
      led1=1;    // run LED=1
    PWM=1;    // send high on PWM pin
    RL2=1;    // select one direction
    RL1=0;      // switch on RL1
    time(t);   // wait for desired time
    RL1=1;    // switch off RL1
    led1=0;    // run LED=0;
    time(20);   // wait for 1 sec
    led1=1;    // again run LED=1
    RL2=0;    // select other direction
    RL1=0;    // switch on RL1   
    time(t);   // wait for desire time
    RL1=1;    // switch off RL1
    led1=0;    // run LED=0
    time(20);   // wait for 1 sec
      }
    PWM=0;
    }
    else if(m==2)    // for m=2 start jogging mode
      {
    r=0;    // reset run flag
    PWM=1;    // send high on PWM pin
    RL1=0;    // switch on RL1
    time(20);   // wait for 1 sec
    RL1=1;    // switch off RL1
    PWM=0;    // send low on PWM pin
   } 
  }
void direction()     // alter the direction
  {
 keydly();      // key debounce delay
 d++;       // increment count
 if((d%2)==0)     // check for even or odd
   {
  led3=1;      // indicate on LEDs
  led4=0;
  RL2=1;      // switch ON / OFF RL2
   }
 else
   {
  led3=0;
  led4=1;
  RL2=0;
   }
  }
 void mode()        // change mode of rotation
   {
    keydly();        // key debounce delay
 writecmd(0x80);       // display message on first line first column
 m++;         // increment count 
 if(m==3) m=0;       // if it is 3 reset it
 if(m==0) writestr("mode:continuous "); // otherwise display mode
 else if(m==1) writestr("mode:reversible ");
 else if(m==2) writestr("mode:jogging    ");   
   }
 void incspeed()         // increase speed
   {
     int z;     
  keydly();         // key debounce
  writecmd(0xC0);        // select second line on LCD
  if(y<15)          // if not max pulse width
      {
     x--;
   y++;         // increase it convert it in to         
   z=y-5+0x30;        // 1 to 10 scale and ASCII
   writestr("speed: ");     // diaplay speed on LCD
   writedata(z);
   writestr("       ");
    }
  else if(y==15) writestr("max speed: 10  "); // if max width display message     
 }
void decspeed()           // increase speed
   {
     int w;    
  writecmd(0xC0);         // key debounce        
  keydly();
  if(x<15)           // if not minimum width
      {
     x++;
   y--;          // decrease it     
   w=y-5+0x30;         // do same as above  
   writestr("speed: ");
   writedata(w);
   writestr("       ");
    }
  else if(x==15) writestr("min speed: 1   ");  // if min width display message     
 }
void inctime()           // increase time
  {
   int p;   
 keydly();           // key debounce delay
 writecmd(0xC0);          
 if(t<180)           // if not max time
   {
  t+=20;           // increase it by 1 sec  
  p=t/20;
  p=p+0x30;          // convert it in to ASCII  
  writestr("time: ");        // display it
  writedata(p);
  writestr(" sec    ");
   }
 else if(t==180) writestr("max time: 9 sec");  // if max time display message 
  }
void dectime()           // decrease time
  {
   int q;      
 keydly();           // key debounce delay
 writecmd(0xC0);
 if(t>20)            // if not min time
   {
  t-=20;           // decrease it   
   q=t/20;
   q=q+0x30;          // do same as above  
   writestr("time: ");
   writedata(q);
   writestr(" sec    ");
   }
 else if(t==20) writestr("min time: 1 sec");   // if min time display message 
  }
void keydly()      // key debounce delay
  {
 int a,b;
 for(a=0;a<50;a++)
   for(b=0;b<1000;b++);
  }
void time(unsigned int c)   // change time in seconds
 {
 int k;
 TL1 = 0xAF;      // use timer 1
 TH1 = 0x3C;      // to generate 50 ms delay
 TR1 = 1;      // start timer
 for(k=0;k<=c;k++)    // rotate loop in multiples of 20
   {
  while(TF1==0);    // wait till timer overflow
  TF1 = 0;     // reset the flag
  TL1 = 0xAF;     // reload it
  TH1 = 0x3C;
   }
 TR1 = 0;      // stop timer
  }
void delay(unsigned int c1)   // change time in micro seconds
 {
 int a;
 TH0=0x9B;      // select timer 0
 TL0=0x9B;      // to generate 100 micro second delay
 TR0=1;       // start timer       
 for(a=0;a<c1;a++)    // rotate loop between 5 to 15
   {
  while(TF0==0);    // wait until timer overflow
  TF0=0;      // reset the flag
   }
 TR0=0;       // stop timer
  }

void main()
  {
 TMOD=0x12;      // timer1 in 16 bit timer, timer 0 in 8 bit auto reload mode
 P2=0xE0;      // LEDs off, relays OFF
 P0=0x00;      // P0, P3 output ports
 P3=0x00;
 writecmd(0x3C);     // initilize LCD
 writecmd(0x0E);
 writecmd(0x01);
 writecmd(0x84);     // display message
    writestr("DC Motor");   // DC motor controller in
 writecmd(0xC3);     // center of LCD
 writestr("Controller"); 
 time(50);      // wait for 2.5 sec
 writecmd(0x80); 
    writestr("mode:continuous "); // display current mode and speed
 writecmd(0xC0);
 writestr("speed: 5       "); 
 led3=1;       // stop LED on
 led2=1;       // clockwise direction
agin:P1=0xFF;      // P1 as input port
 while(P1==0xFF);    // wait until any key press
loop:switch(P1)
   {
  case 0xFE:     // for first key
   keydly();    // key debounce
   led2=0;     // stop LED off
   start();    // sart rotating motor
   break;
  case 0xFD:     // for second key
   keydly();    // key debounce
   r=0;     // run flag reset
   writecmd(0x01);   
   writestr("motor stop"); // display message
   led2=1;     // stop LED on
   PWM=0;     // low logic to PWM pin
   RL1=1;     // relay1 off
   break;
  case 0xFB:     // for third key   
   mode();     // select mode     
   if(r==1) start();  // jump to start if run flag is set
   break;
  case 0xF7:     // for fourth key  
   direction();   // change direction   
   if(r==1) start();  // jump to start if run flag is set
   break;
  case 0xEF:     // for fifth key   
   incspeed();    // increase speed
   if(r==1) start();  // jump to start if run flag is set
   break;
  case 0xDF:     // for sixth key   
   decspeed();    // decrease speed  
   if(r==1) start();  // jump to start if run flag is set
   break;
  case 0xBF:     // for seventh key  
   inctime();    // increase time
   if(r==1) start();  // jump to start if run flag is set
   break;
  case 0x7F:     // for eigth key  
   dectime();    // decrease time   
   if(r==1) start();  // jump to start if run flag is set
   break;
    }
 if(r==1) goto loop;    // if run flag is set jump of key detect
 else goto agin;     // if not jump to again
  }
   

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