标题: 电动机控制程序 求各位大神给予指点和帮助啊!!! [打印本页]

作者: 563524748    时间: 2014-8-23 21:42
标题: 电动机控制程序 求各位大神给予指点和帮助啊!!!

#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit P36=P3^6;
sbit P37=P3^7;
sbit P27=P2^7;
sbit Key=P0^2;
uchar Current_Level,Dest_Level;
uint i=0,M=0,N=0;
void DelayMS(uint dly);
void Key_scan(void);
void DcMonitor(void)
{
  if(Current_Level<Dest_Level)
  {
   M=Dest_Level-Current_Level;
   P27=1;
   P36=1;
   P37=0;
   Key_scan();
   for(i=N;i>0;i--)
   {
    Current_Level++;
   }
  }
else if(Current_Level>Dest_Level)
  {
   M=Current_Level-Dest_Level;
   P27=1;
   P36=0;
   P37=1;
   Key_scan();
   for(i=N;i>0;i--)
   {
    Current_Level--;
   }
  }
else
  {
   P27=0;
   P36=0;
   P37=0;
  }
}
void Key_scan(void)
{
  while(N<M)
  {while(Key==0)
   {
    DelayMS(10);
    if(Key==1)
    break;
    while(Key==0);
    N++;
   }
  }
}
void DelayMS (uint dly)
{
uint a,b;
for(a=dly;a>0;a--)
  for(b=247;b>0;b--);
}
void main()
{
P27=0;
P36=0;
P37=0;
  if(P1!=0XFF)
  {
   switch(P1)
   {
    case 0XFE:Dest_Level=5;DcMonitor();break;
    case 0XFD:Dest_Level=4;DcMonitor();break;  
    case 0XFB:Dest_Level=3;DcMonitor();break;
    case 0XF7:Dest_Level=2;DcMonitor();break;
    case 0XEF:Dest_Level=1;DcMonitor();break;
   }
  }
}
我想模拟的过程是这样的:按下K1,电机开始转动,右边的开关采集到一个低电平信号之后,电机停止转动,再按下K5,电机又开始转动,开关采集到4个低电平信号之后,电机停止转动,再按下K3,电机反向转动,开关采集到两个信号之后,电机停止转动。这个有点类似电梯的控制,程序应该怎么改才能实现这样的效果啊,求各位帮助,一起讨论!!!


作者: hujia    时间: 2014-8-23 23:44
那你现在发的这个程序能实现哪些功能?
作者: hujia    时间: 2014-8-23 23:45
最好把仿真的工程文件传上来,我在本地帮你,仿真一下看看
作者: 563524748    时间: 2014-8-24 09:47
hujia 发表于 2014-8-23 23:45
最好把仿真的工程文件传上来,我在本地帮你,仿真一下看看

现在只能实现按键按下了,电机开始转动,开关采集到信号之后,电机停止。先按K1,电机转,开关采集一个信号,电机停止;再按K5,开关采集5个信号之后电机停止;再按K3,电机转(还是原来的方向,没有反向转),开关采集3个信号之后电机停止。和我之前描述的过程不大一样,这里面的问题是程序没有把上一次按键按下的数值保存下来,供下一次使用,您给指点指点!!!
作者: 563524748    时间: 2014-8-24 09:54
563524748 发表于 2014-8-24 09:47
现在只能实现按键按下了,电机开始转动,开关采集到信号之后,电机停止。先按K1,电机转,开关采集一个信 ...


C.zip (11.75 KB, 下载次数: 8)
作者: 明白    时间: 2014-8-24 11:54
void main()
{
P27=0;
P36=0;
P37=0;
        while(1)
        {
          if(P1!=0XFF)
          {
                   switch(P1)
                   {
                    case 0XFE:Dest_Level=5; N=0;break;
                    case 0XFD:Dest_Level=4; N=0;break;  
                    case 0XFB:Dest_Level=3; N=0;break;
                    case 0XF7:Dest_Level=2; N=0;break;
                    case 0XEF:Dest_Level=1; N=0;break;
                   }
          }
         DcMonitor();
        }
}
作者: 563524748    时间: 2014-8-24 15:38
明白 发表于 2014-8-24 11:54
void main()
{
P27=0;

我试了一下,可以仿真我说的功能了,我明白什么个意思了,谢谢你了啊!!!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1