找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 9805|回復(fù): 6
收起左側(cè)

STC15F2K60S2+esp8266+步進(jìn)電機(jī),app控制步進(jìn)電機(jī)正反轉(zhuǎn)及加減速

[復(fù)制鏈接]
ID:355489 發(fā)表于 2018-7-22 18:29 | 顯示全部樓層 |閱讀模式
在前一篇貼子在基礎(chǔ)上,進(jìn)一步學(xué)習(xí)控制步進(jìn)電機(jī)。

準(zhǔn)備材料:
步進(jìn)電機(jī):28byj48+ULN2003驅(qū)動(dòng)板

接線圖:

2018072201

2018072201

調(diào)試過(guò)程中主要有以下問(wèn)題:
1、步進(jìn)電機(jī)的連接  2 、步進(jìn)電機(jī)的速度控制,如何調(diào)整角速度。

步驟:
1、按前一篇,貼子連接好app wifi 控制單片機(jī)
2、按上圖連接好步進(jìn)電機(jī)
3、拷貝如下C++代碼, 燒錄到單片機(jī)中
4、利用app手機(jī)控制步進(jìn)電機(jī)前進(jìn),倒退,停止,加速,減速。

app1

app1


代碼如下:

  1. #include <reg52.h>                       //包含頭文件
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define RELOAD_COUNT 0xFA         //宏定義波特率發(fā)生器的載入值
  5. #define MAIN_Fosc                22118400L        //定義主時(shí)鐘        
  6. #define        BaudRate1                115200UL        //選擇波特率
  7. #define receive_max 20          //串口接收緩沖長(zhǎng)度   
  8. #define        Timer1_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))                //Timer 1 重裝值, 對(duì)應(yīng)300KHZ
  9. #define        Timer2_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))        //Timer 2 重裝值, 對(duì)應(yīng)300KHZ
  10. typedef  unsigned char u8;

  11. /*****************LED燈對(duì)應(yīng)P0口的1個(gè)端口*************/
  12. sbit LED0=P3^7;
  13. /************波特率發(fā)生器相關(guān)功能寄存器的定義****************/
  14. sfr AUXR=0x8E;
  15. sfr BRT=0x9C;
  16. sfr AUXR1=0xA2;
  17. sfr P_SW1 = 0xA2;
  18. /*****************相關(guān)變量**************/
  19. uchar Recive_table[receive_max];        //用于接收wifi模塊反饋到MCU上的數(shù)據(jù)
  20. u8 receive_count=0; //接受數(shù)據(jù)的個(gè)數(shù)
  21. /*******************************************************************
  22. 名稱:延時(shí)函數(shù)
  23. 作用:毫秒級(jí)延時(shí),微妙級(jí)延時(shí)函數(shù),為數(shù)據(jù)收發(fā)完成作等待.......
  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. 名稱:波特率發(fā)生器函數(shù)
  33. 作用:波特率發(fā)生器可以是T1定時(shí)器實(shí)現(xiàn),也可以是MCU內(nèi)部獨(dú)立的波特率發(fā)生器,
  34. 各自不同的載入值計(jì)算式,具體根據(jù)寄存器相關(guān)設(shè)置來(lái)參考計(jì)算,以實(shí)現(xiàn)
  35. 異步串行通訊。(經(jīng)測(cè)試,兩種設(shè)置方式均可用,可任選一種。)
  36. ********************************************************************/
  37. void Uart_Init()//使用定時(shí)器1作為波特率發(fā)生器
  38. {
  39.     SCON |= 0x40;               //8位數(shù)據(jù)
  40.     P_SW1 &=  ~0xc0;       //UART1 使用P30 P31口  默認(rèn)
  41.     TR1 = 0;                    //關(guān)閉定時(shí)器
  42.     TR1 = 0;                        //波特率使用Timer1產(chǎn)生
  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; //高優(yōu)先級(jí)中斷
  51.     REN = 1;        //允許接收
  52.     ES  = 1;        //允許中斷
  53.     EA = 1;                //允許全局中斷


  54. }

  55. //發(fā)送一字節(jié)
  56. void sendByte(uchar b)
  57. {   ES=0;
  58.     SBUF = b;
  59.     while(!TI);
  60.     TI=0;
  61.     ES=1;
  62. }

  63. //發(fā)送字符串
  64. void sendString(uchar *s)
  65. {
  66.     while(*s != '\0') //字符串默認(rèn)結(jié)尾'\0',以此來(lái)判斷字符串的結(jié)束
  67.     {
  68.         sendByte(*s++);
  69.     }
  70. }

  71. /********************************************************************
  72. 名稱:WIFI模塊設(shè)置函數(shù)
  73. 作用: 啟動(dòng)模塊,以便可以實(shí)現(xiàn)無(wú)線接入和控制
  74. ********************************************************************/
  75. void ESP8266_Set(uchar *puf) // 數(shù)組指針*puf指向字符串?dāng)?shù)組
  76. {
  77.     sendString(puf);
  78.     ms_delay(10);
  79.     sendString("\r\n");//回車
  80. }
  81. /****************************************************
  82. 名稱:ESP8266發(fā)送數(shù)據(jù)函數(shù)
  83. 功能:用于與wifi模塊相連的終端發(fā)送數(shù)據(jù)
  84. *****************************************************/
  85. void ESP8266_Sent(uchar *puf)      // 數(shù)組指針*puf指向字符串?dāng)?shù)組
  86. {
  87.     ESP8266_Set("AT+CIPSEND=0,50");
  88.     sendString(puf);
  89.     ms_delay(10);
  90.     sendString("\r\n");   //回車
  91. }


  92. /***


  93. 步進(jìn)電機(jī)

  94. **/
  95. #define MotorData P0
  96. unsigned char curKeyval;
  97. //步進(jìn)電機(jī)控制接口定義
  98. uchar phasecw[4] = {0x08,0x04,0x02,0x01}; //正轉(zhuǎn) 電機(jī)導(dǎo)通相序 D-C-B-A
  99. uchar phaseccw[4]= {0x01,0x02,0x04,0x08}; //反轉(zhuǎn) 電機(jī)導(dǎo)通相序 A-B-C-D
  100. int speedMax = 14;
  101. int speedMin = 50;
  102. int curSpeed = 50;
  103. //順時(shí)針轉(zhuǎn)動(dòng)
  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. //逆時(shí)針轉(zhuǎn)動(dòng)
  114. void MotorCCW(void)
  115. {
  116.     uchar i;
  117.     for(i=0; i<4; i++)
  118.     {
  119.         MotorData=phaseccw;
  120.         ms_delay(curSpeed);//轉(zhuǎn)速調(diào)節(jié)
  121.     }
  122. }
  123. //停止轉(zhuǎn)動(dòng)
  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. 名稱:主函數(shù)
  136. 作用:程序的執(zhí)行入口
  137. ********************************************************************/
  138. void main()
  139. {
  140.     ms_delay(50000);
  141.     LED0=0;//關(guān)閉LED燈
  142.     Uart_Init();//使用獨(dú)立的波特率發(fā)生器
  143.     ms_delay(500);
  144.     LED0=!LED0;
  145.     ms_delay(500);
  146.     LED0=!LED0;
  147.     ESP8266_Set("AT+CIPMUX=1"); //啟動(dòng)多連接
  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)//如果接受到數(shù)據(jù)
  157.         {
  158.             ms_delay(500);
  159.             receive_count = 0;//接收計(jì)數(shù)清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;//接收計(jì)數(shù)清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;//清除接受標(biāo)志
  222.         Recive_table[receive_count] = SBUF;//將數(shù)據(jù)存入數(shù)組
  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. }
復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:480682 發(fā)表于 2019-3-7 10:40 | 顯示全部樓層
有問(wèn)題呀,為什么我不能執(zhí)行呀
回復(fù)

使用道具 舉報(bào)

ID:510566 發(fā)表于 2019-4-12 15:53 | 顯示全部樓層
這套東西單片機(jī)可以用52嗎
回復(fù)

使用道具 舉報(bào)

ID:510566 發(fā)表于 2019-4-12 16:01 | 顯示全部樓層
單片機(jī)改成52的話程序改動(dòng)大嗎
回復(fù)

使用道具 舉報(bào)

ID:308173 發(fā)表于 2019-4-13 09:33 | 顯示全部樓層
兄弟你把代碼打包一下讓我下載呀
回復(fù)

使用道具 舉報(bào)

ID:355489 發(fā)表于 2019-4-27 19:20 | 顯示全部樓層
miaoxiaobaiqaq 發(fā)表于 2019-4-13 09:33
兄弟你把代碼打包一下讓我下載呀

你直接復(fù)制代碼就可以了,這就是所有代碼
回復(fù)

使用道具 舉報(bào)

ID:355489 發(fā)表于 2019-4-29 20:41 | 顯示全部樓層
hjx820 發(fā)表于 2019-4-27 19:20
你直接復(fù)制代碼就可以了,這就是所有代碼

sorry, 附件請(qǐng)到        STC15F2K60S2單片機(jī)+ESP8266+NTC傳輸?shù)骄W(wǎng)絡(luò)并訪問(wèn) 這個(gè)貼子里下載,我這里所有貼子的除了main.c不一樣,其它都是一樣的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表