微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 这个小程序哪里有问题吗

这个小程序哪里有问题吗

时间:10-02 整理:3721RD 点击:
程序如下,不大,但是就是调试不好,帮忙看下,谢谢
//控制程序,控制时序说明:按下电源键,系统供电,按下供膜,夹持电磁铁得电,延时500ms后电机启动,膜送至指定位置
//后传感器1发出信号,固定电磁铁吸合,电机自锁,夹持松开,500ms延时后电机反转,反转回指定位置时传感器2发出信号,
//电机停转,蜂鸣器提示待装入微孔板;微孔板装入后按下热封键,热封机启动热封,定时6s后固定电磁铁失电松开,热封结束
//后取出微孔板,此为一个工作循环。
#include<reg52.h>
#define uint  unsigned int
#define uchar unsigned char
sbit supply= P3^7;
sbit sealer= P3^6;
sbit power= P3^5;
sbit in1= P0^0;
sbit in2= P0^1;
sbit in3= P0^2;
sbit in4= P0^3;
sbit jiachi= P1^4;
sbit guding= P2^7;
sbit refeng= P2^6;
sbit chuangan1= P3^3;
sbit chuangan2= P3^2;
sbit buzzer= P1^5;
uchar code zz[]={0x03,0x06,0x0C,0x09};                        //步进电机正转
uchar code fz[]={0x09,0x0A,0x06,0x03};                    //步进电机反转

void delay(uint ms)        //毫秒延时函数
{
        uint t;
        while(ms--)
                for(t=0;t<120;t++);
}
void motor_zz()                                               //步进电机正转
  {
     while(1)
            {
                uint i;
                for(i=0;i<4;i++)
                    {
                        P0=zz[i];
                        delay(5);
                    }
                }
           
  }

void motor_fz()                                       //步进电机反转
  {
      while(1)
            {
                uint j;
                for(j=0;j<4;j++)
                    {
                        P0=fz[j];
                        delay(5);
                    }
                }
  }



void main()
{
        while(1)                    //工作循环
            {
                  supply=1;                            //清零操作
          sealer=1;
          power= 1;
          jiachi= 1;
          buzzer= 1;
          guding=1;
          chuangan1= 1;
          chuangan2=1;
          refeng= 1;

              if(supply==0)                   //供膜检查
              delay(10);                   //按键防抖
              if(supply==0)
                {         
                      jiachi=0;
                 delay(20);                  
                         while(chuangan1==1)
                              {
                                    motor_zz();
                                         if(chuangan1==0)
                                         break;
                                }
                     guding=0;
                         delay(20);
                         jiachi=1;
                         while(chuangan2==1)
                              {
                                          motor_fz();
                                         if(chuangan2==0)
                                         break;
                                }
                          buzzer=0;
                          delay(20);
                          buzzer=1;
                         }
             if(sealer==0)                  //热封检查
             delay(20);
             if(sealer==0)
             {         
                      refeng=0;
                
                 }
       
                }
}

加油

加油

你的程序缺少电机停转的控制,当传送到位后应该有停止电机转动的控制。
另外,电机的两个方向转动的程序,都是用的while(1)的无限死循环方式,循环中间也没有判断电机何时该停止的判断,最终应该是电机只会朝一个方向不停的转动。
在程序里,非必要情况下,应该尽量少用while(1)这类无限循环的方式,即使要用,循环体内也应该有如何退出循环的判断,来退出循环。

正如楼上所说,你在电机转动的过程中,使用的是while(1)这种方式写的,不过最好在里面加一个超时机制,这样增加程序的稳定性,另外,你的流程里每一步对电机都有控制,而你程序里,?类似?if(chuangan1==0)之后,并没有对电机进行操作,这边首先就不对了,先把这部分改了,后续再调

统一回复了,哈哈,已调试成功,谢谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top