[STC单片机] 大神们我在用stc12单片机做了个循迹小车,现在有点问题想请教下

[复制链接]
 楼主| 执柯伐柯 发表于 2017-8-7 09:32 | 显示全部楼层 |阅读模式
1.我的小车在遇到左边的黑线时停不下来,慢慢开是能停的。。是我的程序太臃肿了嘛
2.我想在我的小车上实现,在条件达成之后在冲一段时间,这在程序中怎么实现
附程序,希望大佬们帮帮我这个菜鸟,第一次做小车

  1. #include <reg52.h>

  2. #define uint unsigned int
  3. unsigned char zifuchuan[]="abcd";                        //待显示字符
  4. volatile unsigned char sending;
  5. int add_left1,add_left2,add_right1,add_right2;
  6. int  flag=0;
  7. int  flag2=0;
  8. int r,l,z=0;

  9. /*******PWM波调节参数********/
  10. #define push_left1 1
  11. #define push_left2 1
  12. #define push_right1 1
  13. #define push_right2 1                                 

  14. /*******黑白检测传感器输出********/
  15. sbit sign_left1=P2^0;
  16. sbit sign_left2=P2^1;
  17. sbit sign_left3=P2^2;
  18. //sbit sign_right1=P2^2;
  19. sbit sign_left4=P2^3;
  20. sbit sign_right1=P2^4;
  21. sbit sign_right2=P2^5;
  22. sbit sign_right3=P2^6;
  23. sbit sign_back2=P2^7;
  24. sbit sign_back=P3^1;
  25. /*******四轮电机信号输入********/
  26. sbit left_moto1_in1=P0^0;
  27. sbit left_moto1_in2=P0^1;
  28. sbit left_moto2_in1=P0^2;
  29. sbit left_moto2_in2=P0^3;
  30. sbit right_moto1_in1=P0^4;
  31. sbit right_moto1_in2=P0^5;
  32. sbit right_moto2_in1=P0^6;
  33. sbit right_moto2_in2=P0^7;

  34. /*******四轮电机信号使能********/
  35. sbit Left_moto1_pwm_ENA=P1^0;
  36. sbit Left_moto2_pwm_ENB=P1^1;
  37. sbit Right_moto1_pwm_ENA=P1^2;
  38. sbit Right_moto2_pwm_ENB=P1^3;

  39. /*******电机占空比参量定义********/
  40. unsigned char pwm_val_left1  =0;    //变量定义
  41. unsigned char push_val_left1 =0;    //左1电机占空比N/10
  42. unsigned char pwm_val_left2  =0;    //变量定义
  43. unsigned char push_val_left2 =0;    //左2电机占空比N/10
  44. unsigned char pwm_val_right1 =0;        //变量定义
  45. unsigned char push_val_right1=0;    //右电机占空比N/10
  46. unsigned char pwm_val_right2 =0;        //变量定义
  47. unsigned char push_val_right2=0;    //右电机占空比N/10

  48. bit Left_moto1_stop =1;
  49. bit Left_moto2_stop =1;
  50. bit Right_moto1_stop=1;
  51. bit Right_moto2_stop=1;
  52. unsigned  int  time=0;

  53. /*******左1电机前进********/
  54. void left_moto1_go()
  55. {
  56.   left_moto1_in1=1;
  57.   left_moto1_in2=0;
  58. }

  59. /*******左1电机后退********/
  60. void left_moto1_back()
  61. {
  62.   left_moto1_in1=0;
  63.   left_moto1_in2=1;
  64. }

  65. /*******左1电机停止********/
  66. void left_moto1_stp()
  67. {
  68.   left_moto1_in1=0;
  69.   left_moto1_in2=0;
  70. }

  71. /*******左2电机前进********/
  72. void left_moto2_go()
  73. {
  74.   left_moto2_in1=1;
  75.   left_moto2_in2=0;
  76. }

  77. /*******左2电机后退********/
  78. void left_moto2_back()
  79. {
  80.   left_moto2_in1=0;
  81.   left_moto2_in2=1;
  82. }

  83. /*******左2电机停止********/
  84. void left_moto2_stp()
  85. {
  86.   left_moto2_in1=0;
  87.   left_moto2_in2=0;
  88. }

  89. /*******右1电机前进********/
  90. void right_moto1_go()
  91. {
  92.   right_moto1_in1=1;
  93.   right_moto1_in2=0;
  94. }

  95. /*******右1电机后退********/
  96. void right_moto1_back()
  97. {
  98.   right_moto1_in1=0;
  99.   right_moto1_in2=1;
  100. }

  101. /*******右1电机停止********/
  102. void right_moto1_stp()
  103. {
  104.   right_moto1_in1=0;
  105.   right_moto1_in2=0;
  106. }

  107. /*******右2电机前进********/
  108. void right_moto2_go()
  109. {
  110.   right_moto2_in1=1;
  111.   right_moto2_in2=0;
  112. }

  113. /*******右2电机后退********/
  114. void right_moto2_back()
  115. {
  116.   right_moto2_in1=0;
  117.   right_moto2_in2=1;
  118. }

  119. /*******右2电机停止********/
  120. void right_moto2_stp()
  121. {
  122.   right_moto2_in1=0;
  123.   right_moto2_in2=0;
  124. }

  125. /*******小车停止********/
  126. void car_stp()
  127. {
  128.    push_val_left1  = push_left1+add_left1;  //PWM 调节参数1-10   1为最慢,10是最快  改这个值可以改变其速度
  129.    push_val_left2  = push_left2+add_left2;
  130.    push_val_right1 = push_right1+add_right1;        //PWM 调节参数1-10   1为最慢,10是最快        改这个值可以改变其速度
  131.    push_val_right2 = push_right2+add_right2;       
  132.    left_moto1_stp();
  133.    left_moto2_stp();
  134.    right_moto1_stp();
  135.    right_moto2_stp();
  136. }

  137. /*******小车直线前进********/
  138. void car_run_straight()
  139. {
  140.    push_val_left1  = push_left1+add_left1;  //PWM 调节参数1-10   1为最慢,10是最快  改这个值可以改变其速度
  141.    push_val_left2  = push_left2+add_left2;
  142.    push_val_right1 = push_right1+add_right1;        //PWM 调节参数1-10   1为最慢,10是最快        改这个值可以改变其速度
  143.    push_val_right2 = push_right2+add_right2;       
  144.    left_moto1_go();
  145.    left_moto2_go();
  146.    right_moto1_go();
  147.    right_moto2_go();
  148. }

  149. /*********小车右转**********/
  150. void car_turn_left()
  151. {
  152.    push_val_left1  = push_left1+add_left1;  //PWM 调节参数1-10   1为最慢,10是最快  改这个值可以改变其速度
  153.    push_val_left2  = push_left2+add_left2;
  154.    push_val_right1 = push_right1+add_right1;        //PWM 调节参数1-10   1为最慢,10是最快        改这个值可以改变其速度
  155.    push_val_right2 = push_right2+add_right2;               
  156.    right_moto1_go();
  157.    right_moto2_go();
  158.    left_moto1_stp();
  159.    left_moto2_stp();
  160. }

  161. /*********小车左转**********/
  162. void car_turn_right()
  163. {
  164.    push_val_left1  = push_left1+add_left1;  //PWM 调节参数1-10   1为最慢,10是最快  改这个值可以改变其速度
  165.    push_val_left2  = push_left2+add_left2;
  166.    push_val_right1 = push_right1+add_right1;        //PWM 调节参数1-10   1为最慢,10是最快        改这个值可以改变其速度
  167.    push_val_right2 = push_right2+add_right2;       
  168.    left_moto1_stp();
  169.    left_moto2_stp();
  170.    right_moto1_go();
  171.    right_moto2_go();   
  172. }

  173. void car_translate_right()
  174. {
  175.    push_val_left1  = push_left1+add_left1;  //PWM 调节参数1-10   1为最慢,10是最快  改这个值可以改变其速度
  176.    push_val_left2  = push_left2+add_left2;
  177.    push_val_right1 = push_right1+add_right1;        //PWM 调节参数1-10   1为最慢,10是最快        改这个值可以改变其速度
  178.    push_val_right2 = push_right2+add_right2;
  179.    left_moto1_go();
  180.    left_moto2_back();
  181.    right_moto1_back();
  182.    right_moto2_go();
  183. }

  184. /*******左1电机调速(调节push_val_left的值改变电机转速,占空比)********/
  185. void pwm_out_left_moto1(void)
  186. {  
  187.         if(Left_moto1_stop)
  188.         {
  189.                 if(pwm_val_left1<=push_val_left1)
  190.                         Left_moto1_pwm_ENA=1;
  191.             else
  192.                 Left_moto1_pwm_ENA=0;
  193.         if(pwm_val_left1>=10)
  194.                 pwm_val_left1=0;
  195.         }
  196.         else
  197.                 Left_moto1_pwm_ENA=0;
  198. }

  199. /*******左2电机调速(调节push_val_left的值改变电机转速,占空比)********/
  200. void pwm_out_left_moto2(void)
  201. {  
  202.         if(Left_moto2_stop)
  203.         {
  204.                 if(pwm_val_left2<=push_val_left2)
  205.                         Left_moto2_pwm_ENB=1;
  206.             else
  207.                 Left_moto2_pwm_ENB=0;
  208.         if(pwm_val_left2>=10)
  209.                 pwm_val_left2=0;
  210.         }
  211.         else
  212.                 Left_moto2_pwm_ENB=0;
  213. }

  214. /*******右1电机调速(调节push_val_left的值改变电机转速,占空比)********/
  215. void pwm_out_right_moto1(void)
  216. {
  217.   if(Right_moto1_stop)
  218.   {
  219.         if(pwm_val_right1<=push_val_right1)
  220.                 Right_moto1_pwm_ENA=1;
  221.         else
  222.                 Right_moto1_pwm_ENA=0;
  223.         if(pwm_val_right1>=10)
  224.                 pwm_val_right1=0;
  225.   }
  226.   else
  227.                 Right_moto1_pwm_ENA=0;
  228. }

  229. /*******右2电机调速(调节push_val_left的值改变电机转速,占空比)********/
  230. void pwm_out_right_moto2(void)
  231. {
  232.   if(Right_moto2_stop)
  233.   {
  234.         if(pwm_val_right2<=push_val_right2)
  235.                 Right_moto2_pwm_ENB=1;
  236.         else
  237.                 Right_moto2_pwm_ENB=0;
  238.         if(pwm_val_right2>=10)
  239.                 pwm_val_right2=0;
  240.   }
  241.   else
  242.                 Right_moto2_pwm_ENB=0;
  243. }
  244. /********************************************************************
  245. * 名称 : Delay()
  246. * 功能 : 延时,延时时间为 10ms * del
  247. ***********************************************************************/  
  248. void Delay(uint del)  
  249. {  
  250.     uint i,j;  
  251.     for(i=0; i<del; i++)  
  252.     for(j=0; j<1827; j++)      
  253.     ;  
  254. }

  255. /*******串口初始化********/
  256. void initcom(void)                               
  257. {
  258. EA=0;           //暂时关闭中断
  259. AUXR=0x15;
  260. BRT=0xdc;
  261. SCON=0x50;      //串口工作在模式1
  262. ES=1;           //串行中断允许
  263. REN=1;          //允许接收
  264. EA=1;           //允许中断
  265. }

  266. /*******定时器0和定时器1初始化********/
  267. void initime(void)                               
  268. {
  269. EA=0;           //暂时关闭中断
  270. TMOD=0x11;                 //模式1设置(M1=0,M0=1)
  271. TR0=1;                         //打开定时器
  272. TH0=0XFC;          //1Ms定时定时器设置,每隔1Ms发起一次中断。
  273. TL0=0X18;
  274. ET0=1;           //开定时器0中断
  275. TR1=1;
  276. TH1=0Xfd;                 //定时器设置,每隔100微秒发起一次中断。
  277. TL1=0xfd;
  278. ET1=1;           //开定时器1中断
  279. EA=1;           //允许中断
  280. }
  281. /*********发送一个字节的数据,形参d即为待发送数据**********/
  282. void send(unsigned char d)                  
  283. {
  284. SBUF=d;         //将数据写入到串口缓冲
  285. sending=1;             //设置发送标志
  286. while(sending); //等待发送完毕
  287. }

  288. /**********发送字符串,直到遇到0才结束**********/
  289. void sendc(unsigned char * pd)
  290. {
  291.         int n;
  292. /* while((*pd)!='\0')
  293. {
  294.   send(*pd);     //发送一个字符
  295.   pd++;          //移动到下一个字符
  296. }        */
  297. for(n=0;n<5;n++)
  298. {
  299. ES=0;
  300. SBUF=pd[n];
  301. while(!TI);
  302. TI=0;
  303. }

  304.        
  305.        
  306.        
  307.        
  308.        
  309. // while((*pd)!='\0')
  310. // {
  311. //  send(*pd);     //发送一个字符
  312. //  pd++;          //移动到下一个字符
  313. // }
  314. }

  315. /**********主程序**********/
  316. void main()
  317. {
  318. initcom();             //串口初始化
  319. initime();      //定时器0和定时器1初始化
  320. IPH=IPH|0x10;
  321. IP=IP|0x10;
  322. sign_left1=1;
  323. sign_left2=1;
  324. sign_left3=1;
  325. add_left1=3;
  326. add_left2=3;
  327. add_right1=3;
  328. add_right2=3;
  329. flag=1;
  330.         sign_back=1;
  331.        
  332. while(1)
  333. {
  334.          if(flag==1&&sign_left1==0&&sign_left2==1&&sign_left3==0&&sign_left4==0&&sign_right2==0&&sign_right3==0)//中间灯扫描
  335.    {  
  336.             add_left1=2;
  337.       add_left2=2;
  338.       add_right1=2;
  339.       add_right2=2;
  340.           car_run_straight();       
  341.    }
  342.          if(flag==1&&sign_left1==0&&sign_left2==0&&sign_left3==1&&sign_left4==0&&sign_right2==0&&sign_right3==0)//中间灯扫描
  343.    {  
  344.             add_left1=2;
  345.       add_left2=2;
  346.       add_right1=2;
  347.       add_right2=2;
  348.           car_run_straight();       
  349.    }
  350.     if(flag==1&&sign_left1==0&&sign_left2==1&&sign_left3==1&&sign_left4==0&&sign_right2==0&&sign_right3==0)//中间灯扫描
  351.    {  
  352.             add_left1=2;
  353.       add_left2=2;
  354.       add_right1=2;
  355.       add_right2=2;
  356.           car_run_straight();       
  357.    }
  358.     if(flag==1&&sign_left1==1&&sign_left2==0&&sign_left3==0&&sign_left4==0&&sign_right2==0&&sign_right3==0)//左边碰黑线一个灯   右转
  359.    {  
  360.           add_right1=2;
  361.     add_right2=2;
  362.           add_left1=3;
  363.           add_left2=3;
  364.           left_moto1_go();
  365.           left_moto2_go();
  366.           right_moto1_back();
  367.           right_moto2_back();       
  368.    }
  369.     if(flag==1&&sign_left1==0&&sign_left2==0&&sign_left3==0&&sign_left4==1&&sign_right2==0&&sign_right3==0)//右边边碰黑线一个灯  左转
  370.    {  
  371.           add_right1=3;
  372.     add_right2=3;
  373.           add_left1=2;
  374.           add_left2=2;
  375.           left_moto1_back();
  376.           left_moto2_back();
  377.           right_moto1_go();
  378.           right_moto2_go();               
  379.    }
  380.          
  381.     if(flag==1&&sign_left1==1&&sign_left2==1&&sign_left3==0&&sign_left4==0)//左边碰黑线两个灯  右转
  382.    {  
  383.    add_right1=2;
  384.     add_right2=2;
  385.           add_left1=3;
  386.           add_left2=3;
  387.           left_moto1_go();
  388.           left_moto2_go();
  389.           right_moto1_back();
  390.           right_moto2_back();       
  391.    }
  392.     if(flag==1&&sign_left1==0&&sign_left2==0&&sign_left3==1&&sign_left4==1&&sign_right2==0&&sign_right3==0)//右边碰黑线两个灯   左转
  393.    {  
  394.            add_left1=2;
  395.            add_left2=2;
  396.            car_turn_right();       
  397.    }
  398.     if(flag==1&&sign_left1==0&&sign_left2==0&&sign_left3==0&&sign_left4==0&&sign_right2==0&&sign_right3==0)          //   左转
  399.    {  
  400.     add_right1=3;
  401.     add_right2=3;
  402.           add_left1=2;
  403.           add_left2=2;
  404.           left_moto1_back();
  405.           left_moto2_back();
  406.           right_moto1_go();
  407.           right_moto2_go();       
  408.    }

  409.   if(flag==1&&sign_left1==1&&sign_left2==1&&sign_left3==1&&sign_left4==0&&sign_right2==0&&sign_right3==0)
  410.         {         
  411.                 add_left1=0;
  412.           add_left2=0;
  413.                 add_right1=0;
  414.                 add_right2=0;
  415. car_run_straight();       
  416.                
  417.        
  418.         }

  419. }
  420. }

  421. /********串口中断程序**********/
  422. void uart(void) interrupt 4       
  423. {
  424. if(RI)        //收到数据
  425. {
  426.   RI=0;        //清中断请求
  427. }
  428. else          //发送完一字节数据
  429. {
  430.   TI=0;
  431.   sending=0;   //清正在发送标志
  432. }
  433. }

  434. /********定时器0中断程序**********/
  435. void time0() interrupt 1
  436. {         
  437.         if((flag2==0)&&(sign_right2==1||sign_right3==1))
  438.                          {
  439.          left_moto1_stp();
  440.    left_moto2_stp();
  441.    right_moto1_stp();
  442.    right_moto2_stp();
  443.                                  
  444.                   
  445.                          
  446.                          
  447.                          }
  448.                          
  449.                           if(sign_back2==0)  //光电开关扫描到//
  450.                          {
  451.                          flag=0;       
  452.                          
  453.                          }

  454.                  if(flag==0)
  455.         {
  456.    
  457.           add_left1=9;
  458.           add_left2=9;
  459.                 add_right1=5;
  460.                 add_right2=5;
  461.           left_moto1_go();
  462.           left_moto2_go();
  463.           right_moto1_back();
  464.           right_moto2_back();
  465.                 flag2=1;
  466.                 r++;
  467.      if(r>=2000)       
  468.     {       
  469.        
  470.                 if(sign_left1==0&&sign_left2==0&&sign_left3==0&&sign_left4==0)
  471.                 {
  472.           add_left1=2;
  473.           add_left2=2;
  474.                 add_right1=2;
  475.                 add_right2=2;
  476.           left_moto1_go();
  477.           left_moto2_go();
  478.           right_moto1_go();
  479.           right_moto2_go();
  480.                        
  481.                 }
  482.                 if(sign_left1==1||sign_left2==1||sign_left3==1||sign_left4==1)
  483.                 { z++;
  484.                         if(z>=5000)       
  485.                         {
  486.                           flag2=0;
  487.                                 z=0;
  488.                         }
  489.                         flag=1;
  490.                 r=0;
  491.                 }
  492.      }                       
  493.         }
  494.                        

  495. TH0=0XFC;          //1Ms定时
  496. TL0=0X18;
  497. time++;
  498. pwm_val_left1++;
  499. pwm_val_left2++;
  500. pwm_val_right1++;
  501. pwm_val_right2++;
  502. pwm_out_left_moto1();
  503. pwm_out_left_moto2();
  504. pwm_out_right_moto1();
  505. pwm_out_right_moto2();
  506. }

  507. /********定时器1中断程序**********/
  508. void time1() interrupt 3
  509. {
  510.    TH1=0Xfd;                 //定时器设置       
  511.    TL1=0Xfd;


  512. }
 楼主| 执柯伐柯 发表于 2017-8-7 16:30 | 显示全部楼层
