找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15F2K60S2+esp8266+步进电机,app控制步进电机正反转及加减速

[复制链接]
跳转到指定楼层
楼主
在前一篇贴子在基础上,进一步学习控制步进电机。

准备材料:
步进电机:28byj48+ULN2003驱动板

接线图:

调试过程中主要有以下问题:
1、步进电机的连接  2 、步进电机的速度控制,如何调整角速度。

步骤:
1、按前一篇,贴子连接好app wifi 控制单片机
2、按上图连接好步进电机
3、拷贝如下C++代码, 烧录到单片机中
4、利用app手机控制步进电机前进,倒退,停止,加速,减速。


代码如下:

  1. #include <reg52.h>                       //包含头文件
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define RELOAD_COUNT 0xFA         //宏定义波特率发生器的载入值
  5. #define MAIN_Fosc                22118400L        //定义主时钟        
  6. #define        BaudRate1                115200UL        //选择波特率
  7. #define receive_max 20          //串口接收缓冲长度   
  8. #define        Timer1_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))                //Timer 1 重装值, 对应300KHZ
  9. #define        Timer2_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))        //Timer 2 重装值, 对应300KHZ
  10. typedef  unsigned char u8;

  11. /*****************LED灯对应P0口的1个端口*************/
  12. sbit LED0=P3^7;
  13. /************波特率发生器相关功能寄存器的定义****************/
  14. sfr AUXR=0x8E;
  15. sfr BRT=0x9C;
  16. sfr AUXR1=0xA2;
  17. sfr P_SW1 = 0xA2;
  18. /*****************相关变量**************/
  19. uchar Recive_table[receive_max];        //用于接收wifi模块反馈到MCU上的数据
  20. u8 receive_count=0; //接受数据的个数
  21. /*******************************************************************
  22. 名称:延时函数
  23. 作用:毫秒级延时,微妙级延时函数,为数据收发完成作等待.......
  24. ********************************************************************/
  25. void ms_delay(uint t)
  26. {
  27.     uint i,j;
  28.     for(i=t; i>0; i--)
  29.         for(j=112; j>0; j--);
  30. }


  31. /********************************************************************
  32. 名称:波特率发生器函数
  33. 作用:波特率发生器可以是T1定时器实现,也可以是MCU内部独立的波特率发生器,
  34. 各自不同的载入值计算式,具体根据寄存器相关设置来参考计算,以实现
  35. 异步串行通讯。(经测试,两种设置方式均可用,可任选一种。)
  36. ********************************************************************/
  37. void Uart_Init()//使用定时器1作为波特率发生器
  38. {
  39.     SCON |= 0x40;               //8位数据
  40.     P_SW1 &=  ~0xc0;       //UART1 使用P30 P31口  默认
  41.     TR1 = 0;                    //关闭定时器
  42.     TR1 = 0;                        //波特率使用Timer1产生
  43.     AUXR &= ~0x01;                //S1 BRT Use Timer1;
  44.     TMOD &= ~(1<<6);   //Timer1 set As Timer
  45.     TMOD &= ~0x30;     //Timer1_16bitAutoReload;2
  46.     AUXR |=  (1<<6);        //Timer1 set as 1T mode
  47.     TH1 = (u8)(Timer1_Reload >> 8);
  48.     TL1 = (u8)Timer1_Reload;
  49.     TR1  = 1;

  50.     PS = 1; //高优先级中断
  51.     REN = 1;        //允许接收
  52.     ES  = 1;        //允许中断
  53.     EA = 1;                //允许全局中断


  54. }

  55. //发送一字节
  56. void sendByte(uchar b)
  57. {   ES=0;
  58.     SBUF = b;
  59.     while(!TI);
  60.     TI=0;
  61.     ES=1;
  62. }

  63. //发送字符串
  64. void sendString(uchar *s)
  65. {
  66.     while(*s != '\0') //字符串默认结尾'\0',以此来判断字符串的结束
  67.     {
  68.         sendByte(*s++);
  69.     }
  70. }

  71. /********************************************************************
  72. 名称:WIFI模块设置函数
  73. 作用: 启动模块,以便可以实现无线接入和控制
  74. ********************************************************************/
  75. void ESP8266_Set(uchar *puf) // 数组指针*puf指向字符串数组
  76. {
  77.     sendString(puf);
  78.     ms_delay(10);
  79.     sendString("\r\n");//回车
  80. }
  81. /****************************************************
  82. 名称:ESP8266发送数据函数
  83. 功能:用于与wifi模块相连的终端发送数据
  84. *****************************************************/
  85. void ESP8266_Sent(uchar *puf)      // 数组指针*puf指向字符串数组
  86. {
  87.     ESP8266_Set("AT+CIPSEND=0,50");
  88.     sendString(puf);
  89.     ms_delay(10);
  90.     sendString("\r\n");   //回车
  91. }


  92. /***


  93. 步进电机

  94. **/
  95. #define MotorData P0
  96. unsigned char curKeyval;
  97. //步进电机控制接口定义
  98. uchar phasecw[4] = {0x08,0x04,0x02,0x01}; //正转 电机导通相序 D-C-B-A
  99. uchar phaseccw[4]= {0x01,0x02,0x04,0x08}; //反转 电机导通相序 A-B-C-D
  100. int speedMax = 14;
  101. int speedMin = 50;
  102. int curSpeed = 50;
  103. //顺时针转动
  104. void MotorCW(void)
  105. {
  106.     uchar i;
  107.     for(i=0; i<4; i++)
  108.     {
  109.         MotorData=phasecw;
  110.         ms_delay(curSpeed);
  111.     }
  112. }
  113. //逆时针转动
  114. void MotorCCW(void)
  115. {
  116.     uchar i;
  117.     for(i=0; i<4; i++)
  118.     {
  119.         MotorData=phaseccw;
  120.         ms_delay(curSpeed);//转速调节
  121.     }
  122. }
  123. //停止转动
  124. void MotorStop(void)
  125. {
  126.     MotorData=0x00;
  127. }

  128. void speedUp(void){

  129.         curSpeed = curSpeed+3;
  130. }

  131. void speedDown(void){

  132.         curSpeed = curSpeed-3;
  133. }

  134. /********************************************************************
  135. 名称:主函数
  136. 作用:程序的执行入口
  137. ********************************************************************/
  138. void main()
  139. {
  140.     ms_delay(50000);
  141.     LED0=0;//关闭LED灯
  142.     Uart_Init();//使用独立的波特率发生器
  143.     ms_delay(500);
  144.     LED0=!LED0;
  145.     ms_delay(500);
  146.     LED0=!LED0;
  147.     ESP8266_Set("AT+CIPMUX=1"); //启动多连接
  148.     ms_delay(500);
  149.     LED0=!LED0;
  150.     ESP8266_Set("AT+CIPSERVER=1,333");//建立server,端口为333
  151.     ms_delay(500);
  152.     LED0=!LED0;
  153.     //允许串口中断
  154.     while(1)
  155.     {

  156.         if(receive_count > 0)//如果接受到数据
  157.         {
  158.             ms_delay(500);
  159.             receive_count = 0;//接收计数清0

  160.             if(Recive_table[9]=='0')
  161.             {
  162.                 LED0=!LED0;//0 灯灭
  163.                 ms_delay(500);
  164.                 ESP8266_Sent("close");
  165.                 //  ms_delay(500);
  166.                 //        ESP8266_Sent(Recive_table);
  167.                 //         ms_delay(500);
  168.                 curKeyval  =1;
  169.                 ms_delay(50);
  170.             }
  171.             if(Recive_table[9]=='1')
  172.             {
  173.                 LED0=!LED0;//0 灯灭
  174.                 ms_delay(500);
  175.                 ESP8266_Sent("open");
  176.                 //  ms_delay(500);
  177.                 //        ESP8266_Sent(Recive_table);
  178.                 //         ms_delay(500);
  179.                 curKeyval  =2;
  180.                 ms_delay(50);
  181.             }
  182.             if(Recive_table[9]=='2')
  183.             {
  184.                 LED0=!LED0;//0 灯灭
  185.                 ms_delay(500);
  186.                 ESP8266_Sent("open");
  187.                 //  ms_delay(500);
  188.                 //        ESP8266_Sent(Recive_table);
  189.                 //         ms_delay(500);

  190.                 curKeyval  =3;
  191.                 ms_delay(50);
  192.             }
  193.                          if(Recive_table[9]=='3')
  194.             {
  195.                  speedUp();
  196.             }
  197.                          if(Recive_table[9]=='4')
  198.             {
  199.                   speedDown();
  200.             }
  201.             receive_count = 0;//接收计数清0

  202.         }


  203.         switch(curKeyval)
  204.         {
  205.         case 1:
  206.             MotorCW();
  207.             break;
  208.         case 2:
  209.             MotorCCW();
  210.             break;
  211.         case 3:
  212.             MotorStop();
  213.             break;

  214.         }

  215.     }

  216. }

  217. void UART1_int (void) interrupt 4
  218. {
  219.     if(RI)
  220.     {
  221.         RI = 0;//清除接受标志
  222.         Recive_table[receive_count] = SBUF;//将数据存入数组
  223.         if(++receive_count > receive_max) {
  224.             receive_count = 0;//避免溢出
  225.         }
  226.         if((Recive_table[receive_count-1]=='\n'))
  227.             receive_count=0;
  228.     }
  229.     if(TI)
  230.     {}
  231. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:480682 发表于 2019-3-7 10:40 | 只看该作者
有问题呀,为什么我不能执行呀
回复

使用道具 举报

板凳
ID:510566 发表于 2019-4-12 15:53 | 只看该作者
这套东西单片机可以用52吗
回复

使用道具 举报

地板
ID:510566 发表于 2019-4-12 16:01 | 只看该作者
单片机改成52的话程序改动大吗
回复

使用道具 举报

5#
ID:308173 发表于 2019-4-13 09:33 | 只看该作者
兄弟你把代码打包一下让我下载呀
回复

使用道具 举报

6#
ID:355489 发表于 2019-4-27 19:20 | 只看该作者
miaoxiaobaiqaq 发表于 2019-4-13 09:33
兄弟你把代码打包一下让我下载呀

你直接复制代码就可以了,这就是所有代码
回复

使用道具 举报

7#
ID:355489 发表于 2019-4-29 20:41 | 只看该作者
hjx820 发表于 2019-4-27 19:20
你直接复制代码就可以了,这就是所有代码

sorry, 附件请到        STC15F2K60S2单片机+ESP8266+NTC传输到网络并访问 这个贴子里下载,我这里所有贴子的除了main.c不一样,其它都是一样的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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