找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1939|回复: 2
收起左侧

一个单片机超声波避障程序错误的问题

[复制链接]
ID:397735 发表于 2020-3-6 23:42 | 显示全部楼层 |阅读模式
  1. HELLO 51MUC
复制代码

萌新半抄半改写了一个程序但是出现了同一个语法错误(大雾)
  1. compiling wuluchaoshengbo.c...
  2. wuluchaoshengbo.c(205): error C141: syntax error near '=', expected ';'
  3. wuluchaoshengbo.c(209): error C141: syntax error near '=', expected ';'
  4. wuluchaoshengbo.c(216): error C141: syntax error near '=', expected ';'
  5. wuluchaoshengbo.c(228): error C141: syntax error near '=', expected ';
复制代码

放眼望去全是错误,头发都要掉完了,涂涂改改
希望有好心人指点下错误,帮助下小娃娃
  1. #include <STC12C5A60S2.h
  2. #include <intrins.h>

  3. #define  RX1  P3^6                   //小车左侧超声波HC-SR04接收端
  4. #define  TX1  P1^7                   //发送端

  5. #define  RX2  P3^3                   //左前方超声波
  6. #define  TX2  P0^2

  7. #define  RX3  P2^4                   //正前方超声波
  8. #define  TX3  P2^5

  9. #define  RX4  P3^5                   //右前方超声波
  10. #define  TX4  P3^4

  11. #define  RX5  P3^7                   //右侧超声波
  12. #define  TX5  P1^6

  13. #define Left_moto_pwm          P1^5         //PWM信号端
  14. #define Right_moto_pwm          P1^4          //PWM信号端

  15. //定义小车驱动模块输入IO口
  16. sbit IN1=P1^0;
  17. sbit IN2=P1^1;
  18. sbit IN3=P1^2;
  19. sbit IN4=P1^3;
  20. sbit EN1=P1^4;
  21. sbit EN2=P1^5;

  22. bit Right_moto_stop=1;
  23. bit Left_moto_stop =1;

  24. #define Left_moto_go      {IN1=0,IN2=1,EN1=1;}  //左电机向前走
  25. #define Left_moto_back    {IN1=1,IN2=0,EN1=1;}         //左边电机向后走
  26. #define Left_moto_Stop    {EN1=0;}  //左边电机停转
  27. #define Right_moto_go     {IN3=1,IN4=0,EN2=1;}        //右边电机向前走
  28. #define Right_moto_back   {IN3=0,IN4=1,EN2=1;}        //右边电机向后走
  29. #define Right_moto_Stop   {EN2=0;}        //右边电机停转


  30. unsigned char pwm_val_left  =0;//变量定义
  31. unsigned char push_val_left =0;// 左电机占空比N/20
  32. unsigned char pwm_val_right =0;
  33. unsigned char push_val_right=0;// 右电机占空比N/20


  34. unsigned int  time=0;
  35. unsigned int  timer=0;
  36. unsigned long S1=0;
  37. unsigned long S2=0;
  38. unsigned long S3=0;
  39. unsigned long S4=0;
  40. unsigned long S5=0;



  41. void delay_1ms(unsigned char x)          //1ms延时函数,100ms以内可用
  42. {
  43. unsigned char i;
  44. while(x--)
  45. for(i=124;i>0;i--);
  46. }


  47. /********************************************************/

  48. void Count1()          //计算左侧超声波距离的函数
  49. {
  50. while(!RX1);                //当RX1为零时等待
  51. TR0=1;                            //开启计数
  52. while(RX1);                //当RX1为1计数并等待
  53. TR0=0;                                //关闭计数
  54. time=TH0*256+TL0;
  55. TH0=0;
  56. TL0=0;
  57. S1=(time*1.7)/100;     //算出来是CM
  58. }

  59. void Count2()          //计算函数
  60. {
  61. while(!RX2);                //当RX2为零时等待
  62. TR0=1;                            //开启计数
  63. while(RX2);                //当RX2为1计数并等待
  64. TR0=0;                                //关闭计数
  65. time=TH0*256+TL0;
  66. TH0=0;
  67. TL0=0;
  68. S2=(time*1.7)/100;     //算出来是CM
  69. }


  70. void Count3()          //计算函数
  71. {
  72. while(!RX3);                //当RX3为零时等待
  73. TR0=1;                            //开启计数
  74. while(RX3);                //当RX3为1计数并等待
  75. TR0=0;                                //关闭计数
  76. time=TH0*256+TL0;
  77. TH0=0;
  78. TL0=0;
  79. S3=(time*1.7)/100;     //算出来是CM
  80. }

  81. void Count4()          //计算函数
  82. {
  83. while(!RX4);                //当RX4为零时等待
  84. TR0=1;                            //开启计数
  85. while(RX4);                //当RX4为1计数并等待
  86. TR0=0;                                //关闭计数
  87. time=TH0*256+TL0;
  88. TH0=0;
  89. TL0=0;
  90. S4=(time*1.7)/100;     //算出来是CM
  91. }

  92. void Count5()          //计算函数
  93. {
  94. while(!RX5);                //当RX5为零时等待
  95. TR0=1;                            //开启计数
  96. while(RX5);                //当RX5为1计数并等待
  97. TR0=0;                                //关闭计数
  98. time=TH0*256+TL0;
  99. TH0=0;
  100. TL0=0;
  101. S5=(time*1.7)/100;     //算出来是CM
  102. }



  103. /************************************************************************/
  104. //前进
  105. void run(void)
  106. {
  107. push_val_left=8;         //左电机调速,速度调节变量 0-20。。。0最小,20最大,四驱大轮>6
  108. push_val_right=8;         //右电机调速
  109. Left_moto_go ;   //左电机往前走
  110. Right_moto_go ;  //右电机往前走
  111. }
  112. /************************************************************************/
  113. //后退
  114. void backrun(void)
  115. {
  116. push_val_left=20;
  117. push_val_right=20;
  118. Left_moto_back ; //左电机往前走
  119. Right_moto_back ; //右电机往前走
  120. }
  121. /************************************************************************/
  122. //左转
  123. void leftrun(void)
  124. {
  125. push_val_left=20;
  126. push_val_right=20;
  127. Left_moto_back ; //左电机往后走
  128. Right_moto_go ; //右电机往前走
  129. }
  130. /************************************************************************/
  131. //右转
  132. void rightrun(void)
  133. {
  134. push_val_left=20;
  135. push_val_right=20;
  136. Left_moto_go ; //左电机往前走
  137. Right_moto_back ; //右电机往后走
  138. }
  139. /************************************************************************/
  140. //停止
  141. void stoprun(void)
  142. {
  143. Left_moto_Stop ; //左电机停
  144. Right_moto_Stop ; //右电机停
  145. }




  146. /************************************************************************/
  147. /*                    PWM调制电机转速                                   */
  148. /************************************************************************/

  149. /*                    左电机调速                                        */
  150. /*调节push_val_left的值改变电机转速,占空比            */

  151. void pwm_out_left_moto(void)
  152. {
  153. if(Left_moto_stop)
  154. {
  155. if(pwm_val_left<=push_val_left)
  156. {
  157. Left_moto_pwm=1;
  158. }
  159. else
  160. {
  161. Left_moto_pwm=0;
  162. }
  163. if(pwm_val_left>=20)
  164. pwm_val_left=0;
  165. }
  166. else
  167. {
  168. Left_moto_pwm=0;
  169. }
  170. }
  171. /******************************************************************/
  172. /*                    右电机调速                                  */
  173. void pwm_out_right_moto(void)
  174. {
  175. if(Right_moto_stop)
  176. {
  177. if(pwm_val_right<=push_val_right)
  178. {
  179. Right_moto_pwm=1;
  180. }
  181. else
  182. {
  183. Right_moto_pwm=0;
  184. }
  185. if(pwm_val_right>=20)
  186. pwm_val_right=0;
  187. }
  188. else
  189. {
  190. Right_moto_pwm=0;
  191. }
  192. }



  193. /********************************************************/
  194. void timer0() interrupt 1                  //T0中断
  195. {

  196. }

  197. /***************************************************/
  198. ///*TIMER1中断服务子函数产生PWM信号*/

  199. void timer1()interrupt 3
  200. {
  201. TH1=(65536-1000)/256;         //1ms定时
  202. TL1=(65536-1000)%256;
  203. timer++;
  204. pwm_val_left++;
  205. pwm_val_right++;
  206. pwm_out_left_moto();
  207. pwm_out_right_moto();
  208. }


  209. /*********************************************************
  210. **********************************************************/

  211. void  main(void)

  212. {
  213. TMOD=0x11;                   //设T0为方式1,GATE=1;
  214. TH0=0;
  215. TL0=0;
  216. TH1=(65536-1000)/256;         //1ms定时
  217. TL1=(65536-1000)%256;
  218. ET0=1;             //允许T0中断
  219. ET1=1;                           //允许T1中断
  220. TR1=1;                           //开启定时器
  221. EA=1;                           //开启总中断

  222. while(1)
  223. {

  224. TX1=1;                                 //开启超声波1探测
  225. delay_1ms(1);
  226. TX1=0;
  227. Count1();                        //测距

  228. TX2=1;
  229. delay_1ms(1);
  230. TX2=0;
  231. Count2();

  232. TX3=1;
  233. delay_1ms(1);
  234. TX3=0;
  235. Count3();

  236. TX4=1;
  237. delay_1ms(1);
  238. TX4=0;
  239. Count4();

  240. TX5=1;
  241. delay_1ms(1);
  242. TX5=0;
  243. Count5();


  244. if(S3<20 && S1<20 && S5<20)        //进入狭窄通道
  245. {
  246. backrun();                        //倒车
  247. delay_1ms(100);
  248. }

  249. else if(S3<20 && S1<S5 ) //车子与障碍物90度垂直,左边距离小右转
  250. {
  251. rightrun();
  252. }
  253. else if(S3<20 && S5<S1 )        //车子与障碍物90度垂直,右边距离小左转
  254. {
  255. leftrun();
  256. }

  257. else if(S2<20)
  258. {
  259. rightrun(); //车与障碍物呈45度角时,车的左边比车的右边距离小,右转

  260. }
  261. else if(S4<20)
  262. {
  263. leftrun(); //车与障碍物呈45度角时,车的右边比车的左边距离小,左转
  264. }

  265. else
  266. {
  267. run();
  268. }

  269. }
  270. }



