找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1188|回复: 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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表