如题,想通过调节电位器的阻值配合ad0804芯片和单片机来空控制步进电机旋转的角度。电路部分如下
左边只用到电位器了2和4接上。 然后单片机的P1.0----P1.3口接步进电机驱动板,驱动板使用的是uln2003芯片,ad数据送到P2口。
通过别人指点和自己理解写了下面的程序。不知道正确否,希望大家帮帮忙。我也知道应该尽力自己发现并解决问题,这次真不会。
//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}; //反转 A-AB-B-BC-C-CD-D-DA (即一个脉冲,转 3.75 度)
unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe};//正转
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,步进电机走一拍
l=value%3;//肯定小于3不用考虑
n=k/8;//可以转几个八拍
s=k%8;
t=s/3;
a=P2;//此行和下面两行是用来判断电位器变大还是变小
delay50us(5);//延时
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;
}
}
}
}
|