www.pudn.com > STC89.rar > STC89.c
/*步进电机驱动器,使单片机输出 CP-,CW-,和FRE-,信号给步进电机驱动, 高速从500Hz可以加速10490Hz,低速从102Hz可以加速500Hz,*/ #includeunsigned 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(); }