找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1419|回复: 1
收起左侧

单片机程序编译没有问题,烧录后控制不了步进电机

[复制链接]
ID:428161 发表于 2018-11-17 13:41 | 显示全部楼层 |阅读模式
1黑币
  1. #include "reg52.h"

  2. void delay(unsigned int t);

  3. //Motor
  4. sbit F1 = P1^0;
  5. sbit F2 = P1^1;
  6. sbit F3 = P1^2;
  7. sbit F4 = P1^3;
  8. sbit k1 =P3^0;
  9. sbit k2=P3^1;
  10. sbit RX=P0^6;                //                       
  11. sbit TX=P0^7;

  12. sbit shuidi=P0^3;
  13. sbit hongyai=P0^0;
  14. sbit yali=P0^2;
  15. bit flag1=0;
  16. bit flag2=0;
  17. signed int  time=0;
  18. unsigned int  timer=0;
  19. unsigned long S=0;
  20. unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反转
  21. unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //正转
  22. void Conut(void)
  23. {
  24.         time=TH0*256+TL0;
  25.         TH0=0;
  26.         TL0=0;
  27.         
  28.         S= (long)(time*0.17);     //算出来是CM

  29.         if((S>=4000)||flag1==1)   //
  30.         {         
  31.           flag1=0;
  32.         }         
  33. }

  34. void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  35. {
  36.     flag1=1;                                         //中断溢出标志
  37.   }
  38. void panduan()

  39. {
  40.                    TMOD=0x11;                   //设T0为方式1,GATE=1;
  41.         TH0=0;
  42.         TL0=0;         
  43.         TH1=0xf8;                   //2MS定时
  44.         TL1=0x30;
  45.         ET0=1;             //允许T0中断
  46.         ET1=1;                           //允许T1中断
  47.         TR1=1;                           //开启定时器
  48.         EA=1;                           //总中断


  49.         {



  50.          while(!RX);                //当RX为零时等待
  51.          TR0=1;                            //开启计数
  52.          while(RX);                        //当RX为1计数并等待
  53.          TR0=0;                                //关闭计数
  54.      Conut();                        //计算  
  55.          if(S<80)         
  56.           flag2=0;      
  57.         else         
  58.         flag2=0;         
  59.                   }
  60.                                   //调节转速
  61.         }

  62. void motor_FFW()
  63.           {
  64.    unsigned char i;      
  65.     {
  66.       for (i=0; i<8; i++)  


  67.         {
  68.           if(hongyai==0) P1 = FFW[i]&0x1f;   //调取数据
  69.                   if(k2==0) P1 = FFW[i]&0x1f;
  70.           if(yali==0) P1 = FFW[i]&0x1f;
  71.                   if(flag2==0)P1 = FFW[i]&0x1f;
  72.         


  73.           delay(1);  
  74.          }
  75.          }
  76. }
  77. void  motor_FFZ()
  78. {
  79.    unsigned char i;      
  80.     {
  81.       for (i=0; i<8; i++)      
  82.         {
  83.                   if(k1==0) P1 = FFZ[i]&0x1f;
  84.                    if(shuidi==0) P1 = FFZ[i]&0x1f;
  85.                  
  86.                                                 
  87.                   delay(1);                   //调节转速
  88.         }
  89.      }
  90. }
  91. void         main()
  92. {
  93.     while(1)
  94.         {
  95.          if(flag2==0)
  96.     motor_FFW();
  97.         
  98.          if(shuidi==0)
  99.          motor_FFZ();
  100.          if(hongyai==0)
  101.          motor_FFW();
  102.          if(yali==0)
  103.          motor_FFW();
  104. }
  105. }
复制代码

编译没有问题,程序烧录后控制不了五线四相步进电机
求大神解决!

回复

使用道具 举报

