久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7267|回復: 12
打印 上一主題 下一主題
收起左側

單片機控制三相步進電極(C 語言程序)

  [復制鏈接]
跳轉到指定樓層
樓主
ID:72705 發表于 2015-1-24 16:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
因為這是第一次接觸步進電機以及電機驅動器,所以編了個簡單的程序,其實是改過來的,有興趣的朋友可以參考一下,喜歡交流的朋友也可以回帖.
這是l連接好的圖片:
我用p1口的0、1、2、3分別接驅動器的+、PU、+、DR接線端,其中PU的脈沖提供了轉速的變化,DR電平的改變決定了旋轉方向下面給出程序,大家有什么不懂的到群里討論。
  1. #include <reg51.h>        //51芯片管腳定義頭文件
  2. #include <intrins.h>   //內部包含延時函數 _nop_() ;

  3. #define uchar unsigned char
  4. #define uint   unsigned int
  5. #define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;


  6. uchar code FFW[4]={0xf5,0xf7,0xf5,0xf7} ;
  7. uchar code REV[4]={0xfd,0xff,0xfd,0xff} ;

  8. sbit   K1    = P3^3 ;        //運行與停止
  9. sbit   K2    = P3^2 ;        //設定圈數
  10. sbit   K3    = P3^5 ;        //方向轉換
  11. sbit   K4    = P3^4 ;        //速率調整

  12. sbit   BEEP = P2^4 ;        //蜂鳴器

  13. sbit   LCD_RS = P2^6 ;            
  14. sbit   LCD_RW = P3^6 ;
  15. sbit   LCD_EN = P2^7 ;

  16. bit   on_off=0 ;             //運行與停止標志
  17. bit   direction=1 ;          //方向標志
  18. bit   rate_dr=1 ;            //速率標志
  19. bit   snum_dr=1 ;            //圈數標志

  20. uchar code   cdis1[ ] = {" STEPPING MOTOR "} ;
  21. uchar code   cdis2[ ] = {"CONTROL   PROCESS"} ;
  22. uchar code   cdis3[ ] = {"     STOP         "} ;
  23. uchar code   cdis4[ ] = {"NUM:     RATE:    "} ;
  24. uchar code   cdis5[ ] = {"   RUNNING        "} ;

  25. uchar    m,v=0,q=0 ;

  26. int    number=0,number1=0;
  27. char    snum=1,snum1=1 ;        //預設定圈數
  28. char    rate=1 ;                //預設定速率
  29. char    data_temp,data_temp1,data_temp2 ;   

  30. /********************************************************/
  31. /*                                                  
  32. /* 延時t毫秒
  33. /* 11.0592MHz時鐘,延時約1ms                                    
  34. /*                                                      
  35. /********************************************************/
  36. void delay(uint t)
  37. {                           
  38.     uchar k ;
  39.     while(t--)
  40.     {
  41.       for(k=0 ; k<125 ; k++)
  42.       { }
  43.     }
  44. }

  45. /********************************************************/
  46. void delayB(uchar x)     //x*0.14MS
  47. {
  48.     uchar i ;
  49.     while(x--)
  50.     {
  51.       for (i=0 ; i<13 ; i++)
  52.       { }
  53.     }
  54. }

  55. /********************************************************/
  56. void beep()
  57. {
  58.     uchar j ;
  59.     for (j=0 ;j<100 ;j++)
  60.      {
  61.       delayB(4) ;
  62.       BEEP=!BEEP ;                  //BEEP取反
  63.      }
  64.       BEEP=1 ;                     //關閉蜂鳴器
  65.    delay(170) ;
  66. }

  67. /********************************************************/
  68. /*                                                               
  69. /*檢查LCD忙狀態                                                   
  70. /*lcd_busy為1時,忙,等待。為0時,閑,可寫指令與數據。     
  71. /*                                                               
  72. /********************************************************/

  73. bit lcd_busy()
  74. {                          
  75.      bit result ;
  76.      LCD_RS = 0 ;
  77.      LCD_RW = 1 ;
  78.      LCD_EN = 1 ;
  79.      delayNOP() ;
  80.      result = (bit)(P0&0x80) ;
  81.      LCD_EN = 0 ;
  82.      return(result) ;
  83. }

  84. /********************************************************/
  85. /*                                                                 
  86. /*寫指令數據到LCD                                                
  87. /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             
  88. /*                                                               
  89. /********************************************************/

  90. void lcd_wcmd(uchar cmd)

  91. {                          
  92.     while(lcd_busy()) ;
  93.      LCD_RS = 0 ;
  94.      LCD_RW = 0 ;
  95.      LCD_EN = 0 ;
  96.      _nop_() ;
  97.      _nop_() ;
  98.      P0 = cmd ;
  99.      delayNOP() ;
  100.      LCD_EN = 1 ;
  101.      delayNOP() ;
  102.      LCD_EN = 0 ;  
  103. }

  104. /********************************************************/
  105. /*                                                               
  106. /*寫顯示數據到LCD                                                  
  107. /*RS=H,RW=L,E=高脈沖,D0-D7=數據。                              
  108. /*                                                               
  109. /********************************************************/

  110. void lcd_wdat(uchar dat)
  111. {                          
  112.     while(lcd_busy()) ;
  113.      LCD_RS = 1 ;
  114.      LCD_RW = 0 ;
  115.      LCD_EN = 0 ;
  116.      P0 = dat ;
  117.      delayNOP() ;
  118.      LCD_EN = 1 ;
  119.      delayNOP() ;
  120.      LCD_EN = 0 ;
  121. }

  122. /********************************************************/
  123. /*                                                               
  124. /*   LCD初始化設定                                                
  125. /*                                                               
  126. /********************************************************/

  127. void lcd_init()
  128. {
  129.      delay(30) ;                  
  130.      lcd_wcmd(0x38) ;       //16*2顯示,5*7點陣,8位數據
  131.      delay(5) ;
  132.      lcd_wcmd(0x38) ;         
  133.      delay(5) ;
  134.      lcd_wcmd(0x38) ;         
  135.      delay(5) ;

  136.      lcd_wcmd(0x0c) ;       //顯示開,關光標
  137.      delay(5) ;
  138.      lcd_wcmd(0x06) ;       //移動光標
  139.      delay(5) ;
  140.      lcd_wcmd(0x01) ;       //清除LCD的顯示內容
  141.      delay(5) ;
  142. }

  143. /********************************************************/
  144. /*                                                                 
  145. /*   設定顯示位置                                                  
  146. /*                                                               
  147. /********************************************************/

  148. void lcd_pos(uchar pos)
  149. {                          
  150.    lcd_wcmd(pos | 0x80) ;   //數據指針=80+地址變量
  151. }

  152. /********************************************************/
  153. /*                                                      
  154. /* LCD1602初始顯示子程序                                             
  155. /*                                                      
  156. /********************************************************/
  157. void   LCD_init_DIS()
  158. {            
  159.       delay(10) ;                  //延時
  160.       lcd_init() ;                 //初始化LCD            
  161.         
  162.       lcd_pos(0) ;                 //設置顯示位置為第一行的第1個字符
  163.       m = 0 ;
  164.       while(cdis1[m] != '\0')
  165.        {                          //顯示字符
  166.          lcd_wdat(cdis1[m]) ;
  167.          m++ ;
  168.        }

  169.       lcd_pos(0x40) ;              //設置顯示位置為第二行第1個字符
  170.       m = 0 ;
  171.       while(cdis2[m] != '\0')
  172.        {
  173.          lcd_wdat(cdis2[m]) ;       //顯示字符
  174.          m++ ;
  175.        }

  176.        delay(1000) ;                //延時        
  177.         
  178.        lcd_pos(0) ;                 //設置顯示位置為第一行的第1個字符
  179.        m = 0 ;
  180.        while(cdis3[m] != '\0')
  181.          {                         //顯示字符
  182.            lcd_wdat(cdis3[m]) ;
  183.            m++ ;
  184.          }

  185.        lcd_pos(0x40) ;              //設置顯示位置為第二行第1個字符
  186.        m = 0 ;
  187.       while(cdis4[m] != '\0')
  188.          {
  189.            lcd_wdat(cdis4[m]) ;     //顯示字符
  190.            m++ ;
  191.          }      

  192.          for(m=0 ;m<2 ;m++)
  193.            {
  194.         lcd_pos(0x0c+m) ;     //顯示方向符號
  195.               lcd_wdat(0x3e) ;
  196.      }

  197. }
  198. /********************************************************/
  199. /*
  200. /*數據轉換子程序
  201. /*
  202. /********************************************************/
  203. void   data_conv()
  204. {
  205.       data_temp1=data_temp/10 ;        //高位
  206.    if(data_temp1==0)
  207.    {data_temp1=0x20 ;}              //高位為0不顯示
  208.       else
  209.    {data_temp1=data_temp1+0x30 ;}

  210.     data_temp2=data_temp%10 ;        //低位
  211.       data_temp2=data_temp2+0x30 ;
  212. }

  213. /********************************************************/
  214. /*
  215. /*數據顯示子程序
  216. /*
  217. /********************************************************/
  218. void   data_dis()
  219. {
  220.      data_temp = snum ;         //顯示圈數
  221.      data_conv() ;
  222.         lcd_pos(0x44) ;
  223.         lcd_wdat(data_temp1) ;
  224.         lcd_pos(0x45) ;
  225.         lcd_wdat(data_temp2) ;
  226.    
  227.      data_temp = rate ;          //顯示速率
  228.      data_conv() ;
  229.         lcd_pos(0x4d) ;
  230.         lcd_wdat(data_temp1) ;
  231.         lcd_pos(0x4e) ;
  232.         lcd_wdat(data_temp2) ;
  233. }
  234. /********************************************************
  235. /*
  236. /* 顯示運行方向符號
  237. /*
  238. /********************************************************/
  239. void   motor_DR()
  240.    {
  241.         if(direction==1)            //正轉方向標志
  242.          { for(m=0 ;m<2 ;m++)
  243.            {
  244.        lcd_pos(0x0c+m) ;       //顯示方向符號
  245.              lcd_wdat(0x3e) ;
  246.       }
  247.     }
  248.          else
  249.           { for(m=0 ;m<2 ;m++)        //反轉方向標志
  250.             {
  251.            lcd_pos(0x0c+m) ;      //顯示方向符號
  252.               lcd_wdat(0x3c) ;
  253.       }
  254.     }
  255.    }

  256. /********************************************************
  257. /*
  258. /* 顯示運行狀態
  259. /*
  260. /********************************************************/
  261. void   motor_RUN()
  262. {
  263.        if(on_off==1)
  264.      { TR0=1 ;
  265.        lcd_pos(0) ;      //設置顯示位置為第一行的第1個字符
  266.           m = 0 ;
  267.           while(cdis5[m] != '\0')
  268.            { lcd_wdat(cdis5[m]) ;       //RUNNING
  269.              m++ ;    }
  270.              motor_DR() ;               //
  271.      }  
  272.        else  
  273.      { TR0=0 ; P1 =0xf0 ;
  274.     lcd_pos(0) ;      //設置顯示位置為第一行的第1個字符
  275.           m = 0 ;
  276.           while(cdis3[m] != '\0')
  277.            { lcd_wdat(cdis3[m]) ;       //STOP
  278.              m++ ;    }
  279.              motor_DR() ;               //
  280.     snum=snum1 ;              //
  281.     number1=0 ;               //清圈數計數器
  282.           }
  283.    }

  284. /********************************************************
  285. *                                                      
  286. *   主程序                                               
  287. *                                                      
  288. *********************************************************/

  289. main()
  290. {
  291.           LCD_init_DIS() ;
  292.   
  293.     TMOD = 0x01 ;        //T0定時方式1
  294.     TL0   = 0xee ;
  295.     TH0   = 0xff ;
  296.     EA    = 1 ;
  297.     ET0   = 1 ;
  298.     P1    = 0xf0 ;
  299.   
  300.     while(1)
  301.      {  
  302.         if(K1==0)
  303.      {
  304.           beep() ;
  305.        while(K1==0) ;        //等待鍵釋放
  306.        on_off=~on_off ;      
  307.           motor_RUN() ;  
  308.          }    //K1 end
  309. /********************************************************/
  310.        if(K2==0)   
  311.         {
  312.        beep() ;
  313.     if(snum_dr==1)
  314.      { snum++ ;
  315.          snum1=snum ;
  316.        if(snum==10)
  317.              { snum_dr=~snum_dr ;}
  318.      }
  319.     else  
  320.       {snum-- ;
  321.     snum1=snum ;
  322.        if(snum==1)
  323.     { snum_dr=~snum_dr ; }
  324.       }
  325.    
  326.      } //K2   end
  327. /********************************************************/
  328.          if(K3==0)   
  329.        {
  330.        beep() ;
  331.     direction=~direction ;
  332.           motor_DR() ;
  333.        }//K3 end

  334. /********************************************************/
  335.          if(K4==0)   
  336.         {
  337.        beep() ;
  338.     if(rate_dr==1)
  339.      { rate++ ;
  340.        if(rate==10)
  341.              { rate_dr=~rate_dr ;}
  342.      }
  343.      else  
  344.       {
  345.        rate-- ;
  346.        if(rate==1)
  347.     { rate_dr=~rate_dr ; }
  348.       }
  349.    } //K4 end
  350.    

  351.    
  352. /********************************************************/
  353.        if(number1==snum1)    //與設定圈數是否相等  
  354.       { number1=0 ;
  355.           on_off=0 ;
  356.           TR0=0 ;
  357.          snum=snum1 ;
  358.          P1 =0xf0 ;
  359.      motor_RUN() ;
  360.      }         
  361.           data_dis() ;
  362. }   // while(1) end
  363. }   //main end

  364. /********************************************************/
  365. /*
  366. /*   定時器 0 中斷
  367. /*
  368. /********************************************************/

  369. void   motor_onoff()   interrupt   1  
  370. {     
  371.         TL0   = 0xff ;
  372.         TH0   = 0xff ;
  373.         q++ ;
  374.      if(q < rate)
  375.          { return ; }
  376. else
  377.         { q=0 ;   
  378.         number++ ;                   //脈沖計數
  379.    
  380.          if(number==800)               //2*400個脈沖電機轉一圈
  381.            { snum-- ;
  382.             number=0 ;
  383.             number1++ ;
  384.      }           //電機轉動圈數
  385.    

  386.           if(direction==1)             //方向標志
  387.           { if(v<4)  
  388.             {P1 = FFW[v] ;v++ ;}        //取數據,正轉
  389.             if(v==4)
  390.             { v=0 ; }
  391.           }
  392.    
  393.           else
  394.           { if(v<4)  
  395.             {P1 = REV[v] ;v++ ;}        //取數據,反轉
  396.           if(v==4)
  397.             { v=0 ; }
  398.          
  399.    }
  400.   
  401.   
  402.      }
  403. }
