代码源程序:#include"STC11F60XE.H"#define uint unsigned int#define uchar unsigned char/*************************************************************************项目名称:步进电机通用驱动程序解决方案:STC11L04+A3966程序开发人:黄荣汉开发日期:2011-5-27说明:1)电流控制在650mA以下,否则容易损坏驱动IC2)细分功能只应用于单极性步进电机,暂不支持双极性电机细分功能,切记。
本版本的程序上,双极性电机如果使用细分,电机将不能正常运转,有可能导致电机损坏。
*************************************************************************/sbit Phase01=P1^7;sbit En01=P1^6;sbit En02=P1^5;sbit Phase02=P1^2;sbit S1=P3^4;sbit S2=P3^3;sbit S3=P3^7;//***************************** A+ A- B+ B- *************************//*****7 6 5 2*****uchar code step0_tab8[8]={0x04,0x44,0x84,0xa0,0x80,0x40,0x00,0x20}; //单极性驱动取表数据;// step1_tab8[8]={0x04,0x00,0x84,0x00,0x80,0x00,0x00,0x00}uchar code step0_tab4[4]={0x80,0x84,0x04,0x00}; //双极性驱动取表数据;/*************************************************************************/bit driver_flag,run_flag,ccw_flag; //1)驱动方式:0代表单极性、1代表双极性;2)运行标志:0标示停止,1标示运行;3)正反转标示:0代表反转;1代表正转bit run_model,driver_model; //1)运行模式:0代表间断运转,1代表连续运转;2)细分模式(仅对单极性电机有效):0代表2细分;1代表不细分;bit ccw_last,k_on_flag; //1)上一次正反转标志;uchar i,n;uint clk_time;uint nn,delay_counter;/*************************************************************************/void delay(uint x){uchar a;for(;x>0;x--)for(a=0;a<100;a++);}/*************************************************************************/void init_timer0(){EA=1;ET0=1;TMOD=0x01;}/************************************************************************/void keyscan(){bit k1_on,k2_on,k3_on;P3=P3 | 0x98;if((!k_on_flag)&((P3&0x98)!=0x98)){delay(2);if((P3&0x98)==0x88) //s1{k1_on=1;k_on_flag=1;}else if((P3&0x98)==0x90) //s2{k2_on=1;k_on_flag=1;}else if((P3&0x98)==0x18) //s3{k3_on=1;k_on_flag=1;}}if((k_on_flag)&((P3&0x98)==0x98)){delay(10);if((P3&0x98)==0x98){if(k1_on) //s1{if(run_flag==1){run_model=!run_model;}}else if(k2_on) //s2{if(run_flag==1){ccw_flag=!ccw_flag;}}else if(k3_on) //s3{run_flag=!run_flag;TR0=!TR0;}k1_on=0;k2_on=0;k3_on=0;k_on_flag=0;}}}/*************************************************************************/ void initial() //上电默认状态:单极性驱动,反转,停止;运转模式:间断运转{P1=P1|0x60; //输出停止init_timer0();driver_flag=1;ccw_flag=0;run_flag=0;i=0;n=0;ccw_last=0;run_model=0;driver_model=0;//仅对单极性电机有效,默认:2细分}/*************************************************************************/ void driver_confit(){if(driver_flag==0)//单极性驱动模式{if(driver_model==0) //单极性2细分2{if(ccw_flag==0){P1 = step0_tab8[i];i++;if(i==8) i=0;}else{P1 = step0_tab8[i-1];i--;if(i==0) i=8;}}else //单极性不细分{if(ccw_flag==0){P1 = step0_tab8[i];i=i+2;if(i==8) i=0;}else{P1 = step0_tab8[i-2];i=i-2;if(i==0) i=8;}}}else //双极性驱动模式{if(ccw_flag==0){P1 = step0_tab4[n];n++;if(n==4) n=0;}else{P1 = step0_tab4[n-1];n=n-1;if(n==0) n=4;}}}/*************************************************************************/ void timer0() interrupt 1{driver_confit();ccw_last=ccw_flag;TH0=clk_time/256;TL0=clk_time%256;}/*************************************************************************/ void main(){P1M0=0xe4;P1M1=0x00;P3M0=0x00;P3M1=0x00;nn=0;initial();delay_counter=2000; //间断工作时间控制clk_time=(65535-1157);//速度控制,具体设置请参考“转速计算表工具.xls”并注意实际的步距角,这个很重要!TH0=clk_time/256;TL0=clk_time%256;while(1){keyscan();if(run_flag==1){if(ccw_last!=ccw_flag){TR0=0;P1=P1|0x60;{if(ccw_flag==1){i=8;n=4;}else{i=0;n=0;}}delay(2);TR0=1;}else{if(run_model==0){if(nn<delay_counter){nn++;delay(500);}else if(nn==delay_counter){nn=0;TR0=!TR0;if( TR0==0){i=0;n=0;P1=P1|0x60;}}}}}else{TR0=0;i=0;n=0;P1=P1|0x60;}}}/************************************************************************ void main0(){initial() ;while(1){driver_confit();}}*/。