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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

遙控步進電機1602液晶顯示 原理圖和源程序分享

[復制鏈接]
跳轉到指定樓層
樓主
這個可以直接用在銑床和車床上。遙控步進電機lcd1602液晶顯示

下載:
遙控步進電機1602顯示.rar (133.63 KB, 下載次數: 51)


部分源碼預覽:

  1. /********************************************************************

  2. ***********************************************************************/

  3. #include <reg51.h>
  4. #include <intrins.h>
  5. #include "lcd1602.h"

  6. #define uchar unsigned char
  7. #define uint  unsigned int

  8. uchar LCD_ID_1[16] = {"Red Control"};
  9. uchar LCD_ID_2[16] = {"You press the:-"};

  10. void delay(uchar x);  //x*0.14MS
  11. void delay1(int ms);

  12. uchar distemp = 0;

  13. sbit IRIN = P3^3;         //紅外接收器數據線

  14. uchar IRCOM[7];

  15. sbit E=P1^2;                //1602使能引腳
  16. sbit RW=P1^1;                //1602讀寫引腳       
  17. sbit RS=P1^0;                //1602數據/命令選擇引腳




  18. unsigned char cMode = 0;
  19. unsigned char s1_num;
  20. unsigned int iSetData, iCurData;
  21. signed char RL;         // 方向
  22. signed char iSet[3];
  23. signed char iCur[3];
  24. unsigned char T0_NUM;
  25. unsigned char fx_flag;
  26. unsigned char fx_flag2 = 0;


  27. sbit MotorEn = P2^1;     // 使能
  28. sbit FX = P2^0;          // 方向
  29. sbit CLK = P2^2;         // 脈沖


  30. unsigned int gStep = 0;
  31. unsigned long gMainchong = 0;
  32. unsigned int gJd = 0;
  33. unsigned char dj_flag = 0;

  34. /********************************************************************
  35. * 名稱 : Delay()
  36. * 功能 : 延時,延時時間大概為1毫秒
  37. * 輸入 : 無
  38. * 輸出 : 無
  39. ***********************************************************************/
  40. void Delay_1ms(uint i)
  41. {
  42.         uint x,j;
  43.         for(j=0;j<i;j++)
  44.         for(x=0;x<=148;x++);       
  45. }

  46. /********************************************************************
  47. * 名稱 : delay()
  48. * 功能 : 延時,延時時間大概為140US。
  49. * 輸入 : 無
  50. * 輸出 : 無
  51. ***********************************************************************/

  52. void Delay2()
  53. {
  54.         int i,j;
  55.         for(i=0; i<=10; i++)
  56.         for(j=0; j<=2; j++)
  57.         ;
  58. }

  59. /********************************************************************
  60. * 名稱 : enable(uchar del)
  61. * 功能 : 1602命令函數
  62. * 輸入 : 輸入的命令值
  63. * 輸出 : 無
  64. ***********************************************************************/
  65. void enable(uchar del)
  66. {
  67. //        P0 = del;
  68. P2 = del;
  69.         RS = 0;
  70.         RW = 0;
  71.         E = 0;
  72.         Delay2();
  73.         E = 1;
  74.         Delay2();
  75. }

  76. /********************************************************************
  77. * 名稱 : write(uchar del)
  78. * 功能 : 1602寫數據函數
  79. * 輸入 : 需要寫入1602的數據
  80. * 輸出 : 無
  81. ***********************************************************************/

  82. void write(uchar del)
  83. {
  84. //        P0 = del;
  85. P2 = del;
  86.         RS = 1;
  87.         RW = 0;
  88.         E = 0;
  89.         Delay2();
  90.         E = 1;
  91.         Delay2();
  92. }

  93. /********************************************************************
  94. * 名稱 : L1602_init()
  95. * 功能 : 1602初始化,請參考1602的資料
  96. * 輸入 : 無
  97. * 輸出 : 無
  98. ***********************************************************************/
  99. void L1602_init(void)
  100. {
  101.         enable(0x38);
  102.         Delay_1ms(5);
  103.         enable(0x38);
  104.         Delay_1ms(5);
  105.         enable(0x38);
  106.         Delay_1ms(5);
  107.         enable(0x38);
  108.         enable(0x08);       
  109.         enable(0x0c);
  110.         enable(0x04);
  111.         enable(0x01);
  112. }

  113. /********************************************************************
  114. * 名稱 : L1602_char(uchar hang,uchar lie,char sign)
  115. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符顯示"b" ,調用該函數如下
  116.                  L1602_char(1,5,'b')
  117. * 輸入 : 行,列,需要輸入1602的數據
  118. * 輸出 : 無
  119. ***********************************************************************/
  120. void L1602_char(uchar hang,uchar lie,char sign)
  121. {
  122.         uchar a;
  123.         if(hang == 1) a = 0x80;
  124.         if(hang == 2) a = 0xc0;
  125.         a = a + lie - 1;
  126.         enable(a);
  127.         write(sign);
  128. }

  129. /********************************************************************
  130. * 名稱 : L1602_string(uchar hang,uchar lie,uchar *p)
  131. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下
  132.                   L1602_string(1,5,"ab cd ef;")
  133. * 輸入 : 行,列,需要輸入1602的數據
  134. * 輸出 : 無
  135. ***********************************************************************/
  136. void L1602_string(uchar hang,uchar lie,uchar *p)
  137. {
  138.         uchar a;
  139.         if(hang == 1) a = 0x80;
  140.         if(hang == 2) a = 0xc0;
  141.         a = a + lie - 1;
  142.         enable(a);
  143.         while(1)
  144.         {
  145.                 if(*p == '\0') break;
  146.                 write(*p);
  147.                 p++;
  148.         }
  149. }






  150. /**********************************************************/
  151. void delay(unsigned char x)    //x*0.14MS
  152. {
  153. unsigned char i;
  154.   while(x--)
  155. {
  156.   for (i = 0; i<13; i++) {}
  157. }
  158. }

  159. /**********************************************************/
  160. void delay1(int ms)
  161. {
  162. unsigned char y;
  163.   while(ms--)
  164. {
  165.   for(y = 0; y<250; y++)
  166.   {
  167.    _nop_();
  168.    _nop_();
  169.    _nop_();
  170.    _nop_();
  171.   }
  172. }
  173. }


  174. //
  175. void Ang2()          
  176. {
  177.         iCurData = gMainchong*0.9/8.0;
  178.         if(iCurData > 999)
  179.                 iCurData = 0;
  180.         write_sfm(2, 7, iCurData);
  181. }



  182. // 計算并顯示42步進電機角度
  183. void Ang3()       
  184. {
  185.         float f_ja;
  186.         unsigned char ge;
  187.         f_ja = (float)(gMainchong*0.9/8.0);
  188.         ge = ((unsigned int)(f_ja*10.0)) % 10 ;
  189. //        if(f_ja > 5)
  190. //                iCurData += 1;
  191.         write_sfm(2, 7, iCurData);
  192. }






  193. // 42步進電機左轉
  194. void left(unsigned int Speed,unsigned int road)
  195. {
  196.         //步進節拍A-D-C-B
  197.         FX = 1;
  198.         do{               
  199.                 CLK=CLK^0x01;               //   輸出脈沖
  200.                 mDelay(road);                //這里的延時就可控制轉速

  201.                 gMainchong++;       // 作為顯示角度的脈沖數         
  202.                 Ang2();          // 計算并顯示角度
  203. // 顯示方向箭頭
  204.                 switch(fx_flag)
  205.                 {
  206.                         case 0:
  207.                                 write_string(2, 13, "<");
  208.                                 break;
  209.                         case 1:
  210.                                 write_string(2, 14, "<");
  211.                                 break;
  212.                         case 2:
  213.                                 write_string(2, 15, "<");
  214.                                 break;
  215.                         case 3:
  216.                                 write_string(2, 13, "   ");
  217.                                 break;
  218.                         default:
  219.                                 break;
  220.                 }
  221.                 Speed--;
  222.         }       
  223.         while(Speed);
  224.         Ang3();          // 計算并顯示角度
  225.     MotorEn = 0; // 步進電機停止
  226.         iCurData = 0;
  227.         TR0 = 0;        // 關閉定時器
  228.         write_string(2, 13, "<<<");
  229. }




  230. // 42步進電機
  231. void right(unsigned int Speed,unsigned int road) // 脈沖數    間隔時間
  232. {
  233.         //步進節拍:A-B-C-D
  234.         FX = 0;
  235.         do{               
  236.                 CLK=CLK^0x01;               //   輸出脈沖
  237.                 mDelay(road);                //這里的延時就可控制轉速

  238.                 gMainchong++;       // 作為顯示角度的脈沖數
  239.                 Ang2();          // 計算并顯示角度

  240.                         fx_flag2++;
  241.         if(fx_flag2 >= 50)
  242.         {
  243.                  fx_flag++;
  244.                 fx_flag2 = 0;
  245.                 if(fx_flag >= 5)
  246.                         fx_flag = 0;
  247.         }
  248.                

  249. // 顯示方向箭頭
  250.                 switch(fx_flag)
  251.                 {
  252.                         case 0:
  253.                                 write_string(2, 13, ">");
  254.                                 break;
  255.                         case 1:
  256.                                 write_string(2, 14, ">");
  257.                                 break;
  258.                         case 2:
  259.                                 write_string(2, 15, ">");
  260.                                 break;
  261.                         case 3:
  262.                                 write_string(2, 13, "   ");
  263.                                 break;
  264.                         default:
  265.                                 break;
  266.                 }
  267.                 Speed--;   // 脈沖數在減小
  268.         }       
  269.         while(Speed);
  270.         Ang3();          // 計算并顯示角度
  271.         MotorEn = 0; // 步進電機停止
  272.         iCurData = 0;
  273.         TR0 = 0;        // 關閉定時器



  274.         write_string(2, 13, ">>>");
  275. }




  276. //  8細分
  277. void  RightStepAll()
  278. {
  279.         unsigned int ja = 0;

  280.         ja =  (unsigned int)((iSetData/0.9)*8.0);    // 脈沖
  281.         if(ja != 0)
  282.                 right(ja, 10);

  283. }



  284. void  LeftStepAll()
  285. {
  286.         unsigned int ja = 0;
  287.         ja =  (unsigned int)((iSetData/0.9)*8.0);    // 脈沖
  288.         if(ja != 0)
  289.         left(ja, 10);

  290. }











  291. void hw_disponse()
  292. {
  293.         if(IRCOM[2] == 0x0c)         // 功能鍵
  294.         {
  295.                 s1_num++;       
  296.                 cMode = 0;        // 功能模式
  297.                 if(s1_num ==1)          // 第1次被按下
  298.                 {
  299.                         write_com(0x80+7);          // 角度 百位
  300.                         write_com(0x0f);      // 光標閃爍
  301.                 }
  302.                 if(s1_num ==2)
  303.                 {
  304.                         write_com(0x80+8);
  305.                 }
  306.                 if(s1_num == 3)
  307.                 {
  308.                         write_com(0x80+9);
  309.                 }
  310.                 if(s1_num == 4)
  311.                 {
  312.                         write_com(0x80+13);
  313.                 }
  314.                 if(s1_num == 5)
  315.                 {
  316.                         s1_num = 0;            // 記錄按鍵清零
  317.                         cMode = 0;             // 退出模式
  318.                         write_com(0x0c);           // 取消光標閃爍
  319.                 }
  320.         }
  321.         else if(IRCOM[2] == 0x18)        // +
  322.         {
  323.                 cMode = 0;
  324.                 if(s1_num == 1)                          // 百
  325.                 {
  326.                         iSet[0]++;
  327.                         if(iSet[0] >= 10)
  328.                                 iSet[0] = 0;
  329.                         iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
  330.                         write_sfm(1, 7, iSetData);
  331.                     write_com(0x80+7);
  332.                 }
  333.                 if(s1_num == 2)
  334.                 {
  335.                         iSet[1]++;
  336.                         if(iSet[1] >= 10)
  337.                                 iSet[1] = 0;
  338.                         iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
  339.                         write_sfm(1, 7, iSetData);
  340.                     write_com(0x80+8);
  341.                 }
  342.                 if(s1_num == 3)
  343.                 {
  344.                         iSet[2]++;
  345.                         if(iSet[2] >= 10)
  346.                                 iSet[2] = 0;
  347.                         iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
  348.                         write_sfm(1, 7, iSetData);
  349.                     write_com(0x80+9);
  350.                 }
  351.                 if(s1_num == 4)          // 方向
  352.                 {
  353.                         RL++;
  354.                         if(RL > 1)
  355.                                 RL = 0;
  356.                         if(RL == 0)
  357.                                 write_string(1, 13, "R");
  358.                         else
  359.                                 write_string(1, 13, "L");
  360.                         write_com(0x80+13);
  361.                 }       
  362.         }
  363.         else if(IRCOM[2] == 0x5e)        //-
  364.         {
  365.                 cMode = 0;
  366.                 if(s1_num == 1)
  367.                 {
  368.                         iSet[0]--;
  369.                         if(iSet[0] < 0)
  370.                                 iSet[0] = 9;
  371.                         iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
  372.                         write_sfm(1, 7, iSetData);
  373.                         write_com(0x80+7);
  374.                 }
  375.                 if(s1_num == 2)
  376.                 {
  377.                         iSet[1]--;
  378.                         if(iSet[1] < 0)
  379.                                 iSet[1] = 9;
  380.                         iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
  381.                         write_sfm(1, 7, iSetData);
  382.                     write_com(0x80+8);
  383.                 }
  384.                 if(s1_num == 3)
  385.                 {
  386.                         iSet[2]--;
  387.                         if(iSet[2] < 0)
  388.                                 iSet[2] = 9;
  389.                         iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
  390.                         write_sfm(1, 7, iSetData);
  391.                         write_com(0x80+9);
  392.                 }
  393.                 if(s1_num == 4)          // 方向
  394.                 {
  395.                         RL--;
  396.                         if(RL < 0)
  397.                                 RL = 1;
  398.                         if(RL == 0)
  399.                                 write_string(1, 13, "R");
  400.                         else
  401.                                 write_string(1, 13, "L");
  402.                         write_com(0x80+13);
  403.                 }       
  404.         }
  405.         else if(IRCOM[2] == 0x08)        // 運行
  406.         {
  407.                 cMode = 0;
  408.                 gMainchong = 0;
  409.                 iCurData = 0;
  410.         //        write_sfm(2, 7, iCurData);   // 當前角度已經復位
  411.         write_sfm(2, 7, 66);
  412.                 write_string(2, 13, "   ");
  413.         //        T0_Init();

  414.                 MotorEn = 1; // added 5-30

  415.         //        TR0 = 1;       // 啟動
  416.                 if(RL == 0)    // 右轉
  417.                         RightStepAll();
  418.                 if(RL == 1)
  419.                         LeftStepAll();               
  420.         }
  421.         else
  422.         {
  423.            ;
  424.         }  


  425. }  




  426. /*******************************************************************/
  427. main()
  428. {

  429.     IE = 0x84;                 //允許總中斷中斷,使能 INT1 外部中斷
  430.     TCON = 0x10;               //觸發方式為脈沖負邊沿觸發
  431.    
  432.     IRIN=1;                    //I/O口初始化
  433.        
  434.     delay1(10);                 //延時


  435.         MotorEn = 0;     // L297 使能(只有智能,才能正常工作,否則停止)
  436.         init_1602();                             //lcd1602初始化
  437.         write_string(1, 2, "set:");
  438.         write_sfm(1,7,iSetData);
  439.         write_string(2, 2, "cur:");
  440.         write_sfm(2,7,0);
  441.         mDelay(1);
  442.         write_string(1, 13, "R");       
  443.         write_string(2, 13, ">>>");
  444.         iSetData = 0;
  445.   
  446.     while(1);

  447. } //end main
  448. /**********************************************************/
  449. void IR_IN() interrupt 2 using 0
  450. {
  451.   unsigned char j,k,N=0;
  452.      EX1 = 0;   
  453.          delay(15);
  454.          if (IRIN==1)
  455.      { EX1 =1;
  456.            return;
  457.           }
  458.                            //確認IR信號出現
  459.   while (!IRIN)            //等IR變為高電平,跳過9ms的前導低電平信號。
  460.     {delay(1);}

  461. for (j=0;j<4;j++)         //收集四組數據
  462. {
  463.   for (k=0;k<8;k++)        //每組數據有8位
  464.   {
  465.    while (IRIN)            //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
  466.      {delay(1);}
  467.     while (!IRIN)          //等 IR 變為高電平
  468.      {delay(1);}
  469.      while (IRIN)           //計算IR高電平時長
  470.       {
  471.     delay(1);
  472.     N++;           
  473.     if (N>=30)
  474.          { EX1=1;
  475.          return;}                  //0.14ms計數過長自動離開。
  476.       }                        //高電平計數完畢               
  477.      IRCOM[j]=IRCOM[j] >> 1;                  //數據最高位補“0”
  478.      if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //數據最高位補“1”
  479.      N=0;
  480.   }//end for k
  481. }//end for j
  482.    
  483.    if (IRCOM[2]!=~IRCOM[3])
  484.    { EX1=1;
  485.      goto LOOP; }

  486.    switch(IRCOM[2])
  487.    {
  488.         case 0x16:
  489.                         distemp = 0;
  490.                         break;
  491.                 case 0x0c:
  492.                         distemp = 1;
  493.                         break;
  494.                 case 0x18:
  495.                         distemp = 2;
  496.                         break;
  497.                 case 0x5e:
  498.                         distemp = 3;
  499.                         break;
  500.                 case 0x08:
  501.                         distemp = 4;
  502.                         break;
  503.                 case 0x1c:
  504.                         distemp = 5;
  505.                         break;
  506.                 case 0x5a:
  507.                         distemp = 6;
  508.                         break;
  509.                 case 0x42:
  510.                         distemp = 7;
  511.                         break;
  512.                 case 0x52:
  513.                         distemp = 8;
  514.                         break;
  515.                 case 0x4a:
  516.                         distemp = 9;
  517.                         break;
  518.    }
  519.    

  520. hw_disponse();                  



  521.     EX1 = 1;
  522.         LOOP:;
  523. }
