📄 stc89.c
字号:
/*步进电机驱动器,使单片机输出 CP-,CW-,和FRE-,信号给步进电机驱动,
高速从500Hz可以加速10490Hz,低速从102Hz可以加速500Hz,*/
#include <at89x52.h>
unsigned char bdata out_word;
sbit out_word_2=out_word^2; //脱机信号FRE-
sbit out_word_3=out_word^3; //旋转方向CW-,1为正转,0为反转
sbit out_word_4=out_word^4; //步进电机输出信号CP-
bit speed_up_flag; //=1,加速,=0,减速
bit speed_flag; //=1,高速,=0,低速
bit dir; //=1,反转,=0,正转
bit off_line; //脱机标记
unsigned char data keyword; //键盘输入的键值
unsigned int data fx; //存放步进电机频率计数
unsigned char code frequence_code[]=
{ //高速定时器时间常数,80MHz工作频率,16位计数器
0xCB,0xEB,//f=500Hz
0xCC,0xF1,//f=510Hz
0xCD,0xEC,//f=520Hz
0xCE,0xDE,//f=530Hz
0xCF,0xC7,//f=540Hz
0xD0,0xA7,//f=550Hz
0xD1,0x80,//f=560Hz
0xD2,0x51,//f=570Hz
0xD3,0x1A,//f=580Hz
0xD3,0xDD,//f=590Hz
0xD4,0x99,//f=600Hz
0xD5,0x50,//f=610Hz
0xD6,0x00,//f=620Hz
0xD6,0xAA,//f=630Hz
0xD7,0x50,//f=640Hz
0xD7,0xF0,//f=650Hz
0xD8,0x8B,//f=660Hz
0xD9,0x22,//f=670Hz
0xD9,0xB5,//f=680Hz
0xDA,0x43,//f=690Hz
0xDA,0xCD,//f=700Hz
0xDB,0x53,//f=710Hz
0xDB,0xD5,//f=720Hz
0xDC,0x54,//f=730Hz
0xDC,0xCF,//f=740Hz
0xDD,0x48,//f=750Hz
0xDD,0xBD,//f=760Hz
0xDE,0x2E,//f=770Hz
0xDE,0x9D,//f=780Hz
0xDF,0x0A,//f=790Hz
0xDF,0x73,//f=800Hz
0xDF,0xDA,//f=810Hz
0xE0,0x3E,//f=820Hz
0xE0,0xA0,//f=830Hz
0xE1,0x00,//f=840Hz
0xE1,0x5D,//f=850Hz
0xE1,0xB9,//f=860Hz
0xE2,0x12,//f=870Hz
0xE2,0x69,//f=880Hz
0xE2,0xBE,//f=890Hz
0xE3,0x11,//f=900Hz
0xE3,0x62,//f=910Hz
0xE3,0xB2,//f=920Hz
0xE4,0x00,//f=930Hz
0xE4,0x4C,//f=940Hz
0xE4,0x97,//f=950Hz
0xE4,0xE0,//f=960Hz
0xE5,0x28,//f=970Hz
0xE5,0x6E,//f=980Hz
0xE5,0xB2,//f=990Hz
0xE5,0xF6,//f=1000Hz
//……
//……
0xFD,0x66,//f=10000Hz
0xFD,0x66,//f=10010Hz
0xFD,0x67,//f=10020Hz
0xFD,0x68,//f=10030Hz
0xFD,0x68,//f=10040Hz
0xFD,0x69,//f=10050Hz
0xFD,0x6A,//f=10060Hz
0xFD,0x6A,//f=10070Hz
0xFD,0x6B,//f=10080Hz
0xFD,0x6C,//f=10090Hz
0xFD,0x6C,//f=10100Hz
0xFD,0x6D,//f=10110Hz
0xFD,0x6E,//f=10120Hz
0xFD,0x6E,//f=10130Hz
0xFD,0x6F,//f=10140Hz
0xFD,0x70,//f=10150Hz
0xFD,0x70,//f=10160Hz
0xFD,0x71,//f=10170Hz
0xFD,0x72,//f=10180Hz
0xFD,0x72,//f=10190Hz
0xFD,0x73,//f=10200Hz
0xFD,0x74,//f=10210Hz
0xFD,0x74,//f=10220Hz
0xFD,0x75,//f=10230Hz
0xFD,0x75,//f=10240Hz
0xFD,0x76,//f=10250Hz
0xFD,0x77,//f=10260Hz
0xFD,0x77,//f=10270Hz
0xFD,0x78,//f=10280Hz
0xFD,0x79,//f=10290Hz
0xFD,0x79,//f=10300Hz
0xFD,0x7A,//f=10310Hz
0xFD,0x7B,//f=10320Hz
0xFD,0x7B,//f=10330Hz
0xFD,0x7C,//f=10340Hz
0xFD,0x7C,//f=10350Hz
0xFD,0x7D,//f=10360Hz
0xFD,0x7E,//f=10370Hz
0xFD,0x7E,//f=10380Hz
0xFD,0x7F,//f=10390Hz
0xFD,0x7F,//f=10400Hz
0xFD,0x80,//f=10410Hz
0xFD,0x81,//f=10420Hz
0xFD,0x81,//f=10430Hz
0xFD,0x82,//f=10440Hz
0xFD,0x83,//f=10450Hz
0xFD,0x83,//f=10460Hz
0xFD,0x84,//f=10470Hz
0xFD,0x84,//f=10480Hz
0xFD,0x85,//f=10490Hz
};
unsigned char code frequence_code1[]=
{ //低速定时器时间常数,80MHz工作频率,16位计数器
0x00,0xB0,//f=102Hz
0x07,0xFB,//f=105Hz
0x13,0x42,//f=110Hz
0x1D,0x8D,//f=115Hz
0x26,0xFD,//f=120Hz
0x2F,0xAB,//f=125Hz
0x37,0xAE,//f=130Hz
0x3F,0x1A,//f=135Hz
0x45,0xFD,//f=140Hz
0x4C,0x67,//f=145Hz
0x52,0x64,//f=150Hz
0x57,0xFE,//f=155Hz
0x5D,0x3E,//f=160Hz
0x62,0x2C,//f=165Hz
0x66,0xD1,//f=170Hz
0x6B,0x31,//f=175Hz
0x6F,0x53,//f=180Hz
0x73,0x3C,//f=185Hz
0x76,0xF1,//f=190Hz
0x7A,0x74,//f=195Hz
0x7D,0xCB,//f=200Hz
0x80,0xF8,//f=205Hz
0x83,0xFE,//f=210Hz
0x86,0xE1,//f=215Hz
0x89,0xA1,//f=220Hz
0x8C,0x43,//f=225Hz
0x8E,0xC7,//f=230Hz
0x91,0x30,//f=235Hz
0x93,0x7F,//f=240Hz
0x95,0xB6,//f=245Hz
0x97,0xD6,//f=250Hz
0x99,0xE1,//f=255Hz
0x9B,0xD7,//f=260Hz
0x9D,0xBB,//f=265Hz
0x9F,0x8D,//f=270Hz
0xA1,0x4E,//f=275Hz
0xA2,0xFF,//f=280Hz
0xA4,0xA1,//f=285Hz
0xA6,0x34,//f=290Hz
0xA7,0xBA,//f=295Hz
0xA9,0x32,//f=300Hz
0xAA,0x9F,//f=305Hz
0xAB,0xFF,//f=310Hz
0xAD,0x54,//f=315Hz
0xAE,0x9F,//f=320Hz
0xAF,0xE0,//f=325Hz
0xB1,0x16,//f=330Hz
0xB2,0x44,//f=335Hz
0xB3,0x69,//f=340Hz
0xB4,0x85,//f=345Hz
0xB5,0x99,//f=350Hz
0xB6,0xA5,//f=355Hz
0xB7,0xAA,//f=360Hz
0xB8,0xA8,//f=365Hz
0xB9,0x9E,//f=370Hz
0xBA,0x8F,//f=375Hz
0xBB,0x79,//f=380Hz
0xBC,0x5C,//f=385Hz
0xBD,0x3A,//f=390Hz
0xBE,0x13,//f=395Hz
0xBE,0xE6,//f=400Hz
0xBF,0xB4,//f=405Hz
0xC0,0x7C,//f=410Hz
0xC1,0x40,//f=415Hz
0xC1,0xFF,//f=420Hz
0xC2,0xBA,//f=425Hz
0xC3,0x71,//f=430Hz
0xC4,0x23,//f=435Hz
0xC4,0xD1,//f=440Hz
0xC5,0x7B,//f=445Hz
0xC6,0x22,//f=450Hz
0xC6,0xC4,//f=455Hz
0xC7,0x64,//f=460Hz
0xC8,0x00,//f=465Hz
0xC8,0x98,//f=470Hz
0xC9,0x2D,//f=475Hz
0xC9,0xC0,//f=480Hz
0xCA,0x4F,//f=485Hz
0xCA,0xDB,//f=490Hz
0xCB,0x64,//f=495Hz
0xCB,0xEB,//f=500Hz
};
void output(void); //步进电机输出
void speed_up(void); //加速
void speed_down(void); //减速
void stop(void); //步进电机停止进给
input(void); //键盘输入
main()
{
TMOD=0x11; //定时器0为方式1,定时器1为方式1
IP=0x0B; //定时器0中断、定时器1中断和外部中断0为高优先级
IE=0xA1; //开放显示中断和外部中断0
P1_6=0; //联机
fast_feed=0; //连续快进
speed_flag=0; //低速
off_line=0; //与控制系统联线
fx=0;
do
{
input(); //键输入
switch(keyword)
{
case 0: off_line=~off_line; //与控制系统联线/断线
fx=0;
if (off_line==0)
{
out_word_2=0; //输出脱机信号FRE-
}
break;
case 1: if (off_line!=0)
break; //返回命令状态
case 2: outcmd();break; //快进输出,正向
case 3: outcmd();break; //快进输出,反向
case 4: if (off_line!=0)
{ //高低速切换
speed_flag=~speed_flag;
fx=0;
}
break;
default: break;
}
output(); //控制步进电机输出
}
while(1);
}
void outcmd(void) //快进输出命令
{
unsigned char key;
fx=0;
do
{
if (off_line==0) return; //与控制系统联线时不能快进
key=key_word;
if ((key&0x0F)==2) //按下"2"键
{
out_word&=0xE7; //X正向输出
goto out1;
}
else
{
if ((key&0x0F)==3) //按下"3"键
{
out_word_3=1; // CW+,反向
out_word_4=0; //发CP-信号
out1: x_speed_up_flag=1; //加速
ET0=1; //允许定时器0中断
TR0=1;
goto out3;
}
else
speed_up_flag=0; //减速
}
}
out3: while (key!=0xFF);
}
void speed_up(void) //步进电机加速
{
if (speed_flag!=0) //高速
{
TH0=frequence_code[fx];
TL0=frequence_code[fx+1];
if (fx<1998) fx=fx+2;
}
else
{ //低速
TH0=frequence_code1[fx];
TL0=frequence_code1[fx+1];
if (fx<81) fx=fx+2;
}
}
void speed_down(void) //步进电机减速
{
if (speed_flag!=0) //高速
{
if (fx>0)
{
fx=fx-2;
TH0=frequence_code[fx];
TL0=frequence_code[fx+1];
}
else
stop(); //步进电机停止进给
}
else //低速
stop(); //步进电机停止进给
}
void stop(void) //步进电机停止进给
{
out_word_4=1; //停发信号
TR0=0; //速度太低,关定时器0,步进电机停止
ET0=0; //禁止定时器0中断
}
void output(void)
{
P1=out_word;
}
void time0_int(void) interrupt 1 //定时器0中断服务程序,X快进
{
if (speed_up_flag!=0)
speed_up(); //加速或恒速
else
speed_down(); //减速
output();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -