找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3807|回复: 2
打印 上一主题 下一主题
收起左侧

上位机发送命令控制单片机发送特定数量的脉冲,驱动步进电机驱动器

[复制链接]
回帖奖励 10 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次(中奖概率 50%)
跳转到指定楼层
楼主
ID:311281 发表于 2018-10-18 09:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如上位机发送2A 2A F4 04 00 00 00 F8,则使单片机发送4个脉冲(命令第4个字节表示脉冲数),问题在与我用proteus仿真,发送这个命令后单片机一直发送脉冲,没有按照我们的命令只发送4个脉冲,这怎么办,
程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. const uint setpulse=1;

  5. uint judge[8];
  6. uchar  cnt=0;
  7. uint pulse;
  8. uint point;
  9. uchar mot_ZT;
  10. uchar  move_ok;
  11. uint dcf_XY;
  12. uint dcf_PY;
  13. uint dcf_QX;
  14. uint djuchar re_flag;
  15. /**效验和参数设定**/
  16. uchar sum;

  17. /**端口引脚定义**/
  18. sbit Mot_Dir=P2^7;        //步进电机方向
  19. sbit Mot_En=P2^6;        //步进电机使能
  20. sbit Mot_Pulse=P2^5;        //步进电机脉冲
  21. sbit sw=P0^3;                //限位开关
  22. sbit Valve_XY=P2^0;   //吸样阀
  23. sbit Valve_PY=P2^1;          //排样阀
  24. sbit Valve_QX=P2^2;          //清洗阀


  25. /**定时器0的初始化子程序**/
  26. void Init_Timer0(void)
  27. {
  28.   TMOD |=0x01;

  29.   EA=1;
  30.   ET0=1;
  31.   TR0=1;
  32. //  PS=1;          //串口的优先级
  33.   PT0=1;  // 定时器T0的优先级
  34. }

  35. /**延时**/
  36. void DelayUs2x(uchar t)
  37. {
  38.   while(--t);
  39. }
  40. void DelayMs(uchar t)
  41. {
  42.   while(t--)
  43.   {
  44.      //延迟1ms
  45.      DelayUs2x(245);
  46.      DelayUs2x(245);
  47.    }
  48. }
  49. //**串口初始化**//
  50. void InitUART(void)        
  51. {
  52.   SCON=0x50;
  53.   TMOD |=0x20;
  54.   TH1=0xFD;
  55.   TL1=0xFD;
  56.   TR1=1;
  57.   EA=1;
  58.   ES=1;
  59.   ET0=0;
  60. //  PS=1;
  61. }
  62. /**效验和**/
  63. void check(void)
  64. {
  65.    uchar tmp;
  66.    uint cs=0;
  67.   for(tmp=2;tmp<7;tmp++)
  68.     {
  69.            cs+=judge[tmp];
  70.         }
  71.         tmp=cs>>8;
  72.         sum=cs&0x00ff;
  73.         if(sum==0xff)
  74.         {
  75.           sum=0;
  76.         }
  77.         sum+=tmp;
  78.         if(sum==0xff)
  79.         {
  80.           sum=0;
  81.         }

  82. }

  83. //**串口中断程序**//
  84. void UART_SER(void) interrupt 4
  85. {
  86.   unsigned char Temp;
  87.   uchar i;
  88.   if(RI)
  89.   {
  90.     RI=0;         // 标志位清零
  91.         Temp=SBUF;
  92.         judge[cnt]=Temp;
  93.         if(judge[0]==0x2A)        
  94.          {
  95.             cnt++;
  96.                 if(cnt>=8)
  97.                 {
  98.                    check();
  99.                    if(judge[7]==sum)
  100.                      {
  101.                            re_flag=1;
  102.                          }
  103.                         else
  104.                         {
  105.                            for(i=0;i<8;i++)
  106.                            {
  107.                               judge[i]=0x00;//缓存数组清零
  108.                            }
  109.                         }
  110.                    cnt=0;
  111.                 }
  112.          }
  113.          
  114.     SBUF=Temp;//把接受的值再返还给电脑端         
  115.   }
  116.   if(TI)  //如果是发送标志位,清零
  117.   {
  118.     TI=0;
  119.   }
  120. }


  121. //**定时器中断子程序**//
  122. void Timer0_(void) interrupt 1
  123. {
  124.   sw=1;         //为了测试程序先定义一个sw的状态
  125.   TH0=(65536-2000)/256;         //定时2ms
  126.   TL0=(65536-2000)%256;
  127.   switch(mot_ZT)
  128.   {
  129.     case 0://复位
  130.         if(sw==1)//触点开关 开
  131.          {
  132.        Mot_Dir=0;
  133.            Mot_Pulse=0;
  134.            Mot_En=1;
  135.          }
  136.          else
  137.          {
  138.            Mot_Dir=0;
  139.            Mot_Pulse=~Mot_Pulse;
  140.            Mot_En=1;
  141.          }
  142.          if(sw==1)
  143.          {
  144.            move_ok=1;
  145.            mot_ZT=3;

  146.          }
  147.          break;
  148. case 1: //探针上移
  149.           if(sw==1||pulse==0)
  150.          {
  151.            Mot_Dir=0;
  152.            Mot_Pulse=0;
  153.            Mot_En=1;
  154.          }
  155.          else
  156.          {
  157.            Mot_Dir=0;
  158.            Mot_Pulse=~Mot_Pulse;
  159.            Mot_En=1;
  160.            pulse--;
  161.          }
  162.          if(pulse==0)
  163.          {
  164.            move_ok=1;
  165.            mot_ZT=3;

  166.          }
  167.          break;
  168. case 2://探针下移
  169.     if(pulse==0)
  170.         {
  171.           Mot_Dir=1;
  172.           Mot_En=1;
  173.           Mot_Pulse=0;
  174.         }
  175.         else
  176.         {
  177.           Mot_Dir=1;
  178.           Mot_Pulse=~Mot_Pulse;
  179.           Mot_En=1;
  180.           pulse--;
  181.         }
  182.             if(pulse==0)
  183.            {
  184.              move_ok=1;
  185.                     mot_ZT=3;               
  186.            }
  187.            break;
  188.   case 3:  //电机不动
  189.        Mot_Dir=1;
  190.            Mot_Pulse=0;
  191.            Mot_En=1;

  192.            break;
  193. default:
  194.        Mot_Dir=1;
  195.            Mot_Pulse=0;
  196.            Mot_En=1;
  197.              break;

  198.   }
  199. }


  200. //**探针位置函数**//
  201. void Motor(void)
  202. {
  203.   Init_Timer0();
  204.   EA=1;

  205.   if(judge[2]==0xF3)  //探针置位
  206.   {
  207.     mot_ZT=0;   //状态标志为0,1,2        ,3
  208.   }
  209.   else if(judge[2]==0xF4)//探针上移
  210.   {
  211.     mot_ZT=1;
  212.         point=judge[3];
  213.         pulse=point*setpulse;

  214.   }
  215.   else if(judge[2]==0xF5)//探针下移
  216.   {
  217.      mot_ZT=2;
  218.          pulse=judge[3];
  219.          pulse=point*setpulse;
  220.   }
  221. }


  222. //**主函数**//
  223. void main(void)
  224. {
  225.   InitUART();
  226.   ES=1;
  227.   while(1)
  228.   {
  229.     if(re_flag==1)
  230.         {
  231.       if(judge[0]==0x2A&&judge[1]==0x2A)
  232.           {
  233.             if(judge[2]==0xF3||judge[2]==0xF4||judge[2]==0xF5)
  234.                   {
  235.                      Motor();
  236.                         
  237.                   }
  238.                 else if(judge[2]==0xF2)
  239.                   {
  240.                     beng();  //泵中的1为关,0为开
  241.                   }
  242.          
  243.           }
  244.          }

  245.   }

  246. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2018-10-18 15:39 | 只看该作者
re_flag变量使用过就要清0,否则永久执行后续命令。
回复

使用道具 举报

板凳
ID:311281 发表于 2018-10-19 15:10 | 只看该作者
wulin 发表于 2018-10-18 15:39
re_flag变量使用过就要清0,否则永久执行后续命令。

谢谢,确实是疏忽了。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表