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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

  [復(fù)制鏈接]
ID:72705 發(fā)表于 2015-1-24 16:07 | 顯示全部樓層 |閱讀模式
因為這是第一次接觸步進(jìn)電機(jī)以及電機(jī)驅(qū)動器,所以編了個簡單的程序,其實(shí)是改過來的,有興趣的朋友可以參考一下,喜歡交流的朋友也可以回帖.
這是l連接好的圖片:
我用p1口的0、1、2、3分別接驅(qū)動器的+、PU、+、DR接線端,其中PU的脈沖提供了轉(zhuǎn)速的變化,DR電平的改變決定了旋轉(zhuǎn)方向下面給出程序,大家有什么不懂的到群里討論。
  1. #include <reg51.h>        //51芯片管腳定義頭文件
  2. #include <intrins.h>   //內(nèi)部包含延時函數(shù) _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 ;        //運(yùn)行與停止
  9. sbit   K2    = P3^2 ;        //設(shè)定圈數(shù)
  10. sbit   K3    = P3^5 ;        //方向轉(zhuǎn)換
  11. sbit   K4    = P3^4 ;        //速率調(diào)整

  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 ;             //運(yùn)行與停止標(biāo)志
  17. bit   direction=1 ;          //方向標(biāo)志
  18. bit   rate_dr=1 ;            //速率標(biāo)志
  19. bit   snum_dr=1 ;            //圈數(shù)標(biāo)志

  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 ;        //預(yù)設(shè)定圈數(shù)
  28. char    rate=1 ;                //預(yù)設(shè)定速率
  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 ;                     //關(guān)閉蜂鳴器
  65.    delay(170) ;
  66. }

  67. /********************************************************/
  68. /*                                                               
  69. /*檢查LCD忙狀態(tài)                                                   
  70. /*lcd_busy為1時,忙,等待。為0時,閑,可寫指令與數(shù)據(jù)。     
  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. /*寫指令數(shù)據(jù)到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. /*寫顯示數(shù)據(jù)到LCD                                                  
  107. /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。                              
  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初始化設(shè)定                                                
  125. /*                                                               
  126. /********************************************************/

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

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

  143. /********************************************************/
  144. /*                                                                 
  145. /*   設(shè)定顯示位置                                                  
  146. /*                                                               
  147. /********************************************************/

  148. void lcd_pos(uchar pos)
  149. {                          
  150.    lcd_wcmd(pos | 0x80) ;   //數(shù)據(jù)指針=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) ;                 //設(shè)置顯示位置為第一行的第1個字符
  163.       m = 0 ;
  164.       while(cdis1[m] != '\0')
  165.        {                          //顯示字符
  166.          lcd_wdat(cdis1[m]) ;
  167.          m++ ;
  168.        }

  169.       lcd_pos(0x40) ;              //設(shè)置顯示位置為第二行第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) ;                 //設(shè)置顯示位置為第一行的第1個字符
  179.        m = 0 ;
  180.        while(cdis3[m] != '\0')
  181.          {                         //顯示字符
  182.            lcd_wdat(cdis3[m]) ;
  183.            m++ ;
  184.          }

  185.        lcd_pos(0x40) ;              //設(shè)置顯示位置為第二行第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. /*數(shù)據(jù)轉(zhuǎn)換子程序
  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. /*數(shù)據(jù)顯示子程序
  216. /*
  217. /********************************************************/
  218. void   data_dis()
  219. {
  220.      data_temp = snum ;         //顯示圈數(shù)
  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. /* 顯示運(yùn)行方向符號
  237. /*
  238. /********************************************************/
  239. void   motor_DR()
  240.    {
  241.         if(direction==1)            //正轉(zhuǎn)方向標(biāo)志
  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++)        //反轉(zhuǎn)方向標(biāo)志
  250.             {
  251.            lcd_pos(0x0c+m) ;      //顯示方向符號
  252.               lcd_wdat(0x3c) ;
  253.       }
  254.     }
  255.    }

  256. /********************************************************
  257. /*
  258. /* 顯示運(yùn)行狀態(tài)
  259. /*
  260. /********************************************************/
  261. void   motor_RUN()
  262. {
  263.        if(on_off==1)
  264.      { TR0=1 ;
  265.        lcd_pos(0) ;      //設(shè)置顯示位置為第一行的第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) ;      //設(shè)置顯示位置為第一行的第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 ;               //清圈數(shù)計數(shù)器
  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)    //與設(shè)定圈數(shù)是否相等  
  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++ ;                   //脈沖計數(shù)
  379.    
  380.          if(number==800)               //2*400個脈沖電機(jī)轉(zhuǎn)一圈
  381.            { snum-- ;
  382.             number=0 ;
  383.             number1++ ;
  384.      }           //電機(jī)轉(zhuǎn)動圈數(shù)
  385.    

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

以上程序本人運(yùn)行正常。

相關(guān)帖子

回復(fù)

使用道具 舉報

ID:72901 發(fā)表于 2015-1-28 12:15 | 顯示全部樓層
不錯,值得學(xué)習(xí)
回復(fù)

使用道具 舉報

ID:68477 發(fā)表于 2015-4-12 15:07 | 顯示全部樓層
這個不錯。
回復(fù)

使用道具 舉報

ID:76929 發(fā)表于 2015-4-14 14:28 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報

ID:76952 發(fā)表于 2015-4-14 18:37 | 顯示全部樓層
很有用處的帖子,先收藏了
回復(fù)

使用道具 舉報

ID:81489 發(fā)表于 2015-6-15 12:25 | 顯示全部樓層
驅(qū)動器是什么型號的
回復(fù)

使用道具 舉報

ID:82813 發(fā)表于 2015-6-18 15:14 | 顯示全部樓層
我也準(zhǔn)備做個反饋程序用到步進(jìn)電機(jī),到時候向你請教。
回復(fù)

使用道具 舉報

ID:114869 發(fā)表于 2016-4-18 14:49 | 顯示全部樓層
好難啊
回復(fù)

使用道具 舉報

ID:137360 發(fā)表于 2016-8-23 09:48 | 顯示全部樓層
怎么1602液晶不顯示轉(zhuǎn)速和方向?????????????????????
回復(fù)

使用道具 舉報

ID:235962 發(fā)表于 2017-9-27 11:02 | 顯示全部樓層
贊一個,感謝分享
回復(fù)

使用道具 舉報

ID:249545 發(fā)表于 2017-11-24 16:57 | 顯示全部樓層
三相步進(jìn)電機(jī)我買錯了2個,沒找到驅(qū)動就一直放,現(xiàn)在變廢鐵啦
回復(fù)

使用道具 舉報

ID:274274 發(fā)表于 2018-1-29 14:52 | 顯示全部樓層
非常好,謝謝分享!
回復(fù)

使用道具 舉報

ID:320226 發(fā)表于 2019-3-17 21:26 | 顯示全部樓層
樓主  你好單片機(jī)接到什么電器來控制電機(jī)的可以講解下下嗎
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产www在线 | 亚洲永久| 亚洲精品天堂 | 亚洲91精品 | 日韩中文一区二区三区 | 日韩在线一区二区三区 | 亚洲一区 中文字幕 | 欧美日韩久久精品 | 日韩欧美久久精品 | 成人性视频免费网站 | 久久久久国产一区二区三区四区 | 黄色精品 | 国产一区二区三区在线 | 九九热视频这里只有精品 | 欧美久久影院 | 电影午夜精品一区二区三区 | 久久亚洲综合 | 国产精品无码专区在线观看 | 亚洲精品一区二区三区丝袜 | 玩丰满女领导对白露脸hd | www.成人.com| 欧美综合久久 | 99成人精品| www免费视频 | 亚洲欧美一区二区三区国产精品 | 国产美女自拍视频 | 日本人和亚洲人zjzjhd | 国产欧美精品一区二区 | 你懂的在线视频播放 | 亚洲福利网 | 亚洲欧美视频一区 | 亚洲免费在线视频 | 香蕉久久av | 中文字幕欧美日韩一区 | 日日夜夜影院 | 亚洲精品一区二区二区 | 成人免费视频播放 | 亚洲免费在线观看 | 久久首页 | 精精久久 | 精品中文字幕久久 |