復制代碼


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

使用道具 舉報

沙發
ID:79544 發表于 2017-6-13 16:37 | 只看該作者
樓主:你是驅動什么型號步進電機。電機的引腳怎么定義的
回復

使用道具 舉報

板凳
ID:228228 發表于 2017-8-18 10:28 | 只看該作者
下載學習下 非常感謝
回復

使用道具 舉報

地板
ID:89286 發表于 2017-8-20 20:52 | 只看該作者
thanks for sharing
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美激情国产精品 | 一级特黄网站 | 成人区精品一区二区婷婷 | 二区国产 | 久久精品国产亚洲 | 国产日产精品一区二区三区四区 | 日日操夜夜操天天操 | 国产精品成人一区二区三区 | av黄色片| 美女一级毛片 | 日本不卡一区二区三区在线观看 | 国产成人精品一区二区在线 | 成人精品影院 | 婷婷五月色综合 | 国产一区二区三区四区 | 欧美日韩免费一区二区三区 | 中文字幕国产精品 | 一级黄色录像毛片 | 久久91精品 | 国产精品久久久久久久久久久久 | 97国产精品视频 | 欧美日韩在线视频一区 | 中文在线a在线 | 日本亚洲一区 | 在线免费观看视频你懂的 | www.色五月.com| 久草免费视 | 99久久精品国产毛片 | 欧美激情99 | 欧美日韩黄色一级片 | 欧美精品一区二区三区在线播放 | 国产色99精品9i | 亚洲精品久久久久久首妖 | 欧美亚洲一区二区三区 | 国产一区二区三区色淫影院 | 热99| 亚洲日韩中文字幕一区 | 精品视频一区二区三区在线观看 | 国产中文字幕在线 | 亚洲欧美在线观看视频 | 久久精品免费看 |