51单片机控制步进电机正反转

时间:2025-03-07 19:17:29
#include <> #include <> unsigned char code z[]={0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03//315,270,225......360(0) };//八拍 unsigned char code f[]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03//45,90,145......360(0) }; sbit K1 = P3^0;//定义正转按钮 sbit K2 = P3^1;//定义反转按钮 sbit K3 = P3^2;//定义停止按钮 void zz(unsigned char n); void fz(unsigned char n); void delay(); void step(); void main() { unsigned char N = 1;//由于设定好了转一圈的数据,所以N在此设定为转多少圈。 TMOD=0X10; TL1=0XF0; TH1=0XD8; EA=0; ET1=0;//这里没有使用定时器中断,这里只是使用定时器的定时功能。 zz(N); delay(); fz(N); while(1) { if(K1 == 0) { while(1) { P0 = 0xfe; zz(N); if(K3 == 0||K2==0) break; } } else if(K2 == 0) { while(1) { P0 = 0xfd; fz(N); if(K3 == 0||K1==0) break; } } else { P0 = 0xfb; P1 = 0x03; } } } void zz(unsigned char n)//正转 { unsigned char i,j; for(i=0;i<n;i++) { for(j=0;j<8;j++)//整个for循环,正转一个步距角,因为四相八拍,所以是半个步距角,即半步。 { if(K3 == 0) break; P1 = z[j]; step(); } } } void fz(unsigned char n)//反转 { unsigned char i,j; for(i=0;i<n;i++) { for(j=0;j<8;j++) { if(K3 == 0) break; P1 = f[j]; step(); } } } void delay()//定义1s { unsigned char i,j,k; _nop_(); i=8; j=154; k=122; do { do { while(--k); }while(--j); }while(--i); } void step()//定时器计时10ms { TF1=0; TR1=1; while(TF1==0); TR1=0; TL1=0XF0; TH1=0XD8; }