小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 8844|回复: 8

求助,小车通电后,有时不能控制,反复关电开电两三次后正常,是不是下位机源码乱了

[复制链接]
发表于 2013-7-17 20:44:01 | 显示全部楼层 |阅读模式
源码是从论坛下的,后来改了舵机控制方向,但是如题。但是一但成功控制后一切又正常,PS:只是不能控制,视频一直正常。
  1. #include<reg52.h>
  2. #include<math.h>
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. P0M1=0X00;
  7. P0M0=0XFF;//设置P0 为强推挽输出


  8. uchar Buffer =0;      //从串口接收的数据
  9. uint URTAReceivedCount=0,n=1;
  10. uchar data Tempdatatable[5],CommandDatatable[5];//数据包


  11. uchar serVal[2];
  12. uint pwm[]={1382,1300,1382,1382,1382,1382,1382,1382}; //初始90度,(实际是1382.4,取整得1382)
  13. uchar pwm_flag=0;
  14. uint code ms0_5Con=461; //0.5ms计数 (实际是460.8,取整得461)461
  15. uint code ms2_5Con=2304; //2.5ms计数2304


  16. bit key_stime_ok;
  17. sbit StatusLight=P2^0;
  18. sbit Light=P2^6;
  19. sbit servo0=P0^0;  //舵机控制
  20. sbit servo1=P0^1;
  21. sbit servo2=P0^2;
  22. sbit servo3=P0^3;
  23. sbit servo4=P0^4;
  24. sbit servo5=P0^5;
  25. sbit servo6=P0^6;
  26. sbit servo7=P0^7;
  27. sbit P10=P1^0;
  28. sbit P11=P1^1;
  29. sbit P12=P1^2;
  30. sbit P14=P1^4;
  31. /********************************************************************
  32. * 名称 : delayms()
  33. * 功能 : 延时子程序,延时时间为 1000个MS为1S
  34. * 输入 : MS (延时一毫秒的个数)
  35. * 输出 : 无
  36. ***********************************************************************/
  37. void delayms(unsigned int ms)                       
  38. {   
  39. unsigned int a,b,c;
  40.     for(a=2;a>0;a--)
  41. for(b=46;b>0;b--)
  42. for(c=ms;c>0;c--);
  43. }

  44. /********************************************************************
  45. * 名称 : Delay_1ms()
  46. * 功能 : 延时子程序,延时时间为 1ms * x
  47. * 输入 : x (延时一毫秒的个数)
  48. * 输出 : 无
  49. ***********************************************************************/
  50. void Delay_1ms(uint i)//1ms延时
  51. {
  52. uint x,j;//uchar x,j;
  53. for(j=0;j<i;j++)
  54. for(x=0;x<=148;x++);
  55. }
  56. /********************************************************************
  57. * 名称 : Send_Data()
  58. * 功能 : 向上位机传送字符
  59. * 输入 : 无
  60. * 输出 : 无
  61. ***********************************************************************/
  62. void Send_Data(uchar type,uchar cmd,uchar dat)
  63. {
  64.    uchar data Buffer[5];//构建数据包
  65.    uchar *p;
  66.    uint Send_Count=0;
  67.    p = Buffer;
  68.    Buffer[0]=0XFF;
  69.    Buffer[1]=type;
  70.    Buffer[2]=cmd;
  71.    Buffer[3]=dat;
  72.    Buffer[4]=0XFF;     
  73.   while(1)
  74.      {
  75.       if(*p==0XFF)
  76.         {
  77.          Send_Count++;  //0XFF标志统计位
  78.         }
  79.       SBUF = *p;  //发送
  80.       while(!TI)  //如果发送完毕,硬件会置位TI,等待发送完毕
  81.            {
  82.              _nop_();
  83.            }
  84.       p++;
  85.       TI = 0;
  86.       if(Send_Count == 2)  //当统计到两次出现0XFF,则认为一个数据包发送完毕,跳出循环
  87.         {
  88.          TI = 0;
  89.          break;
  90.         }  
  91.      }
  92. }
  93. /********************************************************************
  94. 协议规定:
  95. 包头  类型位  数据位 数据位   结束位
  96. 0XFF   0X**   OX**   0X**      0XFF
  97. 各命令说明:
  98. 类型位   数据位  数据位  功能

  99. 0X00       0X02  0X00    前进
  100. 0X00       0X01  0X00    后退
  101. 0X00       0X03  0X00    左转
  102. 0X00       0X04  0X00    右转
  103. 0X00       0X00  0X00    停止

  104. 0X01       0X01  角度    舵机1
  105. 0X01       0X02    .     舵机2
  106. 0X01       0X01    .     舵机3
  107. 0X01       0X02    .     舵机4
  108. 0X01       0X01    .     舵机5
  109. 0X01       0X02    .     舵机6
  110. 0X01       0X01    .     舵机7
  111. 0X01       0X02  数据    舵机8
  112. 0X02           0X01 档位值        左侧档
  113. 0X02       0X02        档位值        右侧档
  114. 0X04       0X00     车灯亮
  115. 0X04       0X01     车灯灭

  116. 0X03      雷达数据   发送雷达数据
  117. ***********************************************************************/
  118. /********************************************************************
  119. * 名称 : Com_Int()
  120. * 功能 : 串口中断子函数
  121. ***********************************************************************/
  122. void Com_Int(void) interrupt 4
  123. {
  124. uchar temp;
  125. ES=0; //关串口中断
  126. RI=0; //软件清除接收中断
  127. temp=SBUF;
  128.   if(temp==0XFF && URTAReceivedCount<3)
  129.      {
  130.        Tempdatatable[0]==0XFF;  //包头
  131.        URTAReceivedCount++;
  132.      }
  133.   else
  134.      {
  135.        Tempdatatable[n]=temp;
  136.        n++;
  137.            if(URTAReceivedCount==0&&n==2)
  138.            n=1;
  139.      }

  140.   if(URTAReceivedCount==2)//包尾
  141.     {
  142.        Tempdatatable[0]=0XFF;
  143.        Tempdatatable[4]=0XFF;
  144.        n=1;
  145.        URTAReceivedCount=0;  //组包完毕
  146.        temp="";
  147.       // Send_Data(Tempdatatable[1],Tempdatatable[2],Tempdatatable[3]);  //发送组成的数据包回去
  148.     }

  149.   CommandDatatable[0]=Tempdatatable[0];
  150.   CommandDatatable[1]=Tempdatatable[1];
  151.   CommandDatatable[2]=Tempdatatable[2];
  152.   CommandDatatable[3]=Tempdatatable[3];
  153.   CommandDatatable[4]=Tempdatatable[4];

  154.   ES=1;//开串口中断
  155.   

  156. }

