【求助贴】我要搞一个自动瞄准系统,听说台湾科技领先中国50年,特来请教一些编程问题

[复制链接]
查看15 | 回复15 | 2021-1-27 08:27:52 | 显示全部楼层 |阅读模式
如果台湾老大哥能帮我解决问题,我和我弟愿意承认台湾是个独立国家
回复

使用道具 举报

千问 | 2021-1-27 08:27:52 | 显示全部楼层
//实验目标:红外感应开关检测到物体,输出低电平,单片机检测到后,由步进电机转动到红外开关所处的位置
  #include
  sbit K1=P2^0;//红外感应开关4个
  sbit K2=P2^1;
  sbit K3=P2^2;
  sbit K4=P2^3;
  unsigned long i;
  unsigned char cnt,new;
  unsigned char old=0;
  unsigned char code zhengzhuan[8]={0xe,0xc,0xd,0x9,0xb,0x3,0x7,0x6};
  unsigned char code fanzhuan[8]={0x6,0x7,0x3,0xb,0x9,0xd,0xc,0xe};

  void delay()
  {i=20;
  while(i--);}


  void zhengzhuan1024() //步进电机正转1024拍,45度。
  {
  for(i=1024;i>0;i--)
  {
  P1=zhengzhuan[cnt];
  delay();
  cnt++;
  cnt=cnt&0x07;
  }
  }
  void fanzhuan1024()//步进电机反转1024拍,45度。
  {
  for(i=1024;i>0;i--)
  {
  P1=fanzhuan[cnt];
  delay();
  cnt++;
  cnt=cnt&0x07;
  }
  }
  void fanzhuan2048() //步进电机正转2048拍,180度。
  {
  for(i=2048;i>0;i--)
  {
  P1=fanzhuan[cnt];
  delay();
  cnt++;
  cnt=cnt&0x07;
  }
  }
  void main()
  {
  K1=1;
  K2=1;
  K3=1;
  K4=1; //红外线感应开关检测前先输出高电平
  while(1)
  {
  if(K1==0)//红外线1号开关最先检测到物体,输出低电平
  {
  new=old+1;
  switch(new)
  {
  case 1:while(!K1);break;//因为old初始化为0,所以只执行这个分支
  case 2:while(!K1);break;
  case 3:fanzhuan1024();while(!K1);break;
  case 4:fanzhuan2048();while(!K1);break;
  case 5:zhengzhuan1024();while(!K1);break;}
  old=1;//赋值1,记住步进电机转动停止的位置
  }
  if(K2==0)//红外开关2号检测到物体
  {
  new=old+1;//因为先前old为1,所以new=2
  switch(new)
  {
  case 1:while(!K2);break;
  case 2:zhengzhuan1024();while(!K2);break; //执行这条分支,步进电机正转1024拍(45度)至2号红外开关所处的位置
  case 3:while(!K2);break;
  case 4:fanzhuan1024();while(!K2);break;
  case 5:fanzhuan2048();while(!K2);break;}
  old=2; //赋值2,记住步进电机转动停止的位置
  }
  if(K3==0)
  {
  new=old+1;
  switch(new)
  {
  case 1:while(!K3);break;
  case 2:fanzhuan2048();while(!K3);break;
  case 3:zhengzhuan1024();while(!K3);break;
  case 4:while(!K3);break;
  case 5:fanzhuan1024();while(!K3);break;}
  old=3;
  }
  if(K4==0)
  {
  new=old+1;
  switch(new)
  {
  case 1:while(!K4);break;
  case 2:fanzhuan1024();while(!K4);break;
  case 3:fanzhuan2048();while(!K4);break;
  case 4:zhengzhuan1024();while(!K4);break;
  case 5:while(!K4);break;}
  old=4;
  }
  }
  }

回复

使用道具 举报

千问 | 2021-1-27 08:27:52 | 显示全部楼层
好像不是难题,不过以矮黑的智商,你这辈子都不用承认了

回复

使用道具 举报

千问 | 2021-1-27 08:27:52 | 显示全部楼层
这段程序已用keil软件编译通过,可就是第二次红外线检测到物体后,步进电机就转个不停,求解决办法

回复

使用道具 举报

千问 | 2021-1-27 08:27:52 | 显示全部楼层
采样周期?步进电机转个不停是不是意味着单片机的输出锁住了?
  单片机和步进电机之间应该有个机构吧?
回复

使用道具 举报

千问 | 2021-1-27 08:27:52 | 显示全部楼层
这事儿得虚心请教台湾老大哥
回复

使用道具 举报

千问 | 2021-1-27 08:27:52 | 显示全部楼层
没有台湾老大哥要帮忙吗?给一点提示或写一小段参考程序给我也好啊,我愿意出卖自己的国格来换取

回复

使用道具 举报

千问 | 2021-1-27 08:27:52 | 显示全部楼层
大二?大三?51,这个不难,好好分析,你能解决。台湾这个方面因为起步早需得天独厚的发展确实比较强,因为我们公司还有我知道的几家公司都在用台湾人开的公司的软件方案,不过我们也在努力发展。相信以后一定会比他们强很多

回复

使用道具 举报

千问 | 2021-1-27 08:27:52 | 显示全部楼层
帮不上你,不过大部分群是这样的,建议找相关论坛,论坛比群靠谱些。单片机还没学到。

回复

使用道具 举报

千问 | 2021-1-27 08:27:52 | 显示全部楼层
@26万8千8百 @无所事事被占用 步进电机用的是八拍模式,减速比是1:64,也就是说转一圈要4096个节拍,转90度就是1024个,180度就是2048个,按照我的设想,步进电机转完指定节拍就停止转动,程序就应该等待物体离开,然后执行break,跳出整个switch语句,等待下一个红外检测信号,而不是现在这个样子,步进电机转个不停

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行