找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2483|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机步进电机的程序设计(正反转,调速等功能)

[复制链接]
跳转到指定楼层
楼主
ID:103072 发表于 2016-1-25 21:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
能实现正反转,调速等功能
  1. #include <reg51.h>      
  2. #include <intrins.h>  
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

  6. unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //??
  7. unsigned char code REV[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //??
  8. //unsigned char code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //??
  9. //unsigned char code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //??
  10. sbit  K1   = P3^2;       //?????
  11. sbit  K2   = P3^3;       //????
  12. sbit  K3   = P3^4;       //????
  13. sbit  K4   = P3^5;       //????

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

  17. bit  on_off=0;            //???????
  18. bit  direction=1;         //????
  19. bit  rate_dr=1;           //????
  20. bit  snum_dr=1;           //????

  21. uchar code  cdis1[ ] = {"NO.0738230126 "};
  22. uchar code  cdis2[ ] = {"     2012/5/24"};
  23. uchar code  cdis3[ ] = {"    STOP        "};
  24. uchar code  cdis4[ ] = {"NUM:    RATE:   "};
  25. uchar code  cdis5[ ] = {"  RUNNING       "};

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

  27. uchar   number=0,number1=0;
  28. uchar   snum=20,snum1=20;       //?????
  29. uchar   rate=3;               //?????
  30. uchar   data_temp,data_temP0,data_temp2;   


  31. /********************************************************/
  32. /*                                                  
  33. /* ??t??
  34. /* 11.0592MHz??,???1ms                                    
  35. /*                                                      
  36. /********************************************************/
  37. void delay(uint t)
  38. {                           
  39.    uchar k;
  40.    while(t--)
  41.    {
  42.      for(k=0; k<124; k++)
  43.      { }
  44.    }
  45. }

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


  56. /********************************************************/
  57. /*                                                               
  58. /*??LCD???                                                   
  59. /*lcd_busy?1?,?,????0?,?,????????     
  60. /*                                                               
  61. /********************************************************/

  62. bit lcd_busy()
  63. {                          
  64.     bit result;
  65.     LCD_RS = 0;
  66.     LCD_RW = 1;
  67.     LCD_EN = 1;
  68.     delayNOP();
  69.     result = (bit)(P0&0x80);
  70.     LCD_EN = 0;
  71.     return(result);
  72. }

  73. /********************************************************/
  74. /*                                                                 
  75. /*??????LCD                                                
  76. /*RS=L,RW=L,E=???,D0-D7=????                             
  77. /*                                                               
  78. /********************************************************/

  79. void lcd_wcmd(uchar cmd)

  80. {                          
  81.    while(lcd_busy());
  82.     LCD_RS = 0;
  83.     LCD_RW = 0;
  84.     LCD_EN = 0;
  85.     _nop_();
  86.     _nop_();
  87.     P0 = cmd;
  88.     delayNOP();
  89.     LCD_EN = 1;
  90.     delayNOP();
  91.     LCD_EN = 0;  
  92. }

  93. /********************************************************/
  94. /*                                                               
  95. /*??????LCD                                                  
  96. /*RS=H,RW=L,E=???,D0-D7=???                              
  97. /*                                                               
  98. /********************************************************/

  99. void lcd_wdat(uchar dat)
  100. {                          
  101.    while(lcd_busy());
  102.     LCD_RS = 1;
  103.     LCD_RW = 0;
  104.     LCD_EN = 0;
  105.     P0 = dat;
  106.     delayNOP();
  107.     LCD_EN = 1;
  108.     delayNOP();
  109.     LCD_EN = 0;
  110. }

  111. /********************************************************/
  112. /*                                                               
  113. /*  LCD?????                                                
  114. /*                                                               
  115. /********************************************************/

  116. void lcd_init()
  117. {
  118.     delay(30);                  
  119.     lcd_wcmd(0x38);      //16*2??,5*7??,8???
  120.     delay(5);
  121.     lcd_wcmd(0x38);         
  122.     delay(5);
  123.     lcd_wcmd(0x38);         
  124.     delay(5);

  125.     lcd_wcmd(0x0c);      //???,???
  126.     delay(5);
  127.     lcd_wcmd(0x06);      //????
  128.     delay(5);
  129.     lcd_wcmd(0x01);      //??LCD?????
  130.     delay(5);
  131. }

  132. /********************************************************/
  133. /*                                                                 
  134. /*  ??????                                                  
  135. /*                                                               
  136. /********************************************************/

  137. void lcd_pos(uchar pos)
  138. {                          
  139.   lcd_wcmd(pos | 0x80);  //????=80+????
  140. }


  141. /********************************************************/
  142. /*                                                      
  143. /* LCD1602???????                                             
  144. /*                                                      
  145. /********************************************************/
  146. void  LCD_init_DIS()
  147. {            
  148.      delay(10);                 //??
  149.      lcd_init();                //???LCD            
  150.         
  151.      lcd_pos(0);                //????????????1???
  152.      m = 0;
  153.      while(cdis1[m] != '\0')
  154.       {                         //????
  155.         lcd_wdat(cdis1[m]);
  156.         m++;
  157.       }

  158.      lcd_pos(0x40);             //???????????1???
  159.      m = 0;
  160.      while(cdis2[m] != '\0')
  161.       {
  162.         lcd_wdat(cdis2[m]);      //????
  163.         m++;
  164.       }

  165.       delay(3000);               //??        
  166.         
  167.       lcd_pos(0);                //????????????1???
  168.       m = 0;
  169.       while(cdis3[m] != '\0')
  170.         {                        //????
  171.           lcd_wdat(cdis3[m]);
  172.           m++;
  173.         }

  174.       lcd_pos(0x40);             //???????????1???
  175.       m = 0;
  176.      while(cdis4[m] != '\0')
  177.         {
  178.           lcd_wdat(cdis4[m]);    //????
  179.           m++;
  180.         }      
  181.         for(m=0;m<2;m++)
  182.           {
  183.        lcd_pos(0x0c+m);    //??????
  184.              lcd_wdat(0x3e);
  185.     }

  186. }
  187. /********************************************************/
  188. /*
  189. /*???????
  190. /*
  191. /********************************************************/
  192. void  data_conv()
  193. {
  194.      data_temP0=data_temp/10;       //??
  195.   if(data_temP0==0)
  196.   {data_temP0=0x20;}             //???0???
  197.      else
  198.   {data_temP0=data_temP0+0x30;}

  199.    data_temp2=data_temp%10;       //??
  200.      data_temp2=data_temp2+0x30;
  201. }

  202. /********************************************************/
  203. /*
  204. /*???????
  205. /*
  206. /********************************************************/
  207. void  data_dis()
  208. {
  209.     data_temp = snum;        //????
  210.     data_conv();
  211.        lcd_pos(0x44);
  212.        lcd_wdat(data_temP0);
  213.        lcd_pos(0x45);
  214.        lcd_wdat(data_temp2);
  215.    
  216.     data_temp = rate;         //????
  217.     data_conv();
  218.        lcd_pos(0x4d);
  219.        lcd_wdat(data_temP0);
  220.        lcd_pos(0x4e);
  221.        lcd_wdat(data_temp2);
  222. }
  223. /********************************************************
  224. /*
  225. /* ????????
  226. /*
  227. /********************************************************/
  228. void  motor_DR()
  229.   {
  230.        if(direction==1)           //??????
  231.         { for(m=0;m<2;m++)
  232.           {
  233.       lcd_pos(0x0c+m);      //??????
  234.             lcd_wdat(0x3e);
  235.      }
  236.    }
  237.         else
  238.          { for(m=0;m<2;m++)       //??????
  239.            {
  240.           lcd_pos(0x0c+m);     //??????
  241.              lcd_wdat(0x3c);
  242.      }
  243.    }
  244.   }

  245. /********************************************************
  246. /*
  247. /* ??????
  248. /*
  249. /********************************************************/
  250. void  motor_RUN()
  251. {
  252.       if(on_off==1)
  253.     { TR0=1;
  254.       lcd_pos(0);     //????????????1???
  255.          m = 0;
  256.          while(cdis5[m] != '\0')
  257.           { lcd_wdat(cdis5[m]);      //RUNNING
  258.             m++;   }
  259.             motor_DR();              //
  260.     }  
  261.       else  
  262.     { TR0=0; P0 =0x0f;
  263.    lcd_pos(0);     //????????????1???
  264.          m = 0;
  265.          while(cdis3[m] != '\0')
  266.           { lcd_wdat(cdis3[m]);      //STOP
  267.             m++;   }
  268.             motor_DR();              //
  269.    snum=snum1;             //
  270.    number1=0;              //??????
  271.          }
  272.   }


  273. /********************************************************
  274. *                                                      
  275. *  ???                                               
  276. *                                                      
  277. *********************************************************/

  278. main()
  279. {               
  280.          LCD_init_DIS();
  281.   
  282.    TMOD = 0x01;       //T0????1
  283.    TL0  = 0x33;
  284.    TH0  = 0xf5;
  285.    EA   = 1;
  286.    ET0  = 1;
  287.    
  288.    P1=0;
  289.    while(1)
  290.     {  
  291.        if(K1==0)
  292.     {
  293.          //beep();
  294.       while(K1==0);       //?????
  295.       on_off=~on_off;      
  296.          motor_RUN();  
  297.         }   //K1 end
  298. /********************************************************/
  299.       if(K2==0)   
  300.        {
  301.         if(snum_dr==1)
  302.     { snum++;
  303.         snum1=snum;
  304.       if(snum==0x14)
  305.             { snum_dr=~snum_dr;}
  306.     }
  307.    else  
  308.      {snum--;
  309.    snum1=snum;
  310.       if(snum==0x01)
  311.    { snum_dr=~snum_dr; }
  312.      }
  313.    
  314.     } //K2  end
  315. /********************************************************/
  316.         if(K3==0)   
  317.       {
  318.    direction=~direction;
  319.          motor_DR();
  320.       }//K3 end

  321. /********************************************************/
  322.         if(K4==0)   
  323.        {
  324.    if(rate_dr==1)
  325.     { rate++;
  326.       if(rate==0x10)
  327.             { rate_dr=~rate_dr;}
  328.     }
  329.     else  
  330.      {
  331.       rate--;
  332.       if(rate==0x01)
  333.    { rate_dr=~rate_dr; }
  334.      }
  335.   } //K4 end
  336.    
  337. /********************************************************/
  338.       if(number1==snum1)   //?????????  
  339.      { number1=0;
  340.          on_off=0;
  341.          TR0=0;
  342.         snum=snum1;
  343.    P1=0x0f;
  344.     motor_RUN();
  345.     }         
  346.          data_dis();
  347. }  // while(1) end
  348. }  //main end


  349. /********************************************************/
  350. /*
  351. /*  ??? T0 ??
  352. /*
  353. /********************************************************/

  354. void  motor_onoff()  interrupt  1  
  355. {     
  356.        TL0  = 0x33;
  357.        TH0  = 0xf5;
  358.        q++;
  359.     if(q < rate)
  360.         { return; }
  361.     else
  362.        {  q=0;   
  363.        number++;                  //????
  364.         
  365.       if(number==64)              //64????????
  366.        { snum--;
  367.       number=0;
  368.             number1++; }          //??????
  369.    

  370.          if(direction==1)            //????
  371.        { if(v<8)  
  372.          {P1 = FFW[v];v++;}       //???,??
  373.         if(v==8)
  374.         { v=0; }
  375.           }
  376.    
  377.       else
  378.        { if(v<8)  
  379.          {P1 = REV[v];v++;}       //???,??
  380.          if(v==8)
  381.          { v=0; }
  382.           }
  383.     }
  384. }
复制代码


bujindianji.rar

36.43 KB, 下载次数: 51, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表