复制代码


回复

使用道具 举报

 楼主| 发表于 2013-7-17 20:45:16 | 显示全部楼层
  1. /********************************************************************
  2. * 名称 : Com_Init()
  3. * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
  4. ***********************************************************************/
  5. void Com_Init(void)
  6. {
  7. TMOD = 0x21;
  8. PCON = 0x00;
  9. SCON = 0x50;
  10. TH1 = 0xFd; //设置波特率 9600
  11. TL1 = 0xFd;
  12. TR1 = 1; //启动定时器1
  13. ES = 1; //开串口中断
  14. EA = 1; //开总中断
  15. IT0=0;
  16. EX0=1;
  17. }

  18. /********************************************************************
  19. * 功能 : 舵机PWM中断初始化
  20. ***********************************************************************/
  21. void Timer0Init()
  22. {
  23. /*0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
  24. /.5 ms初始值 F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)*/
  25. TMOD |= 0x01;         //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响       
  26. TH0=-ms2_5Con>>8;         //给定初值,17ms中断
  27. TL0=-ms2_5Con;
  28. EA=1; //总中断打开
  29. ET0=1; //定时器0中断打开
  30. TR0=1; //定时器0开关打开
  31. }
  32. /********************************************************************
  33. * 功能 : 舵机PWM中断, //舵机控制函数 周期为20ms 一个循环20MS = 8*2.5ms
  34. ***********************************************************************/
  35. void SteeringGear() interrupt 1
  36. {
  37. switch(pwm_flag)
  38. {
  39. case 1: servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;
  40. case 2: servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;
  41. case 3: servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;
  42. case 4: servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;
  43. case 5: servo2=1; TH0=-pwm[2]>>8; TL0=-pwm[2]; break;
  44. case 6: servo2=0; TH0=-(ms2_5Con-pwm[2])>>8; TL0=-(ms2_5Con-pwm[2]); break;
  45. case 7: servo3=1; TH0=-pwm[3]>>8; TL0=-pwm[3]; break;
  46. case 8: servo3=0; TH0=-(ms2_5Con-pwm[3])>>8; TL0=-(ms2_5Con-pwm[3]); break;
  47. case 9: servo4=1; TH0=-pwm[4]>>8; TL0=-pwm[4]; break;
  48. case 10: servo4=0; TH0=-(ms2_5Con-pwm[4])>>8; TL0=-(ms2_5Con-pwm[4]); break;
  49. case 11: servo5=1; TH0=-pwm[5]>>8; TL0=-pwm[5]; break;
  50. case 12: servo5=0; TH0=-(ms2_5Con-pwm[5])>>8; TL0=-(ms2_5Con-pwm[5]); break;
  51. case 13: servo6=1;TH0=-pwm[6]>>8; TL0=-pwm[6]; break;
  52. case 14: servo6=0;TH0=-(ms2_5Con-pwm[6])>>8; TL0=-(ms2_5Con-pwm[6]); break;
  53. case 15: servo7=1;TH0=-pwm[7]>>8; TL0=-pwm[7]; break;
  54. case 16: servo7=0;TH0=-(ms2_5Con-pwm[7])>>8; TL0=-(ms2_5Con-pwm[7]); break;
  55. default: TH0=0xff; TL0=0x80; pwm_flag=0;
  56. }
  57. pwm_flag++;
  58. }

  59. void SetSteeringGear(uchar i, uchar val)
  60. {
  61. uint a = (val+46)*10;
  62. if(a<ms0_5Con)
  63. a=ms0_5Con;
  64. if(a>ms2_5Con)
  65. a=ms2_5Con;
  66. pwm[i]=a;
  67. CommandDatatable[2]=0xff; //清除缓存
  68. }
  69. void SetSteeringGear1(uchar val)
  70. {
  71. if(val!=5)
  72. {
  73. P10=0;
  74. }
  75. if(val==5)
  76. {
  77. P10=1;
  78. }
  79. }       
  80. void SetSteeringGear2(uchar val)
  81. {
  82. if(val!=5)
  83. {
  84. P11=0;
  85. }
  86. if(val==5)
  87. {
  88. P11=1;
  89. }
  90. }
  91. /********************************************************************
  92. * 名称 :Moto_Forward()
  93. * 功能 : 电机启动,前进,整车表现为前进。
  94. ***********************************************************************/
  95. void Moto_Forward()
  96. {
  97. P12=1;
  98. Delay_1ms(100);
  99. }
  100. /********************************************************************
  101. * 名称 :Moto_Backward()
  102. * 功能 : 电机启动,后退,整车表现为后退。
  103. ***********************************************************************/
  104. void Moto_Backward()
  105. {
  106. P14=1;
  107. }

  108. /********************************************************************
  109. * 名称 :Moto_TurnLeft()
  110. * 功能 : 舵机左转45度,电机前进,整车表现为左转。
  111. ***********************************************************************/
  112. void Moto_TurnLeft()
  113. {
  114. SetSteeringGear(0x01,0x87);
  115. P12=1;
  116. }
  117. /********************************************************************
  118. * 名称 :Moto_TurnRight()
  119. * 功能 : 舵机右转45度135度,电机前进,整车表现为右转。
  120. ***********************************************************************/
  121. void Moto_TurnRight()
  122. {
  123. SetSteeringGear(0x01,0x2D);
  124. P12=1;
  125. }
  126. /********************************************************************
  127. * 名称 :Moto_Stop()
  128. * 功能 : 电机停止,舵机至0位90度,整车表现为停止。54为校准后小车能走直线。
  129. ***********************************************************************/
  130. void Moto_Stop()
  131. {
  132. SetSteeringGear(0x1,0x54);
  133. P1= 0x00;
  134. }
  135. /********************************************************************
  136. * 功能 : 串口中断接收数据
  137. ***********************************************************************/


  138. /*********************************************************************************
  139. ** 函数功能 : 主函数
  140. *********************************************************************************/

  141. void main()
  142. {
  143. Delay_1ms(6000);
  144. Delay_1ms(6000);
  145. Delay_1ms(6000);
  146. Delay_1ms(6000);
  147. Com_Init();//串口初始化
  148. Timer0Init();//舵机PWM中断初始化
  149. while(1)
  150. {

  151. if(CommandDatatable[0]==0XFF && CommandDatatable[4]==0XFF)
  152. {
  153. switch (CommandDatatable[1]) //根据键值不同,执行不同的内容
  154. {
  155. case 0X00: //类型位0X00,表明是控制数据包,进入控制数据case
  156. switch(CommandDatatable[2]) //根据数据位的值来进行选择执行不同的动作
  157. {
  158. case 0X00:Moto_Stop();break;
  159. case 0X01:Moto_Forward();break;
  160. case 0X02:Moto_Backward();break;
  161. case 0X03:Moto_TurnLeft();break;
  162. case 0X04:Moto_TurnRight();break;
  163. default : break;
  164. }
  165. break;
  166. case 0X01: //类型位0X01,表明是舵机数据包,进入舵机case
  167. switch(CommandDatatable[2])
  168. {
  169. case 0x02:SetSteeringGear(1,CommandDatatable[3]);break;
  170. case 0x03:SetSteeringGear(2,CommandDatatable[3]);break;
  171. case 0x04:SetSteeringGear(3,CommandDatatable[3]);break;
  172. case 0x05:SetSteeringGear(4,CommandDatatable[3]);break;
  173. case 0x06:SetSteeringGear(5,CommandDatatable[3]);break;
  174. case 0x07:SetSteeringGear(6,CommandDatatable[3]);break;
  175. case 0x08:SetSteeringGear(7,CommandDatatable[3]);break;
  176. default : break;
  177. }
  178. break;
  179. case 0X02:
  180. switch(CommandDatatable[2])
  181. {
  182. case 0X01:SetSteeringGear1(CommandDatatable[3]);break;
  183. case 0X02:SetSteeringGear2(CommandDatatable[3]);break;
  184. defaul        :        break;
  185. }
  186. break;
  187. case 0X04: //类型位0X04,表明是大灯数据包,进入大灯case
  188. switch(CommandDatatable[2])
  189. {
  190. case 0X01:Light=0;break;
  191. case 0X00:Light=1;break;
  192. default : break;
  193. }
  194. break;
  195. default : break;
  196. }
  197. }
  198. }
  199. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-17 20:46:17 | 显示全部楼层
本帖最后由 hawkwu 于 2013-7-17 20:47 编辑

太长,分开发,求助啊,PS:一直是这样瞎改的,能用。{:soso_e101:}
回复 支持 反对

使用道具 举报

发表于 2013-7-17 21:02:38 | 显示全部楼层
你这个代码的串口接收部分有问题,可能会数据溢出从而失去控制,你仿照论坛一代板的代码,重写串口解析那部分函数,其他的可以不用动。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-17 21:12:27 来自手机 | 显示全部楼层
liuviking 发表于 2013-7-17 21:02
你这个代码的串口接收部分有问题,可能会数据溢出从而失去控制,你仿照论坛一代板的代码,重写串口解析那部 ...

代码问题啊,L大,你看我代码用左右差速当按键用,十分不便啊,就是左右差速值等于5时,按键生效。能在1.05安卓版上位机加两按键么?实在不懂安卓开发啊。
回复 支持 反对

使用道具 举报

发表于 2013-7-17 21:18:14 | 显示全部楼层
hawkwu 发表于 2013-7-17 21:12
代码问题啊,L大,你看我代码用左右差速当按键用,十分不便啊,就是左右差速值等于5时,按键生效。能在1. ...

1.05版安卓上位机不是带有左右调速功能的吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-17 21:21:32 来自手机 | 显示全部楼层
liuviking 发表于 2013-7-17 21:18
1.05版安卓上位机不是带有左右调速功能的吗?

不是要用左右调速功能,我只把它当按键用,控制单片机两个io口,不当调速用,这样有点啰嗦。
回复 支持 反对

使用道具 举报

发表于 2013-7-18 10:21:12 | 显示全部楼层
1.05版安卓上位机有差速功能
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-18 18:15:37 | 显示全部楼层
已确定是程序问题。继续改
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-9-8 10:38 , Processed in 1.078329 second(s), 19 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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