<menuitem id="t17lb"><menuitem id="t17lb"><ruby id="t17lb"></ruby></menuitem></menuitem><ins id="t17lb"></ins>
<ins id="t17lb"><i id="t17lb"><progress id="t17lb"></progress></i></ins>
<cite id="t17lb"><i id="t17lb"></i></cite>
<ins id="t17lb"></ins>
<address id="t17lb"><i id="t17lb"></i></address>
<address id="t17lb"><i id="t17lb"></i></address>
<ins id="t17lb"></ins>
<ins id="t17lb"></ins><var id="t17lb"><i id="t17lb"><th id="t17lb"></th></i></var><listing id="t17lb"><i id="t17lb"></i></listing>
<th id="t17lb"><i id="t17lb"><th id="t17lb"></th></i></th>
<del id="t17lb"><i id="t17lb"><listing id="t17lb"></listing></i></del>
<var id="t17lb"><span id="t17lb"><th id="t17lb"></th></span></var><th id="t17lb"><del id="t17lb"></del></th>

單片機論壇

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 205|回復: 6
收起左側

51單片機循跡車的一點程序問題(環島)

[復制鏈接]
dx981005 發表于 2019-8-10 16:57 | 顯示全部樓層 |閱讀模式
先貼本人自己寫出來的程序吧。
圖片1.png
問題是在環島掃到全黑的情況與全黑停車情況的判斷,車子掃到全黑時總是突然開始倒車并附有卡頓挺迷的。希望大家能給個好建議。
PS.如果輪子轉速太快紅外測速無法記錄外部中斷怎么整?

單片機源程序如下:
  1. #include<reg52.h>
  2. #include<stdio.h>
  3. #include<intrins.h>
  4. #include<stdlib.h>
  5. sbit left1=P1^0;
  6. sbit left2=P1^1;                         //定義前方左側紅外探頭端口
  7. sbit right1=P1^2;
  8. sbit right2=P1^3;                         //定義前方右側紅外探頭端口

  9. //sbit ENA=P1^4;
  10. //sbit ENB=P1^5;
  11. //sbit ENC=P1^6;
  12. //sbit END=P1^7;


  13. sbit L2A=P0^0;                            //定義左側電機驅動A端
  14. sbit L2B=P0^1;                            //定義左側電機驅動B端

  15. sbit R2A=P0^2;                            //定義右側電機驅動A端
  16. sbit R2B=P0^3;                            //定義右側電機驅動B端

  17. sbit L1A=P0^4;                            //定義左側電機驅動A端
  18. sbit L1B=P0^5;                            //定義左側電機驅動B端

  19. sbit R1A=P0^6;                            //定義右側電機驅動A端
  20. sbit R1B=P0^7;                            //定義右側電機驅動B端

  21. typedef unsigned int uint;
  22. typedef unsigned char uchar ;

  23. uchar R_data;
  24. bit R_flag=0;
  25. int tim=0;
  26. int x=0;
  27. int count = 0;
  28. int  v_speed,Distance=0,time=0;
  29. char speed[7];
  30. int PWM1 = 0;
  31. int PWM2 = 0;
  32. int pussy=0;

  33. void itoa_00(int v_speed);
  34. void Time0_Init(void);
  35. void Outside0_Init(void);
  36. void Uart_Init(void);
  37. void xunji(void);
  38. void tingzhi(void);
  39. void qianjin(void);
  40. void zuozhuan(void);
  41. void youzhuan(void);
  42. char exchange(int v_speed);

  43. void delay_ms(uint i)//1ms??
  44. {
  45.   uchar x,j;  
  46.   for(j=0;j<i;j++)
  47.     for(x=0;x<=148;x++);
  48. }




  49. void Uart_SendByte(uchar Byte)
  50. {
  51.     SBUF =    Byte;
  52.     while(!TI)                   //è?1?·¢?ííê±?£?ó2?t?á????TI
  53.     {
  54.         _nop_();   
  55.     }   
  56. }

  57. void main()
  58. {
  59.     Uart_Init();
  60.     Time0_Init();
  61.     Outside0_Init();
  62.     while(1)
  63.     {
  64.     if(R_flag==1)
  65.         {
  66.             for(x=0;x<6;x++)
  67.             {        
  68.                Uart_SendByte(speed[x]);
  69.                 delay_ms(1);
  70.             }
  71.             R_flag=0;        
  72.         }   
  73.   xunji();
  74.     }        
  75. }


  76. int cout;
  77. void itoa_00(int v_speed)
  78. {   
  79.       cout = v_speed/100;
  80.         speed[0]=exchange(cout);
  81.       v_speed%=100;
  82.       cout = v_speed/10;
  83.       speed[1]=exchange(cout);
  84.       v_speed%=10;
  85.       speed[2]=exchange(v_speed);
  86.       speed[3] = '\n';
  87.       speed[4]='\0';

  88. }
  89. char exchange(int v_speed)
  90. {
  91.         switch(v_speed)
  92.         {
  93.             case 0:return '0';
  94.             case 1:return '1';
  95.             case 2:return '2';
  96.             case 3:return '3';
  97.             case 4:return '4';
  98.             case 5:return '5';
  99.             case 6:return '6';
  100.             case 7:return '7';
  101.             case 8:return '8';
  102.             case 9:return '9';            
  103.         }
  104.         return '\0';
  105. }

  106. void Uart_Init(void)
  107. {
  108.      TMOD = 0x21;   //?¨ê±?÷1¤×÷?ú?¨ê±?÷1μ?·?ê?2
  109.      PCON = 0x00;   //2?±??μ
  110.      SCON = 0x50;    //′?ú1¤×÷?ú·?ê?1£?2¢?ò???ˉ′DD?óê?   
  111.      TH1 = 0xFd;    //éè??2¨ì??ê 9600
  112.      TL1 = 0xFd;
  113.      TR1 = 1;        //???ˉ?¨ê±?÷1
  114.        ES = 1;        //?a′?ú?D??
  115.        EA = 1;        //?a×ü?D??        
  116. }

  117. void Time0_Init()  //?¨ê±?÷?D??0????
  118. {
  119.     TMOD = 0x21;
  120.     TH0 = 0xfc;            //11.0592 ---0.05s
  121.       TL0 = 0x18;
  122.     ET0 = 1;
  123.     TR0 = 1;   
  124.       EA = 1;
  125. }

  126. void Outside0_Init()  
  127. {
  128.       EX0 = 1;  
  129.       IT0 = 1;  
  130.       EA = 1;      
  131. }

  132. void EX0_ISR() interrupt 0
  133. {
  134.       Distance += 1;
  135. }

  136. void Timer0Interrupt() interrupt 1  //?¨ê±?÷?D??
  137. {
  138.    TH0 = 0xfc;            //11.0592 ---0.05s
  139.      TL0 = 0x18;
  140.      pussy++;
  141.      count++;
  142.      if(count == 1000)
  143.      {
  144.          time+=1;
  145.          count=0;
  146.      }
  147.      if(pussy<7)
  148.      {PWM1=0;}
  149.      if(7<=pussy<10)
  150.      {PWM1=1;}
  151.      if(pussy==10)
  152.      {pussy=0;}
  153. }
  154. void Uart_Int(void) interrupt 4  
  155. {
  156.     if(RI == 1)   
  157.     {
  158.         v_speed = Distance/time;
  159.         itoa_00(v_speed);   
  160.         RI = 0;  
  161.         R_flag=1;
  162.     }
  163. }

  164. void tingzhi()
  165. {
  166.     //ENA=0;
  167.   L1A=0;                            //定義左側電機驅動A端
  168.   L1B=0;                            //定義左側電機驅動B端
  169.   //ENB=0;
  170.   L2A=0;                            //定義右側電機驅動A端
  171.   L2B=0;                            //定義右側電機驅動B端
  172.   //ENC=0;
  173.   R1A=0;                            //定義左側電機驅動A端
  174.   R1B=0;                            //定義左側電機驅動B端
  175.   //END=0;
  176.   R2A=0;                            //定義右側電機驅動A端
  177.   R2B=0;                            //定義右側電機驅動B端
  178. }

  179. void qianjin()
  180. {
  181.     //ENA=1;
  182.   L1A=0;
  183.     L1B=1;
  184.         //ENB=1;
  185.    
  186.     L2A=0;
  187.     L2B=1;
  188.         //ENC=1;

  189.     R1A=1;
  190.     R1B=0;
  191.         //END=1;

  192.     R2A=0;
  193.     R2B=1;
  194. }

  195. void zuozhuan1()
  196. {
  197.         //ENA=1;

  198.   L1A=0;                            //定義左側電機驅動A端
  199.   L1B=0;                            //定義左側電機驅動B端
  200.     //ENB=1;

  201.   L2A=0;                            //定義右側電機驅動A端
  202.   L2B=0;                            //定義右側電機驅動B端
  203.     //ENC=1;

  204.   R1A=0;                            //定義左側電機驅動A端
  205.   R1B=1;                            //定義左側電機驅動B端
  206.     //END=1;

  207.   R2A=1;                            //定義右側電機驅動A端
  208.   R2B=0;                            //定義右側電機驅動B端
  209. }

  210. void youzhuan1()
  211. {
  212.     //    ENA=1;

  213.   L1A=0;                            //定義左側電機驅動A端
  214.   L1B=1;                            //定義左側電機驅動B端
  215.     //ENB=1;

  216.   L2A=0;                            //定義右側電機驅動A端
  217.   L2B=1;                            //定義右側電機驅動B端

  218.   R1A=0;                            //定義左側電機驅動A端
  219.   R1B=0;                            //定義左側電機驅動B端

  220.   R2A=0;                            //定義右側電機驅動A端
  221.   R2B=0;                            //定義右側電機驅動B端
  222. }


  223. void xunji()
  224. {
  225.     if((right2 == 0)&&(right1 == 0)&&(left1 == 0)&&(left2 == 0))
  226.     {
  227.         qianjin();
  228.     }
  229.     if((right2 == 0)&&(right1 ==1)&&(left1 == 0)&&(left2 == 0))
  230.     {
  231.         youzhuan1();
  232.     }
  233.     if((right2 == 0)&&(right1 == 0)&&(left1 == 1)&&(left2 == 0))
  234.     {
  235.         zuozhuan1();
  236.     }
  237.     if((right2 == 0)&&(right1 == 0)&&(left1 == 0)&&(left2 == 1))
  238.     {
  239.         zuozhuan1();
  240.     }
  241.     if((right2 == 1)&&(right1 == 0)&&(left1 == 0)&&(left2 == 0))
  242.     {
  243.         youzhuan1();
  244.     }
  245.     if((right2 == 1)&&(right1 == 1)&&(left1 == 1)&&(left2 == 1))
  246.     {
  247.         if(tim<100)
  248.         {
  249.             qianjin();
  250.           delay_ms(100);
  251.             tingzhi();
  252.             }
  253.         }
  254.     }   
  255. }
