[51单片机] 串口接收数据问题

[复制链接]
883|0
 楼主| damoyeren 发表于 2015-3-5 17:33 | 显示全部楼层 |阅读模式
我串口接收来自PC的命令
FF 01 00 02 1E 00 21 FF 01 00 00 00 00 01

单片机收到数据后,把这些数据保存在数组里。然后逐一对比收到数据的准确性,如果准确,让电机旋转。
问题:下载到单片机程序没有任何反应,请问各位大神,我的程序思路正确吗

  1. <P># include <reg52.h>

  2. typedef unsigned int uint16;
  3. typedef unsigned char uchar8;
  4. typedef unsigned long int uint32;

  5. uchar8 rec_dat[]={0};
  6. uchar8 i = 0;
  7. //uchar8 num;//接收字节个数计数器
  8. uint32 pulse;

  9. code uchar8 up_data[8] ={0xFe,0xFc,0xFd,0xF9,0xFb,0xF3,0xF7,0xF6};//反转数组
  10. code uchar8 down_data[8]={0XF6,0XF7,0XF3,0XFB,0XF9,0XFD,0XFC,0XFE};//正转数组

  11. /*延时函数*/
  12. void delay_ms(uchar8 z)
  13. {
  14. uchar8 x,y;
  15. for(x=z;x>0;x--)
  16. for(y=110;y>0;y--);
  17. }

  18. /*将旋转角度转换为脉冲数量,实参传递的是圈数*/
  19. void motor_pulse(uint32 angle)
  20. {
  21. EA = 0;//</P>
  22. <P>pulse = (angle*4096)/360;
  23. EA = 1;
  24. }

  25. /*串口配置函数: 串口工作方式设置 定时器T1设置波特率*/
  26. void config (uint16 BAUD)
  27. {
  28. SCON = 0X50;//SM0=0 SM1=1 SM2=0 REN=1串口工作在波特率可变模式 允许接收
  29. TMOD = 0X20;//TO工作在方式1,定时模式;T1工作在方式2,自动重装模式
  30. TH1 = 256 - (11059200/12/32)/BAUD;
  31. TL1 = TH1;//定时器T1工作在方式2自动重装模式:TL0计数器溢出后又TH0自动填数
  32. TR1 = 1;//启动定时器T1
  33. EA = 1;//启动总中断
  34. ES = 1;//启动串口中断
  35. }

  36. /*电机旋转函数:旋转实参传递的是电机旋转角度*/
  37. void motor_up()
  38. {
  39. static uchar8 index = 0;
  40. while (pulse!=0)
  41. {
  42. P1 = up_data[index];
  43. delay_ms(10);
  44. index++;
  45. index = index&0x07;//此句等效如果index>=8,index=0
  46. pulse--;
  47. }
  48. }


  49. /*主函数*/
  50. void main ()
  51. {
  52. config(2400);//配置波特率为9600
  53. while(1)
  54. {
  55. if ((rec_dat[0]==0xff) && (rec_dat[1]==0x01) && (rec_dat[2]==0x00) && (rec_dat[3]==0x02) && (rec_dat[4]==0x1e) && (rec_dat[5]==0x00) && (rec_dat[6]==0x21) && (rec_dat[7]==0xff) && (rec_dat[8]==0x01) && (rec_dat[9]==0x00) && (rec_dat[10]==0x00) && (rec_dat[11]==0x00) && (rec_dat[12]==0x00) && (rec_dat[13]==0x01) )
  56. //if (rec_dat[5] == 0x21)
  57. {
  58. motor_pulse(180);//如果收到的命令正确,给电机发送旋转圈数1
  59. motor_up();//电机正转
  60. }
  61. }
  62. }


  63. void InterruptUART() interrupt 4
  64. {
  65. static uchar8 num = 0;//接收字节个数计数器
  66. if(RI)
  67. {
  68. RI = 0;
  69. rec_dat[num] = SBUF;
  70. if((num==0) &&(rec_dat[num]==0XFF))
  71. {
  72. rec_dat[num] = SBUF;
  73. num = 1;
  74. }
  75. else if((num == 1) &&(rec_dat[num] = 0X01) )
  76. {
  77. rec_dat[num] = SBUF;
  78. num = 2;
  79. }
  80. else if((num == 2) &&(rec_dat[num] = 0X00) )
  81. {
  82. rec_dat[num] = SBUF;
  83. num = 3;
  84. }
  85. else if((num == 3) &&(rec_dat[num] = 0X02) )
  86. {
  87. rec_dat[num] = SBUF;
  88. num = 4;
  89. }
  90. else if((num == 4) &&(rec_dat[num] = 0X1e) )
  91. {
  92. rec_dat[num] = SBUF;
  93. num = 5;
  94. }
  95. else if((num==5) &&(rec_dat[num]==0X00))
  96. {
  97. rec_dat[num] = SBUF;
  98. num = 6;
  99. }
  100. else if((num == 6) &&(rec_dat[num] = 0X21) )
  101. {
  102. rec_dat[num] = SBUF;
  103. num = 7;
  104. }
  105. else if((num == 7) &&(rec_dat[num] = 0Xff) )
  106. {
  107. rec_dat[num] = SBUF;
  108. num = 8;
  109. }
  110. else if((num == 8) &&(rec_dat[num] = 0X01) )
  111. {
  112. rec_dat[num] = SBUF;
  113. num = 9;
  114. }
  115. else if((num == 9) &&(rec_dat[num] = 0X00) )
  116. {
  117. rec_dat[num] = SBUF;
  118. num = 10 ;
  119. }
  120. else if((num == 10) &&(rec_dat[num] = 0X00) )
  121. {
  122. rec_dat[num] = SBUF;
  123. num = 11 ;
  124. }
  125. else if((num == 11) &&(rec_dat[num] = 0X00) )
  126. {
  127. rec_dat[num] = SBUF;
  128. num = 12 ;
  129. }
  130. else if((num == 12) &&(rec_dat[num] = 0X00) )
  131. {
  132. rec_dat[num] = SBUF;
  133. num = 13;
  134. }
  135. else if((num == 13) &&(rec_dat[num] = 0X01) )
  136. {
  137. rec_dat[num] = SBUF;
  138. num = 0;
  139. }
  140. else
  141. num = 0;
  142. }
  143. if (TI)
  144. TI = 0;
  145. }</P>


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

本版积分规则

126

主题

393

帖子

2

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