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

 找回密码
 立即注册
查看: 13827|回复: 17

程序问题 求大神帮忙看看

[复制链接]
发表于 2014-12-27 23:48:48 | 显示全部楼层 |阅读模式
  1. /* 这个版本是根据管理员iuviking的51单片机版WIFI小车下位机程序(通信协议版)
  2. 版本修改而来,我已经加入了八路舵机控制(p0口),ε咫ヤ涯/ */
  3. #include<reg52.h>
  4. #include<math.h>
  5. #include<intrins.h>
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. uchar Buffer =0; //从串口接收的数据
  9. uint URTAReceivedCount=0,n=1;
  10. uchar data Tempdatatable[5],CommandDatatable[5];//数据包


  11. uchar serVal[2];
  12. uint pwm[]={1120,1190,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)
  15. uint code ms2_5Con=2304; //2.5ms计数


  16. bit key_stime_ok;
  17. sbit StatusLight=P2^0; //状态灯
  18. sbit MainLight=P2^1; //主大灯
  19. sbit servo0=P2^6; //舵机控制
  20. sbit servo1=P2^7;
  21. /********************************************************************
  22. * 名称 : Delay_1ms()
  23. * 功能 : 延时子程序,延时时间为 1ms * x
  24. * 输入 : x (延时一毫秒的个数)
  25. * 输出 : 无
  26. ***********************************************************************/
  27. void Delay_1ms(uint i)//1ms延时
  28. {
  29. uchar x,j;
  30. for(j=0;j<i;j++)
  31. for(x=0;x<=148;x++);
  32. }

  33. void TurnOnStatusLight()
  34. {
  35. StatusLight=0;
  36. }
  37. /********************************************************************
  38. * 名称 : Send_Data()
  39. * 功能 : 向上位机传送字符
  40. * 输入 : 无
  41. * 输出 : 无
  42. ***********************************************************************/
  43. void Send_Data(uchar type,uchar cmd,uchar dat)
  44. {
  45. uchar data Buffer[5];//构建数据包
  46. uchar *p;
  47. uint Send_Count=0;
  48. p = Buffer;
  49. Buffer[0]=0XFF;
  50. Buffer[1]=type;
  51. Buffer[2]=cmd;
  52. Buffer[3]=dat;
  53. Buffer[4]=0XFF;
  54. while(1)
  55. {
  56. if(*p==0XFF)
  57. {
  58. Send_Count++; //0XFF标志统计位
  59. }
  60. SBUF = *p; //发送
  61. while(!TI) //如果发送完毕,硬件会置位TI,等待发送完毕
  62. {
  63. _nop_();
  64. }
  65. p++;
  66. TI = 0;
  67. if(Send_Count == 2) //当统计到两次出现0XFF,则认为一个数据包发送完毕,跳出循环
  68. {
  69. TI = 0;
  70. break;
  71. }
  72. }
  73. }
  74. /********************************************************************
  75. 协议规定:
  76. 包头 类型位 数据位 数据位 结束位
  77. 0XFF 0X** OX** 0X** 0XFF
  78. 各命令说明:
  79. 类型位 数据位 数据位 功能

  80. 0X00 0X02 0X00 前进
  81. 0X00 0X01 0X00 后退
  82. 0X00 0X03 0X00 左转
  83. 0X00 0X04 0X00 右转
  84. 0X00 0X00 0X00 停止

  85. 0X01 0X01 角度 舵机1
  86. 0X01 0X02 . 舵机2

  87. 0X02 0X01 车灯亮
  88. 0X02 0X02 车灯灭

  89. 0X03 雷达数据 发送雷达数据
  90. ***********************************************************************/
  91. /********************************************************************
  92. * 名称 : Com_Int()
  93. * 功能 : 串口中断子函数
  94. ***********************************************************************/
  95. void Com_Int(void) interrupt 4
  96. {
  97. uchar temp;
  98. ES=0; //关串口中断
  99. RI=0; //软件清除接收中断
  100. temp=SBUF;
  101. if(temp==0XFF && URTAReceivedCount<3)
  102. {
  103. Tempdatatable[0]==0XFF; //包头
  104. URTAReceivedCount++;
  105. }
  106. else
  107. {
  108. Tempdatatable[n]=temp;
  109. n++;
  110. if(URTAReceivedCount==0&&n==2)
  111. n=1;
  112. }

  113. if(URTAReceivedCount==2)//包尾
  114. {
  115. Tempdatatable[0]=0XFF;
  116. Tempdatatable[4]=0XFF;
  117. n=1;
  118. URTAReceivedCount=0; //组包完毕
  119. temp="";
  120. // Send_Data(Tempdatatable[1],Tempdatatable[2],Tempdatatable[3]); //发送组成的数据包回去
  121. }

  122. CommandDatatable[0]=Tempdatatable[0];
  123. CommandDatatable[1]=Tempdatatable[1];
  124. CommandDatatable[2]=Tempdatatable[2];
  125. CommandDatatable[3]=Tempdatatable[3];
  126. CommandDatatable[4]=Tempdatatable[4];

  127. ES=1;//开串口中断


  128. }

  129. /********************************************************************
  130. * 名称 : Com_Init()
  131. * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
  132. ***********************************************************************/
  133. void Com_Init(void)
  134. {
  135. TMOD = 0x21;
  136. PCON = 0x00;
  137. SCON = 0x50;
  138. TH1 = 0xFd; //设置波特率 9600
  139. TL1 = 0xFd;
  140. TR1 = 1; //启动定时器1
  141. ES = 1; //开串口中断
  142. EA = 1; //开总中断
  143. IT0=0;
  144. EX0=1;
  145. }

  146. /********************************************************************
  147. * 名称 :Moto_Forward()
  148. * 功能 : 电机1、2启动,都是前进,整车表现为前进。
  149. ***********************************************************************/
  150. void Moto_Forward()
  151. {
  152. P1= 0xaa;
  153. Delay_1ms(100);
  154. }
  155. /********************************************************************
  156. * 名称 :Moto_Backward()
  157. * 功能 : 电机1、2启动,都是后退,整车表现为后退。
  158. ***********************************************************************/
  159. void Moto_Backward()
  160. {

  161. P1= 0x55;
  162. Delay_1ms(100);
  163. }

  164. /********************************************************************
  165. * 名称 :Moto_TurnLeft()
  166. * 功能 : 电机1后退,电机2前进,整车表现为左转。
  167. ***********************************************************************/
  168. void Moto_TurnLeft()
  169. {
  170. P1= 0x99;
  171. Delay_1ms(100);
  172. }
  173. /********************************************************************
  174. * 名称 :Moto_TurnRight()
  175. * 功能 : 电机1前进,电机2后退,整车表现为右转。
  176. ***********************************************************************/
  177. void Moto_TurnRight()
  178. {
  179. P1= 0x66;
  180. Delay_1ms(100);
  181. }
  182. /********************************************************************
  183. * 名称 :Moto_Stop()
  184. * 功能 : 电机1停止,电机2停止,整车表现为停止。
  185. ***********************************************************************/
  186. void Moto_Stop()
  187. {

  188. P1= 0x00;
  189. Delay_1ms(100);
  190. }
  191. /********************************************************************
  192. * 功能 : 舵机PWM中断初始化
  193. ***********************************************************************/
  194. void Timer0Init()
  195. {
  196. /*0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
  197. /.5 ms初始值 F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)*/
  198. TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
  199. TH0=-ms2_5Con>>8; //给定初值,17ms中断
  200. TL0=-ms2_5Con;
  201. EA=1; //总中断打开
  202. ET0=1; //定时器0中断打开
  203. TR0=1; //定时器0开关打开
  204. }
  205. /********************************************************************
  206. * 功能 : 舵机PWM中断, //舵机控制函数 周期为20ms 一个循环20MS = 8*2.5ms
  207. ***********************************************************************/
  208. void SteeringGear() interrupt 1
  209. {
  210. switch(pwm_flag)
  211. {
  212. case 1: servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;
  213. case 2: servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;
  214. case 3: servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;
  215. case 4: servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;
  216. default: TH0=0xff; TL0=0x80; pwm_flag=0;
  217. }
  218. pwm_flag++;
  219. }

  220. void SetSteeringGear(uchar i, uchar val)
  221. {
  222. uint a = (val+46)*10;
  223. if(a<ms0_5Con)
  224. a=ms0_5Con;
  225. if(a>ms2_5Con)
  226. a=ms2_5Con;
  227. pwm[i]=a;
  228. CommandDatatable[2]=0xff; //清除缓存
  229. }

  230. /********************************************************************
  231. * 功能 : 串口中断接收数据
  232. ***********************************************************************/


  233. /*********************************************************************************
  234. ** 函数功能 : 主函数
  235. *********************************************************************************/

  236. void main()
  237. {

  238. MainLight=0;
  239. Delay_1ms(200);
  240. Com_Init();//串口初始化
  241. Timer0Init();//舵机PWM中断初始化
  242. while(1)
  243. {

  244. if(CommandDatatable[0]==0XFF && CommandDatatable[4]==0XFF)
  245. {
  246. switch (CommandDatatable[1]) //根据键值不同,执行不同的内容
  247. {
  248. case 0X00: //类型位0X00,表明是控制数据包,进入控制数据case
  249. switch(CommandDatatable[2]) //根据数据位的值来进行选择执行不同的动作
  250. {
  251. case 0X00:Moto_Stop();break;
  252. case 0X01:Moto_Forward();break;
  253. case 0X02:Moto_Backward();break;
  254. case 0X03:Moto_TurnLeft();break;
  255. case 0X04:Moto_TurnRight();break;
  256. default : break;
  257. }
  258. break;
  259. case 0X01: //类型位0X01,表明是舵机数据包,进入舵机case
  260. switch(CommandDatatable[2])
  261. {
  262. case 0x01:SetSteeringGear(0,CommandDatatable[3]);break;
  263. case 0x02:SetSteeringGear(1,CommandDatatable[3]);break;
  264. default : break;
  265. }
  266. break;
  267. case 0X02: //类型位0X02,表明是大灯数据包,进入大灯case
  268. switch(CommandDatatable[2])
  269. {
  270. case 0X01:MainLight=1;break;
  271. case 0X02:MainLight=0;break;
  272. default : break;
  273. }
  274. break;
  275. default : break;
  276. }
  277. }
  278. }
  279. }
