📄 25.c
字号:
/***************************************************************************
软件名称:步进电机控制控制软件
软件编写:梁博宇
编写时间:2004/09/11
最后修改时间:
版本:1.0
编译环境:KEIL C7.07
备注:
通讯协议
(1)接受数据
1 2 3 4 5
地址 电机1的方向 电机2的方向 命令字 电机1的步数 电机2的步数 校验和
(2)发送数据
1 2 3
本机地址 电机/位置 校验和
*****************************************************************************/
#include<AT892051.H>
#include <absacc.h>
#include <stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint timedj;
uchar bjadd;
uchar *com1;//
uchar *com2;//
uchar i,j;//
uchar add1,ad1;//加速阶段步数,匀速阶段步数,减速阶段步数
uchar add2,ad2;
uchar ys,ys1;
uchar ji1,ji2;
uchar jsbf1,jsbf2;
uchar ji1bf,ji2bf;
uchar jiabf,jibbf;
uchar fx,fx1;
uchar bx,bx1;
uchar fangx1,fangx2;
//uchar p;//效验和
bit fbit,mot1,mot2,djz1,djz2,jsbit,fasbit1,fasbit2,zxbit1,zxbit2;
uchar weiz,weiz1;
bit fwbit1,fwbit2,fwbit3;
uchar code ff[5]={0x03,0x06,0x0c,0x09,0x00};//电机1反转 0011 0110 1100 1001
uchar code zz[5]={0x03,0x09,0x0c,0x06,0x00};//电机1正转 0011 1001 1100 0110
uchar code ff1[5]={0x30,0x60,0xc0,0x90,0x00};//电机2反转
uchar code zz1[5]={0x30,0x90,0xc0,0x60,0x00};//电机2正转
uchar data in[3];//接收到
void djfw(unsigned char no);
void mot_c1(void) //方向 步数 工作状态加速/减速
{
P3_4=0;
ys=10;
if(bx!=0)
{
if(10<bx)
ad1=5;
else
ad1=bx/2;
add1=2*ad1+2;
}
if(fx==1)
{
com1=zz;//正转
mot1=1;
ji1=bx;
jiabf=bx;
fbit=0;
fx=0;
bx=0;
fangx1=1;
}
else if(fx==2)
{
com1=ff;//反转
mot1=1;
ji1=bx;
jiabf=bx;
fbit=0;
fx=0;
bx=0;
fangx1=2;
}
}
void mot_c2(void)
{
P3_5=0;
ys1=10;
if(bx1!=0)
{
if(10<bx1)
ad2=5;
else
ad2=bx1/2;
add2=2*ad2+2;
}
if(fx1==1)
{
com2=zz1;//正转
mot2=1;
ji2=bx1;
jibbf=bx1;
fbit=0;
fx1=0;
bx1=0;
fangx2=1;
}
else if(fx1==2)
{
com2=ff1;//反转
mot2=1;
ji2=bx1;
jibbf=bx1;
fbit=0;
fx1=0;
bx1=0;
fangx2=2;
}
}
bit comout(void)//发送
{
uchar p;
ES=0;
SM2=0;
SBUF=bjadd;//将地址发回
while(TI!=1);TI=0;
while(RI!=1);RI=0;
SBUF=in[0];
while(TI!=1);TI=0;
p=bjadd+in[0];
SBUF=p;
while(TI!=1);TI=0;
while(RI!=1);RI=0;
SM2=1;
if(SBUF==0x00)
{
ES=1;
return(0);
}
else
{
ES=1;
return(1);
}
}
void out(void)
{
uchar b;
b=in[0]>>4;
if(b==1)
{
b=in[0]&0x03;
if(b==1)//1电机正转
{
fx=1;
bx=in[1];
mot_c1();
}
else if(b==2)//1电机反转
{
fx=2;
bx=in[1];
mot_c1();
}
b=(in[0]>>2)&0x03;
if(b==1)//2电机正转
{
fx1=1;
bx1=in[2];
mot_c2();
}
else if(b==2)//2电机反转
{
fx1=2;
bx1=in[2];
mot_c2();
}
}
else if(b==2)//1复位
fwbit1=1;
else if(b==3)//2复位
fwbit2=1;
else if(b==4)//复位
fwbit3=1;
in[0]=0;
in[1]=0;
in[2]=0;
}
void inttime(void) interrupt 1
{
uchar temp;
TH0=-550/256;
TL0=-550%256;
P3_3=1;
P3_2=1;
if(!P3_2&&!zxbit1)
{
zxbit1=1;
fasbit1=1;
fx=0;
mot1=0;//停机
ji1=0;
bx=0;
}
else if(P3_2)
zxbit1=0;
if(!P3_3&&!zxbit2)
{
zxbit2=1;
fasbit2=1;
fx1=0;
mot2=0;//停机
ji2=0;
bx1=0;
}
else if(P3_3)
zxbit2=0;
if(mot1)//电机1
{
if(ys==0)
{
temp=P1&0xf0;
P1=temp|com1[i];
if(com1[++i]==0x00)i=0;
ji1--;
ys=jsbf1;
if(ji1==0)
{
mot1=0;
fangx1=0;
P3_4=1;
}
}
else
ys--;
fbit=0;
}
if(mot2)//电机2
{
if(ys1==0)
{
temp=P1&0x0f;
P1=temp|com2[j];
if(com2[++j]==0x00)j=0;
ji2--;
ys1=jsbf2;
if(ji2==0)
{
mot2=0;
fangx2=0;
P3_5=1;
}
}
else
ys1--;
fbit=0;
}
if(jsbit)
{
timedj++;
if(timedj>510)
{
jsbit=0;
timedj=0;
}
}
}
void com(void) interrupt 4 using 2//通讯
{
uchar p,s;
ES=0;
if(TI)
TI=0;
else if(SBUF!=bjadd)//地址
RI=0;
else
{
RI=0;
SM2=0;
SBUF=bjadd;//将地址发回
while(TI==0);TI=0;
p=0;
for(s=0;s<3;s++)
{
while(RI!=1);RI=0;
in[s]=SBUF;
p=p+in[s];
}
while(RI!=1);RI=0;
if(SBUF==p){SBUF=0x00;
SM2=1;
out();}
else
{
SBUF=0xff;
while(TI==0);TI=0;
SM2=1;
}
}
ES=1;
}
void Delay1(unsigned int xc)
{
while(xc--)
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void djfw(unsigned char no)
{
if(no==1)
{
jsbit=1;
fx=2;
bx=100;
mot_c1();
while(timedj!=500);
if(!P3_2)//没到
{
fx=1;
bx=100;
mot_c1();
}
}
if(no==2)
{
jsbit=1;
fx1=2;
bx1=100;
mot_c2();
while(timedj!=500);
if(!P3_3)
{
fx1=1;
bx1=100;
mot_c2();
}
}
if(no==3)
{
jsbit=1;
fx=2;
bx=100;
mot_c1();
fx1=2;
bx1=100;
mot_c2();
while(timedj!=500);
if(!P3_3)
{
fx=1;
bx=100;
mot_c1();
}
if(!P3_3)
{
fx1=1;
bx1=100;
mot_c2();
}
}
}
void main()
{
TMOD=0x21;
TH0=-550/256;
TL0=-550%256;
TL1=0xfd;//0xfd;
TH1=0xfd;//0xfd; //19200
PCON=0x80;
SCON=0xf0;//工作在方式3
TR1=1;
TR0=1;
IP=0x10;
bjadd=0x03;
fbit=1;
P3_4=1;
P3_5=1;
P3_3=1;
P3_2=1;
Delay1(1000);
ET0=1;
ES=1;
EA=1;
//IE=0x97;//47
/////////////////////////
// djfw(3);//复位
while(P3_2&&P3_3);
///////////////////////////////
while(1)
{
do{
if(fwbit1)
{
fwbit1=0;
djfw(1);
}
if(fwbit2)
{
fwbit2=0;
djfw(2);
}
if(fwbit3)
{
fwbit3=0;
djfw(3);
}
if(fasbit1)
{
fasbit1=0;
if(fangx1==1)//正向
weiz=1;
if(fangx1==2)//反向
weiz=3;
in[0]=0x10|(weiz&0x0f);
while(comout());//发送
}
if(fasbit2)
{
fasbit2=0;
if(fangx2==1)//正向
weiz1=1;
if(fangx2==2)//反向
weiz1=3;
in[0]=0x20|(weiz1&0x0f);
while(comout());//发送
}
}
while(fbit);
fbit=1;
if(ji1bf!=ji1)
{
ji1bf=ji1;
if(ji1>jiabf-ad1-1)
add1=add1-2;
// else if(ji1bf<5)
// add1=add1+1;
else
add1=1;
jsbf1=add1;
}
if(ji2bf!=ji2)
{
ji2bf=ji2;
if(ji2>jibbf-ad2-1)
add2=add2-2;
// else if(ji2bf<5)
// add2=add2+1;
else
add2=1;
jsbf2=add2;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -