内蒙古老王
2021-10-09 15:45
采纳率: 100%
浏览 22

STC89C52RC控制步进电机,程序卡在main第一行,

img

img


程序如下:

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit maicong=P2^5;//电机脉冲输出,初始低电平
sbit fangxiang=P2^6;//电机方向输出,初始化后低电平
sbit EN=P2^7;//电机使能,初始高电平
sbit XWKG=P2^4;//初始位置确认端口,低电平有效,调用ZIJIAN子程序
sbit k0=P1^0;//启动,调用START子程序
sbit k1=P1^1;//停止,调用TINGZHI子程序
sbit k2=P1^2;//速度加,调用SUDUZ子程序
sbit k3=P1^3;//速度减,调用SUDUJ子程序
sbit k4=P1^4;//步长加,调用BUCHANGZ子程序
sbit k5=P1^5;//步长减,调用BUCHANGJ子程序

uint tt=200;//是否需要??
uint step=1100;//同上
uint num=18;
void keyscan();//键盘扫描程序,程序完成
void delayms(uint ms);//毫秒级可变延时程序
void delayus(uint us);//微秒级可变延时程序,用于低电平输出延时,改变低电平时长就调整了频率。
void delay(uint us);//微秒级延时程序,用于脉冲高电平输出延时
void baidong();//
void ZIJIAN();//程序完成
void START();//对应k0
void TINGZHI();//对应k1
void SUDUZ();//对应k2
void SUDUJ();//对应k3
void BUCHANGZ();//对应k4
void BUCHANGJ();//对应k5
void JIUQIANYISHEN();//对应k6
void main(void)
{
    _    maicong = 0;_
        fangxiang = 1;
        IT1 = 1;                        //set INT1 int type (1:Falling only 0:Low level)
        EX1 = 1;                        //enable INT1 interrupt
        EA = 1;                         //open global interrupt switch
        ZIJIAN();       
        while(1);//等待按键指令,此时PWM=0;DIR=0。
}
/*低一级的外部中断2,负责按键的操作,即启动、停止、加减速、步长加减、自动运行程序的启动*/
void exint1() interrupt 2           //(location at 0013H)
{              
    keyscan();                                  
}
void keyscan()
{
 while(1)
 {
         if(k0==0)    START();
    else if(k1==0)    TINGZHI();//停止,回初始位
    else if(k2==0)    SUDUZ();//速度增
    else if(k3==0)    SUDUJ();//速度减
    else if(k4==0)    BUCHANGZ();//步长增
    else if(k5==0)    BUCHANGJ();//步长减
    else if(k6==0)    JIUQIANYISHEN();//九浅一深
    else if(XWKG==0) ZIJIAN();//初始位开关开,电机换向,转动
}
}

void ZIJIAN()
  {
                EN=0;//电机使能,可以自由转动
                fangxiang=1;
        while(XWKG==0)
     {
    maicong=1;
    delay(1);
    maicong=0;
        delayus(tt);
        }
               while(XWKG==1)
                        { 
        fangxiang=0;
        maicong=1;
    delay(1);
    maicong=0;
        delayus(tt);//此处需配合限位开关确定转动角度       
                                     
                }
          EN=1;//电机使能,不能自由转动
        delayms(50);
}        
void START()
  {
        EN=0;
                step=1100;//50*55最大移动步数,有可能触发限位开关
                delayms(50);
        while(1)
                {                  
          baidong();
            }
}
void TINGZHI()
{
        while(1);    
}

void SUDUZ()
{
   tt=tt-5;
   if(tt<1)
    tt=1;
    while(k2==0);
}

void SUDUJ()
{
   tt=tt+5;
   if(tt>255)
    tt=255;
    while(k3==0);
}

void BUCHANGZ()
{
   step=step+5;
   if(step>2750)
    step=2750;
    while(k4==0);
}

void BUCHANGJ()
{
   step=step-5;
   if(step<50)
    step=50;
    while(k5==0);
}


/*外部中断0(最高级),负责打断外部中断 2,即限位开关的触发*/

void exint0() interrupt 0           //(location at 0003H)
{
    while(1);
}


    

void baidong()
    {
     EN=0;//电机使能,可以自由转动
        
       while(step--)//step取值范围小于细分*55
     {
    maicong=1;//初始pwm输出为低电平,开始动作就要变为高电平(共阴接法)
    delay(1);//延时4微秒,脉冲宽度为5微秒
    maicong=0;//低电平
    delayus(tt);//延时9微秒,低电平宽度10微秒,调整此延时数值更改速度
     }
   fangxiang=~fangxiang;//换向
    }
void delay(uint xus)
    {
        uint m;
        for(m=0;m<xus;++m);
        
    }
void delayus(uint tt)
    {
        uint n;
        for(n=0;n<tt;++n);//可变延时程序???
    }
void delayms(uint xms)
    {
        uint x,y;
        for(x=0;x<xms;++x)
        for(y=0;y<110;++y);
    }

  • 好问题 提建议
  • 收藏

2条回答 默认 最新

  • 有问必答小助手 2021-10-11 11:41
    已采纳

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


    本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


    因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • 有问必答小助手 2021-10-12 07:07
    您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
    PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题