復制代碼

以上程序本人運行正常。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩1
回復

使用道具 舉報

沙發
ID:72901 發表于 2015-1-28 12:15 | 只看該作者
不錯,值得學習
回復

使用道具 舉報

板凳
ID:68477 發表于 2015-4-12 15:07 | 只看該作者
這個不錯。
回復

使用道具 舉報

地板
ID:76929 發表于 2015-4-14 14:28 | 只看該作者
感謝分享
回復

使用道具 舉報

5#
ID:76952 發表于 2015-4-14 18:37 | 只看該作者
很有用處的帖子,先收藏了
回復

使用道具 舉報

6#
ID:81489 發表于 2015-6-15 12:25 | 只看該作者
驅動器是什么型號的
回復

使用道具 舉報

7#
ID:82813 發表于 2015-6-18 15:14 | 只看該作者
我也準備做個反饋程序用到步進電機,到時候向你請教。
回復

使用道具 舉報

8#
ID:114869 發表于 2016-4-18 14:49 | 只看該作者
好難啊
回復

使用道具 舉報

9#
ID:137360 發表于 2016-8-23 09:48 | 只看該作者
怎么1602液晶不顯示轉速和方向?????????????????????
回復

使用道具 舉報

10#
ID:235962 發表于 2017-9-27 11:02 | 只看該作者
贊一個,感謝分享
回復

