找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2403|回復(fù): 2
收起左側(cè)

一個單片機(jī)超聲波避障程序錯誤的問題

[復(fù)制鏈接]
ID:397735 發(fā)表于 2020-3-6 23:42 | 顯示全部樓層 |閱讀模式
  1. HELLO 51MUC
復(fù)制代碼

萌新半抄半改寫了一個程序但是出現(xiàn)了同一個語法錯誤(大霧)
  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 ';
復(fù)制代碼

放眼望去全是錯誤,頭發(fā)都要掉完了,涂涂改改
希望有好心人指點(diǎn)下錯誤,幫助下小娃娃
  1. #include <STC12C5A60S2.h
  2. #include <intrins.h>

  3. #define  RX1  P3^6                   //小車左側(cè)超聲波HC-SR04接收端
  4. #define  TX1  P1^7                   //發(fā)送端

  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                   //右側(cè)超聲波
  12. #define  TX5  P1^6

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

  15. //定義小車驅(qū)動模塊輸入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;}  //左電機(jī)向前走
  25. #define Left_moto_back    {IN1=1,IN2=0,EN1=1;}         //左邊電機(jī)向后走
  26. #define Left_moto_Stop    {EN1=0;}  //左邊電機(jī)停轉(zhuǎn)
  27. #define Right_moto_go     {IN3=1,IN4=0,EN2=1;}        //右邊電機(jī)向前走
  28. #define Right_moto_back   {IN3=0,IN4=1,EN2=1;}        //右邊電機(jī)向后走
  29. #define Right_moto_Stop   {EN2=0;}        //右邊電機(jī)停轉(zhuǎn)


  30. unsigned char pwm_val_left  =0;//變量定義
  31. unsigned char push_val_left =0;// 左電機(jī)占空比N/20
  32. unsigned char pwm_val_right =0;
  33. unsigned char push_val_right=0;// 右電機(jī)占空比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延時函數(shù),100ms以內(nèi)可用
  42. {
  43. unsigned char i;
  44. while(x--)
  45. for(i=124;i>0;i--);
  46. }


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

  48. void Count1()          //計(jì)算左側(cè)超聲波距離的函數(shù)
  49. {
  50. while(!RX1);                //當(dāng)RX1為零時等待
  51. TR0=1;                            //開啟計(jì)數(shù)
  52. while(RX1);                //當(dāng)RX1為1計(jì)數(shù)并等待
  53. TR0=0;                                //關(guān)閉計(jì)數(shù)
  54. time=TH0*256+TL0;
  55. TH0=0;
  56. TL0=0;
  57. S1=(time*1.7)/100;     //算出來是CM
  58. }

  59. void Count2()          //計(jì)算函數(shù)
  60. {
  61. while(!RX2);                //當(dāng)RX2為零時等待
  62. TR0=1;                            //開啟計(jì)數(shù)
  63. while(RX2);                //當(dāng)RX2為1計(jì)數(shù)并等待
  64. TR0=0;                                //關(guān)閉計(jì)數(shù)
  65. time=TH0*256+TL0;
  66. TH0=0;
  67. TL0=0;
  68. S2=(time*1.7)/100;     //算出來是CM
  69. }


  70. void Count3()          //計(jì)算函數(shù)
  71. {
  72. while(!RX3);                //當(dāng)RX3為零時等待
  73. TR0=1;                            //開啟計(jì)數(shù)
  74. while(RX3);                //當(dāng)RX3為1計(jì)數(shù)并等待
  75. TR0=0;                                //關(guān)閉計(jì)數(shù)
  76. time=TH0*256+TL0;
  77. TH0=0;
  78. TL0=0;
  79. S3=(time*1.7)/100;     //算出來是CM
  80. }

  81. void Count4()          //計(jì)算函數(shù)
  82. {
  83. while(!RX4);                //當(dāng)RX4為零時等待
  84. TR0=1;                            //開啟計(jì)數(shù)
  85. while(RX4);                //當(dāng)RX4為1計(jì)數(shù)并等待
  86. TR0=0;                                //關(guān)閉計(jì)數(shù)
  87. time=TH0*256+TL0;
  88. TH0=0;
  89. TL0=0;
  90. S4=(time*1.7)/100;     //算出來是CM
  91. }

  92. void Count5()          //計(jì)算函數(shù)
  93. {
  94. while(!RX5);                //當(dāng)RX5為零時等待
  95. TR0=1;                            //開啟計(jì)數(shù)
  96. while(RX5);                //當(dāng)RX5為1計(jì)數(shù)并等待
  97. TR0=0;                                //關(guān)閉計(jì)數(shù)
  98. time=TH0*256+TL0;
  99. TH0=0;
  100. TL0=0;
  101. S5=(time*1.7)/100;     //算出來是CM
  102. }



  103. /************************************************************************/
  104. //前進(jìn)
  105. void run(void)
  106. {
  107. push_val_left=8;         //左電機(jī)調(diào)速,速度調(diào)節(jié)變量 0-20。。。0最小,20最大,四驅(qū)大輪>6
  108. push_val_right=8;         //右電機(jī)調(diào)速
  109. Left_moto_go ;   //左電機(jī)往前走
  110. Right_moto_go ;  //右電機(jī)往前走
  111. }
  112. /************************************************************************/
  113. //后退
  114. void backrun(void)
  115. {
  116. push_val_left=20;
  117. push_val_right=20;
  118. Left_moto_back ; //左電機(jī)往前走
  119. Right_moto_back ; //右電機(jī)往前走
  120. }
  121. /************************************************************************/
  122. //左轉(zhuǎn)
  123. void leftrun(void)
  124. {
  125. push_val_left=20;
  126. push_val_right=20;
  127. Left_moto_back ; //左電機(jī)往后走
  128. Right_moto_go ; //右電機(jī)往前走
  129. }
  130. /************************************************************************/
  131. //右轉(zhuǎn)
  132. void rightrun(void)
  133. {
  134. push_val_left=20;
  135. push_val_right=20;
  136. Left_moto_go ; //左電機(jī)往前走
  137. Right_moto_back ; //右電機(jī)往后走
  138. }
  139. /************************************************************************/
  140. //停止
  141. void stoprun(void)
  142. {
  143. Left_moto_Stop ; //左電機(jī)停
  144. Right_moto_Stop ; //右電機(jī)停
  145. }




  146. /************************************************************************/
  147. /*                    PWM調(diào)制電機(jī)轉(zhuǎn)速                                   */
  148. /************************************************************************/

  149. /*                    左電機(jī)調(diào)速                                        */
  150. /*調(diào)節(jié)push_val_left的值改變電機(jī)轉(zhuǎn)速,占空比            */

  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. /*                    右電機(jī)調(diào)速                                  */
  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中斷服務(wù)子函數(shù)產(chǎn)生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;                   //設(shè)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)        //進(jìn)入狹窄通道
  245. {
  246. backrun();                        //倒車
  247. delay_1ms(100);
  248. }

  249. else if(S3<20 && S1<S5 ) //車子與障礙物90度垂直,左邊距離小右轉(zhuǎn)
  250. {
  251. rightrun();
  252. }
  253. else if(S3<20 && S5<S1 )        //車子與障礙物90度垂直,右邊距離小左轉(zhuǎn)
  254. {
  255. leftrun();
  256. }

  257. else if(S2<20)
  258. {
  259. rightrun(); //車與障礙物呈45度角時,車的左邊比車的右邊距離小,右轉(zhuǎn)

  260. }
  261. else if(S4<20)
  262. {
  263. leftrun(); //車與障礙物呈45度角時,車的右邊比車的左邊距離小,左轉(zhuǎn)
  264. }

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

  269. }
  270. }



