找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1836|回复: 6
打印 上一主题 下一主题
收起左侧

完成串口发送测试

[复制链接]
跳转到指定楼层
楼主
ID:326783 发表于 2018-5-13 21:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:242300 发表于 2018-5-13 22:28 来自手机 | 只看该作者
我来抢沙发
回复

使用道具 举报

板凳
ID:326783 发表于 2018-5-14 23:09 | 只看该作者
今天回来有点晚,完成了控制器模拟接收G代码的功能。。。。
回复

使用道具 举报

地板
ID:326783 发表于 2018-5-16 23:13 | 只看该作者
终于画出了第一张图


回复

使用道具 举报

5#
ID:326783 发表于 2018-5-16 23:25 | 只看该作者
珍惜自己的每一个想法,虽然付出的艰辛是常人不能体会的,但是成功带来的喜悦能弥补一切。天道酬勤!曾有朋友问我,你学习编程的意义何在,能挣钱么?我也想过这个问题,并为之纠结。现在我可以回答他:编程本身就是一种快乐,这种快乐,不是钱能衡量的,也许就是人生的意义所在。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:1 发表于 2018-5-17 00:07 | 只看该作者
好东东 楼主能分享点制作资料吗?
回复

使用道具 举报

7#
ID:326783 发表于 2018-5-29 22:45 | 只看该作者
(分享设计)雕刻机主程序分享!!!
  1. #include "IAP15W4K61S4.h"
  2. #include "Delay_m.h"
  3. #include "serial_xj.h"
  4. #include "TIMER.h"
  5. #include "m_XoY.h"
  6. #define m_Speed 15                        //设置电机速度
  7. #define pulse_Number 40        //单位为1时电机所需要的脉冲数
  8. #define uint   unsigned int
  9. #define uchar  unsigned char
  10. /*引脚定义区*/
  11. /**Step:        脉冲
  12. ***Dir :        方向
  13. ***Sleep:        驱动芯片睡眠使能
  14. ***En:                使能
  15. **/
  16. sbit X_Step=P1^2;
  17. sbit X_Dir=P1^1;
  18. sbit X_Sleep=P1^2;
  19. sbit X_En=P1^4;

  20. sbit Y_Step=P5^5;
  21. sbit Y_Dir=P5^4;
  22. sbit Y_Sleep=P3^3;
  23. sbit Y_En=P3^5;
  24. /*标志位定义区*/
  25. /**
  26. ***Flag0:                                完成一次单位运行标志位
  27. ***m_Flag:                                X/Y轴运行标志位
  28. ***Serval_Flag                        串行接收完成标志位
  29. **/
  30. bit Flag0=0, m_Flag=0, Serval_Flag=0;
  31. bit G_mode=0;                        //G代码模式G0或G1
  32. bit Laser_En=1;                        //激光使能标志
  33. /*变量定义区*/
  34. /**
  35. **X_start:                                X轴开始坐标-整形变量
  36. **Y_start:                                Y轴开始坐标-整形变量
  37. **X_end:                                 X轴终点坐标-整形变量
  38. **Y_end:                                Y轴终点坐标-整形变量
  39. **/
  40. int X_start=0, Y_start=0, X_end=0, Y_end=0;

  41. uchar Rotation_dir;                //转动方向
  42. uint  Circle_Step;                //总的步数-整形变量
  43. uchar q=0;                                //象限值
  44. uchar Re_value[40];                //接收字节数组

  45. /*子函数定义区*/
  46. void Pin_Init(void);        //引脚初使化
  47. void Timer_Creat(void);        //创建Timer0
  48. //void motor_Stop(void);
  49. void motor_Zx(void);        //X轴正转运行一个单位
  50. void motor_Fx(void);        //X轴反转运行一个单位
  51. void motor_Zy(void);        //Y轴正转运行一个单位
  52. void motor_Fy(void);        //Y轴反转运行一个单位
  53. void motor_Run(uint circle_step, uchar Q); //电机运行
  54. void G_code(void);
  55. /********主函数********/
  56. void main()
  57. {
  58.         //uchar i;
  59.         Serial1_Init();                        //串行通信初使化
  60.         Pin_Init();                                //引脚初使化
  61.         Timer_Creat();                         //定时器0初使化
  62.         mDelay(100);                        //待系统稳定
  63.         Send_data(0x55);
  64.         ES=1;                                        //开启串行中断使能
  65.         EA=1;                                        //开启总中断
  66.         while(1)
  67.         {
  68.                 if(Serval_Flag)                                                                                //如果串行信号接收正确
  69.                 {
  70.                         Serval_Flag=0;                                                                         //清除串行接收正确标志位
  71.                         G_code();                                                                                //分析G代码,计算X_end,Y_end及激光是否加载
  72.                         //X_end=0;                                                                                //接收到给定的X坐标值
  73.                         //Y_end=0;                                                                                //接收到给定的Y坐标值
  74. //                        Send_data(X_start);
  75. //                        Send_data(Y_start);
  76. //                        Send_data(X_end);
  77. //                        Send_data(X_end);
  78.                         //Send_data(0xAA);
  79.                         Circle_Step=(Abs(Y_end-Y_start)+Abs(X_end-X_start));        //总步数
  80.                         q=Pd_XoY(X_start, Y_start, X_end, Y_end);                                //所在象限
  81. //                        Send_data(q);
  82. //                        Send_ata(0xAA);
  83.                         motor_Run(Circle_Step, q);                                                                //电机运行
  84.                         Y_start=Y_end;                                                                                        //运行完毕后将最终值赋与初使值
  85.                         X_start=X_end;
  86. //                        for(i=0;i<(Re_value[1]-47);i++)
  87. //                        {
  88. //                                Send_data(Re_value[i]);       
  89. //                        }
  90.                         Send_data(0x55);
  91.                         ES=1;         //打开串行中断
  92.                 }
  93.         }
  94. }
  95. void Pin_Init(void)
  96. {
  97.         X_En=1;
  98.         X_Sleep=1;
  99.         Y_En=1;
  100.         Y_Sleep=1;
  101. }
  102. /******************************
  103. **函数功能:定时器创建并初使化
  104. **函数名:        Timer_Creat(void)                       
  105. */
  106. void Timer_Creat(void)
  107. {
  108.         TIM_InitTypeDef myTim_inittypedef;

  109.         myTim_inittypedef.TIM_Mode=TIM_16BitAutoReload;         //模式为8位重装
  110.         myTim_inittypedef.TIM_Polity=0;                                                //不设工作优先级
  111.         myTim_inittypedef.TIM_Interrupt=ENABLE;                                //允许中断
  112.         myTim_inittypedef.TIM_ClkSource=TIM_CLOCK_12T;                //时钟为传统12分频
  113.         myTim_inittypedef.TIM_ClkOut=DISABLE;                                 //不允许外输出时钟
  114.         myTim_inittypedef.TIM_Value=65500;                                        //设置时间初值
  115.         myTim_inittypedef.TIM_Run=DISABLE;                                         //TR0=1
  116.         Timer_Inilize(Timer0,&myTim_inittypedef);
  117. }
  118. /******************************
  119. **函数功能:Timer0定时器中断
  120. **函数名:        timer0_int(void)
  121. **运行变量:static uchar Count0运行频率控制变量
  122. **                        static uint Count1 运行步数控制变量
  123. **                        m_Flag                           X/Y电机运行标志位
  124. **                        Flag0                           运行完毕标志位
  125. **运行常量:m_Speed                5
  126. **                        pulse_Number       2               
  127. */
  128. void timer0_int (void) interrupt TIMER0_VECTOR
  129. {
  130.         static uchar         Count0=0;                //运行频率控制变量控制运行速度
  131.         static uint         Count1=0;                 //运行步数控制变量控制运行长度
  132.         if(Count0 == m_Speed)                        //频率控制计数器等于m_Speed
  133.         {
  134.                 Count0=0;                                         //频率控制变量=0
  135.                 if(m_Flag)                                        //当X/Y运行控制位=1
  136.                 {
  137.                         X_Step=!X_Step;                        //X轴动作
  138.                 }
  139.                 else
  140.                 {
  141.                         Y_Step=!Y_Step;                        //Y轴动作
  142.                 }
  143.                 Count1++;
  144.         }
  145.         else
  146.         {
  147.                 Count0++;
  148.         }
  149.         if(Count1==pulse_Number)
  150.         {
  151.                  Count0=0;
  152.                 Count1=0;
  153.                 TR0=0;
  154.                 Flag0=1;        //完成一次运转
  155.         }
  156. }
  157. /*
  158. void motor_Stop(void)
  159. {
  160.         X_En=1;
  161.         X_Sleep=0;
  162.         Y_En=1;
  163.         Y_Sleep=0;
  164. }*/
  165. /*
  166. **X轴电机正向运行
  167. */
  168. /******************************
  169. **函数功能:Y轴电机正向运行
  170. **函数名:        motor_Fx(void)
  171. **运行变量:bit Flag0                                每一步运行完毕标志位
  172. **                        bit m_Flag                                Y电机工作                       
  173. */
  174. void motor_Zx(void)
  175. {
  176.         X_En=0;
  177.         X_Dir=0;
  178.         m_Flag=1;
  179.         TR0=1;
  180.         while(!Flag0);
  181.         Flag0=0;       
  182.         X_En=1;
  183. }
  184. /******************************
  185. **函数功能:X轴电机反向运行
  186. **函数名:        motor_Fx(void)
  187. **运行变量:bit Flag0                                每一步运行完毕标志位
  188. **                        bit m_Flag                                Y电机工作                       
  189. */
  190. void motor_Fx(void)
  191. {
  192.           X_En=0;
  193.         X_Dir=1;
  194.         m_Flag=1;
  195.         TR0=1;
  196.         while(!Flag0);
  197.         Flag0=0;       
  198.         X_En=1;
  199. }
  200. /******************************
  201. **函数功能:Y轴电机正向运行
  202. **函数名:        motor_Zy(void)
  203. **运行变量:bit Flag0                                每一步运行完毕标志位
  204. **                        bit m_Flag                                X/Y电机工作标志               
  205. */
  206. void motor_Zy(void)
  207. {
  208.         Y_En=0;                        //Y轴电机使能
  209.         Y_Dir=1;                //Y轴电机正转
  210.         m_Flag=0;                //Y电机工作
  211.         TR0=1;                        //开启定时器1中断                       
  212.         while(!Flag0);        //等待完成步进
  213.         Flag0=0;                 //清除步进完成标志位
  214.         Y_En=1;
  215. }
  216. /******************************
  217. **函数功能:Y轴电机反向运行
  218. **函数名:        motor_Fy(void)
  219. **运行变量:bit Flag0                                每一步运行完毕标志位
  220. **                        bit m_Flag                                X/Y电机工作标志                       
  221. */
  222. void motor_Fy(void)
  223. {
  224.         Y_En=0;                        //Y轴电机使能
  225.         Y_Dir=0;                //Y轴电机反转
  226.         m_Flag=0;                //Y电机工作
  227.         TR0=1;                        //开启定时器1中断                       
  228.         while(!Flag0);        //等待完成步进
  229.         Flag0=0;                 //清除步进完成标志位
  230.         Y_En=1;
  231. }
  232. /******************************
  233. **函数功能:电机运行直线插补
  234. **函数名:        motor_Run(uint circle_step, uchar Q)
  235. **形参说明:uint circle_step运行步数
  236.                         Q直线所在象限                                       
  237. */
  238. void motor_Run(uint circle_step, uchar Q)
  239. {
  240.         int Fm=0;
  241.         while(circle_step)
  242.         {
  243.                 if(Q==0)                //延Y轴运行
  244.                 {
  245.                         if(Y_end > Y_start)
  246.                         {
  247.                                   Rotation_dir=1;        //Y++
  248.                         }
  249.                         else
  250.                         {
  251.                                 Rotation_dir=2;        //Y--
  252.                         }
  253.                 }
  254.                 else if(Q==5)        //沿X轴运行
  255.                 {
  256.                         if(X_end > X_start)
  257.                         {
  258.                                 Rotation_dir=3;                        //X++
  259.                         }
  260.                         else
  261.                         {
  262.                                 Rotation_dir=4;                        //X--
  263.                         }
  264.                 }
  265.                 else if(Q==1)                                        //在第一象限
  266.                 {
  267.                         if(Fm>=0)
  268.                         {
  269.                                 Rotation_dir=3;                        //X++
  270.                                 Fm=Fm-(Y_end-Y_start);        //任意两点
  271.                         }
  272.                         else
  273.                         {
  274.                                 Rotation_dir=1;                        //Y++
  275.                                 Fm=Fm+(X_end-X_start);         //任意两点
  276.                         }
  277.                 }
  278.                 else if(Q==2)         //在第二象限
  279.                 {
  280.                         if(Fm>=0)
  281.                         {
  282.                                 Rotation_dir=4;                        //X--       
  283.                                 Fm=Fm-(Y_end-Y_start);
  284.                         }
  285.                         else
  286.                         {
  287.                                 Rotation_dir=1;                        //Y++
  288.                                 Fm=Fm+(X_start-X_end);
  289.                         }
  290.                 }
  291.                 else if(Q==3)        //在第三象限
  292.                 {
  293.                         if(Fm>=0)
  294.                         {
  295.                                 Rotation_dir=4;                //X--
  296.                                 Fm=Fm-(Y_start-Y_end);
  297.                         }
  298.                         else
  299.                         {
  300.                                 Rotation_dir=2;                //Y--
  301.                                 Fm=Fm+(X_start-X_end);
  302.                         }       
  303.                 }
  304.                 else                          //在第四象限
  305.                 {
  306.                         if(Fm>=0)
  307.                         {
  308.                                 Rotation_dir=3;                        //X++
  309.                                 Fm=Fm-(Y_start-Y_end);
  310.                         }
  311.                         else
  312.                         {
  313.                                 Rotation_dir=2;                //Y--
  314.                                 Fm=Fm+(X_end-X_start);
  315.                         }
  316.                 }
  317.                 switch(Rotation_dir)
  318.                 {
  319.                         case 1:
  320.                         {
  321.                                 motor_Zy();
  322.                         }
  323.                         break;
  324.                         case 2:
  325.                         {
  326.                                 motor_Fy();
  327.                         }
  328.                         break;
  329.                         case 3:
  330.                         {
  331.                                 motor_Zx();
  332.                         }
  333.                         break;
  334.                         case 4:
  335.                         {
  336.                                 motor_Fx();
  337.                         }
  338.                         break;
  339.                 }
  340.                 circle_step--;
  341.         }
  342. }
  343. /******************************
  344. **函数功能:串行中断子函数
  345. **函数名:        Serial_inter()
  346. **运行变量:static uchar Count2          接收计数器
  347. **                        uchar Re_value[40]                串行数据寄存数组       
  348. **                        bit Serval_Flag                        接收完毕标志位
  349. */
  350. void Serial_inter() interrupt 4
  351. {
  352.         static uchar Count2=0;                        //设立串行接收计数器
  353.         if(TI)
  354.         {
  355.                 TI=0;
  356.         }
  357.         if(RI)
  358.         {
  359.                 RI=0;
  360.                 Re_value[Count2]=SBUF;                //接收数组进行数据接收
  361.                 if(Re_value[0]==0x47)                 //如果接收数组[0]="G"
  362.                 {
  363.                         if(Re_value[Count2]==0x0d)         //如果接收数组有一位为结束符
  364.                         {
  365.                                 Count2=0;                         //清除串行接收计数器
  366.                                 ES=0;
  367.                                 Serval_Flag=1;                //接收正确标志位置位
  368.                         }
  369.                         else                                         //否则
  370.                         {
  371.                                 Count2++;                          //串行接收计数器加1
  372.                         }
  373.                 }
  374.         }
  375. }
  376. /******************************
  377. **函数功能:G代码解释程序
  378. **函数名:        G_code(void)
  379. **运行变量:uchar Re_value[40]                串行数据寄存数组       
  380. **                        bit Serval_Flag                        接收完毕标志位
  381. */
  382. void G_code(void)
  383. {
  384.         uchar i;
  385.         uchar GXoYoZ=0;                                        //读取X或Y或Z字符
  386.         uchar X_posi, Y_posi, Z_posi;
  387.         if(Re_value[2])                                //如果第二位等于1
  388.         {
  389.                 G_mode=1;                                 //G1模式
  390.         }
  391.         else
  392.         {
  393.                 G_mode=0;                                //G0模式
  394.         }
  395.         for(i=3;i<(Re_value[1]-47);i++)
  396.         {
  397.                 if(Re_value[i]==0x58)                        //当字符等于X
  398.                 {
  399.                         GXoYoZ=0x01;
  400.                         X_posi=i;
  401.                 }
  402.                 else if(Re_value[i]==0x59)                //当字符等于Y
  403.                 {
  404.                         GXoYoZ=0x02;
  405.                         Y_posi=i;
  406.                 }
  407.                 else if(Re_value[i]==0x5a)                //当字符等于Z
  408.                 {
  409.                         GXoYoZ=0x03;
  410.                         Z_posi=i;
  411.                 }
  412.                 else if(Re_value[i]==0x2e)                 //当字符等于.
  413.                 {
  414.                         switch(GXoYoZ)
  415.                         {
  416.                                 case 0x01:
  417.                                 {
  418.                                          if((i-X_posi)==3)
  419.                                         {
  420.                                                 X_end=(Re_value[i-2]-0x30)*100+(Re_value[i-1]-0x30)*10+(Re_value[i+1]-0x30);
  421.                                         }
  422.                                         else
  423.                                         {
  424.                                                 X_end=(Re_value[i-1]-0x30)*10+(Re_value[i+1]-0x30);
  425.                                         }
  426.                                         GXoYoZ=0;
  427.                                         X_posi=0;
  428.                                 }
  429.                                 break;
  430.                                 case 0x02:
  431.                                 {
  432.                                         if((i-Y_posi)==3)
  433.                                         {
  434.                                                 Y_end=(Re_value[i-2]-0x30)*100+(Re_value[i-1]-0x30)*10+(Re_value[i+1]-0x30);
  435.                                         }
  436.                                         else
  437.                                         {
  438.                                                 Y_end=(Re_value[i-1]-0x30)*10+(Re_value[i+1]-0x30);
  439.                                         }
  440.                                         GXoYoZ=0;
  441.                                         Y_posi=0;
  442.                                 }
  443.                                 break;
  444.                                 case 0x03:
  445.                                 {
  446.                                         if(Re_value[Z_posi+1]=='-')
  447.                                         {
  448.                                                 Laser_En=0;
  449.                                         }
  450.                                         else
  451.                                         {
  452.                                                 Laser_En=1;
  453.                                         }
  454.                                         GXoYoZ=0;
  455.                                         Z_posi=0;
  456.                                 }
  457.                                 break;
  458.                         }
  459.                 }
  460.                 else
  461.                 {
  462.                         ;
  463.                 }       
  464.         }
  465. }
复制代码

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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