如题,想通过调节电位器的阻值配合ad0804芯片和单片机来空控制步进电机旋转的角度。电路部分如下
然后单片机的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; } } } }
大家提提意见吧
非常感谢你 ,我自己难以发现不足,按照您说的,我好好研究研究。
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |