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

QQ登錄

只需一步,快速開始

搜索
查看: 21572|回復(fù): 20
打印 上一主題 下一主題
收起左側(cè)

STC89C52RC單片機(jī)控制步進(jìn)電機(jī)仿真與程序源碼及實(shí)物圖

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本單片機(jī)是STC89C52RC,本程序應(yīng)用于step motor--28BYJ,小型步進(jìn)電機(jī),
  供電電壓DC5V,可直接接于單片機(jī)通過ul2003驅(qū)動(dòng)芯片驅(qū)動(dòng),數(shù)碼管是共陰極接口,
控制步進(jìn)電機(jī)啟動(dòng)/停止,正反轉(zhuǎn),加減速,并有運(yùn)行,及轉(zhuǎn)換狀態(tài)顯示。
是初學(xué)者的好例程。


實(shí)物圖:


大家好,我是智成電子DIY,我會(huì)不定時(shí)寫一下簡(jiǎn)單實(shí)用的源碼分享給大家,
當(dāng)然是分享給初學(xué)單片機(jī)的,大神請(qǐng)自覺飄過。原創(chuàng)首發(fā)的當(dāng)然會(huì)在我們的《51黑電子論壇》網(wǎng)址:http://www.torrancerestoration.com/bbs/ 偶爾也會(huì)發(fā)到我的新浪博客(附件里面有地址)


仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)




單片機(jī)源程序如下:

  1. /*本單片機(jī)是STC89C52RC,本程序應(yīng)用于step motor--28BYJ,小型步進(jìn)電機(jī),
  2.    供電電壓DC5V,可直接接于單片機(jī)通過ul2003驅(qū)動(dòng)芯片驅(qū)動(dòng),數(shù)碼管是共陰極接口,*/


  3. #include <STC89C5xRC.H>
  4. #define uchar unsigned char//數(shù)據(jù)宏定義
  5. #define uint unsigned int
  6. #define A P10 //
  7. #define _A P11 //步進(jìn)電機(jī)脈沖接口
  8. #define B P12 //
  9. #define _B P13 //步進(jìn)電機(jī)脈沖接口
  10. uchar su_du=0;       //轉(zhuǎn)速
  11. bit fang_xiang=0;    //方向
  12. bit qi_dong=0;       //啟動(dòng)標(biāo)志
  13. /********************************************************************/

  14. #include <intrins.h>//包含移位標(biāo)準(zhǔn)庫函數(shù)頭文件


  15. sbit DU = P2^6;//數(shù)碼管段選
  16. sbit WE = P2^7;//數(shù)碼管段選


  17. //共陰數(shù)碼管段選表0-9
  18. uchar  code shu_ma[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
  19. /*********************************************************************/
  20. /*====================================
  21. 函數(shù)    : delay(uint z)
  22. 參數(shù)    :z 延時(shí)毫秒設(shè)定,取值范圍0-65535
  23. 返回值    :無
  24. 描述    :12T/Fosc11.0592M毫秒級(jí)延時(shí)
  25. ====================================*/
  26. void delay(uint z)
  27. {
  28.     uint x,y;
  29.     for(x = z; x > 0; x--)
  30.         for(y = 114; y > 0 ; y--);         
  31. }

  32. /*====================================
  33. 函數(shù)    :display(uchar i)
  34. 參數(shù)    :i 顯示數(shù)值,取值范圍0-255
  35. 返回值    :無
  36. 描述    :三位共陰數(shù)碼管動(dòng)態(tài)顯示
  37. ====================================*/
  38. void display(uchar i)                         //數(shù)據(jù)處理
  39. {
  40.     uchar bai, shi, ge;
  41. //    bai = i / 100; //236 / 100  = 2
  42. //    shi = i % 100 / 10;    //236 % 100 / 10 = 3
  43.     ge  = i;// % 10;//236 % 10 =6
  44.    
  45. /*  第一位數(shù)碼管         
  46.     P0 = 0XFF;//清除斷碼
  47.     WE = 1;//打開位選鎖存器
  48.     P0 = 0XFE; //1111 1110
  49.     WE = 0;//鎖存位選數(shù)據(jù)
  50.    
  51.     DU = 1;//打開段選鎖存器
  52.     P0 = shu_ma[bai];//
  53.     DU = 0;//鎖存段選數(shù)據(jù)
  54.     delay(5);

  55.     //第二位數(shù)碼管
  56.     P0 = 0XFF;//清除斷碼
  57.     WE = 1;//打開位選鎖存器
  58.     P0 = 0XFD; //1111 1101
  59.     WE = 0;//鎖存位選數(shù)據(jù)
  60.    
  61.     DU = 1;//打開段選鎖存器
  62.     P0 = shu_ma[shi];//
  63.     DU = 0;//鎖存段選數(shù)據(jù)
  64.     delay(5);*/

  65. /*********    第三位數(shù)碼管 */
  66.     P0 = 0XFF;//清除斷碼
  67.     WE = 1;//打開位選鎖存器
  68.     P0 = 0XFB; //1111 1011
  69.     WE = 0;//鎖存位選數(shù)據(jù)
  70.    
  71.     DU = 1;//打開段選鎖存器
  72.     P0 = shu_ma[ge];//
  73.     DU = 0;//鎖存段選數(shù)據(jù)
  74.     delay(5);
  75. }
  76. void yanshi2(uint a)      //延時(shí)程序
  77. {
  78.     while(a--);
  79. }
  80. uchar an_jian()     //按鍵檢測(cè),P3.0,P3.1,P3.2,P3.3分別接4個(gè)按鍵
  81. {
  82.     if((P3&0x0f)!=0x0f)//判斷 P3只要有一個(gè)按鍵按下,就延時(shí)返回按鍵值。
  83.     {
  84.         yanshi2(20000);
  85.         if((P3&0x0f)!=0x0f)
  86.         {
  87.             return P3&0x0f;
  88.         }
  89.     }
  90.     return P3&0x0f;
  91. }

  92. void yanshi()            //步進(jìn)電機(jī)延時(shí)時(shí)間
  93. {
  94.     uint sd1=0;
  95.     sd1=8000+5753*(10-su_du);//    su_du值越大,周期越短,頻率越高
  96.     while(sd1--)
  97.     {
  98.         if((P3&0x0f)!=0x0f)return;  //在延時(shí)里面判斷有沒有按鍵按下,有就直接返回主函數(shù)
  99.     }
  100. }
  101. void bu_jin()             //每調(diào)用一次步進(jìn)電機(jī)向指定方向走一步
  102. {
  103.     static char j=1;     //把起始速度設(shè)置為1。
  104.     if(fang_xiang)         //判斷方向位,為1則按正相序循環(huán),
  105.     {
  106.         j++;
  107.         if(j==5)j=1;
  108.     }
  109.     else
  110.     {
  111.         j--;
  112.         if(j==0)j=4;     //否則,按反相序循環(huán)
  113.     }
  114.     switch(j)             //根據(jù)拍數(shù)選擇不同的電壓組合
  115.     {
  116.         case 1:
  117.             A=1;B=1;_A=0;_B=0;yanshi(); //ab  1100
  118.         break;
  119.         case 2:
  120.             A=0;B=1;_A=1;_B=0;yanshi(); //a~b 0110
  121.         break;
  122.         case 3:
  123.             A=0;B=0;_A=1;_B=1;yanshi(); //a~b~0011
  124.         break;
  125.         case 4:
  126.             A=1;B=0;_A=0;_B=1;yanshi(); //ab~ 1001
  127.         break;
  128.     }
  129. }



  130.    

  131. void main()
  132. {
  133.     P14=0;//方向標(biāo)志
  134.     P15=0;//啟動(dòng) 標(biāo)志
  135.     while(1)
  136.     {
  137.         switch(an_jian())             //按鍵處理
  138.         {
  139.             case 0x0e:                   //第一個(gè)按鍵按下按鍵狀態(tài)取反,啟動(dòng)/停止
  140.                 qi_dong=!qi_dong;
  141.                 P15=qi_dong;            //狀態(tài)指示
  142.             break;
  143.             case 0x0d:                    //第二個(gè)按鍵按下,速度加
  144.                 if(su_du<9)
  145.                     su_du++;         //速度加
  146.             break;
  147.             case 0x0b:                   //第三個(gè)按鍵按下,速度減
  148.                 if(su_du>0)
  149.                     su_du--;         //速度減
  150.             break;
  151.             case 0x07:                     //第四個(gè)按鍵按下按鍵狀態(tài)取反,方向轉(zhuǎn)換
  152.                 fang_xiang=!fang_xiang;      
  153.                 P34=fang_xiang;            //方向指示燈
  154.             break;
  155.         }
  156.    
  157.         if(qi_dong)                         //啟動(dòng)按鈕為1
  158.         {
  159.             bu_jin();                    //步進(jìn)電機(jī)
  160.         }
  161.         else P1=0X0F;                    //停止?fàn)顟B(tài),脈沖輸出端口全部停止輸出

  162.            display(su_du); //數(shù)碼管顯示函數(shù)
  163.     }
  164.    
  165. }
復(fù)制代碼
下面插個(gè)小廣告:
在這里會(huì)有精彩有趣的單片機(jī)DIY套件產(chǎn)品和優(yōu)質(zhì)原創(chuàng)的源碼。
包括淘寶最低價(jià)的微型激光雕刻機(jī)支持脫機(jī)打印的,用51單片機(jī)打造(原創(chuàng)哦)。
6足4足蜘蛛仿生機(jī)器人,同樣是用51單片機(jī)打造,控制18路舵機(jī)完成各個(gè)動(dòng)作
還可以手機(jī)wifi控制,提供所有資料(單片機(jī)源碼,APP源碼,電路,PCB等)
還會(huì)有其他強(qiáng)大有趣的設(shè)計(jì),如解魔法機(jī)器人,智能小車等。
您有好的想法也可以聯(lián)系我,我們一起開發(fā)更多有用的產(chǎn)品!

此附件由于多人回帖說代碼有錯(cuò)誤,已經(jīng)被管理員刪除,無法下載
單片機(jī)控制步進(jìn)電機(jī).rar (361.69 KB, 下載次數(shù): 301)
此附件由于多人回帖說代碼有錯(cuò)誤,已經(jīng)被管理員刪除,無法下載,請(qǐng)論壇搜索"步進(jìn)電機(jī)" 或移步http://www.torrancerestoration.com/bbs/dpj-146064-1.html


評(píng)分

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

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩2
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:328476 發(fā)表于 2018-5-30 18:57 | 只看該作者
不好使
回復(fù)

使用道具 舉報(bào)

板凳
ID:482513 發(fā)表于 2019-3-3 10:24 | 只看該作者
代碼有錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

地板
ID:234344 發(fā)表于 2019-3-11 21:09 | 只看該作者
不錯(cuò),運(yùn)行成功了,就是發(fā)熱量太大了,運(yùn)行2分鐘就燙手
回復(fù)

使用道具 舉報(bào)

5#
ID:490006 發(fā)表于 2019-3-13 15:24 | 只看該作者
謝謝大神的指導(dǎo)!!!
回復(fù)

使用道具 舉報(bào)

6#
ID:497548 發(fā)表于 2019-3-25 19:30 | 只看該作者
感謝樓主啊的
回復(fù)

使用道具 舉報(bào)

7#
ID:424386 發(fā)表于 2019-4-27 20:36 | 只看該作者
謝謝樓主分享,很有用。
回復(fù)

使用道具 舉報(bào)

8#
ID:16806 發(fā)表于 2019-5-7 19:03 | 只看該作者
感謝分享,正好能用到。
回復(fù)

使用道具 舉報(bào)

9#
ID:530732 發(fā)表于 2019-5-10 09:48 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

10#
ID:261318 發(fā)表于 2019-5-13 10:44 | 只看該作者
cjn1411714511 發(fā)表于 2019-3-11 21:09
不錯(cuò),運(yùn)行成功了,就是發(fā)熱量太大了,運(yùn)行2分鐘就燙手

為什么我不能運(yùn)行
回復(fù)

使用道具 舉報(bào)

11#
ID:525685 發(fā)表于 2019-5-14 13:32 | 只看該作者
感謝樓主、
回復(fù)

使用道具 舉報(bào)

12#
ID:549774 發(fā)表于 2019-5-29 13:26 | 只看該作者
這個(gè)電路圖怎么還沒連上啊
回復(fù)

使用道具 舉報(bào)

13#
ID:549774 發(fā)表于 2019-5-29 13:35 | 只看該作者
敵對(duì)的 發(fā)表于 2019-4-27 20:36
謝謝樓主分享,很有用。

在嗎,你是怎么運(yùn)行成功的,還需要連線嗎
回復(fù)

使用道具 舉報(bào)

14#
ID:399229 發(fā)表于 2019-12-4 22:47 | 只看該作者
謝謝樓主分享,需要提醒各位朋友。樓主的仿真那塊,把按鍵引腳和(A+ A- B+ B-)畫反了,看代碼就知道怎么調(diào)換了。
回復(fù)

使用道具 舉報(bào)

15#
ID:219115 發(fā)表于 2019-12-5 10:48 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

16#
ID:666279 發(fā)表于 2019-12-17 14:55 | 只看該作者
大佬厲害了。
回復(fù)

使用道具 舉報(bào)

17#
ID:396513 發(fā)表于 2019-12-17 16:20 | 只看該作者
程序  寫的很爛  直接對(duì)引腳操作  變量聲明很不規(guī)范
回復(fù)

使用道具 舉報(bào)

18#
ID:671439 發(fā)表于 2019-12-23 16:02 | 只看該作者
不錯(cuò),運(yùn)行成功了,就是發(fā)熱量太大了,運(yùn)行2分鐘就燙手
回復(fù)

使用道具 舉報(bào)

19#
ID:679523 發(fā)表于 2020-1-2 12:14 來自手機(jī) | 只看該作者
王試試33 發(fā)表于 2019-12-23 16:02
不錯(cuò),運(yùn)行成功了,就是發(fā)熱量太大了,運(yùn)行2分鐘就燙手

你好,請(qǐng)問是怎么成功的啊
回復(fù)

使用道具 舉報(bào)

20#
ID:272776 發(fā)表于 2020-3-15 22:12 | 只看該作者
樓主厲害嘛,分享出來的東西既改電路還改程序。
回復(fù)

使用道具 舉報(bào)

21#
ID:750010 發(fā)表于 2020-5-12 16:40 | 只看該作者
亂七八糟的,跟程序?qū)?yīng)的電路圖也不說下,IO口就對(duì)不上哪個(gè)是哪個(gè),都不知道運(yùn)行出來的人是怎么運(yùn)行的?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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