لمن يمتلك الخبرة في لغة ال c المستعملة في الmicro controller أرجو المساعدة للضرورة القصوة و المستعجلة
هذا هو كود لتجربة التحكم . Single phase AC Motor speed controlle
وللأسف لم أتمكن من تحويلها الى لغة الhex لتفعيل التجربة , لذلك لمن يمتلك الخبرة أو القدرة على تحويله الى ال hex وارساله لي عن طريق الpdf وله جزيل الشكر .
وهذا هو الكود في لغة c
The complete operation is based on the software embedded in micro controller 89C2051. The software is written in C language. Different functions are used for different operations like ext1, ext0, delay and keydly etc. Here is the code with necessary comments which it self explains all above functions.
click here for the C code.
#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
}