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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4906|回復: 4
收起左側

51單片機驅動步進電機程序 可調圈數 默認啟動一次轉100圈

[復制鏈接]
ID:217754 發表于 2017-7-16 22:09 | 顯示全部樓層 |閱讀模式
我也是剛學。用的資料改的。我自己用來繞線做特斯拉線圈使用。默認啟動一次轉100圈。需要可以自己調。

單片機源程序如下:
  1. //download by http://down.liehuo.net
  2.    
  3. #include <reg51.h>       //51芯片管腳定義頭文件
  4. #include <intrins.h>  //內部包含延時函數 _nop_();

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


  8. uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
  9. uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};

  10. sbit  K1   = P3^2;       //運行與停止
  11. sbit  K2   = P3^3;       //設定圈數
  12. sbit  K3   = P3^4;       //方向轉換
  13. sbit  K4   = P3^5;       //速率調整
  14. sbit  BEEP = P3^6;       //蜂鳴器

  15. sbit  LCD_RS = P2^0;            
  16. sbit  LCD_RW = P2^1;
  17. sbit  LCD_EN = P2^2;

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

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

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

  28. uint   number=0,number1=0;
  29. uchar   snum=100,snum1=100;       //預設定圈數
  30. uchar   rate=2;               //預設定速率
  31. uchar   data_temp,data_temP1,data_temp2;   

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

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

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

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

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

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

  92. void lcd_wcmd(uchar cmd)

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

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

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

  124. /********************************************************/
  125. /*                                                               
  126. /*  LCD初始化設定                                                
  127. /*                                                               
  128. /********************************************************/

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

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

  145. /********************************************************/
  146. /*                                                                 
  147. /*  設定顯示位置                                                  
  148. /*                                                               
  149. /********************************************************/

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

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

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

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

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

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

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

  212.    data_temp2=data_temp%10;       //低位
  213.      data_temp2=data_temp2+0x30;
  214. }

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

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

  286. /********************************************************
  287. *                                                      
  288. *  主程序                                               
  289. *                                                      
  290. *********************************************************/

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

  336. /********************************************************/
  337.         if(K4==0)   
  338.        {
  339.       beep();
  340.    if(rate_dr==1)
  341.     { rate++;
  342.       if(rate==0x10)
  343.             { rate_dr=~rate_dr;}
  344.     }
  345.     else  
  346.      {
  347.       rate--;
  348.       if(rate==0x01)
  349.    { rate_dr=~rate_dr; }
  350.      }
  351.   } //K4 end
  352.    
  353. /********************************************************/
  354.       if(number1==snum1)   //與設定圈數是否相等  
  355.      { number1=0;
  356.          on_off=0;
  357.          TR0=0;
  358. ……………………

  359. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
步進電機 默認100圈.zip (36.36 KB, 下載次數: 61)
回復

使用道具 舉報

ID:201936 發表于 2017-7-17 08:22 | 顯示全部樓層
你好,有沒有電路圖?
回復

使用道具 舉報

ID:231077 發表于 2020-1-16 10:10 | 顯示全部樓層
學習了
回復

使用道具 舉報

ID:563570 發表于 2020-1-31 22:05 來自手機 | 顯示全部樓層
有沒有原理圖
回復

使用道具 舉報

ID:701710 發表于 2020-3-29 23:35 | 顯示全部樓層
我在CSDN也看過相同的代碼。達到預設圈數不能正常停止
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区在线播放 | 99久久夜色精品国产亚洲96 | 精品一区二区三区不卡 | 色免费视频| 日本a视频 | 久久国产视频播放 | 亚洲精品99 | 国产精品久久久久无码av | 亚洲iv一区二区三区 | 亚洲国产偷 | 日日操视频 | 国产三级| 日韩影音 | 91久久精品一区二区三区 | 国产成人精品亚洲日本在线观看 | 99精品国产一区二区三区 | 玖玖玖在线观看 | 91精品国产综合久久久久久丝袜 | 欧美成人专区 | 国产精品久久久久久av公交车 | 91大片 | 亚洲精品久久久久久国产精华液 | 亚洲国产精品激情在线观看 | a级免费黄色片 | 亚洲国产成人久久综合一区,久久久国产99 | 亚洲国产一区二区三区在线观看 | 中文字幕视频在线看 | 欧美久久精品一级黑人c片 91免费在线视频 | 日韩中文字幕视频在线 | 欧美精品1区2区3区 精品国产欧美一区二区 | 欧美精品一区在线 | 国产区久久| 欧美日韩一 | 日韩欧美综合 | 国产一区三区在线 | 精品久久久久久久人人人人传媒 | 91影院在线观看 | 亚洲综合一区二区三区 | 欧美激情在线观看一区二区三区 | 成人免费大片黄在线播放 | 精品久久电影 |