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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

LCD1602液晶顯示步進電機控制的單片機程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:419893 發表于 2018-11-3 22:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
LCD1602顯示 步進電機控制器速度方向圈數可調            
*K1-啟動與停止步進電機運行;K2-設定步進電機運行圈數 (1-20圈)            
*K3-設定步進電機轉動方向;K4-設定步進電機運行速度                          
*步進電機的轉速控制分16檔,數字越小,轉速越快。                              
*7.5度步進電機;周期7.5×4=30度,電機轉動一圈需12個周                    
P1.0-P1.3接輸入ULN2003,2003輸出再接步進電機
p3.7接小喇叭提供按鍵音      
*p1.4-p1.7接端口按              


程序:
  1. #include <reg51.h>       //51芯片管腳定義頭文件
  2. #include <intrins.h>         //內部包含延時函數 _nop_();

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


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

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

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

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

  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. uchar   number=0,number1=0;
  27. uchar   snum=5,snum1=5;       //預設定圈數
  28. uchar   rate=8;               //預設定速率
  29. uchar   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;                    //關閉蜂鳴器
  65.          delay(170);
  66. }

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

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

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

  143. /********************************************************/
  144. /*                                                                 
  145. /*  設定顯示位置                                                  
  146. /*                                                               
  147. /********************************************************/

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

  152. /********************************************************/
  153. /*                                                      
  154. /* LCD1602初始顯示子程序                                             
  155. /*                                                      
  156. /********************************************************/
  157. void  LCD_init_DIS()
  158. {            
  159.      delay(10);                 //延時
  160.      lcd_init();                //初始化LCD            

  161.      lcd_pos(0);                //設置顯示位置為第一行的第1個字符
  162.      m = 0;
  163.      while(cdis1[m] != '\0')
  164.       {                         //顯示字符
  165.         lcd_wdat(cdis1[m]);
  166.         m++;
  167.       }

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

  175.       delay(3000);               //延時        

  176.       lcd_pos(0);                //設置顯示位置為第一行的第1個字符
  177.       m = 0;
  178.       while(cdis3[m] != '\0')
  179.         {                        //顯示字符
  180.           lcd_wdat(cdis3[m]);
  181.           m++;
  182.         }

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

  190.         for(m=0;m<2;m++)
  191.           {
  192.                      lcd_pos(0x0c+m);    //顯示方向符號
  193.              lcd_wdat(0x3e);
  194.                   }

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

  208.           data_temp2=data_temp%10;       //低位
  209.      data_temp2=data_temp2+0x30;
  210. }

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

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

  282. /********************************************************
  283. *                                                      
  284. *  主程序                                               
  285. *                                                      
  286. *********************************************************/

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

  332. /********************************************************/
  333.         if(K4==0)   
  334.        {
  335.              beep();
  336.                  if(rate_dr==1)
  337.                   { rate++;
  338.                     if(rate==0x10)
  339.             { rate_dr=~rate_dr;}
  340.                   }
  341.                   else  
  342.                    {
  343.                     rate--;
  344.                     if(rate==0x01)
  345.                         { rate_dr=~rate_dr; }
  346.                    }
  347.                 } //K4 end

  348. /********************************************************/
  349.       if(number1==snum1)   //與設定圈數是否相等  
  350.             { number1=0;
  351.          on_off=0;
  352.          TR0=0;
  353.                snum=snum1;
  354.                  P1 =0xf0;
  355.                   motor_RUN();
  356.            }         
  357.          data_dis();
  358.         }  // while(1) end
  359. }  //main end

  360. /********************************************************/
  361. /*
  362. /*  定時器 0 中斷
  363. /*
  364. /********************************************************/

  365. void  motor_onoff()  interrupt  1  
  366. {     
  367.        TL0  = 0x33;
  368.        TH0  = 0xf5;
  369.        q++;
  370.            if(q < rate)
  371.         { return; }
  372.            else
  373.        {  q=0;   
  374.               number++;                  //脈沖計數

  375.              if(number==96)              //96個脈沖電機轉一圈
  376.               { snum--;
  377.                     number=0;
  378.             number1++; }                 //電機轉動圈數
  379.                   

  380.          if(direction==1)            //方向標志
  381.               { if(v<8)  
  382.                 {P1 = FFW[v];v++;}       //取數據,正轉
  383.                if(v==8)
  384.                { v=0; }
  385.           }
  386.          
  387.              else
  388.               { if(v<8)  
  389.                 {P1 = REV[v];v++;}       //取數據,反轉
  390.                 if(v==8)
  391.                 { v=0; }
  392.           }
  393.            }
  394. }

  395. /********************************************************/
復制代碼




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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久99久视频| 欧美一区二区三区大片 | 亚洲高清久久 | 古典武侠第一页久久777 | 99国产精品99久久久久久粉嫩 | 免费永久av | 久久精品久久精品久久精品 | 日本精品视频一区二区 | 91人人爽 | 国产视频在线观看一区二区三区 | 久亚州在线播放 | 波多野结衣一区二区 | 国产成人精品一区二区三区网站观看 | 麻豆视频在线免费看 | 在线播放中文字幕 | 亚洲成人精品 | 欧美精品电影一区 | 久久高清免费视频 | 精品国产乱码久久久久久图片 | 婷婷色成人 | 国产精品一区二区av | 国产极品粉嫩美女呻吟在线看人 | 中文字幕 欧美 日韩 | 一级国产精品一级国产精品片 | 国产无人区一区二区三区 | 黄色在线免费观看视频 | 国产精品久久久久久久久久久免费看 | 久久久国产一区二区三区四区小说 | 成人性生交a做片 | 欧美区在线 | 中文字幕av在线播放 | 狠狠干美女 | 成人a在线观看 | 亚洲国产精品一区二区久久 | 玖草资源| 91一区二区三区在线观看 | 亚洲一区二区三区久久久 | 国产精品69毛片高清亚洲 | 国产999精品久久久久久 | 中文字幕精品一区久久久久 | 亚洲第一成年免费网站 |