上位机通过串口控制单片机,然后单片机控制步进电机

[复制链接]
5645|8
 楼主| 薛定谔的小猫子 发表于 2014-10-21 21:03 | 显示全部楼层 |阅读模式
上位机通过串口控制单片机,然后单片机控制步进电机。即通过串口通讯由上位机实时的控制步进电机的转动圈数控制。大家看看我写的哪里不对,为什么步进电机没有按给定的数值跑?
  1. #include<reg52.h>
  2. #include <stdio.h>             /*输入输出库函数,用于收发字符串*/

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar a,flag_uart;
  6. uchar step[]={0x08,0x28,0x20,0x30,0x10,0x50,0x40,0x48}; // 时序参数表

  7. /*串行口初始化波特率9600,定时器1,工作方式2 */
  8. void init()
  9. {
  10. PCON=0x80;//波特率加倍
  11. TMOD=0x21;//定时器1作为比特率发生器,方式2
  12. SCON=0x50;//串行控制寄存器设置;SM0=0; SM1=1;串行口工作于方式2;REN=1;串行口接收允许
  13. TH1=0xf3;
  14. TL1=0xf3; //装入初值
  15. TR1=1;//开定时器1
  16. ES=1;//串口中断允许
  17. EA=1;// 总中断允许
  18. }

  19. /****************DelayMs****************/
  20. void DelayMs(uint t)      //延时1毫秒
  21. {   
  22. uint i,j;
  23. for(i=t;i>0;i--)
  24.     for(j=110;j>0;j--);
  25. }

  26. /**************************************************主函数*******************************************************/
  27. void main(void)
  28. {
  29. uchar k,c;
  30. init();
  31. flag_uart = 0;        //中断标志位
  32. a = 0;                        //循环控制变量

  33. while(1)
  34. {
  35. while(flag_uart==1)//通过串口中断置位
  36.    {
  37.     for(k = 0;k < a;k++) // 主循环,控制循环次数
  38.        {
  39.            for(c = 0;c < 8;c++)
  40.               {
  41.                P1=step[c];
  42.                DelayMs(10); // 延时
  43.               }
  44.         }

  45.         SBUF = a;
  46.         while(!TI);
  47.         TI = 0;
  48.         ES = 1;

  49.         a = 0;
  50.         flag_uart = 0;
  51.     }
  52. }
  53. }

  54. //***************串口中断*******************//
  55. void serial() interrupt 4
  56. {
  57.      while(!RI);
  58.          a=SBUF;
  59.      RI=0;
  60.          flag_uart = 1;                  
  61. }
 楼主| 薛定谔的小猫子 发表于 2014-10-21 21:07 | 显示全部楼层
补充:STC89C52RC单片机,晶振24M,波特率设置的是9600
1、步进电机没按指定的圈数跑。
2、串口收不到发送过去的数值。
感觉SBUF给a的是一个ASCII码,或者是串口通讯出现了问题。
求大神指教!

评论

我也用的这个单片机 我晶振12M 波特率9600 我加了数据回显程序 接收会来的数据是乱码 之后波特率改为4800就解决了这个问题  发表于 2019-4-11 09:59
信守e 发表于 2014-12-9 18:43 | 显示全部楼层
我也不清楚,上位机通过串口号还是无线蓝牙发‘a’给单片机的呀啊?
wangch_sh 发表于 2014-12-9 19:42 | 显示全部楼层
先把串口调通再说吧。
zyj888 发表于 2017-3-26 15:43 来自手机 | 显示全部楼层
薛定谔的小猫子 发表于 2014-10-21 21:07
补充:STC89C52RC单片机,晶振24M,波特率设置的是9600
1、步进电机没按指定的圈数跑。
2、串口收不到发送 ...

在吗,楼主,我也面临同样的问题,能指点指点吗
xtajmhfhn 发表于 2017-3-27 10:17 | 显示全部楼层
一、首先确定下你的上位机软件发出来的数据对不对?
二、确定你的下位机与上位机通信是否正常?
三、你的上位机没有接收你的下位机发来的数据,说明可能是你的下位机没有收到上位机发来的数据。造成你上位机没有收到下位机的数据!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

23

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部