<p id="5vvtt"><ruby id="5vvtt"><mark id="5vvtt"></mark></ruby></p><p id="5vvtt"></p>

    <p id="5vvtt"></p>
    <ruby id="5vvtt"><b id="5vvtt"></b></ruby>

          <ruby id="5vvtt"></ruby>

          <ruby id="5vvtt"><mark id="5vvtt"></mark></ruby>
            5
            收藏
            微博
            微信
            復制鏈接

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

            提問于
            2024-01-22 14:39

            可做數控滑臺,能驅動4A電流,用的是4線電機,很強勁,不是那種光雕A4988能比的。這個只是單軸測試程序

            制作出來的實物圖如下:
            20181125_063604.jpg 20181125_063939.jpg

            單片機源程序如下:

            1. #include
            2. #include  
            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
            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, 下載次數: 202)

            收藏 256 0 5
            粉絲
            0
            關注
            0
            主題
            3
            真的很好,并且進行了比較詳細的注釋,真給力!
            0

            回答于 · 2024-01-22 23:37

            粉絲
            0
            關注
            0
            主題
            7
            謝謝分享!
            0

            回答于 · 2024-01-23 03:14

            粉絲
            0
            關注
            0
            主題
            3
            先收藏 等有積分在下載吧
            0

            回答于 · 2024-01-23 10:59

            粉絲
            0
            關注
            0
            主題
            2
            樓主的程序可能有些問題,不能編譯成功HEX文件,出現一個錯誤和一個報警,沒有原理圖也不能分析原因所在,能否上傳一下原理圖讓我們分析學習一下
            0

            回答于 · 2024-01-23 11:23

            粉絲
            0
            關注
            0
            主題
            5
            樓主的資料現在下載下來,工程文件已經打不開了,希望樓主解決一下
            0

            回答于 · 2024-01-23 19:20

            亚洲精品免费看>>在线免费观看视频>>亚洲精品免费看