如題,想通過調(diào)節(jié)電位器的阻值配合ad0804芯片和單片機(jī)來空控制步進(jìn)電機(jī)旋轉(zhuǎn)的角度。電路部分如下
aa.png (110.23 KB, 下載次數(shù): 165)
下載附件
2011-11-11 07:34 上傳
左邊只用到電位器了2和4接上。 然后單片機(jī)的P1.0----P1.3口接步進(jìn)電機(jī)驅(qū)動(dòng)板,驅(qū)動(dòng)板使用的是uln2003芯片,ad數(shù)據(jù)送到P2口。
通過別人指點(diǎn)和自己理解寫了下面的程序。不知道正確否,希望大家?guī)蛶兔。我也知道?yīng)該盡力自己發(fā)現(xiàn)并解決問題,這次真不會(huì)。
//use adc0804 and cs51 to control the motor
*************************
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit adcs=P3^5;
sbit adrd=P3^0;
sbit adwr=P3^3;
/*sbit F1 = P1^0;
sbit F2 = P1^1;
sbit F3 = P1^2;
sbit F4 = P1^3;*/
unsigned char code tab[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反轉(zhuǎn) A-AB-B-BC-C-CD-D-DA (即一個(gè)脈沖,轉(zhuǎn) 3.75 度)
unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe};//正轉(zhuǎn)
void delay50us(uint i)
{
uchar j;
for(i=0;i>0;i--)
for(j=6245;j>0;j--);
}
void main()
{
while(1)
{
uchar value,a,k,l,m,n,s,t,w,o,b,c;
adcs=0;
adwr=0;
delay50us(2);
adwr=1;
adcs=1;
delay50us(10);
adcs=0;
adrd=0;
delay50us(1);
value=P2;//000--255八位ad范圍0000 0000~~1111 1111
adrd=1;
adcs=1;
k=value/3;//每增加3,步進(jìn)電機(jī)走一拍
l=value%3;//肯定小于3不用考慮
n=k/8;//可以轉(zhuǎn)幾個(gè)八拍
s=k%8;
t=s/3;
a=P2;//此行和下面兩行是用來判斷電位器變大還是變小
delay50us(5);//延時(shí)
b=P2;
if((c-b)<0) //如果電位器阻值變大
{
if(k>8)//不夠八拍或者超過八拍兩種情況
a=1;
else
a=0;
switch(a)
{
case 0:
for(m=0;m<k-1;m++)
{
P1=tab[m];
delay50us(50);
}
break;
case 1:
while(n--)
{
for(o=0;m<8;o++)
{
P1=tab[o];
delay50us(5);
}
}
for(w=0;w<t-1;w++)
{
P1=tab[w];
delay50us(50);
}
break;
}
}
else if((c-b)>0) //如果電位器阻值變小
{
if(k>8)
a=1;
else
a=0;
switch(a)
{
case 0:
for(m=0;m<k-1;m++)
{
P1=ffz[m];
delay50us(50);
}
break;
case 1:
while(n--)
{
for(o=0;m<8;o++)
{
P1=ffz[o];
delay50us(5);
}
}
for(w=0;w<t-1;w++)
{
P1=ffz[w];
delay50us(50);
}
break;
}
}
}
}
|