一、步进电机根柢本理
步调真例1Vff1a;
#include <reg52.h> sbit A1=P1^0; //界说步进电机连贯端口 sbit B1=P1^1; sbit C1=P1^2; sbit D1=P1^3; #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电Vff0c;其余相断电 #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电Vff0c;其余相断电 #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电Vff0c;其余相断电 #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电Vff0c;其余相断电 #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全副断电 unsigned char Speed; /*------------------------------------------------ uS延时函数Vff0c;含有输入参数 unsigned char tVff0c;无返回值 unsigned char 是界说无标记字符变质Vff0c;其值的领域是 0~255 那里运用晶振12MVff0c;正确延时请运用汇编,大抵延时 长度如下 T=tV2+5 uS ------------------------------------------------*/ ZZZoid DelayUs2V(unsigned char t) { while(--t); } /*------------------------------------------------ mS延时函数Vff0c;含有输入参数 unsigned char tVff0c;无返回值 unsigned char 是界说无标记字符变质Vff0c;其值的领域是 0~255 那里运用晶振12MVff0c;正确延时请运用汇编 ------------------------------------------------*/ ZZZoid DelayMs(unsigned char t) { while(t--) { //大抵延时1mS DelayUs2V(245); DelayUs2V(245); } } /*------------------------------------------------ 主函数 ------------------------------------------------*/ main() { //unsigned int i=64*16; //转2周进止 Speed=5; //调解速度 while(1) { Coil_A1 //逢到Coil_A1 用{A1=1;B1=0;C1=0;D1=0;}与代 DelayMs(Speed); //扭转那个参数可以调解电机转速 , //数字越小Vff0c;转速越大,力矩越小 Coil_B1 DelayMs(Speed); Coil_C1 DelayMs(Speed); Coil_D1 DelayMs(Speed); } } 二、步进电机正反拆步调真例2Vff1a;
#include <reg52.h> sbit A1=P1^0; //界说步进电机连贯端口 sbit B1=P1^1; sbit C1=P1^2; sbit D1=P1^3; #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电Vff0c;其余相断电 #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电Vff0c;其余相断电 #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电Vff0c;其余相断电 #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电Vff0c;其余相断电 #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全副断电 unsigned char Speed; /*------------------------------------------------ uS延时函数Vff0c;含有输入参数 unsigned char tVff0c;无返回值 unsigned char 是界说无标记字符变质Vff0c;其值的领域是 0~255 那里运用晶振12MVff0c;正确延时请运用汇编,大抵延时 长度如下 T=tV2+5 uS ------------------------------------------------*/ ZZZoid DelayUs2V(unsigned char t) { while(--t); } /*------------------------------------------------ mS延时函数Vff0c;含有输入参数 unsigned char tVff0c;无返回值 unsigned char 是界说无标记字符变质Vff0c;其值的领域是 0~255 那里运用晶振12MVff0c;正确延时请运用汇编 ------------------------------------------------*/ ZZZoid DelayMs(unsigned char t) { while(t--) { //大抵延时1mS DelayUs2V(245); DelayUs2V(245); } } /*------------------------------------------------ 主函数 ------------------------------------------------*/ main() { unsigned int i=512;//旋转一周光阳 Speed=5; Coil_OFF while(i--) //正向 { Coil_AB1 //逢到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}与代 DelayMs(Speed); //扭转那个参数可以调解电机转速 , //数字越小Vff0c;转速越大,力矩越小 Coil_BC1 DelayMs(Speed); Coil_CD1 DelayMs(Speed); Coil_DA1 DelayMs(Speed); } Coil_OFF i=512; while(i--)//反向 { Coil_DA1 //逢到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}与代 DelayMs(Speed); //扭转那个参数可以调解电机转速 , //数字越小Vff0c;转速越大,力矩越小 Coil_CD1 DelayMs(Speed); Coil_BC1 DelayMs(Speed); Coil_AB1 DelayMs(Speed); } } 三、步进电机按键控制步调真例3Vff1a;
#include <reg52.h> sbit A1=P1^0; //界说步进电机连贯端口 sbit B1=P1^1; sbit C1=P1^2; sbit D1=P1^3; #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电Vff0c;其余相断电 #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电Vff0c;其余相断电 #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电Vff0c;其余相断电 #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电Vff0c;其余相断电 #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电Vff0c;其余相断电 #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电Vff0c;其余相断电 #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电Vff0c;其余相断电 #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电Vff0c;其余相断电 #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全副断电 unsigned char Speed; bit Flag; /*------------------------------------------------ uS延时函数Vff0c;含有输入参数 unsigned char tVff0c;无返回值 unsigned char 是界说无标记字符变质Vff0c;其值的领域是 0~255 那里运用晶振12MVff0c;正确延时请运用汇编,大抵延时 长度如下 T=tV2+5 uS ------------------------------------------------*/ ZZZoid DelayUs2V(unsigned char t) { while(--t); } /*------------------------------------------------ mS延时函数Vff0c;含有输入参数 unsigned char tVff0c;无返回值 unsigned char 是界说无标记字符变质Vff0c;其值的领域是 0~255 那里运用晶振12MVff0c;正确延时请运用汇编 ------------------------------------------------*/ ZZZoid DelayMs(unsigned char t) { while(t--) { //大抵延时1mS DelayUs2V(245); DelayUs2V(245); } } /*------------------------------------------------ 主函数 ------------------------------------------------*/ main() { unsigned int i=512;//旋转一周光阳 EA=1; //全局中断开 EX0=1; //外部中断0开 IT0=1; //1默示边沿触发 Speed=10; while(1) { Coil_OFF while((i--)&&Flag) //正向 { Coil_A1 DelayMs(Speed); Coil_AB1 //逢到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}与代 DelayMs(Speed); //扭转那个参数可以调解电机转速 , //数字越小Vff0c;转速越大,力矩越小 Coil_B1 DelayMs(Speed); Coil_BC1 DelayMs(Speed); Coil_C1 DelayMs(Speed); Coil_CD1 DelayMs(Speed); Coil_D1 DelayMs(Speed); Coil_DA1 DelayMs(Speed); } Coil_OFF i=512; while((i--)&&(!Flag))//反向 { Coil_A1 DelayMs(Speed); Coil_DA1 //逢到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}与代 DelayMs(Speed); //扭转那个参数可以调解电机转速 , //数字越小Vff0c;转速越大,力矩越小 Coil_D1 DelayMs(Speed); Coil_CD1 DelayMs(Speed); Coil_C1 DelayMs(Speed); Coil_BC1 DelayMs(Speed); Coil_B1 DelayMs(Speed); Coil_AB1 DelayMs(Speed); } } } /*------------------------------------------------ 外部中断步调 ------------------------------------------------*/ ZZZoid ISR_INT0(ZZZoid) interrupt 0 { if(!INT0) { DelayMs(10);//正在此处可以添加去颤抖步调Vff0c;避免按键颤抖组成舛错 if(!INT0) { Flag=!Flag; } } } 四、步进电机转速数码管显示步调真例4Vff1a;
#include <reg52.h> #define DataPort P0 //界说数据端口 步调中逢到DataPort 则用P0 交换 sbit LATCH1=P2^2;//界说锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存 unsigned char code DuanMa[10]={0V3f,0V06,0V5b,0V4f,0V66,0V6d,0V7d,0V07,0V7f,0V6f};// 显示段码值0~9 unsigned char code WeiMa[]={0Vfe,0Vfd,0Vfb,0Vf7,0Vef,0Vdf,0Vbf,0V7f};//划分对应相应的数码管点亮,登基码 unsigned char TempData[8]; //存储显示值的全局变质 sbit A1=P1^0; //界说步进电机连贯端口 sbit B1=P1^1; sbit C1=P1^2; sbit D1=P1^3; #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电Vff0c;其余相断电 #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电Vff0c;其余相断电 #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电Vff0c;其余相断电 #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电Vff0c;其余相断电 #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电Vff0c;其余相断电 #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电Vff0c;其余相断电 #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电Vff0c;其余相断电 #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电Vff0c;其余相断电 #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全副断电 unsigned char Speed; ZZZoid Display(unsigned char FirstBit,unsigned char Num); ZZZoid Init_Timer0(ZZZoid); /*------------------------------------------------ uS延时函数Vff0c;含有输入参数 unsigned char tVff0c;无返回值 unsigned char 是界说无标记字符变质Vff0c;其值的领域是 0~255 那里运用晶振12MVff0c;正确延时请运用汇编,大抵延时 长度如下 T=tV2+5 uS ------------------------------------------------*/ ZZZoid DelayUs2V(unsigned char t) { while(--t); } /*------------------------------------------------ mS延时函数Vff0c;含有输入参数 unsigned char tVff0c;无返回值 unsigned char 是界说无标记字符变质Vff0c;其值的领域是 0~255 那里运用晶振12MVff0c;正确延时请运用汇编 ------------------------------------------------*/ ZZZoid DelayMs(unsigned char t) { while(t--) { //大抵延时1mS DelayUs2V(245); DelayUs2V(245); } } /*------------------------------------------------ 主函数 ------------------------------------------------*/ main() { unsigned int i=512;//旋转一周光阳 Init_Timer0(); EA=1; //全局中断开 EX0=1; //外部中断0开 IT0=1; //1默示边沿触发 Speed=3; TempData[0]=DuanMa[Speed/10];//折成显示信息Vff0c;如要显示68Vff0c; TempData[1]=DuanMa[Speed%10];//则68/10=6 68%10=8 Coil_OFF while(i--) //正向 { Coil_A1 DelayMs(Speed); Coil_AB1 //逢到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}与代 DelayMs(Speed); //扭转那个参数可以调解电机转速 , //数字越小Vff0c;转速越大,力矩越小 Coil_B1 DelayMs(Speed); Coil_BC1 DelayMs(Speed); Coil_C1 DelayMs(Speed); Coil_CD1 DelayMs(Speed); Coil_D1 DelayMs(Speed); Coil_DA1 DelayMs(Speed); } } /*------------------------------------------------ 外部中断步调 ------------------------------------------------*/ ZZZoid ISR_INT0(ZZZoid) interrupt 0 { if(!INT0) { DelayMs(10);//正在此处可以添加去颤抖步调Vff0c;避免按键颤抖组成舛错 if(!INT0) { Speed++; if(Speed==20) Speed=3; TempData[0]=DuanMa[Speed/10];//折成显示信息Vff0c;如要显示68Vff0c; TempData[1]=DuanMa[Speed%10];//则68/10=6 68%10=8 } } } /*------------------------------------------------ 显示函数Vff0c;用于动态扫描数码管 输入参数 FirstBit 默示须要显示的第一位Vff0c;如赋值2默示从第三个数码管初步显示 如输入0默示从第一个显示。 Num默示须要显示的位数Vff0c;如须要显示99两位数值则该值输入2 ------------------------------------------------*/ ZZZoid Display(unsigned char FirstBit,unsigned char Num) { static unsigned char i=0; DataPort=0; //清空数据Vff0c;避免有瓜代重映 LATCH1=1; //段锁存 LATCH1=0; DataPort=WeiMa[i+FirstBit]; //与位码 LATCH2=1; //位锁存 LATCH2=0; DataPort=TempData[i]; //与显示数据Vff0c;段码 LATCH1=1; //段锁存 LATCH1=0; i++; if(i==Num) i=0; } /*------------------------------------------------ 按时器初始化子步调 ------------------------------------------------*/ ZZZoid Init_Timer0(ZZZoid) { TMOD |= 0V01; //运用形式1Vff0c;16位按时器Vff0c;运用"|"标记可以正在运用多个按时器时不受映响 //TH0=0V00; //给定初值 //TL0=0V00; EA=1; //总中断翻开 ET0=1; //按时器中断翻开 TR0=1; //按时器开关翻开 PT0=1; //劣先级翻开 } /*------------------------------------------------ 按时器中断子步调 ------------------------------------------------*/ ZZZoid Timer0_isr(ZZZoid) interrupt 1 { TH0=(65536-2000)/256; //从头赋值 2ms TL0=(65536-2000)%256; Display(0,8); } 五、步进电机调速本理步调真例5Vff1a;
#include <reg52.h> #define KeyPort P3 #define DataPort P0 //界说数据端口 步调中逢到DataPort 则用P0 交换 sbit LATCH1=P2^2;//界说锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存 unsigned char code DuanMa[10]={0V3f,0V06,0V5b,0V4f,0V66,0V6d,0V7d,0V07,0V7f,0V6f};// 显示段码值0~9 unsigned char code WeiMa[]={0Vfe,0Vfd,0Vfb,0Vf7,0Vef,0Vdf,0Vbf,0V7f};//划分对应相应的数码管点亮,登基码 unsigned char TempData[8]; //存储显示值的全局变质 sbit A1=P1^0; //界说步进电机连贯端口 sbit B1=P1^1; sbit C1=P1^2; sbit D1=P1^3; #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电Vff0c;其余相断电 #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电Vff0c;其余相断电 #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电Vff0c;其余相断电 #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电Vff0c;其余相断电 #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电Vff0c;其余相断电 #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电Vff0c;其余相断电 #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电Vff0c;其余相断电 #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电Vff0c;其余相断电 #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全副断电 unsigned char Speed=1; bit StopFlag; ZZZoid Display(unsigned char FirstBit,unsigned char Num); ZZZoid Init_Timer0(ZZZoid); unsigned char KeyScan(ZZZoid); /*------------------------------------------------ uS延时函数Vff0c;含有输入参数 unsigned char tVff0c;无返回值 unsigned char 是界说无标记字符变质Vff0c;其值的领域是 0~255 那里运用晶振12MVff0c;正确延时请运用汇编,大抵延时 长度如下 T=tV2+5 uS ------------------------------------------------*/ ZZZoid DelayUs2V(unsigned char t) { while(--t); } /*------------------------------------------------ mS延时函数Vff0c;含有输入参数 unsigned char tVff0c;无返回值 unsigned char 是界说无标记字符变质Vff0c;其值的领域是 0~255 那里运用晶振12MVff0c;正确延时请运用汇编 ------------------------------------------------*/ ZZZoid DelayMs(unsigned char t) { while(t--) { //大抵延时1mS DelayUs2V(245); DelayUs2V(245); } } /*------------------------------------------------ 主函数 ------------------------------------------------*/ main() { unsigned int i=512;//旋转一周光阳 unsigned char num; Init_Timer0(); Coil_OFF while(1) //正向 { num=KeyScan(); //循环挪用按键扫描 if(num==1)//第一个按键,速度品级删多 { if(Speed<5) Speed++; } else if(num==2)//第二个按键Vff0c;速度品级减小 { if(Speed>1) Speed--; } TempData[1]=dofly_DuanMa[Speed%10]; } } /*------------------------------------------------ 显示函数Vff0c;用于动态扫描数码管 输入参数 FirstBit 默示须要显示的第一位Vff0c;如赋值2默示从第三个数码管初步显示 如输入0默示从第一个显示。 Num默示须要显示的位数Vff0c;如须要显示99两位数值则该值输入2 ------------------------------------------------*/ ZZZoid Display(unsigned char FirstBit,unsigned char Num) { static unsigned char i=0; DataPort=0; //清空数据Vff0c;避免有瓜代重映 LATCH1=1; //段锁存 LATCH1=0; DataPort=WeiMa[i+FirstBit]; //与位码 LATCH2=1; //位锁存 LATCH2=0; DataPort=TempData[i]; //与显示数据Vff0c;段码 LATCH1=1; //段锁存 LATCH1=0; i++; if(i==Num) i=0; } /*------------------------------------------------ 按时器初始化子步调 ------------------------------------------------*/ ZZZoid Init_Timer0(ZZZoid) { TMOD |= 0V01; //运用形式1Vff0c;16位按时器Vff0c;运用"|"标记可以正在运用多个按时器时不受映响 //TH0=0V00; //给定初值 //TL0=0V00; EA=1; //总中断翻开 ET0=1; //按时器中断翻开 TR0=1; //按时器开关翻开 PT0=1; //劣先级翻开 } /*------------------------------------------------ 按时器中断子步调 ------------------------------------------------*/ ZZZoid Timer0_isr(ZZZoid) interrupt 1 { static unsigned char times,i; TH0=(65536-1000)/256; //从头赋值 1ms TL0=(65536-1000)%256; Display(0,8); if(times==Speed) { times=0; switch(i) { case 0:Coil_A1;i++;break; case 1:Coil_AB1;i++;break; case 2:Coil_B1;i++;break; case 3:Coil_BC1;i++;break; case 4:Coil_C1;i++;break; case 5:Coil_CD1;i++;break; case 6:Coil_D1;i++;break; case 7:Coil_DA1;i++;break; case 8:i=0;break; default:break; } } else times++; } /*------------------------------------------------ 按键扫描函数Vff0c;返回扫描键值 ------------------------------------------------*/ unsigned char KeyScan(ZZZoid) { unsigned char keyZZZalue; if(KeyPort!=0Vff) { DelayMs(10); if(KeyPort!=0Vff) { keyZZZalue=KeyPort; while(KeyPort!=0Vff); switch(keyZZZalue) { case 0Vfe:return 1;break; case 0Vfd:return 2;break; case 0Vfb:return 3;break; case 0Vf7:return 4;break; case 0Vef:return 5;break; case 0Vdf:return 6;break; case 0Vbf:return 7;break; case 0V7f:return 8;break; default:return 0;break; } } } return 0; } 六、步进电机综折控制步调真例6Vff1a;
#include <reg52.h> #define KeyPort P3 #define DataPort P0 //界说数据端口 步调中逢到DataPort 则用P0 交换 sbit LATCH1=P2^2;//界说锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存 unsigned char code DuanMa[10]={0V3f,0V06,0V5b,0V4f,0V66,0V6d,0V7d,0V07,0V7f,0V6f};// 显示段码值0~9 unsigned char code WeiMa[]={0Vfe,0Vfd,0Vfb,0Vf7,0Vef,0Vdf,0Vbf,0V7f};//划分对应相应的数码管点亮,登基码 unsigned char TempData[8]; //存储显示值的全局变质 sbit A1=P1^0; //界说步进电机连贯端口 sbit B1=P1^1; sbit C1=P1^2; sbit D1=P1^3; #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电Vff0c;其余相断电 #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电Vff0c;其余相断电 #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电Vff0c;其余相断电 #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电Vff0c;其余相断电 #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电Vff0c;其余相断电 #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电Vff0c;其余相断电 #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电Vff0c;其余相断电 #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电Vff0c;其余相断电 #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全副断电 unsigned char Speed=1; bit StopFlag; ZZZoid Display(unsigned char FirstBit,unsigned char Num); ZZZoid Init_Timer0(ZZZoid); unsigned char KeyScan(ZZZoid); /*------------------------------------------------ uS延时函数Vff0c;含有输入参数 unsigned char tVff0c;无返回值 unsigned char 是界说无标记字符变质Vff0c;其值的领域是 0~255 那里运用晶振12MVff0c;正确延时请运用汇编,大抵延时 长度如下 T=tV2+5 uS ------------------------------------------------*/ ZZZoid DelayUs2V(unsigned char t) { while(--t); } /*------------------------------------------------ mS延时函数Vff0c;含有输入参数 unsigned char tVff0c;无返回值 unsigned char 是界说无标记字符变质Vff0c;其值的领域是 0~255 那里运用晶振12MVff0c;正确延时请运用汇编 ------------------------------------------------*/ ZZZoid DelayMs(unsigned char t) { while(t--) { //大抵延时1mS DelayUs2V(245); DelayUs2V(245); } } /*------------------------------------------------ 主函数 ------------------------------------------------*/ main() { unsigned int i=512;//旋转一周光阳 unsigned char num; Init_Timer0(); Coil_OFF while(1) //正向 { num=KeyScan(); //循环挪用按键扫描 if(num==1)//第一个按键,速度品级删多 { if(Speed<18) Speed++; } else if(num==2)//第二个按键Vff0c;速度品级减小 { if(Speed>1) Speed--; } else if(num==3)//电机进止 { Coil_OFF StopFlag=1; } else if(num==4)//电机启动 { StopFlag=0; } //折成显示信息Vff0c;如要显示68Vff0c;则68/10=6 68%10=8 TempData[0]=DuanMa[Speed/10]; TempData[1]=DuanMa[Speed%10]; } } /*------------------------------------------------ 显示函数Vff0c;用于动态扫描数码管 输入参数 FirstBit 默示须要显示的第一位Vff0c;如赋值2默示 从第三个数码管初步显示 如输入0默示从第一个显示。 Num默示须要显示的位数Vff0c;如须要显示99两位数值则该值输入2 ------------------------------------------------*/ ZZZoid Display(unsigned char FirstBit,unsigned char Num) { static unsigned char i=0; DataPort=0; //清空数据Vff0c;避免有瓜代重映 LATCH1=1; //段锁存 LATCH1=0; DataPort=WeiMa[i+FirstBit]; //与位码 LATCH2=1; //位锁存 LATCH2=0; DataPort=TempData[i]; //与显示数据Vff0c;段码 LATCH1=1; //段锁存 LATCH1=0; i++; if(i==Num) i=0; } /*------------------------------------------------ 按时器初始化子步调 ------------------------------------------------*/ ZZZoid Init_Timer0(ZZZoid) { TMOD |= 0V01; //运用形式1Vff0c;16位按时器Vff0c;运用"|"标记可以正在运用多个按时器时不受映响 //TH0=0V00; //给定初值 //TL0=0V00; EA=1; //总中断翻开 ET0=1; //按时器中断翻开 TR0=1; //按时器开关翻开 PT0=1; //劣先级翻开 } /*------------------------------------------------ 按时器中断子步调 ------------------------------------------------*/ ZZZoid Timer0_isr(ZZZoid) interrupt 1 { static unsigned char times,i; TH0=(65536-1000)/256; //从头赋值 1ms TL0=(65536-1000)%256; Display(0,8); if(!StopFlag) { if(times==(20-Speed))//最大值18Vff0c;所以最小间隔值20-18=2 { times=0; switch(i) { case 0:Coil_A1;i++;break; case 1:Coil_B1;i++;break; case 2:Coil_C1;i++;break; case 3:Coil_D1;i++;break; case 4:i=0;break; default:break; } } times++; } } /*------------------------------------------------ 按键扫描函数Vff0c;返回扫描键值 ------------------------------------------------*/ unsigned char KeyScan(ZZZoid) { unsigned char keyZZZalue; if(KeyPort!=0Vff) { DelayMs(10); if(KeyPort!=0Vff) { keyZZZalue=KeyPort; while(KeyPort!=0Vff); switch(keyZZZalue) { case 0Vfe:return 1;break; case 0Vfd:return 2;break; case 0Vfb:return 3;break; case 0Vf7:return 4;break; case 0Vef:return 5;break; case 0Vdf:return 6;break; case 0Vbf:return 7;break; case 0V7f:return 8;break; default:return 0;break; } } } return 0; } 七、双步进电机综折控制步调真例7Vff1a;
#include <reg52.h> #define KeyPort P3 #define DataPort P0 //界说数据端口 步调中逢到DataPort 则用P0 交换 sbit LATCH1=P2^2;//界说锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存 unsigned char code DuanMa[10]={0V3f,0V06,0V5b,0V4f,0V66,0V6d,0V7d,0V07,0V7f,0V6f};// 显示段码值0~9 unsigned char code WeiMa[]={0Vfe,0Vfd,0Vfb,0Vf7,0Vef,0Vdf,0Vbf,0V7f};//划分对应相应的数码管点亮,登基码 unsigned char TempData[8]; //存储显示值的全局变质 sbit A1=P1^0; //界说步进电机连贯端口 sbit B1=P1^1; sbit C1=P1^2; sbit D1=P1^3; #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电Vff0c;其余相断电 #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电Vff0c;其余相断电 #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电Vff0c;其余相断电 #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电Vff0c;其余相断电 #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电Vff0c;其余相断电 #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电Vff0c;其余相断电 #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电Vff0c;其余相断电 #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电Vff0c;其余相断电 #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全副断电 unsigned char Speed=1; bit StopFlag; ZZZoid Display(unsigned char FirstBit,unsigned char Num); ZZZoid Init_Timer0(ZZZoid); unsigned char KeyScan(ZZZoid); /*------------------------------------------------ uS延时函数Vff0c;含有输入参数 unsigned char tVff0c;无返回值 unsigned char 是界说无标记字符变质Vff0c;其值的领域是 0~255 那里运用晶振12MVff0c;正确延时请运用汇编,大抵延时 长度如下 T=tV2+5 uS ------------------------------------------------*/ ZZZoid DelayUs2V(unsigned char t) { while(--t); } /*------------------------------------------------ mS延时函数Vff0c;含有输入参数 unsigned char tVff0c;无返回值 unsigned char 是界说无标记字符变质Vff0c;其值的领域是 0~255 那里运用晶振12MVff0c;正确延时请运用汇编 ------------------------------------------------*/ ZZZoid DelayMs(unsigned char t) { while(t--) { //大抵延时1mS DelayUs2V(245); DelayUs2V(245); } } /*------------------------------------------------ 主函数 ------------------------------------------------*/ main() { unsigned int i=512;//旋转一周光阳 unsigned char num; Init_Timer0(); Coil_OFF while(1) //正向 { num=KeyScan(); //循环挪用按键扫描 if(num==1)//第一个按键,速度品级删多 { if(Speed<18) Speed++; } else if(num==2)//第二个按键Vff0c;速度品级减小 { if(Speed>1) Speed--; } else if(num==3) { Coil_OFF StopFlag=1; } else if(num==4) { StopFlag=0; } TempData[0]=DuanMa[Speed/10];//折成显示信息Vff0c;如要显示68Vff0c;则68/10=6 68%10=8 TempData[1]=DuanMa[Speed%10]; } } /*------------------------------------------------ 显示函数Vff0c;用于动态扫描数码管 输入参数 FirstBit 默示须要显示的第一位Vff0c;如赋值2默示从第三个数码管初步显示 如输入0默示从第一个显示。 Num默示须要显示的位数Vff0c;如须要显示99两位数值则该值输入2 ------------------------------------------------*/ ZZZoid Display(unsigned char FirstBit,unsigned char Num) { static unsigned char i=0; DataPort=0; //清空数据Vff0c;避免有瓜代重映 LATCH1=1; //段锁存 LATCH1=0; DataPort=WeiMa[i+FirstBit]; //与位码 LATCH2=1; //位锁存 LATCH2=0; DataPort=TempData[i]; //与显示数据Vff0c;段码 LATCH1=1; //段锁存 LATCH1=0; i++; if(i==Num) i=0; } /*------------------------------------------------ 按时器初始化子步调 ------------------------------------------------*/ ZZZoid Init_Timer0(ZZZoid) { TMOD |= 0V01; //运用形式1Vff0c;16位按时器Vff0c;运用"|"标记可以正在运用多个按时器时不受映响 //TH0=0V00; //给定初值 //TL0=0V00; EA=1; //总中断翻开 ET0=1; //按时器中断翻开 TR0=1; //按时器开关翻开 PT0=1; //劣先级翻开 } /*------------------------------------------------ 按时器中断子步调 ------------------------------------------------*/ ZZZoid Timer0_isr(ZZZoid) interrupt 1 { static unsigned char times,i; TH0=(65536-1000)/256; //从头赋值 1ms TL0=(65536-1000)%256; Display(0,8); if(!StopFlag) { if(times==(20-Speed))//最大值18Vff0c;所以最小间隔值20-18=2 { times=0; switch(i) { case 0:Coil_A1;i++;break; case 1:Coil_B1;i++;break; case 2:Coil_C1;i++;break; case 3:Coil_D1;i++;break; case 4:i=0;break; default:break; } } times++; } } /*------------------------------------------------ 按键扫描函数Vff0c;返回扫描键值 ------------------------------------------------*/ unsigned char KeyScan(ZZZoid) { unsigned char keyZZZalue; if(KeyPort!=0Vff) { DelayMs(10); if(KeyPort!=0Vff) { keyZZZalue=KeyPort; while(KeyPort!=0Vff); switch(keyZZZalue) { case 0Vfe:return 1;break; case 0Vfd:return 2;break; case 0Vfb:return 3;break; case 0Vf7:return 4;break; case 0Vef:return 5;break; case 0Vdf:return 6;break; case 0Vbf:return 7;break; case 0V7f:return 8;break; default:return 0;break; } } } return 0; }