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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

BT6560步進電機控制器的51單片機程序 帶12864顯示屏(源代碼)

  [復制鏈接]
跳轉到指定樓層
樓主
ID:358930 發表于 2018-11-25 08:43 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
可做數控滑臺,能驅動4A電流,用的是4線電機,很強勁,不是那種光雕A4988能比的。這個只是單軸測試程序

制作出來的實物圖如下:


單片機源程序如下:
  1. #include <reg51.h>
  2. #include  <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define ulong  unsigned long

  6. /***************************功能定義***************************/
  7. #define LCD12864_W_COM                        0xF8        //寫指令
  8. #define LCD12864_R_COM                        0xFC        //讀指令
  9. #define LCD12864_W_DAT                        0xFA        //寫數據
  10. #define LCD12864_R_DAT                        0xFE        //讀數據
  11. #ifndef __LCD12864_H__
  12. #define __LCD12864_H__
  13. #define LCD12864_COM 0        //輸入指令
  14. #define LCD12864_DAT 1        //輸入數據
  15. #define LCD12864_CLEAR                        0x01        //清除顯示
  16. #define LCD12864_CURSOR                        0x02        //位址歸位,游標回原點
  17. #define LCD12864_CURSOR_RLF                0x04        //光標左移,整體顯示不移動
  18. #define LCD12864_CURSOR_RRF                0x06        //光標右移,整體顯示不移動
  19. #define LCD12864_CURSOR_RLN                0x05        //光標左移,整體顯示移動
  20. #define LCD12864_CURSOR_RRN                0x07        //光標右移,整體顯示移動
  21. #define LCD12864_DIS_OFF                0x08        //顯示狀態全關
  22. #define LCD12864_DIS_ON                        0x0E        //顯示狀態開
  23. #define LCD12864_DIS_CUR_ON                0x0E        //游標顯示開
  24. #define LCD12864_DIS_CURS_ON        0x0F        //游標位置顯示開
  25. #define LCD12864_CURSOR_RL                0x10        //游標左移
  26. #define LCD12864_CURSOR_RR                0x14        //游標右移
  27. #define LCD12864_CURDIS_RL                0x18        //整體顯示左移,光標跟隨
  28. #define LCD12864_CURDIS_RR                0x1C        //整體顯示又移,光標跟隨
  29. #define LCD12864_COM_BASIC                0x30        //基本指令集動作
  30. #define LCD12864_COM_PLOT_ON        0x36        //擴展指令集動作,繪圖顯示ON
  31. #define LCD12864_COM_PLOT_OFF        0x34        //擴展指令集動作,繪圖顯示OFF
  32. #define LCD12864_STAND_TO                0x31        //進入待命模式
  33. #define LCD12864_PLACE_ROLL                0x03        //允許輸入卷動位址
  34. #define LCD12864_PLACE_IRAM                0x02        //允許輸入IRAM位址
  35. #define LCD12864_REVERES_13                0x04        //選擇一、三行同時作反白顯示
  36. #define LCD12864_REVERES_24                0x05        //選擇二、四行同時作反白顯示
  37. #define LCD12864_REST_ON                0x08        //進入睡眠模式
  38. #define LCD12864_REST_OFF                0x0C        //脫離睡眠模式
  39. #define LCD12864_W_COM                        0xF8        //寫指令
  40. #define LCD12864_R_COM                        0xFC        //讀指令
  41. #define LCD12864_W_DAT                        0xFA        //寫數據
  42. #define LCD12864_R_DAT                        0xFE        //讀數據
  43. //======串口模式=======
  44. sbit LCD12864_CS = P2^7;   //片選信號輸入
  45. sbit LCD12864_STD = P2^6;  //串行數據輸入
  46. sbit LCD12864_SCLK = P2^5; //串行移位脈沖輸入
  47. sbit LCD12864_PSB = P2^4;  //串并模式選擇 0:串口,1:并口
  48. sbit LCDRST  = P2^3;
  49. unsigned char code tabe[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//查表法//0-9數字


  50. uint r=1; //步進電機速度
  51. sbit clk=P1^0;  //步進電機速度PIN

  52. sbit cw=P1^1;  //步進電機方向PIN
  53. sbit en=P1^2;  //步進電機使能PIN

  54. sbit k1=P1^4;  //
  55. sbit k2=P1^5;  //
  56. sbit k3=P1^6;  //
  57. /*******************************延時函數**********************************************/
  58. void Delay1Ms(uint t)
  59. {
  60.         uchar i;
  61.         for (;t>0;t--)
  62.                 {
  63.                 for (i=0;i<138;i++)
  64.                         {
  65.                         _nop_();_nop_();_nop_();_nop_();_nop_();
  66.                         _nop_();_nop_();_nop_();_nop_();_nop_();
  67.                         }
  68.                 }       
  69. }
  70. void Delay1s(uchar t)
  71. {
  72.         for (;t>0;t--)
  73.                 {
  74.             Delay1Ms(250);
  75.                 Delay1Ms(250);
  76.                 Delay1Ms(250);
  77.                 Delay1Ms(250);
  78.             }       
  79. }
  80. void delayus()//us微秒延時
  81. {
  82. _nop_();
  83. _nop_();
  84. _nop_();
  85. _nop_();
  86. }
  87. void Delay1000us()                //@11.0592MHz
  88. {
  89. unsigned char i, j;

  90.         _nop_();
  91.         _nop_();
  92.         _nop_();
  93.         i = 11;
  94.         j = 190;
  95.         do
  96.         {
  97.                 while (--j);
  98.         } while (--i);
  99. }
  100. /*****************************向12864寫入8位數據*************************************/
  101. void LCD12864_Wbyte(uchar byte)
  102. {
  103.         uchar i;

  104.         for(i=0;i<8;i++)
  105.                 {
  106.                 LCD12864_SCLK = 0;
  107.                 byte <<= 1;                         //左移待寫入數據,使最高位移至CY
  108.                 LCD12864_STD = CY;        //寫入一位數據
  109.                 LCD12864_SCLK = 1;
  110.                 LCD12864_SCLK = 0;   
  111.                 }
  112. }
  113. /***************************從12864讀出8位數據***返回:sdat************************************/
  114. uchar LCD12864_Rbyte(void)
  115. {
  116.      uchar i,sdat,temp1,temp2;
  117.      temp1 = 0;
  118.      temp2 = 0;
  119. //==========12864的串行數據輸出形式是D7-D6-D5-D4-0-0-0-0-D3-D2-D1-D0-0-0-0-0,故要度兩個八位整合==============
  120.      for(i=0;i<8;i++)
  121.                 {
  122.                 temp1=temp1 << 1;
  123.                 LCD12864_SCLK = 0;
  124.                 LCD12864_SCLK = 1;            
  125.                 LCD12864_SCLK = 0;
  126.                 if( LCD12864_STD )        temp1|=0x01;        //tempe1:D7-D6-D5-D4-0-0-0-0
  127.                 }
  128.      for(i=0;i<8;i++)
  129.                 {
  130.                 temp2=temp2 << 1;
  131.                 LCD12864_SCLK = 0;
  132.                 LCD12864_SCLK = 1;            
  133.                 LCD12864_SCLK = 0;
  134.                 if( LCD12864_STD ) temp2|=0x01;   //tempe2:D3-D2-D1-D0-0-0-0-0
  135.                 }
  136.         sdat = ((temp1 & 0xf0)|(temp2 >> 4));  //取出D7\D6\D5\D4\D3\D2\D1\D0                    
  137.         return sdat;  //返回一個值(sdat)
  138. }
  139. /****************************讀忙狀態**************************************/
  140. void LCD12864_busy( void )
  141. {
  142.         do        LCD12864_Wbyte( LCD12864_R_COM );                //LCD12864_RW=11111,RW(1),RS(0),0
  143.         while( LCD12864_Rbyte() & 0x80 );         //讀BF,直到BF == 0
  144. }
  145. /*************************dat_com=0寫指令,dat_com=1寫數據*****************************************/
  146. void LCD12864_W (bit dat_com,uchar byte)
  147. {
  148.         uchar temp;
  149.         if(dat_com == 0)         //為零,寫入指令
  150.                 temp = LCD12864_W_COM;        //11111,RS(0),RW(0),0
  151.         else                            //否則,寫入數據
  152.                 temp = LCD12864_W_DAT;        //11111,RS(1),RW(0),0
  153.         LCD12864_CS = 1;                //片選使能
  154.         LCD12864_busy();                //LCD忙檢測
  155.         LCD12864_Wbyte(temp);        //寫入模式選擇,指令還是數據
  156.         LCD12864_Wbyte(byte&0xf0);        //寫入字節
  157.         LCD12864_Wbyte((byte<<4)&0xf0);        //寫入字節
  158.     LCD12864_CS = 0;                //片選關閉
  159. }
  160. /****************************LCD12864初始化**************************************/

  161. void LCD12864_Init(void)
  162. {
  163.         LCDRST=1;
  164.         LCD12864_PSB = 0;        //選擇串口模式
  165.         LCD12864_W(LCD12864_COM,0x30);        //基本指令功能.
  166.         LCD12864_W(LCD12864_COM,0x03);        //允許輸入卷動位址
  167.         LCD12864_W(LCD12864_COM,0x0c);                //脫離隨眠狀態,顯示打開,關光標,反白關.
  168.         LCD12864_W(LCD12864_COM,0x01);                //清屏指令.
  169.         LCD12864_W(LCD12864_COM,0x06);        //AC自動加一,光標右移,整體顯示不移動         
  170. }
  171. /**************************LCD12864字符位置自定義顯示****************************************/
  172. void LCD12864_WPoss(uchar x,uchar y,uchar *buff)
  173. {
  174.         uchar addr,i=0;
  175.         switch (x)
  176.                 {
  177.                 case 0:addr=0x80;break;
  178.                 case 1:addr=0x90;break;
  179.                 case 2:addr=0x88;break;
  180.                 case 3:addr=0x98;break;
  181.                 }
  182.         addr=addr+y;

  183.         LCD12864_W(LCD12864_COM,LCD12864_COM_BASIC);        //8BitMCU,基本指令集合
  184.         LCD12864_W(LCD12864_COM,addr);                                        //顯示在自定義位置

  185.         while(buff[i]!='\0')
  186.                 {       
  187.                 LCD12864_W(LCD12864_DAT,buff[i++]);
  188.                 if(++y==16)
  189.                         {
  190.                         y=0;
  191.                         if(++x==4) x=0;

  192.                         switch (x)
  193.                                 {
  194.                                 case 0:addr=0x80;break;
  195.                                 case 1:addr=0x90;break;
  196.                                 case 2:addr=0x88;break;
  197.                                 case 3:addr=0x98;break;
  198.                                 }
  199.                         addr=addr+y;
  200.                         LCD12864_W(LCD12864_COM,addr);
  201.                         }
  202.        
  203.                 }
  204. }
  205. /************************顯示1 *********************************/
  206.                                                           
  207. void display1(long temp)
  208. {
  209.     uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
  210.         //temp=12345678;
  211.         temp=r;
  212.              
  213.         dt1 = temp%10;//1位
  214.         dt2 = temp%100/10;//2位
  215.         dt3 = temp%1000/100;//3位
  216.         dt4 = temp%10000/1000;//4位

  217.         dt5 = temp%100000/10000;//5位
  218.         dt6 = temp%1000000/100000;//6位
  219.         dt7 = temp%10000000/1000000;//7位
  220.         dt8 = temp/10000000;//8位             最高位  
  221.         LCD12864_WPoss(0,2,"步進電機");//第1行顯示表1
  222.         LCD12864_WPoss(1,1,"BT6560控制器");//第1行顯示表1
  223.         LCD12864_WPoss(2,0,"速度:");//第1行顯示表1
  224.     // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0寫指令  1寫數據

  225.      //LCD12864_W(1,tabe[dt8]);//6位
  226.      //LCD12864_W(1,tabe[dt7]);//5位
  227.      //LCD12864_W(1,tabe[dt6]);//4位
  228.      //LCD12864_W(1,tabe[dt5]);//3位
  229.          LCD12864_W(1,tabe[dt4]);//4位
  230.      LCD12864_W(1,tabe[dt3]);//3位
  231.          //LCD12864_W(1,0x2e);
  232.          LCD12864_W(1,tabe[dt2]);//4位
  233.      LCD12864_W(1,tabe[dt1]);//3位
  234.     // LCD12864_WPoss(2,6,"M");//第1行顯示表1
  235.    
  236. }

  237. void Disp_img(unsigned char  *img)        //圖形方式12864顯示字模221 橫向取膜
  238. {
  239.         unsigned char i,j;
  240.         unsigned int k = 0;

  241.         LCD12864_W(0,0x36); //圖形方式
  242.         for(i=0;i<32;i++)
  243.           {
  244.                 LCD12864_W(0,0x80+i);
  245.                 LCD12864_W(0,0x80);
  246.             for(j=0;j<16;j++)
  247.                 {
  248.                         LCD12864_W(1,img[k++]);
  249.                 }
  250.           }

  251.         for(i=0;i<32;i++)
  252.           {
  253.                 LCD12864_W(0,0x80+i);
  254.                 LCD12864_W(0,0x88);
  255.             for(j=0;j<16;j++)
  256.                 {
  257.                         LCD12864_W(1,img[k++]);
  258.                   }
  259.         }
  260. }
  261. void run()//步進電機運行脈沖
  262. {
  263.    uint i;

  264.    for(i=0;i<r;i++)
  265.          {
  266.           clk=0;
  267.           Delay1000us();
  268.           clk=1;
  269.           Delay1000us();
  270.          }
  271. }

  272. void keyscan() //按鍵掃描
  273. {
  274.    if(k1==0)               
  275.   {
  276.     delayus();               
  277.     if(k1==0)               
  278.      {
  279.       r++;if(r>1000)r=1000;
  280.           cw=0; //
  281.           en=0; //

  282.      }
  283.          }
  284.   
  285.     if(k2==0)               
  286.   {
  287.     delayus();            
  288.     if(k2==0)               
  289. ……………………

  290. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
128顯STC12TB6560步進電機OK1.zip (47.25 KB, 下載次數: 236)


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 回帖助人的獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:383856 發表于 2019-1-17 11:24 | 只看該作者
真的很好,并且進行了比較詳細的注釋,真給力!
回復

使用道具 舉報

板凳
ID:288930 發表于 2019-1-19 13:15 | 只看該作者
謝謝分享!
回復

使用道具 舉報

地板
ID:466655 發表于 2019-3-8 16:12 | 只看該作者
先收藏 等有積分在下載吧
回復

使用道具 舉報

5#
ID:495990 發表于 2019-3-30 15:47 | 只看該作者
樓主的程序可能有些問題,不能編譯成功HEX文件,出現一個錯誤和一個報警,沒有原理圖也不能分析原因所在,能否上傳一下原理圖讓我們分析學習一下
回復

使用道具 舉報

6#
ID:355787 發表于 2019-4-14 20:50 | 只看該作者
樓主的資料現在下載下來,工程文件已經打不開了,希望樓主解決一下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩毛片视频 | 国产精品欧美一区二区三区 | 久草视频2| 一区二区三区av夏目彩春 | 久久久夜 | 精品久久影院 | 国产日韩欧美一区二区 | 四虎影院新地址 | 91在线电影 | 成人一区二区三区 | 欧美自拍另类 | 第一区在线观看免费国语入口 | 日韩视频免费在线 | 亚洲中午字幕 | 久久蜜桃资源一区二区老牛 | 欧美伊人 | 精品视频一区二区三区四区 | 国产精品久久久久久久久久免费看 | 国产男女猛烈无遮掩视频免费网站 | 日韩福利电影 | 男女羞羞免费网站 | 日韩在线不卡 | 武道仙尊动漫在线观看 | 欧美精品一区免费 | 国产成人在线一区 | 涩爱av一区二区三区 | 在线观看亚洲 | www.男人天堂.com | 国产激情91久久精品导航 | 欧美黄页 | 精品一区av| 国产福利视频 | 91精品久久久久 | 亚洲日本三级 | 亚洲一区二区精品视频 | 丝袜 亚洲 欧美 日韩 综合 | 一二三区在线 | 99av成人精品国语自产拍 | 国产精品极品美女在线观看免费 | 亚洲一区二区不卡在线观看 | 精品国产一区二区三区性色av |