复制代码
以上为程序内容,是我拿的人家的程序改的,舵机控制一块和电机驱动(两驱改四驱),不知改的对不对,另外编译的时候有两个警告,不是很懂,求大神帮看看 ,解决小弟的困惑啊
回复

使用道具 举报

发表于 2014-12-28 19:58:19 | 显示全部楼层
试跑一下看看。有警告很正常。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-29 19:13:06 | 显示全部楼层
我把程序烧进去了 ,舵机能工作,驱动电机用的两个单独的L298n驱动模块,可是两个不能同时工作,一按就断电,如果只接两个里的任意一个驱动模块,是可以正常工作的,这是为什么呢,请指点迷津啊,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-29 19:15:54 | 显示全部楼层
liuviking 发表于 2014-12-28 19:58
试跑一下看看。有警告很正常。


我把程序烧进去了 ,舵机能工作,驱动电机用的两个单独的L298n驱动模块,可是两个不能同时工作,一按就断电,如果只接两个里的任意一个驱动模块,是可以正常工作的,这是为什么呢,请指点迷津啊
回复 支持 反对

使用道具 举报

发表于 2014-12-29 21:48:58 | 显示全部楼层
ufomiao 发表于 2014-12-29 19:15
我把程序烧进去了 ,舵机能工作,驱动电机用的两个单独的L298n驱动模块,可是两个不能同时工作,一按就 ...

