STC15W408AS单片机6按键控制2步进电机采用TB6600驱动源程序
程序源码来源于:51黑电子william hill官网
编程环境keil,自行新建项目,添加main.c,将代码拷贝进去即可
*主控芯片:STC15W408AS
程序源码:
#include《reg52.h》//电机1控制引脚 ******芯片:STC15W408AS********it CLK = P1^0;***it ENA = P1^1; ***it DIR = P1^2;//电机2控制引脚***it CLK1 = P1^3;***it ENA1 = P1^4; ***it DIR1 = P1^5; //按键控制端***it UP = P3^2; //电机1正转***it DWN = P3^3; //电机1反转***it LFT = P3^4; //电机2正转***it RHT = P3^5; //电机2反正***it SET = P3^6; //加速***it RST = P3^7; //减速unsigned int Tspeed[10]={30,40,60,80,100,200,400,600,800,1000}; //调速等级表bit CY_status=0;unsigned int CYCLE=20;unsigned int cy_count=0;unsigned PWM_count=0;void Init_time();void Key_scan();void main(){ ENA=0; CLK=0; DIR=0; ENA1=0; CLK1=0; DIR1=0; //初始化电机 Init_time(); //初始化定时器 while(1) { Key_scan(); } }void Init_time() //初始化定时器{ TMOD |= 0x01; TH0=(65536-CYCLE)/256; //给time0装初值 TL0=(65536-CYCLE)%256; IE = 0x82; //使得time1的优先级高于time0 TR0=1; //打开中断}void Enter_Timer0() interrupt 1 //进入定时器中断{ TH0=(65536-CYCLE)/256; TL0=(65536-CYCLE)%256; CLK=~CLK; CLK1=~CLK1; PWM_count++; if(PWM_count==(2*cy_count)&&CY_status) { PWM_count=0; TR0=0; ENA=0; ENA1=0; } }/************************按键扫描程序************************ 功能:读取各按键值,判断是否按下,再处理相应事件 注:按键控制程序,由于按键中断优先级高,且每个按键都设计 为弹起有效, 所以长时间按住不放会导致电机减速甚至停 止直至放开按键 *************************************************************/void Key_scan() { static char i=0; if(UP==0) //电机1正反转切换 { if(UP==0) { DIR=1; ENA=1; //启动电机 TR0=1; //开启中断产生脉冲信号 while(!UP); //按键按下直到放开 ENA=0; //关闭电机 TR0=0; //关闭中断停止脉冲信号 CY_status=0; //刷新步进标志位 } } if(DWN==0) { if(DWN==0) { DIR=0; ENA=1; //启动电机 TR0=1; //开启中断产生脉冲信号 while(!DWN); //按键按下直到放开 ENA=0; //关闭电机 TR0=0; //关闭中断停止脉冲信号 CY_status=0; //刷新步进标志位 } } if(LFT==0) //电机2正反转切换 { if(LFT==0) { DIR1=1; ENA1=1; //启动电机 TR0=1; //开启中断产生脉冲信号 while(!LFT); ENA1=0; //关闭电机 TR0=0; //关闭中断停止脉冲信号 CY_status=0; //刷新步进标志位 } } if(RHT==0) { if(RHT==0) { DIR1=0; ENA1=1; //启动电机 TR0=1; //开启中断产生脉冲信号 while(!RHT); ENA1=0; //关闭电机 TR0=0; //关闭中断停止脉冲信号 CY_status=0; //刷新步进标志位 } }if(SET==0) //加速 { if(SET==0) { while(!SET); i--; if(i《1) i=0; CYCLE=Tspeed; } } if(RST==0) //减速 { if(RST==0) { while(!RST); i++; if(i》10) i=10; CYCLE=Tspeed; } } }
STC15W408AS单片机6按键控制2步进电机采用TB6600驱动源程序
程序源码来源于:51黑电子william hill官网
编程环境keil,自行新建项目,添加main.c,将代码拷贝进去即可
*主控芯片:STC15W408AS
程序源码:
#include《reg52.h》//电机1控制引脚 ******芯片:STC15W408AS********it CLK = P1^0;***it ENA = P1^1; ***it DIR = P1^2;//电机2控制引脚***it CLK1 = P1^3;***it ENA1 = P1^4; ***it DIR1 = P1^5; //按键控制端***it UP = P3^2; //电机1正转***it DWN = P3^3; //电机1反转***it LFT = P3^4; //电机2正转***it RHT = P3^5; //电机2反正***it SET = P3^6; //加速***it RST = P3^7; //减速unsigned int Tspeed[10]={30,40,60,80,100,200,400,600,800,1000}; //调速等级表bit CY_status=0;unsigned int CYCLE=20;unsigned int cy_count=0;unsigned PWM_count=0;void Init_time();void Key_scan();void main(){ ENA=0; CLK=0; DIR=0; ENA1=0; CLK1=0; DIR1=0; //初始化电机 Init_time(); //初始化定时器 while(1) { Key_scan(); } }void Init_time() //初始化定时器{ TMOD |= 0x01; TH0=(65536-CYCLE)/256; //给time0装初值 TL0=(65536-CYCLE)%256; IE = 0x82; //使得time1的优先级高于time0 TR0=1; //打开中断}void Enter_Timer0() interrupt 1 //进入定时器中断{ TH0=(65536-CYCLE)/256; TL0=(65536-CYCLE)%256; CLK=~CLK; CLK1=~CLK1; PWM_count++; if(PWM_count==(2*cy_count)&&CY_status) { PWM_count=0; TR0=0; ENA=0; ENA1=0; } }/************************按键扫描程序************************ 功能:读取各按键值,判断是否按下,再处理相应事件 注:按键控制程序,由于按键中断优先级高,且每个按键都设计 为弹起有效, 所以长时间按住不放会导致电机减速甚至停 止直至放开按键 *************************************************************/void Key_scan() { static char i=0; if(UP==0) //电机1正反转切换 { if(UP==0) { DIR=1; ENA=1; //启动电机 TR0=1; //开启中断产生脉冲信号 while(!UP); //按键按下直到放开 ENA=0; //关闭电机 TR0=0; //关闭中断停止脉冲信号 CY_status=0; //刷新步进标志位 } } if(DWN==0) { if(DWN==0) { DIR=0; ENA=1; //启动电机 TR0=1; //开启中断产生脉冲信号 while(!DWN); //按键按下直到放开 ENA=0; //关闭电机 TR0=0; //关闭中断停止脉冲信号 CY_status=0; //刷新步进标志位 } } if(LFT==0) //电机2正反转切换 { if(LFT==0) { DIR1=1; ENA1=1; //启动电机 TR0=1; //开启中断产生脉冲信号 while(!LFT); ENA1=0; //关闭电机 TR0=0; //关闭中断停止脉冲信号 CY_status=0; //刷新步进标志位 } } if(RHT==0) { if(RHT==0) { DIR1=0; ENA1=1; //启动电机 TR0=1; //开启中断产生脉冲信号 while(!RHT); ENA1=0; //关闭电机 TR0=0; //关闭中断停止脉冲信号 CY_status=0; //刷新步进标志位 } }if(SET==0) //加速 { if(SET==0) { while(!SET); i--; if(i《1) i=0; CYCLE=Tspeed; } } if(RST==0) //减速 { if(RST==0) { while(!RST); i++; if(i》10) i=10; CYCLE=Tspeed; } } }
举报