📄 正转一圈 后反转一圈.txt
字号:
#include <reg51.h>
sbit A=P1^4 ;
sbit B=P1^5 ;
sbit C=P1^6;
sbit D=P1^7 ;
static unsigned int count; //计数
static int step_index; //步进索引数,值为0-7
static bit turn; //步进电机转动方向
static bit stop_flag; //步进电机停止标志
static int speedlevel; //步进电机转速参数,数值越小速度越快,最小值为1,速度最慢
static int spcount; //步进电机转速参数计数
void delay(unsigned int endcount); //延时函数,延时为endcount*0.5毫秒
void gorun(); //步进电机控制步进函数
void main(void)
{
EA = 1; //允许CPU中断
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许
TH0 = 0xFE;
TL0 = 0x0C; //设定时每隔0.5ms中断一次
TR0 = 1; //开始计数
turn = 0;
do{turn = 0;
speedlevel =4;
delay(10000); //以speedlevel = 4的速度转2000*0.5MS=1S
speedlevel =4;
delay(10000); //以speedlevel = 4的速度转2000*0.5MS=1S
//stop_flag=1;
delay(600);//停止,2000*0.5MS=3S
stop_flag=0;
turn = 1;
speedlevel =4;
delay(10000); //以speedlevel = 4的速度转2000*0.5MS=1S
speedlevel =4;
delay(10000); //以speedlevel = 4的速度转2000*0.5MS=1S
stop_flag=1;
delay(600);//停止,2000*0.5MS=3S
stop_flag=0;
}while(turn);
}
//定时器0中断处理
void timeint(void) interrupt 1
{
TH0=0xFE;
TL0=0x0C; //设定时每隔0.5ms中断一次
count++; //计数
spcount--; //步进电机转速参数计数
if(spcount<=0)
{
spcount = speedlevel;
gorun();
}
}
void delay(unsigned int endcount)
{
count=0;
do{}while(count<endcount);
}
void gorun()
{
if (stop_flag==1)
{
A = 0;
B = 0;
C = 0;
D = 0;
return;
}
switch(step_index)
{
case 7: //0
A = 1;
B = 0;
C = 0;
D = 0;
break;
case 6: //0、1
A = 1;
B = 0;
C = 0;
D = 1;
break;
case 5: //1
A = 0;
B = 0;
C = 0;
D = 1;
break;
case 4: //1、2
A = 0;
B = 0;
C = 1;
D = 0;
break;
case 3: //2
A = 0;
B = 0;
C = 1;
D = 1;
break;
case 2: //2、3
A = 0;
B = 1;
C = 1;
D = 0;
break;
case 1: //3
A = 0;
B = 1;
C = 0;
D = 0;
break;
case 0: //3、0
A = 1;
B = 1;
C = 0;
D = 0;
}
if (turn==0)
{
step_index++;
if (step_index>7)
step_index=0;
}
else
{
step_index--;
if (step_index<0)
step_index=7;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -