?? jcdj01.c
字號:
/***********************************
42鋸齒電機控制程序
**********************************/
#include "REG52.h"
#include <intrins.h>
#include <math.h>
unsigned int code acctime[11][11]={68,68,68,68,68,68,68,68,68,68,68, //100/0.33
114,94,80,70,62,56,51,46,43,40,37, //150/0.6
75,66,59,53,48,44,41,38,36,33,31, //200/0.7??
75,60,51,43,38,34,31,28,25,23,22, //250/1
45,40,36,32,30,27,25,24,22,21,20, //300/1.1
45,38,33,30,27,24,22,20,19,18,16, //350/1.3
45,36,31,26,23,21,19,17,15,14,13, //400/1.6
45,35,29,25,21,19,17,15,14,13,12, //450/1.8
45,34,27,23,20,17,15,14,12,11,10, //500/2
45,32,25,21,18,14,13,12,11,10,9, //550/2.3
45,31,24,20,16,14,12,11,10,9,8 //600/2.5
};
//**************************************
int data dataen; //數據選通
int direction; //正反轉
unsigned int revcmd;
unsigned int speed;
unsigned int spd;
unsigned int LorR;
//**************************************
//功能選通信號
sbit address0=P3^6;
sbit address1=P3^7;
sbit strobe=P3^1;
//鋸齒電機驅動信號**************
sbit step=P0^2;
sbit dir=P0^1;
sbit en=P0^0;
//上位機輸入信號******************
sbit ad0=P1^0; //AD8
sbit ad1=P1^1; //AD9
sbit ad2=P1^2; //AD10
sbit ad3=P1^3; //AD11
sbit ad4=P1^4;
sbit ad5=P1^5; //AD13
sbit ad6=P1^6;
sbit ad7=P1^7;
sbit ad8=P1^0;
sbit ad9=P1^1;
sbit ad10=P1^2;
sbit ad11=P1^3;
sbit ad13=P1^5;
sbit ad12=P3^2; //C1板數據選通信號INT0
//**************************************
sbit lamp=P0^7;
//**************************************
void ex44us(void)
{
int i=2;
while(i--);
}
void delay44us(unsigned int nums)
{
do
{
ex44us();
nums--;
}while(nums!=0);
}
void Ex10us()
{
data unsigned char t=3;
while(--t);
}
void Delay10us(unsigned int nums)
{
do{
Ex10us();
nums--;
}while(nums!=0);
}
/**********************************************
信號選通
address1 address0
0 0 選通AD0-AD7
0 1 選通AD8-AD13、JPOS0、JPOS1
1 0 選通state0~4、err
1 1 選通撥碼開關、IN0、IN1、JPOS2
IN:signal 0~3
***********************************************/
void PitchON(int signal)
{
switch(signal)
{
case 0:
address0=0;
address1=0;
break;
case 1:
address0=1;
address1=0;
break;
case 2:
address0=0;
address1=1;
break;
case 3:
address0=1;
address1=1;
break;
}
}
/*************************************
區分命令
IN:ad8~ad11
OUT: 1:速度 5:鋸齒動作 13:初始化
*************************************/
unsigned int RevCommand()
{
unsigned int cmd=0;
PitchON(1);
Delay10us(10);
cmd=(unsigned int)ad13;
cmd=(cmd<<1)|(unsigned int)ad11;
cmd=(cmd<<1)|(unsigned int)ad10;
cmd=(cmd<<1)|(unsigned int)ad9;
cmd=(cmd<<1)|(unsigned int)ad8;
return (cmd);
}
/*************************************
IN:ad7~ad0 cmdtype=1:轉速 5:鋸齒動作 13:初始化
OUT:檔位/運轉否
*************************************/
unsigned int DealCmdData(int cmdtype)
{
unsigned int cmd=0;
unsigned int cmdsir[8];
int i;
PitchON(0);
Delay10us(10);
if(cmdtype==1) //轉速0~60
{
cmd=ad5;
cmd=(cmd<<1)|(unsigned int)ad4;
cmd=(cmd<<1)|(unsigned int)ad3;
cmd=(cmd<<1)|(unsigned int)ad2;
cmd=(cmd<<1)|(unsigned int)ad1;
cmd=(cmd<<1)|(unsigned int)ad0;
}
else if(cmdtype==5) //0:鋸齒左/1:鋸齒右
{
cmd=ad0;
}
else if(cmdtype==13)
{
cmdsir[0]=ad0;
cmdsir[1]=ad1;
cmdsir[2]=ad2;
cmdsir[3]=ad3;
cmdsir[4]=ad4;
cmdsir[5]=ad5;
cmdsir[6]=ad6;
cmdsir[7]=ad7;
for(i=0;i<8;i++)
{
if(cmdsir[0]!=cmdsir[i])
return(1); //通訊不過
}
return(0);
}
return (cmd);
}
/*************************************
發送一個脈沖(f=1k),驅動電機
*************************************/
void SendPulse(unsigned int ttime)
{
if(direction==0)
{
step=1;
dir=1;
}
else
{
dir=1;
step=1;
}
ex44us();
if(direction==0)
step=0;
else
dir=0;
delay44us(ttime);
}
void External0(void) interrupt 0 using 2
{
EA=0;
dataen=0;
EA=1;
}
void main()
{
unsigned char i;
//int checkcom=1; //開機檢查通訊線全低 =1有錯誤 =0正常
//int checkcom2=1; //開機檢查通訊線全高 =1有錯誤 =0正常
for(i=0;i<3;i++)
{
lamp=0;
delay44us(3000);
lamp=1;
delay44us(3000);
}
IT0=1;
EX0=1;
TR0=0;
ET0=0;
IE0=0;
EA=1;
dataen=1;
en=1; //鋸齒電機禁止
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
/*while(checkcom==1)
{
_nop_();
locklamp=1; //有錯誤,熄燈
mendlamp=1;
if(dataen==0)
{
revcmd=RevCommand();
dataen=1;
}
if(revcmd==13)
checkcom=DealCmdData(13);
if(checkcom==0)
riseerr=1;
}
while(checkcom2==1)
{
_nop_();
locklamp=1; //有錯誤,熄燈
mendlamp=1;
riseerr=0;
if(dataen==0)
{
revcmd=RevCommand();
dataen=1;
}
if(revcmd==13)
checkcom2=DealCmdData(13);
if(checkcom2==0)
riseerr=1;
}*/
/*while(run==0)
{
speed=40;
ToUp(speed);
delay44us(10000);
ToDown();
delay44us(20000);
}*/
while(1)
{
revcmd=15;
if(dataen==0)
{
revcmd=RevCommand();
dataen=1;
}
switch(revcmd)
{
case 15: //無效
break;
case 1:
speed=DealCmdData(1);
if(speed>60)
speed=60;
if(speed<0)
speed=0;
if(speed==0)
{
TR1=0;
ET1=0;
TH1=0;
TL1=0;
step=1;
dir=1;
spd=0;
}
break;
case 5://鋸齒擺動
LorR=DealCmdData(5);
if(LorR>1)
LorR=1;
if(LorR<0)
LorR=0;
spd=speed/5;
spd--;
spd--;
if(spd<0)
spd=0;
else if(spd>10)
spd=10;
if(LorR==0)//左
{
direction=0; //電機正轉(左擺)
en=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
for(i=0;i<11;i++)
SendPulse(acctime[spd][i]);
for(i=0;i<88;i++)
SendPulse(acctime[spd][10]);
for(i=0;i<11;i++)
SendPulse(acctime[spd][10-i]);
en=1;
}
else
{
direction=1; //電機反轉(右擺)
en=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
for(i=0;i<11;i++)
SendPulse(acctime[spd][i]);
for(i=0;i<88;i++)
SendPulse(acctime[spd][10]);
for(i=0;i<11;i++)
SendPulse(acctime[spd][10-i]);
en=1;
}
break;
default:
break;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -