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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1478|回復: 0
收起左側

有沒有大神幫我看下這個程序?單片機控制兩個步進電機實現

[復制鏈接]
ID:525551 發表于 2019-5-1 14:04 | 顯示全部樓層 |閱讀模式
1) 可以直觀得看到到步進電機的運行軌跡,我們用了128×64LCD液晶顯示屏來直觀得顯示步進電機的實際運行軌跡。
(2) 能夠設定步進電機的運動軌跡半徑大小。
(3) 利用單片機AT89S52的控制,通過按鍵來控制步進電機的正反轉,使其能夠順時針(圓)或者逆時針(圓)運行。

(4) 隨時復位,同時做到在任意象限開始運行。
我不會幫人弄的。有沒有大神會改或者寫這個源程序。求思路

單片機源程序如下:
  1. #include "LCD12864.H"
  2. #include <math.H>
  3. #include <intrins.h>
  4. #define STEP 1                   //定義步進值
  5. #define KEY_DATA P1                        //P1口是按鍵
  6. #define KEY_NULL 0xff                //默認是高電平,按鍵按下是低電平
  7. sbit F1 = P2^0;                //控制電機1I/O口定義
  8. sbit F2 = P2^1; sbit F3 = P2^2; sbit F4 = P2^3;
  9. sbit F5 = P3^0;            //控制電機2I/O口定義
  10. sbit F6 = P3^1; sbit F7 = P3^5; sbit F8 = P3^6;        
  11. bit flag1 ; bit flag2 ;
  12. unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反轉
  13. unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //正轉
  14. char        y_start,y_end;                        //畫線的y坐標起始和終點
  15. int         x_start,x_end;                   //畫線的x坐標起始和終點
  16. /********************************************************/
  17. void  motor1_ffw()                         //電機驅動反轉
  18. { unsigned char i;
  19.       for (i=0; i<8; i++)      
  20.         { P2 = FFW[ i]&0x1f;  //取數據
  21.           delay(1000);           }
  22. }
  23. void  motor1_ffz()                         //電機驅動正轉
  24. { unsigned char i;
  25.       for (i=0; i<8; i++)       //一個周期轉30度
  26.        { P2 = FFZ[ i]&0x1f;   //取數據
  27.          delay(1000);           }
  28. }
  29. void  motor2_ffw()                         //電機驅動反轉
  30. {   F5=1;F6=1;F7=1;F8=0;                   delay(1000);
  31.                      F5=1;F6=1;F7=0;F8=0;                  delay(1000);
  32.                      F5=1;F6=1;F7=0;F8=1;                  delay(1000);
  33.                      F5=1;F6=0;F7=0;F8=1;                  delay(1000);
  34.                      F5=1;F6=0;F7=1;F8=1;                  delay(1000);
  35.                      F5=0;F6=0;F7=1;F8=1;                  delay(1000);
  36.                      F5=0;F6=1;F7=1;F8=1;                  delay(1000);
  37.                      F5=0;F6=1;F7=1;F8=0;   delay(1000);           
  38.   }
  39. void  motor2_ffz()                          //電機驅動正轉
  40.   {  F5=0;F6=1;F7=1;F8=0;         delay(1000);
  41.              F5=0;F6=1;F7=1;F8=1;         delay(1000);
  42.              F5=0;F6=0;F7=1;F8=1;         delay(1000);
  43.              F5=1;F6=0;F7=1;F8=1;         delay(1000);
  44.              F5=1;F6=0;F7=0;F8=1;         delay(1000);
  45.              F5=1;F6=1;F7=0;F8=1;         delay(1000);
  46.              F5=1;F6=1;F7=0;F8=0;         delay(1000);
  47.             F5=1;F6=1;F7=1;F8=0;         delay(1000);
  48.   }
  49. void xiangxian1ni()
  50. { int x0,j,f, y0,y1; x0=20;y0=20 ; y1=0; j=x0+y0; f=0;
  51.            y_start=32;y_end=y_start;                          x_start=43 ;x_end=x_start;                    
  52. do {         x_start=x_end;                          y_start=y_end;                  
  53.        if (f>=0)         
  54.           {  motor1_ffw();                        flag2=0;                        delay(10000);                        
  55.                    x_end=x_end+STEP;                  y_end=y_end;
  56.                                    GUI_Line(x_start,y_start,x_end,y_end,1);
  57.                                    f=f-2*x0+1;                         x0=x0-1;                         delay(10000);                         }
  58.                else
  59.                         {                 motor2_ffz();                flag1=0;                delay(10000);
  60.                           x_end=x_end;                   y_end=y_end+STEP;
  61.                           GUI_Line(x_start,y_start,x_end,y_end,1);
  62.                           f=f+2*y1+1;                   y1=y1+1;                   delay(10000);                   }
  63.           j=j-1;                        }
  64.    while (j!=0);
  65.   }
  66. void xiangxian2ni()
  67. {  int x0,x1, j,f,  y1; x0=20;x1=0; y1=20; j=x0+y1; f=0;
  68.    y_start=53;y_end=y_start;           x_start=64;x_end=x_start;        
  69.    do {  x_start=x_end;                   y_start=y_end;                flag1=1; flag2=1;
  70.       if (f>=0)
  71.                {                 motor2_ffw();                         flag1=0;                         delay(10000);
  72.                                  x_end=x_end;                  y_end=y_end-STEP;
  73.                           GUI_Line(x_start,y_start,x_end,y_end,1);
  74.                                  f=f-2*y1+1;                         y1=y1-1;                         delay(10000);                        }
  75.                else {                  motor1_ffw();                 flag2=0;                  delay(10000);
  76.                                     x_end=x_end+STEP;                   y_end=y_end;
  77.                             GUI_Line(x_start,y_start,x_end,y_end,1);
  78.                            f=f+2*x1+1;                   x1=x1+1;                        delay(10000); }
  79.             j=j-1;                        }
  80.    while (j!=0);
  81. }
  82. void xiangxian3ni()
  83. {   int x0,y0,  j,f, y1; x0=20; y1=20;y0=0; j=x0+y1; f=0;
  84.    y_start=32;y_end=y_start;                   x_start=85;x_end=x_start;               
  85.    do    {  x_start=x_end;                 y_start=y_end;                flag1=1; flag2=1;
  86.    if (f>=0)
  87.                   {  motor1_ffz();                  flag2=0;                         delay(10000);
  88.                                    x_end=x_end-STEP;                y_end=y_end;
  89.                                    GUI_Line(x_start,y_start,x_end,y_end,1);
  90.                                    f=f-2*x0+1;                         x0=x0-1;                         delay(10000);                          }
  91.                else
  92.                          {  motor2_ffw();                  flag1=0;                  delay(10000);
  93.                            x_end=x_end;                 y_end=y_end-STEP;
  94.            GUI_Line(x_start,y_start,x_end,y_end,1);
  95.                            f=f+2*y0+1;                  y0=y0+1;                  delay(10000); }
  96.                                    j=j-1;                        }
  97.    while (j!=0);
  98. }
  99. void xiangxian4ni()
  100. { int x0,x1, j,f,  y1; x0=20;x1=0; y1=20; j=x0+y1; f=0;
  101.    y_start=11;y_end=y_start;           x_start=64;x_end=x_start;               
  102.    do    { x_start=x_end;                y_start=y_end;         flag1=1; flag2=1;
  103.        if (f>=0)
  104.                   {                motor2_ffz();                        flag1=0;                        delay(10000);
  105.                                   x_end=x_end;                 y_end=y_end+STEP;
  106.                         GUI_Line(x_start,y_start,x_end,y_end,1);
  107.                                 f=f-2*y1+1;                        y1=y1-1;                        delay(10000);        }
  108.              else
  109.                         { motor1_ffz();        flag2=0;        delay(10000);                 
  110. x_end=x_end-STEP;          y_end=y_end;
  111.                          GUI_Line(x_start,y_start,x_end,y_end,1);
  112.                          f=f+2*x1+1;                x1=x1+1;                delay(10000);                }
  113.            j=j-1;                }
  114.    while (j!=0);  
  115. }
  116. void xiangxian1shun()
  117. {  int x0,x1, j,f,  y1; x0=20;x1=0; y1=20; j=x0+y1; f=0;
  118.    y_start=53;y_end=y_start;                x_start=64;x_end=x_start;
  119.    do   { x_start=x_end;        y_start=y_end;        flag1=1; flag2=1;
  120.        if (f>=0)
  121.                  { motor2_ffw();                flag1=0;        delay(10000);
  122.                                   x_end=x_end;                y_end=y_end-STEP;
  123.                           GUI_Line(x_start,y_start,x_end,y_end,1);
  124.                                   f=f-2*y1+1; y1=y1-1; delay(10000);                        }
  125.            else
  126.                        {                 motor1_ffz();                flag2=0;        delay(10000);
  127.                          x_end=x_end-STEP;                y_end=y_end;
  128.                          GUI_Line(x_start,y_start,x_end,y_end,1);
  129.                          f=f+2*x1+1;                x1=x1+1;        delay(10000);                }
  130.             j=j-1;                        }
  131.    while (j!=0);
  132.    }
  133. void xiangxian4shun()
  134. {  int x0,j,f, y0,y1; x0=20;y0=20 ; y1=0; j=x0+y0; f=0;
  135.    y_start=32;y_end=y_start;           x_start=43 ;x_end=x_start;
  136.    do   { x_start=x_end;                 y_start=y_end;         flag1=1; flag2=1;
  137.        if (f>=0)
  138.                     {                        motor1_ffw();                 flag2=0;        delay(10000);
  139.                                     x_end=x_end+STEP;                y_end=y_end;
  140.                                     GUI_Line(x_start,y_start,x_end,y_end,1);
  141.                                     f=f-2*x0+1;                x0=x0-1;                delay(10000);                         }
  142.                else
  143.                           {                 motor2_ffw();flag1=0;                 delay(10000);
  144.                           x_end=x_end;                y_end=y_end-STEP;
  145.                           GUI_Line(x_start,y_start,x_end,y_end,1);   
  146.                           f=f+2*y1+1; y1=y1+1;                 delay(10000);                   }
  147.             j=j-1;                        }
  148.    while (j!=0);
  149.    }
  150. void xiangxian3shun()
  151. {  int x0,x1, j,f,  y1; x0=20;x1=0; y1=20; j=x0+y1; f=0;
  152.    y_start=11;y_end=y_start;                  x_start=64;x_end=x_start;
  153.    do  {  x_start=x_end;                 y_start=y_end;         flag1=1; flag2=1;
  154.        if (f>=0)
  155.                    {                 motor2_ffz();                flag1=0;                delay(10000);
  156.                                      x_end=x_end;                y_end=y_end+STEP;
  157.                                      GUI_Line(x_start,y_start,x_end,y_end,1);  
  158.                                      f=f-2*y1+1;                         y1=y1-1;                         delay(10000);                  }
  159.               else
  160.                         {   motor1_ffw();                flag2=0;        delay(10000);
  161.                              x_end=x_end+STEP;                y_end=y_end;
  162.                              GUI_Line(x_start,y_start,x_end,y_end,1);  
  163.                             f=f+2*x1+1;                x1=x1+1;         delay(10000);                 }
  164.             j=j-1;                        }
  165.    while (j!=0);
  166.    }
  167. void xiangxian2shun()
  168. {   int x0,j,f, y0,y1; x0=20;y0=20 ; y1=0; j=x0+y0; f=0;
  169.     y_start=32;y_end=y_start;         x_start=85;x_end=x_start;
  170.    do {  x_start=x_end;                 y_start=y_end;         flag1=1;        flag2=1;
  171.        if (f>=0)
  172.                    {                 motor1_ffz();        flag2=0;        delay(10000);
  173.                                   x_end=x_end-STEP; y_end=y_end;                          
  174.                                   GUI_Line(x_start,y_start,x_end,y_end,1);  
  175.                                   f=f-2*x0+1;                        x0=x0-1;                delay(10000);                          }
  176.               else
  177.                         {                 motor2_ffz();                flag1=0;                delay(10000);
  178.                           x_end=x_end;                 y_end=y_end+STEP;
  179.                           GUI_Line(x_start,y_start,x_end,y_end,1);   
  180.                           f=f+2*y1+1;         y1=y1+1;        delay(10000);                   }
  181.             j=j-1;                        }
  182.    while (j!=0);
  183.    }
  184. //*********************************************************************************************
  185. //說明:程序主函數
  186. //*********************************************************************************************
  187. void main()
  188. {
  189.         /***********************液晶初始化***************************/
  190.         Display_Init();                                                                                       
  191.         GUI_Fill_GDRAM(0x00);                                                                        
  192.         GUI_Line(0,32,127,32,1);
  193.         GUI_Line(0,32,4,30,1);
  194.         GUI_Line(0,32,4,34,1);
  195.         GUI_Line(64,0,64,63,1);
  196.         GUI_Line(62,60,64,63,1);
  197.         GUI_Line(66,60,64,63,1);
  198.         KEY_DATA=KEY_NULL;                  
  199.         while(1)
  200.         {  
  201. delay(1000);         
  202.                          switch(KEY_DATA)
  203.                         {
  204.                          case 0xfe:        
  205.                          xiangxian1ni();
  206.                                         KEY_DATA=0xff;        
  207.                                         break;
  208.                                 case 0xfd:        
  209.                                         xiangxian2ni();
  210.                                         KEY_DATA=0xff;
  211.                                         break;
  212.                                 case 0xfb:               
  213.                                         xiangxian3ni();
  214.                                         KEY_DATA=0xff;        
  215.                                         break;
  216.                                 case 0xf7:               
  217.                                         xiangxian4ni();
  218.                                         KEY_DATA=0xff;               
  219.                                         break;
  220.                                 case 0xef:        
  221.                                         xiangxian1shun();
  222.                                         KEY_DATA=0xff;               
  223.                                         break;
  224.                                 case 0xdf:               
  225.                                         xiangxian4shun();
  226.                                         KEY_DATA=0xff;               
  227.                                         break;
  228.                                         case 0xbf:        
  229.                                         xiangxian3shun();
  230.                                         KEY_DATA=0xff;               
  231.                                         break;
  232.                                         case 0x7f:               
  233.                                         xiangxian2shun();
  234.                                         KEY_DATA=0xff;               
  235.                                         break;
  236.                                 default:
  237.                                         break; }
  238. }
  239. }
  240. 第二部分,調用LCD液晶屏程序部分:
  241. #include "LCD12864.h"                        //包含液晶端口定義的頭文件
  242. //********************************************************
  243. //延時函數
  244. //********************************************************
  245. void delay(unsigned int k)
  246. {  
  247.         unsigned int i;        unsigned char j;
  248.         for(i=0;i<k;i++)
  249.         {
  250.                 for(j=0;j<10;j++);
  251.         }
  252. }
  253. //********************************************************
  254. //延時1ms函數
  255. //********************************************************
  256. void delay_ms(unsigned int k)        //延時0.994us,晶振12M
  257. {
  258.     unsigned int x,y;
  259.     for(x=k;x>0;x--)
  260.         for(y=121;y>0;y--);
  261. }
  262. //********************************************************
  263. //寫命令函數
  264. //********************************************************
  265. void LcdWcom(unsigned char WCom)
  266. {
  267.           delay(1);
  268.           RS=0;                                                //指明操作對象為指令寄存器
  269.           RW=0;                                                //指明為寫操作
  270.           E=1;
  271.           lcd_data=WCom;                        //將命令寫入總線
  272.           E=0;
  273. }
  274. //********************************************************
  275. //寫數據函數
  276. //********************************************************               
  277. void LcdWdata(unsigned char WData)
  278. {
  279.           delay(1);
  280.           RS=1;                                                //指明操作對象為數據寄存器
  281.           RW=0;                                                //指明為寫操作
  282.           E=1;
  283.           lcd_data=WData;                        //將數據寫入總線
  284.           E=0;
  285. }
  286. //********************************************************
  287. //顯示初始化函數
  288. //********************************************************
  289. void Display_Init(void)
  290. {
  291.         delay_ms(45);                                //延時45ms
  292.         RST=1;
  293.         delay(1);
  294.         RST=0;
  295.         delay(1);
  296.         RST=1;
  297.         delay(1);        
  298.         LcdWcom(0x30);                                //設置為8位并行口,基本指令集
  299.         delay(10);
  300.         LcdWcom(0x30);                                //再次設置為8位并行口,基本指令集
  301.         delay(5);
  302.         LcdWcom(0x01);        
  303.         delay_ms(12);                                //延時12ms
  304.         LcdWcom(0x06);                                 //設置為游標右移,DDRAM位地址加1,畫面不移動
  305.         delay(5);
  306.         LcdWcom(0x0C);                                //開顯示
  307. }
  308. //********************************************************
  309. //讀數據函數
  310. //********************************************************
  311. unsigned char LcdRdata(void)
  312. {
  313.         unsigned char LcdData;
  314.         lcd_data=0xff;                                        //釋放數據線
  315.         RW=1;                                                        //指明為讀操作
  316.         RS=1;                                                        //指明操作對象為數據寄存器
  317.         E=1;
  318.         delay(1);
  319.         LcdData = lcd_data;                                //讀取數據線上的數據
  320.         E=0;
  321.         return (LcdData);         
  322. }
  323. //********************************************************
  324. //填充GDRAM數據:
  325. //參數:dat為填充的數據
  326. //********************************************************
  327. void GUI_Fill_GDRAM(unsigned char dat)
  328. {
  329.         unsigned char i;          unsigned char j;        unsigned char k;
  330.         unsigned char bGDRAMAddrX = 0x80;                //GDRAM水平地址
  331.         unsigned char bGDRAMAddrY = 0x80;                //GDRAM垂直地址
  332.         for(i = 0; i < 2; i++)                                                                                                                                 
  333.         {
  334.                 for(j = 0; j < 32; j++)                                                                 
  335.                 {
  336.                         for(k = 0; k < 8; k++)                                                         
  337.                         {
  338.                                 LcdWcom(0x34);                                //設置為8位MPU接口,擴充指令集,繪圖模式關
  339.                                 LcdWcom(bGDRAMAddrY+j);                //垂直地址Y                                                                        
  340.                                 LcdWcom(bGDRAMAddrX+k);                //水平地址X
  341.                                 LcdWdata(dat);
  342.                                 LcdWdata(dat);                        }
  343.                 }
  344.                 bGDRAMAddrX = 0x88;                                                                                                                                         
  345.         }
  346.         LcdWcom(0x36);                                                        //打開繪圖模式
  347.         LcdWcom(0x30);                                                        //恢復基本指令集,關閉繪圖模式   
  348. }
  349. //********************************************************
  350. //打點函數
  351. //參數:color=1,該點填充1;color=0,該點填充白色0;
  352. //********************************************************
  353. void GUI_Point(unsigned char x,unsigned char y,unsigned char color)
  354. {     
  355.         unsigned char x_Dyte,x_byte;                                //定義列地址的字節位,及在字節中的哪1位
  356.         unsigned char y_Dyte,y_byte;                                //定義為上下兩個屏(取值為0,1),行地址(取值為0~31)
  357.         unsigned char GDRAM_hbit,GDRAM_lbit;
  358.         LcdWcom(0x36);                                                                //擴展指令命令
  359.         x_Dyte=x/16;                                                                //計算在16個字節中的哪一個
  360.         x_byte=x&0x0f;                                                                //計算在該字節中的哪一位
  361.         y_Dyte=y/32;                                                                //0為上半屏,1為下半屏
  362.         y_byte=y&0x1f;                                                                //計算在0~31當中的哪一行
  363.         LcdWcom(0x80+y_byte);                                                //設定行地址(y坐標),即是垂直地址
  364.         LcdWcom(0x80+x_Dyte+8*y_Dyte);                                //設定列地址(x坐標),并通過8*y_Dyte選定上下屏,即是水平地址
  365.         LcdRdata();                                                                        //預讀取數據
  366.         GDRAM_hbit=LcdRdata();                                                //讀取當前顯示高8位數據
  367.         GDRAM_lbit=LcdRdata();                                                //讀取當前顯示低8位數據
  368.         delay(1);
  369.         LcdWcom(0x80+y_byte);                                                //設定行地址(y坐標)
  370.         LcdWcom(0x80+x_Dyte+8*y_Dyte);                                //設定列地址(x坐標),并通過8*y_Dyte選定上下屏
  371.         delay(1);
  372.         if(x_byte<8)                                                                                //判斷其在高8位,還是在低8位
  373.         {
  374.                 if(color==1)
  375.                 {
  376.                         LcdWdata(GDRAM_hbit|(0x01<<(7-x_byte)));        //置位GDRAM區高8位數據中相應的點
  377.                 }
  378.                 else
  379.                         LcdWdata(GDRAM_hbit&(~(0x01<<(7-x_byte))));        //清除GDRAM區高8位數據中相應的點        
  380.                 LcdWdata(GDRAM_lbit);                                                        //顯示GDRAM區低8位數據
  381.         }
  382.         else
  383.         {
  384.                 LcdWdata(GDRAM_hbit);
  385.                 if(color==1)
  386.                         LcdWdata(GDRAM_lbit|(0x01<<(15-x_byte)));        //置位GDRAM區高8位數據中相應的點
  387.                 else
  388.                         LcdWdata(GDRAM_lbit&(~(0x01<<(15-x_byte))));//清除GDRAM區高8位數據中相應的點        
  389.         }
  390.         LcdWcom(0x30);                                                                                //恢復到基本指令集
  391. }
  392. //**************************************************************
  393. //畫水平線函數
  394. //參數:color=1,填充1;color=0,填充0;
  395. //                x0,x1為起始和終點的水平坐標值,y為垂直坐標值
  396. //**************************************************************
  397. void GUI_HLine(unsigned char x0, unsigned char x1, unsigned char y, unsigned char color)
  398. {  
  399.         unsigned char  bak;
  400.         if(x0>x1)                                                         // 對x0、x1大小進行排列,以便畫圖
  401.         {  
  402.                 bak = x1;
  403.                 x1 = x0;
  404.                 x0 = bak;
  405.         }
  406.           do
  407.         {  
  408.                 GUI_Point(x0, y, color);                // 從左到右逐點顯示,描出垂直線
  409.                 x0++;
  410.         }while(x1>=x0);
  411. }
  412. //********************************************************
  413. //畫豎直線函數
  414. //參數:color=1,填充黑色1;color=0,填充0;
  415. //                x為起始和終點的水平坐標值,y0,y1為垂直坐標值
  416. //********************************************************
  417. void GUI_RLine(unsigned char x, unsigned char y0, unsigned char y1, unsigned char color)
  418. {  
  419.         unsigned char  bak;
  420.         if(y0>y1)                                                         // 對y0、y1大小進行排列,以便畫圖
  421.         {  
  422.                 bak = y1;
  423.                 y1 = y0;
  424.                 y0 = bak;
  425.         }
  426.         do
  427.         {  
  428.                 GUI_Point(x, y0, color);                // 從上到下逐點顯示,描出垂直線
  429.                 y0++;
  430.         }while(y1>=y0);
  431. }
  432. //********************************************************
  433. //任意兩點畫直線函數
  434. //參數:color=1,該線填充1;color=0,該線填充0;
  435. //                x0:直線起點的x坐標值,y0:直線起點的y坐標值
  436. //                x1:直線終點的x坐標值,y1:直線終點的y坐標值
  437. //********************************************************
  438. void GUI_Line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char color)
  439. {  
  440.         char dx;                                                        // 直線x軸差值變量
  441.         char dy;                                                        // 直線y軸差值變量
  442.         char dx_sym;                                                // x軸增長方向,為-1時減值方向,為1時增值方向
  443.         char dy_sym;                                                // y軸增長方向,為-1時減值方向,為1時增值方向
  444.         char dx_x2;                                                        // dx*2值變量,用于加快運算速度
  445.         char dy_x2;                                                        // dy*2值變量,用于加快運算速度
  446.         char di;                                                        // 決策變量
  447.            if(x0==x1)                                                                        //判斷是否為垂直線
  448.         {
  449.                 GUI_RLine(x0,y0,y1,color);                                //畫垂直線
  450.                 return;
  451.         }
  452.         if(y0==y1)                                                                        //判斷是否為水平線
  453.         {
  454.                 GUI_HLine(x0,x1,y0,color);                                //畫水平線
  455.                 return;
  456.         }
  457.         dx = x1-x0;                                                                        // 求取兩點之間的差值
  458.         dy = y1-y0;
  459.         /* 判斷增長方向,或是否為水平線、垂直線、點 */
  460.         if(dx>0)                                                                        // 判斷x軸方向
  461.         {  
  462.                 dx_sym = 1;                                                                // dx>0,設置dx_sym=1
  463.         }
  464.         else
  465.         {  
  466.                 if(dx<0)
  467.                 {  
  468.                         dx_sym = -1;                                                // dx<0,設置dx_sym=-1
  469.                 }
  470.                 else
  471.                 {  
  472.                         // dx==0,畫垂直線,或一點
  473.                         GUI_RLine(x0, y0, y1, color);
  474.                         return;                }
  475.         }
  476.         if(dy>0)                                                                        // 判斷y軸方向
  477.         {  
  478.                 dy_sym = 1;                                                                // dy>0,設置dy_sym=1
  479.         }
  480.         else
  481.         {  
  482.                 if(dy<0)
  483.                 {                          dy_sym = -1;                                                // dy<0,設置dy_sym=-1                }
  484.                 else
  485.                 {  
  486.                         // dy==0,畫水平線,或一點
  487.                         GUI_HLine(x0, y0, x1, color);
  488.                         return;                }
  489.         }
  490.         /* 將dx、dy取絕對值 */
  491.         dx = dx_sym * dx;
  492.         dy = dy_sym * dy;
  493.         /* 計算2倍的dx及dy值 */
  494.         dx_x2 = dx*2;
  495.         dy_x2 = dy*2;
  496.         /* 使用Bresenham法進行畫直線 */
  497.         if(dx>=dy)                                                                        // 對于dx>=dy,則使用x軸為基準
  498.         {  
  499.                 di = dy_x2 - dx;
  500.                 while(x0!=x1)
  501.                 {  
  502.                         GUI_Point(x0, y0, color);
  503.                         x0 += dx_sym;
  504.                         if(di<0)
  505.                         {  
  506.                                 di += dy_x2;                                        // 計算出下一步的決策值                        }
  507.                         else
  508.                         {  
  509.                                 di += dy_x2 - dx_x2;                                y0 += dy_sym;                        }
  510.                 }
  511.                 GUI_Point(x0, y0, color);                                // 顯示最后一點
  512.         }
  513.         else                                                                                // 對于dx<dy,則使用y軸為基準
  514.         {
  515.                 di = dx_x2 - dy;                while(y0!=y1)
  516.                 {  
  517.                         GUI_Point(x0, y0, color);
  518.                         y0 += dy_sym;
  519.                         if(di<0)
  520.                         {                                di += dx_x2;                        }
  521.                         else
  522.                         {                                di += dx_x2 - dy_x2;                                x0 += dx_sym;                        }
  523.                 }
  524.                 GUI_Point(x0, y0, color);                                // 顯示最后一點        }
  525. }
  526. unsigned char code  DCB2HEX_TAB[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
復制代碼


基于單片機的兩軸步進電機協同控制.doc.doc

1.35 MB, 下載次數: 14

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜爽爽爽男女免费观看影院 | 精品国产一区二区国模嫣然 | 久久综合一区 | 中文字幕久久久 | 在线一区二区三区 | 久久av网 | 一本色道精品久久一区二区三区 | 99成人在线视频 | 午夜免费在线 | 久久亚洲国产精品 | 色偷偷人人澡人人爽人人模 | 天堂va在线观看 | 免费观看的黄色网址 | 青青草在线视频免费观看 | 国产精品久久毛片av大全日韩 | 国产精品欧美日韩 | 国产精品成人国产乱 | 精品欧美一区免费观看α√ | 国产精品av久久久久久久久久 | 日韩不卡一区二区三区 | www.日韩 | 欧美二区三区 | 精品福利在线视频 | 在线2区 | 国产成人免费视频 | 天天综合久久网 | 玖玖视频 | 日韩aⅴ在线观看 | 婷婷福利视频导航 | 91欧美精品成人综合在线观看 | 国产精品亚洲综合 | 亚洲精品久久久久中文字幕欢迎你 | 国产精品视频一二三区 | 日韩资源| av色噜噜 | 伊人久久大香线 | 久久精品一区二区 | 国产乱码精品一品二品 | 四虎永久影院 | 别c我啊嗯国产av一毛片 | 91一区二区三区在线观看 |