单片机C语言实例:15、步进电机控制

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://aiend.cn