找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)步進(jìn)電機(jī)定圈轉(zhuǎn)動,正反轉(zhuǎn),速率內(nèi)部可調(diào) 源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:811317 發(fā)表于 2020-9-18 15:24 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
步進(jìn)電機(jī)定圈轉(zhuǎn)動,正反轉(zhuǎn),速率內(nèi)部可調(diào)



單片機(jī)源程序如下:
  1. /*-----------------------------------------------
  2.   名稱:步進(jìn)電機(jī)
  3.   內(nèi)容:本程序用于測試4相步進(jìn)電機(jī)常規(guī)驅(qū)動
  4.         使用1-2相勵磁
  5.         1-2相激勵功率增倍,步進(jìn)角度減半,抖動減少
  6.         順序如下 a-b-c-d  
  7. ------------------------------------------------*/
  8. #include <reg52.h>
  9. #include<intrins.h>
  10. #include<stdio.h>
  11. #include<string.h>
  12. sbit RS = P2^4;   //定義端口
  13. sbit RW = P2^5;
  14. sbit EN = P2^6;
  15. sbit A1=P1^0; //定義步進(jìn)電機(jī)連接端口
  16. sbit B1=P1^1;
  17. sbit C1=P1^2;
  18. sbit D1=P1^3;
  19. #define RS_CLR RS=0
  20. #define RS_SET RS=1
  21. #define RW_CLR RW=0
  22. #define RW_SET RW=1
  23. #define EN_CLR EN=0
  24. #define EN_SET EN=1
  25. #define DataPort P0
  26. #define KeyPort P3
  27. #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通電,其他相斷電
  28. #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通電,其他相斷電
  29. #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通電,其他相斷電
  30. #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通電,其他相斷電
  31. #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通電,其他相斷電
  32. #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通電,其他相斷電
  33. #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通電,其他相斷電
  34. #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通電,其他相斷電
  35. #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部斷電
  36. unsigned char count;
  37. unsigned char Speed;//正轉(zhuǎn)速度
  38. unsigned char Speed1;//反轉(zhuǎn)速度
  39. bit Flag;
  40. unsigned char code dofly_code[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//轉(zhuǎn)換成液晶顯示的字符

  41. /*------------------------------------------------
  42. uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
  43. unsigned char 是定義無符號字符變量,其值的范圍是
  44. 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
  45. 長度如下 T=tx2+5 uS
  46. ------------------------------------------------*/
  47. void DelayUs2x(unsigned char t)
  48. {   
  49. while(--t);
  50. }
  51. /*------------------------------------------------
  52. mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
  53. unsigned char 是定義無符號字符變量,其值的范圍是
  54. 0~255 這里使用晶振12M,精確延時請使用匯編
  55. ------------------------------------------------*/
  56. void DelayMs(unsigned char t)
  57. {
  58.      
  59. while(t--)
  60. {
  61.      //大致延時1mS
  62.      DelayUs2x(245);
  63.          DelayUs2x(245);
  64. }
  65. }
  66. /*------------------------------------------------
  67.               判忙函數(shù)
  68. ------------------------------------------------*/
  69. bit LCD_Check_Busy(void)
  70. {
  71. DataPort= 0xFF;
  72. RS_CLR;
  73. RW_SET;
  74. EN_CLR;
  75. _nop_();
  76. EN_SET;
  77. return (bit)(DataPort & 0x80);
  78. }
  79. /*------------------------------------------------
  80.               寫入命令函數(shù)
  81. ------------------------------------------------*/
  82. void LCD_Write_Com(unsigned char com)
  83. {  
  84. // while(LCD_Check_Busy()); //忙則等待
  85. DelayMs(5);
  86. RS_CLR;
  87. RW_CLR;
  88. EN_SET;
  89. DataPort=com;
  90. _nop_();
  91. EN_CLR;
  92. }
  93. /*------------------------------------------------
  94.               寫入數(shù)據(jù)函數(shù)
  95. ------------------------------------------------*/
  96. void LCD_Write_Data(unsigned char Data)
  97. {
  98. //while(LCD_Check_Busy()); //忙則等待
  99. DelayMs(5);
  100. RS_SET;
  101. RW_CLR;
  102. EN_SET;
  103. DataPort= Data;
  104. _nop_();
  105. EN_CLR;
  106. }


  107. /*------------------------------------------------
  108.                 清屏函數(shù)
  109. ------------------------------------------------*/
  110. void LCD_Clear(void)
  111. {
  112. LCD_Write_Com(0x01);
  113. DelayMs(5);
  114. }
  115. /*------------------------------------------------
  116.               寫入字符串函數(shù)
  117. ------------------------------------------------*/
  118. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  119. {     
  120. if (y == 0)
  121.         {     
  122.          LCD_Write_Com(0x80 + x);     
  123.         }
  124. else
  125.         {     
  126.         LCD_Write_Com(0xC0 + x);     
  127.         }        
  128. while (*s)
  129.         {     
  130. LCD_Write_Data( *s);     
  131. s ++;     
  132.         }
  133. }
  134. /*------------------------------------------------
  135.               寫入字符函數(shù)
  136. ------------------------------------------------*/
  137. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  138. {     
  139. if (y == 0)
  140.         {     
  141.         LCD_Write_Com(0x80 + x);     
  142.         }   
  143. else
  144.         {     
  145.         LCD_Write_Com(0xC0 + x);     
  146.         }        
  147. LCD_Write_Data( Data);  
  148. }
  149. /*------------------------------------------------
  150.               初始化函數(shù)
  151. ------------------------------------------------*/
  152. void LCD_Init(void)
  153. {
  154.    LCD_Write_Com(0x38);    /*顯示模式設(shè)置*/
  155.    DelayMs(5);
  156.    LCD_Write_Com(0x38);
  157.    DelayMs(5);
  158.    LCD_Write_Com(0x38);
  159.    DelayMs(5);
  160.    LCD_Write_Com(0x38);  
  161.    LCD_Write_Com(0x08);    /*顯示關(guān)閉*/
  162.    LCD_Write_Com(0x01);    /*顯示清屏*/
  163.    LCD_Write_Com(0x06);    /*顯示光標(biāo)移動設(shè)置*/
  164.    DelayMs(5);
  165.    LCD_Write_Com(0x0C);    /*顯示開及光標(biāo)設(shè)置*/
  166.    }

  167. /*------------------------------------------------
  168. 按鍵掃描函數(shù),返回掃描鍵值
  169. ------------------------------------------------*/
  170. unsigned char KeyScan(void)  //鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法
  171. {
  172. unsigned char cord_h,cord_l;//行列值中間變量
  173. KeyPort=0x0f;            //行線輸出全為0
  174. cord_h=KeyPort&0x0f;     //讀入列線值
  175. if(cord_h!=0x0f)    //先檢測有無按鍵按下
  176. {
  177.   DelayMs(10);        //去抖
  178.   if((KeyPort&0x0f)!=0x0f)
  179.   {
  180.     cord_h=KeyPort&0x0f;  //讀入列線值
  181.     KeyPort=cord_h|0xf0;  //輸出當(dāng)前列線值
  182.     cord_l=KeyPort&0xf0;  //讀入行線值

  183.     while((KeyPort&0xf0)!=0xf0);//等待松開并輸出

  184.     return(cord_h+cord_l);//鍵盤最后組合碼值
  185.    }
  186.   }return(0xff);     //返回該值
  187. }
  188. ///*------------------------------------------------
  189. //          按鍵值處理函數(shù),返回掃鍵值
  190. //           可以根據(jù)需要改變返回值

  191. //                          | 1 | 2 | 3 | A |  
  192. //                          | 4 | 5 | 6 | B |  
  193. //                          | 7 | 8 | 9 | C |  
  194. //                          | * | 0 | # | D |
  195. //------------------------------------------------*/

  196. unsigned char KeyPro(void)
  197. {
  198. switch(KeyScan())
  199. {
  200.   case 0x7e:return 10;break;//0 按下相應(yīng)的鍵顯示相對應(yīng)的碼值
  201.   case 0x7d:return 11;break;//1
  202.   case 0x7b:return 12;break;//2
  203.   case 0x77:return 13;break;//3
  204.   case 0xbe:return 3;break;//4
  205.   case 0xbd:return 6;break;//5
  206.   case 0xbb:return 9;break;//6
  207.   case 0xb7:return 14;break;//7
  208.   case 0xde:return 2;break;//8
  209.   case 0xdd:return 5;break;//9
  210.   case 0xdb:return 8;break;//a
  211.   case 0xd7:return 0;break;//b
  212.   case 0xee:return 1;break;//c
  213.   case 0xed:return 4;break;//d
  214.   case 0xeb:return 7;break;//e
  215.   case 0xe7:return 15;break;//f
  216.   default:return 0xff;break;
  217. }
  218. }
  219. /*------------------------------------------------
  220.                     主函數(shù)
  221. ------------------------------------------------*/
  222. main()
  223. {
  224.         unsigned int m=50;//旋轉(zhuǎn)一周時間
  225.         unsigned int k,p,i;
  226.         unsigned char num;
  227.         unsigned char temp[8];
  228.         Speed=2;//正轉(zhuǎn)速度       
  229.         Speed1=2;//反轉(zhuǎn)速度

  230.        
  231.         LCD_Init();
  232.   LCD_Write_Com(0x0F);//光標(biāo)開,光標(biāo)閃爍開
  233.   LCD_Write_String(0,0,"Press the key   ");
  234.         LCD_Write_String(0,1,"*=zheng or #=fan ");
  235.        
  236.         Coil_OFF
  237.         i=0;
  238.         while(1)
  239.         {
  240.                
  241.                 Coil_OFF
  242.                 num=KeyPro();  
  243.                
  244.                 while(num!=10)
  245.                                         {
  246.                                                 Speed++;
  247.                                                 LCD_Clear();
  248.                                          LCD_print("U=            mV");
  249.                                           sprintf(Speed,"%3f",num);
  250.                                                
  251.                                         }
  252.                                        
  253.                         if(num==15)
  254.                         {
  255.                                 DelayMs(10);
  256.                                 if(num==15)
  257.                                 {                                 
  258. //                                         LCD_Write_String(0,1,"Speed=         ");
  259. //                             sprintf(1,"%1d",1);  
  260.           LCD_Clear();
  261.                                         LCD_Write_String(0,0,"Zheng Zhuan:");
  262.                                         while(num!=14)
  263.                                         {
  264.                                                 num=KeyPro();
  265.                                                 if(num!=0xff)//如果掃描是按鍵有效值則進(jìn)行處理
  266.                                                         {
  267.                                                                 if((num==10)||(num==11)||(num==12)||(num==13)||(num==14)||(num==15))
  268.                                                                 {
  269.                                                                         LCD_Write_String(0,1,"ERR,enter * or #");
  270.                                                                         DelayMs(4000);
  271.                                                                         DelayMs(4000);
  272.                                                                         DelayMs(4000);
  273.                                                                         DelayMs(4000);
  274.                                                                         DelayMs(4000);
  275.                                                                         DelayMs(4000);
  276.                                                                         DelayMs(4000);
  277.                                                                         DelayMs(4000);
  278.                                                                         DelayMs(4000);
  279.                                                                         LCD_Write_String(0,1,"                ");
  280.                                                                         i=0;
  281.                                                                         break;
  282.                                                                 }
  283.                                                                
  284.                                                                 if(i==0)   
  285.                                                                         LCD_Write_String(0,1,"                ");//清除該行               
  286.                                                                 if(i<2)     //密碼是8位,大于8位時不再輸入按鍵值
  287.                                                                         {//num=KeyPro();
  288.                                                                                 if(num==10)
  289.                                                                         Speed++;
  290.                                                                                 temp[i]=num;
  291.                                                                                 LCD_Write_Char(i,1,num+'0');
  292.                                                                         }
  293.                                                                         i++;
  294.                                                                         if(i==2)//8位后的按鍵不輸入數(shù)值,相當(dāng)于確認(rèn)按鍵(任意按鍵即可)
  295.                                                                                 {
  296.                                                                                         LCD_Write_String(0,1,"waiting");
  297.                                                                                         i=0;  //計數(shù)器復(fù)位
  298.                                                                                         p=(temp[0]*512/*+temp[1]*100+temp[2]*10+temp[3]*/);/*****************************************************/
  299.                                                                                         for(k=0;k<p;k++)
  300.                                                                                         {          
  301.                                                                                                
  302.                                                                                                 Coil_A1      
  303.                                                                                                 DelayMs(Speed);     //遇到Coil_AB1  用{A1=1;B1=1;C1=0;D1=0;}代替
  304.                                                             //改變這個參數(shù)可以調(diào)整電機(jī)轉(zhuǎn)速 ,
  305.                               //數(shù)字越小,轉(zhuǎn)速越大,力矩越小
  306.                                                                                                 Coil_B1      
  307.                                                                                                 DelayMs(Speed);
  308.                                                                                                 Coil_C1      
  309.                                                                                                 DelayMs(Speed);
  310.                                                                                                 Coil_D1      
  311.                                                                                                 DelayMs(Speed);
  312.                                                                                         }
  313.                                                                                         p=0;
  314.                                                                                         LCD_Write_String(0,1,"                ");
  315.                                                                                 }
  316.                                                         }
  317.                                         }
  318.                                         i=0;
  319.                                 }
  320.                         }
  321.                         if(num==14)
  322.                         {
  323.                                 DelayMs(10);
  324.                                 if(num==14)
  325.                                 {
  326.                                         LCD_Clear();
  327.                                         LCD_Write_String(0,0,"Fan Zhuan:");
  328.                                         while(num!=15)
  329.                                         {
  330.                                                 num=KeyPro();
  331.                                                 if(num!=0xff)  //如果掃描是按鍵有效值則進(jìn)行處理
  332.                                                         {
  333.                                                                 if((num==10)||(num==11)||(num==12)||(num==13)||(num==15)||(num==14))
  334.                                                                 {
  335.                                                                         LCD_Write_String(0,1,"ERR,enter * or #");
  336.                                                                         DelayMs(4000);
  337.                                                                         DelayMs(4000);
  338.                                                                         DelayMs(4000);
  339.                                                                         DelayMs(4000);
  340.                                                                         DelayMs(4000);
  341.                                                                         DelayMs(4000);
  342.                                                                         DelayMs(4000);
  343.                                                                         DelayMs(4000);
  344.                                                                         DelayMs(4000);
  345.                                                                         LCD_Write_String(0,1,"                ");
  346.                                                                         i=0;
  347.                                                                         break;
  348.                                                                 }
  349.                                                                 if(i==0)    //輸入是第一個字符的時候需要把改行清空,方便觀看密碼
  350.                                                                         LCD_Write_String(0,1,"                ");//清除該行               
  351.                                                                 if(i<2)     //密碼是8位,大于8位時不再輸入按鍵值
  352.                                                                         {
  353.                                                                                 temp[i]=num;
  354.                                                                                 LCD_Write_Char(i,1,num+'0');
  355.                                                                         }
  356.                                                                         i++;
  357.                                                                         if(i==2)//8位后的按鍵不輸入數(shù)值,相當(dāng)于確認(rèn)按鍵(任意按鍵即可)
  358.                                                                                 {
  359.                                                                                         LCD_Write_String(0,1,"waiting");
  360.                                                                                         i=0;  //計數(shù)器復(fù)位
  361.                                                                                         p=(temp[0]*512/*+temp[1]*10+temp[2]*/);/*****************************************************************/
  362.                                                                                         for(k=0;k<p;k++)
  363.                                                                                         {          
  364.                                                                                                 Coil_A1      
  365.                                                                                                 DelayMs(Speed1);     //遇到Coil_AB1  用{A1=1;B1=1;C1=0;D1=0;}代替
  366.                                                                            //改變這個參數(shù)可以調(diào)整電機(jī)轉(zhuǎn)速 ,
  367.                                              //數(shù)字越小,轉(zhuǎn)速越大,力矩越小
  368.                                                                                                 Coil_D1      
  369.                                                                                                 DelayMs(Speed1);
  370.                                                                                                 Coil_C1      
  371.                                                                                                 DelayMs(Speed1);
  372.                                                                                                 Coil_B1      
  373.                                                                                                 DelayMs(Speed1);
  374.                                                                                         }
  375.                                                                                         p=0;       
  376.                                                                                         LCD_Write_String(0,1,"                ");                                                                                       
  377.                                                                                 }
  378.                                                         }
  379.                                         }
  380.                                         i=0;
  381.                                 }
  382.                         }
  383.         }

  384. }
復(fù)制代碼

以上51hei提供下載:
步進(jìn)電機(jī)LED顯示按鍵控制轉(zhuǎn)動圈數(shù),速度程序內(nèi)部可調(diào).zip (36.7 KB, 下載次數(shù): 77)

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:811317 發(fā)表于 2020-9-18 16:37 | 只看該作者
////**************單片機(jī)開發(fā)板對應(yīng)按鍵      杜邦線反接***************//
//        case 0x7e:return 1;break;//1 按下相應(yīng)的鍵顯示相對應(yīng)的碼值  按一次輸入值0-9,按兩次確定
//  case 0x7d:return 2;break;//2
//  case 0x7b:return 3;break;//3
//  case 0x77:return 15;break;//zheng zhuan
//  case 0xbe:return 4;break;//4
//  case 0xbd:return 5;break;//5
//  case 0xbb:return 6;break;//6
//  case 0xb7:return 14;break;//fan zhuan
//  case 0xde:return 7;break;//7
//  case 0xdd:return 8;break;//8
//  case 0xdb:return 9;break;//9
//  case 0xd7:return 10;break;//x
//  case 0xee:return 0;break;//0
//  case 0xed:return 11;break;//.
//  case 0xeb:return 12;break;//=
//  case 0xe7:return 13;break;//  /
//  default:return 0xff;break;
回復(fù)

使用道具 舉報

板凳
ID:624831 發(fā)表于 2021-4-27 09:51 來自手機(jī) | 只看該作者
15936083907 發(fā)表于 2020-9-18 16:37
////**************單片機(jī)開發(fā)板對應(yīng)按鍵      杜邦線反接***************//
//        case 0x7e:return 1;break ...

樓主有求原理圖
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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