📄 stepmotorcontroller.c.c
字号:
#include <AT89X51.h>
sbit step=P1^0;
sbit direct=P1^1;
sbit speed=P1^2;
sbit set=P3^2;
sbit ok=P1^3;
sbit led1=P1^4;
sbit led2=P1^5;
sbit led3=P1^6;
sbit led4=P1^7;
bit drt=0,dr0=0,tt=0;
unsigned char stp=0,spd=1;
unsigned int count;
unsigned char n=0,m=0;
unsigned int pvalue[4]={0x83,0x86,0x8c,0x89}; /**********步进电机正转输入值***********/
unsigned int nvalue[4]={0x89,0x8c,0x86,0x83}; /**********步进电机反转输入值***********/
void start(void);
void wait(unsigned int z);
void display(unsigned char x);
void readkeys(void);
/*********************************************/
/******************主程序********************/
void main(void)
{
IT0=1;
EX0=1; /*********设定中断方式*********/
EA=1;
while(1)
{
if(ok==0) start();
}
}
/****************************************************/
/****************中断处理****************************/
extern0() interrupt 0
{
readkeys();
display(stp);
start();
}
/**************************************************/
/******************读键盘**************************/
void readkeys(void)
{
display(stp);
while(ok!=0) /*************在按下OK键前读********/
{
count=300;
wait(count); /************去抖动**************/
if(ok==0) break;
if(step==0) /******************读步数值,边读边显示****************/
{
count=300;
wait(count);
if(step==0)
{
stp++;
if(stp==100) stp=0;
display(stp);
count=10000;
wait(count);
}
}
if(direct==0) /************读方向值,1为反转,0为正转,连读边显示**********/
{
count=300;
wait(count);
if(direct==0)
{
drt=~drt;
display(drt);
count=20000;
wait(count);
}
}
if(speed==0) /*******************读速度值,1~4倍速*********************/
{
count=300;
wait(count);
if(speed==0)
{
spd++;
if(spd==5) spd=1;
display(spd);
count=20000;
wait(count);
}
}
}
}
/*******************************************************/
/*********************对设定值进行显示*****************/
void display(unsigned char x)
{
unsigned char firstbit=0,secondbit=0;
if(x<10) P2=x+128; /************显示一位数*************/
else
{
firstbit=x/10; /************显示两位数*************/
secondbit=x-firstbit*10;
P2=secondbit+192; /******显示个位*******/
switch(firstbit) /******显示十位*******/
{
case 1:led1=1;led2=0;led3=0;led4=0;break;
case 2:led1=0;led2=1;led3=0;led4=0;break;
case 3:led1=1;led2=1;led3=0;led4=0;break;
case 4:led1=0;led2=0;led3=1;led4=0;break;
case 5:led1=1;led2=0;led3=1;led4=0;break;
case 6:led1=0;led2=1;led3=1;led4=0;break;
case 7:led1=1;led2=1;led3=1;led4=0;break;
case 8:led1=0;led2=0;led3=0;led4=1;break;
case 9:led1=1;led2=0;led3=0;led4=1;break;
}
}
}
/****************************************************/
/*************************延时子程序*****************/
void wait(unsigned int z)
{
unsigned int w;
for (w=0;w<z;w++);
}
/******************************************************/
/**********************启动步进电机********************/
void start(void)
{
unsigned char v;
tt=dr0 ^ drt;
while(stp!=0)
{
if(drt==0) /*****************************正转*******************************/
{
if(tt==1) /***判断上一次是正转还是反转******/
{
switch(m)
{ /****反转,则寻找上次通电位置***/
case 0:n=0;
case 1:n=3;
case 2:n=2;
case 3:n=1;
}
}
for(v=1;v<=stp;v++) /***********开始正转 ************/
{
P0=pvalue[n];
n++;
if(n==4) n=0;
wait(40000/spd);
}
dr0=drt;
break;
}
if(drt==1) /********************************反转******************************/
{
if(tt==1) /***判断上一次是正转还是反转*****/
{
switch(n) /***正转,则寻找上次通电位置***/
{
case 0:m=0;
case 1:m=3;
case 2:m=2;
case 3:m=1;
}
}
for(v=1;v<=stp;v++) /***********开始反转 ************/
{
P0=nvalue[m];
m++;
if(m==4) m=0;
wait(40000/spd);
}
dr0=drt;
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -