|
~: AC Motor control program in C :~
#include<reg51.h>
#include <string.h>
sbit led1 = P3^0;
sbit s1 = P3^4;
sbit s2 = P3^5;
sbit s3 = P3^7;
unsigned int d1=0;
unsigned int d2=0;
unsigned int c=0;
bdata unsigned char byte;
sbit b0 = byte^0;
sbit b1 = byte^1;
sbit b2 = byte^2;
sbit b3 = byte^3;
sbit b4 = byte^4;
sbit b5 = byte^5;
sbit b6 = byte^6;
sbit b7 = byte^7;
void dely(void);
void incangle(void);
void decangle(void);
void delay(int d);
void shiftup() // raise the bar graph by one step
{
b7=b6; // shitf the bits one by one to up
b6=b5;
b5=b4;
b4=b3;
b3=b2;
b2=b1;
b1=b0;
b0=1; // insert 1 to first bit
}
void shiftdown() // decrease bar graph by one step
{
b0=b1; // shift all the bits down one by one
b1=b2;
b2=b3;
b3=b4;
b4=b5;
b5=b6;
b6=b7;
b7=0; // insert 0 to last bit
}
void keydly(void) //key debounce delay
{
unsigned int x,y;
for(x=0;x<100;x++)
for(y=0;y<1000;y++);
}
void decangle() //decrease delay by 1ms
{
EX1=0; //first disable all interrupts
if(d1>0)
{
d1--; // decrease delay
shiftdown();
P1=byte;
}
EX1=1; // enable interrupts before leaving
}
void incangle() // increase delay by 1 ms
{
EX1=0; // all other things remains same as above
if(d1<9)
{
d1++;
shiftup()
P1=byte;
}
EX1=1;
}
void delay(int d) // generates delay from 1 to 9 ms
{
int k;
TL0 = 0x17; // load timer 0 with 64535 = FC17h
TH0 = 0xFC; // so it will overflow after 1000 counts
TR0 = 1; // start timer
for(k=0;k<d;k++) // count overflows of timer 0 till
{ // desire delay is required
while(TF0==0);
TF0 = 0;
TL0 = 0x17;
TH0 = 0xFC;
}
TR0 = 0;
}
void int0(void) interrupt 2 // external interrupt 1 subroutine
{
keydly(); // after key debounce delay
if(s1==0) // for first key
{
c++; // increase counter
if((c%2)==1) // check even or odd
{
EX0 = 1; // enable external interrupt 1 if odd
}
else
{
EX0 = 0; // disable external interrupt 1
}
}
else if(s2==0) // for second key
{
incangle(); // increase phase angle
}
else if(s3==0) // for third key
{
decangle(); // decrease phase angle
}
}
void int1(void) interrupt 0 // external interrupt 1 subroutine
{
int t;
led1=0; // led1 is on
delay(d1); // after desired delay
pulse=1; // send pulse on p2.0
for(t=0;t<200;t++);
pulse=0;
led1 = 1; // led1 off
}
void main()
{
TMOD = 0x01; // initialize timer0 as 16 bit timer
P1=0x00; // P1 as output ports
P3=0xFF; // P3 as input port
IE=0x84; // enable external interrupt 1
while(1); // continuous loop
} |