复制代码
错误的位置指向这里,一个部分错误用@标记
  1. void pwm_out_left_moto(void)
  2. {
  3.    if(Left_moto_stop)
  4.       {
  5.           if(pwm_val_left<=push_val_left)
  6.            {
  7. @ Left_moto_pwm=1;
  8.            }
  9.        else
  10.          {
复制代码

感谢各位不吝赐教

回复

使用道具 举报

ID:155507 发表于 2020-3-7 07:20 | 显示全部楼层
P1^4是什么?C语言的意思是:P1这个变量的平方。你想表达的意思不是这个吧,是想表达为外部的IO口,但这个是不能这样表达的。要在main()函数以前,用sbit 去说明定义。不能用 #define
sbit是keil特有的,这个叫位定义

sbit Left_moto_pwm  =        P1^5  ;       //PWM信号端
sbit Right_moto_pwm  =        P1^4  ;        //PWM信号端
回复

使用道具 举报

ID:397735 发表于 2020-3-7 11:55 | 显示全部楼层
angmall 发表于 2020-3-7 07:20
P1^4是什么?C语言的意思是:P1这个变量的平方。你想表达的意思不是这个吧,是想表达为外部的IO口,但这个 ...

谢谢谢谢!因为参考了很多程序有些地方也是一知半解。感谢赐教,以后不会错了!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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