没人吗
Honmax 发表于 2017-8-7 16:44 | 显示全部楼层
 楼主| 执柯伐柯 发表于 2017-8-7 19:26 | 显示全部楼层
cuya 发表于 2017-8-7 20:52 | 显示全部楼层
坦率地说, 我想没人愿意没人有耐心看你的程序, 同时给你找出bug.
你不妨直接说出问题所在
 楼主| 执柯伐柯 发表于 2017-8-8 13:44 | 显示全部楼层
cuya 发表于 2017-8-7 20:52
坦率地说, 我想没人愿意没人有耐心看你的程序, 同时给你找出bug.
你不妨直接说出问题所在 ...

就是当我小车扫描到,让他停止的黑线时,并没有停下来,但如果速度放慢是可以停下来的。所以不知道怎么办
694844985 发表于 2017-8-8 16:07 | 显示全部楼层
看下你的控制逻辑,肯定是控制方法的问题,好好想想你慢速和快速有什么不同,粗略估计是你速度快速程序跳不出来速度控制的执行逻辑
694844985 发表于 2017-8-8 16:08 | 显示全部楼层
加个调试标志位,看看是否进入你扫描黑线的程序里了,如果进入了就点个灯做个指示
linqing171 发表于 2017-8-8 17:20 | 显示全部楼层
用手推车(简称stc)做了个小车?
ningling_21 发表于 2017-8-8 17:30 | 显示全部楼层
执柯伐柯 发表于 2017-8-8 13:44
就是当我小车扫描到,让他停止的黑线时,并没有停下来,但如果速度放慢是可以停下来的。所以不知道怎么办 ...

可以用串口(输出数据到PC)监控一下程序运行的状态(遇到黑线的前后),基本可以找到问题所在
 楼主| 执柯伐柯 发表于 2017-8-9 09:14 | 显示全部楼层
ningling_21 发表于 2017-8-8 17:30
可以用串口(输出数据到PC)监控一下程序运行的状态(遇到黑线的前后),基本可以找到问题所在 ...

扫到之后是停下来了。但是好像是速度太快又冲出去le

 楼主| 执柯伐柯 发表于 2017-8-9 09:17 | 显示全部楼层
linqing171 发表于 2017-8-8 17:20
用手推车(简称stc)做了个小车?

大佬别拿我寻开心可以吗。。
ningling_21 发表于 2017-8-9 09:30 | 显示全部楼层
执柯伐柯 发表于 2017-8-9 09:14
扫到之后是停下来了。但是好像是速度太快又冲出去le

说明问题点在于速度太快,这个容易解决
 楼主| 执柯伐柯 发表于 2017-8-10 09:04 | 显示全部楼层
ningling_21 发表于 2017-8-9 09:30
说明问题点在于速度太快,这个容易解决

嗯嗯,谢谢大佬,我解决了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

1

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