復制代碼


回復

使用道具 舉報

xianfajushi 發表于 2019-8-10 19:59 | 顯示全部樓層
隨便說說,首先不要直接使用 int char 應使用unsigned int這樣的;2邏輯簡化這當然不是必要的,只是可以簡化代碼如 if(right2 == left2 == 0 && right1 == left1 == 1);3調用尋跡前添加判斷R_flag這是猜測的。
回復

使用道具 舉報

無線強大 發表于 2019-8-10 20:55 | 顯示全部樓層
隨便說說,首先不要直接使用 int char 應使用unsigned int這樣的;2邏輯簡化這當然不是必要的,只是可以簡化代碼如 if(right2 == left2 == 0 && right1 == left1 == 1);3調用尋跡前添加判斷R_flag
回復

使用道具 舉報

 樓主| dx981005 發表于 2019-8-10 21:11 | 顯示全部樓層
xianfajushi 發表于 2019-8-10 19:59
隨便說說,首先不要直接使用 int char 應使用unsigned int這樣的;2邏輯簡化這當然不是必要的,只是可以簡 ...

R_flag 的判斷內容要寫些什么呢?是對紅外的判斷還是?
回復

使用道具 舉報

xianfajushi 發表于 2019-8-11 06:32 | 顯示全部樓層
判斷式應該是連續的,而不是單獨的,如if(right2 == left2 == 0 && right1 == left1 == 1)。。else if(right2 == left2 == 0 && right1 == left1 == 1)這樣;if(R_flag) xunji();這樣試看
回復

使用道具 舉報

1105730718 發表于 2019-8-12 00:55 | 顯示全部樓層
代碼問題有點多。首先你的PWM頻率太低了吧,20Hz?,電機控制起碼是幾千Hz的這樣你走起來就會很抖的,還有就是PWM電平反轉的判斷語句,也不對的能用可以說是巧合,C的if判斷不能這么寫,然后就是你的最后一塊兒代碼邏輯不對。你的停車線比較寬,用計時的方法判斷是進環島還是停車可以,但是代碼寫得很不對,你要在檢測到雙黑線后開始time計數,繼續前進延時一段時間后再檢測一次是不是全黑,是的話停車不是就繼續循跡。最后,倒車這個我倒不確定,但是抖動就是你最后那塊兒沒寫好。可能是抖著抖著自己后退了,跟你驅動頻率太低也可能有關系。
回復

使用道具 舉報

CZ1 發表于 2019-8-16 21:26 | 顯示全部樓層
隨便說說:其實這種路線使用4個紅外循跡模塊的話是可以更加容易的實現區分環島和停車點的。使用4個傳感器全部放在車頭排放位置類似于色子上的4,只不過前面的兩個稍微寬一些
回復

使用道具 舉報

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

本版積分規則

QQ|手機版|小黑屋|單片機論壇 |51Hei單片機16群 聯系QQ:125739409;技術交流QQ群7344883

Powered by 單片機教程網

快速回復 返回頂部 返回列表
jijzzizz中国版