内蒙古老王 2021-10-09 15:45 采纳率: 100%
浏览 65
已结题

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天,您在需要使用的时候【私信】联系我,我会为您补发。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月20日
  • 已采纳回答 10月12日
  • 创建了问题 10月9日

悬赏问题

  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R