使用道具 舉報

11#
ID:249545 發表于 2017-11-24 16:57 | 只看該作者
三相步進電機我買錯了2個,沒找到驅動就一直放,現在變廢鐵啦
回復

使用道具 舉報

12#
ID:274274 發表于 2018-1-29 14:52 | 只看該作者
非常好,謝謝分享!
回復

使用道具 舉報

13#
ID:320226 發表于 2019-3-17 21:26 | 只看該作者
樓主  你好單片機接到什么電器來控制電機的可以講解下下嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九久久免费视频 | 日本一级淫片免费啪啪3 | 成人一区av | 我爱操 | 99精品久久久 | 精品一区二区三区91 | 欧美成人精品在线 | 婷婷久久网 | 狠狠爱免费视频 | 国产亚洲精品综合一区 | 精品国产99 | 久久爱一区 | 久久久精彩视频 | 看片国产 | 国产精品色| 日韩成人av在线 | 天天做日日做 | 99亚洲视频 | 国产在线高清 | 亚洲中午字幕 | 欧美精品一区三区 | www.婷婷| 97av在线| 天天操夜夜操免费视频 | 国产真实乱对白精彩久久小说 | 99热.com | 成人免费在线视频 | 欧美久久久久久 | 成人在线观看免费 | 国产一二三区在线 | 色毛片 | 激情福利视频 | 一级毛片成人免费看a | 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 | 欧美精品一区久久 | 成人精品一区二区三区 | 国产天天操 | 四色成人av永久网址 | 久久亚洲一区二区三区四区 | 一区二区三区四区av | 香蕉视频黄色 |