ID:155507 发表于 2018-11-17 21:23 | 显示全部楼层
你的程序有缺陷,我给你来个程序试试

  1. /*-----------------------------------------------
  2.   名称:步进电机
  3.   内容:本程序用于测试4相步进电机常规驱动
  4.         使用1-2相励磁
  5.         1-2相激励功率增倍,步进角度减半,抖动减少
  6.         顺序如下 a-ab-b-bc-c-cd-d-da   又称4相8拍
  7. ------------------------------------------------*/

  8. #include <reg52.h>



  9. sbit A1=P1^0; //定义步进电机连接端口
  10. sbit B1=P1^1;
  11. sbit C1=P1^2;
  12. sbit D1=P1^3;


  13. #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
  14. #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
  15. #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
  16. #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
  17. #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
  18. #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
  19. #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
  20. #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
  21. #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电

  22. unsigned char Speed;
  23. bit Flag;
  24. /*------------------------------------------------
  25. uS延时函数,含有输入参数 unsigned char t,无返回值
  26. unsigned char 是定义无符号字符变量,其值的范围是
  27. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  28. 长度如下 T=tx2+5 uS
  29. ------------------------------------------------*/
  30. void DelayUs2x(unsigned char t)
  31. {   
  32. while(--t);
  33. }
  34. /*------------------------------------------------
  35. mS延时函数,含有输入参数 unsigned char t,无返回值
  36. unsigned char 是定义无符号字符变量,其值的范围是
  37. 0~255 这里使用晶振12M,精确延时请使用汇编
  38. ------------------------------------------------*/
  39. void DelayMs(unsigned char t)
  40. {
  41.      
  42. while(t--)
  43. {
  44.      //大致延时1mS
  45.      DelayUs2x(245);
  46.          DelayUs2x(245);
  47. }
  48. }
  49. /*------------------------------------------------
  50.                     主函数
  51. ------------------------------------------------*/
  52. main()
  53. {
  54. unsigned int i=512;//旋转一周时间

  55. EA=1;          //全局中断开
  56. EX0=1;         //外部中断0开
  57. IT0=1;         //1表示边沿触发

  58. Speed=10;
  59. while(1){
  60. Coil_OFF
  61. while((i--)&&Flag)  //正向
  62.   {  Coil_A1      
  63.      DelayMs(Speed);
  64.      Coil_AB1                //遇到Coil_AB1  用{A1=1;B1=1;C1=0;D1=0;}代替
  65.      DelayMs(Speed);         //改变这个参数可以调整电机转速 ,
  66.                              //数字越小,转速越大,力矩越小
  67.          Coil_B1      
  68.      DelayMs(Speed);
  69.      Coil_BC1
  70.      DelayMs(Speed);
  71.          Coil_C1      
  72.      DelayMs(Speed);
  73.      Coil_CD1
  74.      DelayMs(Speed);
  75.          Coil_D1      
  76.      DelayMs(Speed);
  77.      Coil_DA1
  78.      DelayMs(Speed);
  79.   }
  80.   Coil_OFF
  81.   i=512;
  82.   while((i--)&&(!Flag))//反向
  83.   {  
  84.      Coil_A1      
  85.      DelayMs(Speed);
  86.      Coil_DA1                //遇到Coil_AB1  用{A1=1;B1=1;C1=0;D1=0;}代替
  87.      DelayMs(Speed);         //改变这个参数可以调整电机转速 ,
  88.                              //数字越小,转速越大,力矩越小
  89.          Coil_D1      
  90.      DelayMs(Speed);
  91.      Coil_CD1
  92.      DelayMs(Speed);
  93.          Coil_C1      
  94.      DelayMs(Speed);
  95.      Coil_BC1
  96.      DelayMs(Speed);
  97.          Coil_B1      
  98.      DelayMs(Speed);
  99.      Coil_AB1
  100.      DelayMs(Speed);
  101.   }
  102. }
  103. }

  104. /*------------------------------------------------
  105.                  外部中断程序
  106. ------------------------------------------------*/
  107. void ISR_INT0(void) interrupt 0
  108. {

  109. if(!INT0)
  110.    {
  111.    DelayMs(10);//在此处可以添加去抖动程序,防止按键抖动造成错误
  112.    if(!INT0)
  113.    //while(!INT1);//等待按键释放
  114.      {
  115.      Flag=!Flag;   
  116.      }
  117.    }
  118. }
复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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