復(fù)制代碼
錯誤的位置指向這里,一個部分錯誤用@標(biāo)記
  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.          {
復(fù)制代碼

感謝各位不吝賜教

回復(fù)

使用道具 舉報

ID:155507 發(fā)表于 2020-3-7 07:20 | 顯示全部樓層
P1^4是什么?C語言的意思是:P1這個變量的平方。你想表達(dá)的意思不是這個吧,是想表達(dá)為外部的IO口,但這個是不能這樣表達(dá)的。要在main()函數(shù)以前,用sbit 去說明定義。不能用 #define
sbit是keil特有的,這個叫位定義

sbit Left_moto_pwm  =        P1^5  ;       //PWM信號端
sbit Right_moto_pwm  =        P1^4  ;        //PWM信號端
回復(fù)

使用道具 舉報

ID:397735 發(fā)表于 2020-3-7 11:55 | 顯示全部樓層
angmall 發(fā)表于 2020-3-7 07:20
P1^4是什么?C語言的意思是:P1這個變量的平方。你想表達(dá)的意思不是這個吧,是想表達(dá)為外部的IO口,但這個 ...

謝謝謝謝!因?yàn)閰⒖剂撕芏喑绦蛴行┑胤揭彩且恢虢。感謝賜教,以后不會錯了!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表