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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

步進電機正反轉調速LCD顯示實驗程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:71259 發表于 2014-12-30 01:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include <reg52.h>       //51芯片管腳定義頭文件
  2. #include <intrins.h>  //內部包含延時函數 _nop_();

  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};   //正轉相序
  6. uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};   //反轉相序

  7. sbit  K1   = P3^2;       //運行與停止
  8. sbit  K2   = P3^3;       //速率調整
  9. sbit  K3   = P3^4;       //方向轉換
  10.   
  11. sbit  BEEP = P3^6;       //蜂鳴器

  12. sbit  RS = P2^0;     //液晶管腳定義      
  13. sbit  RW = P2^1;
  14. sbit  E = P2^2;
  15. sbit  BF=P0^7;    //忙碌標志位

  16. bit  on_off=0;            //運行與停止標志
  17. bit  direction=1;         //方向標志


  18. uchar   rate=2;               //預設定速率
  19. uchar   data_temp;  

  20. uchar u=0,v=0;



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

  26. /********************************************************/
  27. /*                                                
  28. /* 延時t毫秒
  29. /* 11.0592MHz時鐘,延時約1ms                                    
  30. /*                                                     
  31. /********************************************************/
  32. void delay(uint t)
  33. {                          
  34.    uchar k;
  35.    while(t--)
  36.    {
  37.      for(k=0; k<125; k++)
  38.      { }
  39.    }
  40. }

  41. /********************************************************/
  42. void delayB(uchar x)    //x*0.14MS
  43. {
  44.    uchar i;
  45.    while(x--)
  46.    {
  47.      for (i=0; i<13; i++)
  48.      { }
  49.    }
  50. }

  51. /********************************************************/
  52. void beep()
  53. {
  54.    uchar j;
  55.    for (j=0;j<100;j++)
  56.     {
  57.      delayB(4);
  58.      BEEP=!BEEP;                 //BEEP取反
  59.     }
  60.      BEEP=1;                    //關閉蜂鳴器
  61.   delay(170);
  62. }

  63. /********************************************************/
  64. /*                                                               
  65. /*檢查LCD忙狀態                                                  
  66. /*BF為1時,忙,等待。為0時,閑,可寫指令與數據。   
  67. /*                                                              
  68. /********************************************************/

  69. bit BusyTest()
  70. {                        
  71.     bit result;
  72.     RS = 0;
  73.     RW = 1;
  74.     E= 1;
  75.   _nop_();
  76.   _nop_();
  77.     result = BF;
  78.     E = 0;
  79.     return(result);
  80. }

  81. /*****************************************************
  82. 函數功能:將模式設置指令或顯示地址寫入液晶模塊
  83. 入口參數:dictate
  84. ***************************************************/
  85. void WriteInstruction (unsigned char dictate)
  86. {  
  87.     while(BusyTest()==1); //如果忙就等待
  88.   RS=0;                  //根據規定,RS和R/W同時為低電平時,可以寫入指令
  89.   RW=0;  
  90.   E=0;                   //E置低電平(寫指令時,
  91.                              // 就是讓E從0到1發生正跳變,所以應先置"0"
  92.   _nop_();
  93.   _nop_();             //空操作兩個機器周期,給硬件反應時間
  94.   P0=dictate;            //將數據送入P0口,即寫入指令或地址
  95.   _nop_();
  96.   _nop_();
  97.   _nop_();
  98.   _nop_();               //空操作四個機器周期,給硬件反應時間
  99.   E=1;                   //E置高電平
  100.   _nop_();
  101.   _nop_();
  102.   _nop_();
  103.   _nop_();               //空操作四個機器周期,給硬件反應時間
  104.    E=0;                  //當E由高電平跳變成低電平時,液晶模塊開始執行命令
  105. }

  106. /*****************************************************
  107. 函數功能:指定字符顯示的實際地址
  108. 入口參數:x
  109. ***************************************************/
  110. void WriteAddress(unsigned char x)
  111. {
  112.      WriteInstruction(x|0x80); //顯示位置的確定方法規定為"80H+地址碼x"
  113. }

  114. /*****************************************************
  115. 函數功能:將數據(字符的標準ASCII碼)寫入液晶模塊
  116. 入口參數:y(為字符常量)
  117. ***************************************************/
  118. void WriteData(unsigned char y)
  119. {
  120.     while(BusyTest()==1);
  121.    RS=1;           //RS為高電平,RW為低電平時,可以寫入數據
  122.    RW=0;
  123.    E=0;            //E置低電平(寫指令時,,
  124.                        // 就是讓E從0到1發生正跳變,所以應先置"0"
  125.    P0=y;           //將數據送入P0口,即將數據寫入液晶模塊
  126.    _nop_();
  127.    _nop_();
  128.     _nop_();
  129.     _nop_();       //空操作四個機器周期,給硬件反應時間
  130.    E=1;          //E置高電平
  131.    _nop_();
  132.    _nop_();
  133.    _nop_();
  134.    _nop_();        //空操作四個機器周期,給硬件反應時間
  135.    E=0;            //當E由高電平跳變成低電平時,液晶模塊開始執行命令
  136. }

  137. /*****************************************************
  138. 函數功能:對LCD的顯示模式進行初始化設置
  139. ***************************************************/
  140. void LcdInt(void)
  141. {
  142.     delay(15);             //延時15ms,首次寫指令時應給LCD一段較長的反應時間
  143.     WriteInstruction (0x38);  //顯示模式設置:16×2顯示,5×7點陣,8位數據接口
  144. delay(5);   //延時5ms 
  145. WriteInstruction (0x38);
  146. delay(5);
  147. WriteInstruction (0x38); //3次寫 設置模式
  148. delay(5);
  149. WriteInstruction (0x0c);  //顯示模式設置:顯示開,無
  150. delay(5);
  151. WriteInstruction (0x06);  //顯示模式設置:光標右移,字符不移
  152. delay(5);            
  153. WriteInstruction (0x01);  //清屏幕指令,將以前的顯示內容清除
  154. delay(5);
  155. }
  156. /********************************************************/
  157. /*                                                      
  158. /* LCD1602初始顯示子程序                                            
  159. /*                                                     
  160. /********************************************************/
  161. void LcdInt_Dis()
  162. {
  163. uchar i=0;
  164. LcdInt();
  165. delay(15);
  166. WriteInstruction(0x01);
  167. delay(5);
  168. WriteAddress(0x00);
  169. delay(5);
  170. while(cdis1[i]!='\0'){
  171.   WriteData(cdis1[i]);
  172.   delay(5);
  173.   i++;
  174. }
  175. WriteAddress(0x40);
  176. delay(5);
  177. i=0;
  178.     while(cdis2[i]!='\0'){
  179.   WriteData(cdis2[i]);
  180.   delay(5);
  181.   i++;
  182. }

  183. delay(3000);
  184. WriteInstruction(0x01);   //清屏
  185. delay(5);
  186. i=0;
  187. WriteAddress(0x00);
  188. delay(5);
  189. while(cdis3[i]!='\0'){
  190.   WriteData(cdis3[i]);
  191.   delay(5);
  192.   i++;
  193. }
  194. WriteAddress(0x40);
  195. delay(5);
  196. i=0;
  197.     while(cdis4[i]!='\0'){
  198.   WriteData(cdis4[i]);
  199.   delay(5);
  200.   i++;
  201. }
  202. WriteAddress(0x0c);
  203. delay(5);
  204. for(i=0;i<2;i++)    //顯示方向符號
  205.        WriteData(0x3e);

  206. }



  207. /********************************************************/
  208. /*
  209. /*數據顯示子程序
  210. /*
  211. /********************************************************/
  212. void  data_dis()
  213. {   
  214.     data_temp = rate;         //顯示速率

  215.     WriteAddress(0x4c);
  216.     WriteData(data_temp+0x30);
  217.     delay(5);

  218. }

  219. /********************************************************
  220. /*
  221. /* 顯示運行方向符號
  222. /*
  223. /********************************************************/
  224. void  dr_dis()
  225. {
  226.    uchar i=0;
  227. WriteAddress(0x0c);      //顯示方向符號
  228.     if(direction==1)           //正轉方向標
  229. {
  230.   
  231.   for(i=0;i<2;i++){
  232.             WriteData(0x3e);
  233.    delay(5);
  234.   }
  235.    
  236.     }
  237.     else
  238.     {
  239.   for(i=0;i<2;i++){      //反轉方向標志   
  240.            WriteData(0x3c);
  241.      delay(5);
  242.   }
  243.    
  244.     }
  245. }

  246. /********************************************************
  247. /*
  248. /* 顯示運行狀態
  249. /*
  250. /********************************************************/
  251. void run_dis()
  252. {
  253. uchar i=0;
  254. if(on_off==1){
  255.   WriteAddress(0x00);
  256.   delay(5);
  257.   for(i=0;cdis5[i]!='\0';i++){
  258.    WriteData(cdis5[i]);
  259.    delay(5);
  260.   }
  261. }
  262. else{
  263.     WriteAddress(0x00);
  264.   delay(5);
  265.   for(i=0;cdis3[i]!='\0';i++){
  266.    WriteData(cdis3[i]);
  267.    delay(5);
  268.   }
  269. }
  270. }

  271. /********************************************************/
  272. /*
  273. /*步進電機正轉
  274. /*
  275. /********************************************************/
  276. void  motor_ffw()
  277. {
  278.    unsigned char i;
  279.    unsigned char  j;

  280.    for (j=0; j<8; j++)        
  281.     {              
  282.       for (i=0; i<8; i++)       //一個周期轉45度
  283.         {
  284.           P1 = FFW[i];          //取數據
  285.           delay(rate);            //調節轉速
  286.         }
  287.     }

  288. }

  289. /********************************************************/
  290. /*
  291. /*步進電機反轉
  292. /*
  293. /********************************************************/
  294. void  motor_rev()
  295. {
  296.      unsigned char i=0;
  297.   unsigned int  j=0;
  298.   for (j=0; j<8; j++)     
  299.       {

  300.         for (i=0; i<8; i++)     //一個周期轉45度
  301.         {
  302.           P1 = REV[i];          //取數據
  303.           delay(rate);            //調節轉速
  304.         }
  305.       }
  306. }  






  307. /********************************************************
  308. *                                                      
  309. *  主程序                                             
  310. *                                                     
  311. *********************************************************/

  312. void main()
  313. {
  314. LcdInt_Dis();  //液晶初始化
  315. TMOD=0X01;   //定時器T0工作方式1
  316. EA=1;      //開總中斷
  317. ET0=1;     //開T0中斷
  318. TH0=(65536-1000)/256;
  319. TL0=(65536-1000)%256; //定時1ms;
  320. TR0=1;     //啟動T0
  321. P1=0X0F;    //關閉電機
  322. while(1){
  323. /**************************************/
  324.   if(K1==0){
  325.    delay(15);   //延時消陡
  326.    if(K1==0){
  327.     on_off=~on_off;   //取反
  328.     beep();
  329.     while(K1==0);  //等待按鍵釋放
  330.       }
  331.    
  332.      }
  333.    
  334. /**************************************/
  335.   if(K2==0){
  336.    delay(15);
  337.    if(K2==0){
  338.     rate++;
  339.     if(rate==0x0a)    //若rate=10,則回到2重新開始
  340.      rate=2;
  341.     beep();
  342.     while(K2==0);
  343.    }
  344.   }

  345. /**************************************/  
  346.   if(K3==0){
  347.    delay(15);
  348.    if(K3==0){
  349.     direction=~direction;
  350.     beep();
  351.     while(K3==0);
  352.    }
  353.   }

  354. /**************************************/
  355.      data_dis();
  356.         run_dis();
  357.   dr_dis();  
  358. };

  359. }



  360. /***************************************
  361. 定時器0中斷
  362. ***************************************/
  363. void t0()   interrupt 1
  364. {
  365.     TH0=(65536-1000)/256;
  366. TL0=(65536-1000)%256;
  367. v++;
  368. if(v<rate)    //每個脈沖間隔v*1ms
  369.   return;
  370. else{
  371.   v=0;
  372.   if(on_off==1){
  373.    if(u==8)
  374.     u=0;
  375.    if(direction==1) //正轉脈沖
  376.        P1=FFW[u];
  377.    else
  378.     P1=REV[u];   //反轉脈沖
  379.    u++;
  380.    }
  381. }
  382. }

復制代碼


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

使用道具 舉報

沙發
ID:74225 發表于 2015-3-11 20:04 | 只看該作者
請問大神這段程序void delayB(uchar x)    //x*0.14MS{uchar i;   while(x--){for (i=0; i<13; i++)有什么作用呢,   還有那個TL0=0X33,TH0=0xf5和你的程序里的TH0=(65536-1000)/256;
TL0=(65536-1000)%256是一樣的嗎
回復

使用道具 舉報

板凳
ID:246189 發表于 2017-12-5 15:28 | 只看該作者
有proteus電路圖嗎?
回復

使用道具 舉報

地板
ID:246189 發表于 2017-12-5 15:33 | 只看該作者
樓主有proteus電路圖嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区av | 五月天婷婷狠狠 | 欧美精品成人影院 | 亚洲毛片在线 | 欧美成年网站 | 视频一区中文字幕 | 欧美www在线 | www国产亚洲精品久久网站 | 国产jizz女人多喷水99 | 精品在线视频播放 | 国产精品久久久久久久久免费高清 | 亚洲精久 | xxxxx免费视频 | 欧美另类视频在线 | 激情伊人网 | 日韩成人影院 | 久久精品一区 | 国产一区二区在线视频 | 男人天堂午夜 | 欧美性大战久久久久久久蜜臀 | 久久久999成人 | 9久9久9久女女女九九九一九 | 欧美精品久久久久久 | 国产毛片毛片 | 一区二区三区欧美 | 美女久久久久久久 | 蜜桃视频一区二区三区 | 青久草视频 | 国产日韩欧美在线 | 欧洲国产精品视频 | 日韩高清一区 | 久久99精品久久久久久 | 国产精品免费av | 免费在线视频a | 日韩在线免费播放 | 国产精品久久久久久 | 在线看片国产精品 | 亚洲一区二区三区桃乃木香奈 | 亚洲97| 正在播放一区二区 | 欧美午夜视频 |