电源不稳定,电流不够
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-29 22:03:29 | 显示全部楼层
liuviking 发表于 2014-12-29 21:48
电源不稳定,电流不够

那该怎么解决呢,我电源是12v的,经过两个稳压模块,一个5v供电,一个8v给电机供电,两个电机驱动板并联,和单片机共地,5v输出和8v输出也都共地,不知道是不是电路有干扰或是接错的原因,大神,求指导啊
回复 支持 反对

使用道具 举报

发表于 2014-12-29 22:24:51 | 显示全部楼层
ufomiao 发表于 2014-12-29 22:03
那该怎么解决呢,我电源是12v的,经过两个稳压模块,一个5v供电,一个8v给电机供电,两个电机驱动板并联 ...

你原始12V电源的规格是怎样的?最大电流多少?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-29 22:43:28 | 显示全部楼层
liuviking 发表于 2014-12-29 22:24
你原始12V电源的规格是怎样的?最大电流多少?

就是网上买的12v锂电池,没有其他参数说明
回复 支持 反对

使用道具 举报

发表于 2014-12-30 00:22:34 | 显示全部楼层
ufomiao 发表于 2014-12-29 22:43
就是网上买的12v锂电池,没有其他参数说明

问一下卖家,最大输出电流是多少,例如论坛商城的是8A,如果A数太小,就会带不起。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-30 18:54:43 | 显示全部楼层
liuviking 发表于 2014-12-30 00:22
问一下卖家,最大输出电流是多少,例如论坛商城的是8A,如果A数太小,就会带不起。

问过了,是2A的,可是我看了下,电机的工作电流也就200多毫安
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2024-11-23 00:13 , Processed in 1.137900 second(s), 22 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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