久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3334|回復(fù): 0
上一主題 下一主題
收起左側(cè)

超聲波循跡避障程序基本可以用,還不完善

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
壁障小車



單片機(jī)源程序如下:
  1. /*******************************************************
  2. * 項(xiàng)目名稱:循跡避障小車
  3. * 單 片 機(jī):STC89C52RC
  4. * 功    能:循跡,紅外遙控,超聲波避障,舵機(jī),PWM,跟蹤
  5. * 作    者:劉琦
  6. * IO口定義:紅外循跡                                P3^4,P3^5
  7. *                        紅外避障                                P3^6,P3^7
  8. *                        電機(jī)                                          P1^0~P1^7               
  9. *                        超聲波避障                                P2^4~P2^5
  10. *                        紅外遙控                                P3^3
  11. *                        舵機(jī)                                        P2^3              
  12. *                        數(shù)碼管段選                                P0
  13. *                        數(shù)碼管位選                                P2^0~P2^3
  14. * 遙 控 器:2           前進(jìn)                         (18)
  15. *                        8           后退                        (52)
  16. *                        5                停止                         (1C)
  17. *                        4           左轉(zhuǎn)                        (08)
  18. *                        6           右轉(zhuǎn)                        (5A)
  19. *                        1                遙控模式                (0C)
  20. *                        3                 循跡模式                (5E)
  21. *                        7                跟隨模式                (42)
  22. *                        9                避障模式                (4A)
  23. *                        +                加速                        (15)
  24. *                        -                減速                        (07)
  25. * 定 時(shí) 器:T0                PWM(電機(jī)、舵機(jī)),數(shù)碼管(超聲波測(cè)距)
  26. *                         T1                紅外遙控計(jì)時(shí)
  27. *                        T2                超聲波計(jì)時(shí)
  28. *******************************************************/
  29. /******************************頭文件區(qū)***********************************************/
  30. #include <reg52.h>
  31. #include "Dianji.h"
  32. #include "Yaokong.h"
  33. #include "RTX51TNY.H"
  34. #include "Chaoshengbo.h"
  35. #include "Duoji.h"

  36. /******************************宏定義區(qū)***********************************************/
  37. //需要定時(shí)刷新的任務(wù)數(shù),0YaoKong,1Display,2CSB
  38. #define NUM_TASK_REFRESH 3
  39. //刷新頻率
  40. //#define TIME_PER_SEC 200                                                        //每次進(jìn)入中斷的頻率,200Hz,5ms
  41. #define TIME_PER_SEC 10000                                                        //每次進(jìn)入中斷的頻率,10000Hz,0.1ms
  42. #define TIME_CLOCK 11059200                                                        //晶振頻率
  43. #define TIME_YAOKONG_50HZ          TIME_PER_SEC/50                  //響應(yīng)遙控命令頻率,0.02s
  44. #define TIME_SUMA_300HZ                TIME_PER_SEC/300                //超聲波距離顯示數(shù)碼管刷新頻率,0.003s
  45. #define TIME_CSB_5HZ                TIME_PER_SEC/5                        //超聲波自動(dòng)檢測(cè)的頻率,0.2s

  46. #define FLAG_YAOKONG                0
  47. #define FLAG_XUNJI                        1
  48. #define FLAG_BIZHANG                2
  49. #define FLAG_GENSUI                        3

  50. #define FLAG_GO                                0
  51. #define FLAG_BACK                        1
  52. #define FLAG_STOP                        2
  53. #define FLAG_TURNLEFT                3
  54. #define FLAG_TURNRIGHT                4

  55. #define NO                                        0
  56. #define YES                                        1

  57. #define DELAYTURN                        5000
  58. #define DELAYDUOJI                        5000


  59. /******************************子函數(shù)聲明區(qū)***********************************************/

  60. void initial_myself(void);   
  61. void initial_peripheral(void);
  62. void delay100ms(void);       

  63. /******************************IO口定義區(qū)***********************************************/
  64. sbit LEFT_XJ  = P3^4;        //        左循跡
  65. sbit RIGHT_XJ = P3^5;        //        右循跡
  66. sbit LEFT_GS  = P3^6;        //        左跟隨
  67. sbit RIGHT_GS = P3^7;        //        右跟隨

  68. //sbit LEFT_CS  = P                //        左測(cè)速
  69. //sbit RIGHT_CS = P                //        右測(cè)速

  70. sbit KEY=P2^6;                        //  激活超聲波測(cè)距,測(cè)試用,蜂鳴器也響;

  71. /******************************全局變量定義區(qū)***********************************************/

  72. unsigned char ucPwm  = 4;                                                                //電機(jī)的PWM占空比,N/10
  73.                                
  74. unsigned int ucPwmCountDianJ = 0;                                                //電機(jī)Pwm計(jì)數(shù)
  75. unsigned int ucPwmCountDuoJ = 0;                                                //舵機(jī)Pwm計(jì)數(shù)

  76. unsigned char ucFlagState = FLAG_YAOKONG;                                //模式選擇,遙控,循跡,避障
  77. unsigned char ucFlagControl = FLAG_STOP;                                //遙控模式下的控制選擇,前進(jìn)后退停止左轉(zhuǎn)右轉(zhuǎn)


  78. unsigned int uc_delay_task_cnt[NUM_TASK_REFRESH];                //任務(wù)刷新延遲

  79. unsigned char ucCSBCheck    = NO;                                                //用于判斷是否需要停車檢測(cè)

  80. unsigned int ucPwmDuoj = 6;                                                                //舵機(jī)歸中,默認(rèn)情況下先歸中
  81. unsigned int ulS[4]         = {0,0,0,0};                                        //儲(chǔ)存距離數(shù)據(jù),0°,180°,90°,后退時(shí)90°

  82. unsigned char ucDuoJiPosition[3]={11,2,6};                                //舵機(jī)的0°,180°,90°對(duì)應(yīng)的ucPwmDuoj數(shù)值

  83. unsigned char ucFlagTurning=NO;                                                        //在超聲波避障模式中,判斷是否正在轉(zhuǎn)彎
  84. unsigned char ucFlagDuoJiPositon=0;                                                //正在檢測(cè)的舵機(jī)位置標(biāo)示,0代表正在檢測(cè)0°
  85. unsigned char ucLockCSBCheck=NO;                                                //超聲波檢測(cè)過程中時(shí),此為YES,鎖住紅外傳感器的檢測(cè)
  86. unsigned int  uiDelayDuoJiMove=DELAYDUOJI;                                //舵機(jī)移動(dòng)延遲結(jié)束
  87. unsigned char ucFlagDuoJiMove=NO;                                                //舵機(jī)開始移動(dòng)的標(biāo)志,此標(biāo)志為YES時(shí)uiDelayDuoJiMove開始減
  88. unsigned char ucFlagCSBBegin=NO;                                                //超聲波開始檢測(cè)標(biāo)志,當(dāng)uiDelayDuoJiMove為0時(shí),為YES
  89. unsigned char ucNumS=0;                                                                        //ulS數(shù)組的第幾位
  90. unsigned char ucNumCSB=0;                                                                //進(jìn)入超聲波檢測(cè)的次數(shù),用來控制什么時(shí)候結(jié)束檢測(cè),開始轉(zhuǎn)彎
  91. unsigned int  uiDelayTurn=DELAYTURN;                                        //轉(zhuǎn)彎結(jié)束,大概90°
  92. unsigned char ucFlagTurn=NO;                                                        //開始轉(zhuǎn)動(dòng)的標(biāo)志,此標(biāo)志為YES時(shí)uiDelayTurn開始減
  93. unsigned char ucFlagTurnOver=NO;                                                //轉(zhuǎn)彎結(jié)束標(biāo)志,為YES時(shí),退出轉(zhuǎn)彎
  94. unsigned char ucFlagSMGLock=NO;                                                        //數(shù)碼管鎖,從檢測(cè)到障礙,到轉(zhuǎn)彎結(jié)束,這段時(shí)間鎖上不顯示
  95. unsigned char ucFlagGuiZhong=NO;                                                //頭一次進(jìn)入避障模式先歸中
  96. unsigned char ucFlagBegin=NO;                                                        //歸中后此位為YES
  97. unsigned char ucFlagChangeState=NO;                                                //改變狀態(tài)標(biāo)識(shí),如果改變了,那么初始化避障模式的變量
  98. unsigned char ucFlagBackOK=NO;                                                        //后退OK標(biāo)識(shí),后退結(jié)束后,才開始轉(zhuǎn)彎


  99. //unsigned char ucCSBDirection = 0;                                                //用來記錄并判斷檢測(cè)后行進(jìn)方向
  100. //unsigned char ucCSBFlag     = 0;                                                //用來激活400ms計(jì)時(shí)
  101. //unsigned char ucFlagJumpoutPwm = 0;                                                //Pwm跳出標(biāo)示,1為跳出

  102. //unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
  103. //unsigned char const positon[3]={ 0xfe,0xfd,0xfb};


  104. /******************************主函數(shù)開始***********************************************/
  105. void main(void)
  106. {
  107.         initial_myself();
  108.         delay100ms();   
  109.     initial_peripheral();


  110.         while(1)
  111.         {
  112.                 if(ucFlagChangeState==YES)                                                //每次改變狀態(tài),將避障模式的變量初始化
  113.                 {
  114.                         ucFlagTurning=NO;                                                        //在超聲波避障模式中,判斷是否正在轉(zhuǎn)彎
  115.                         ucFlagDuoJiPositon=0;                                                //正在檢測(cè)的舵機(jī)位置標(biāo)示,0代表正在檢測(cè)0°
  116.                         ucLockCSBCheck=NO;                                                //超聲波檢測(cè)過程中時(shí),此為YES,鎖住紅外傳感器的檢測(cè)
  117.                         uiDelayDuoJiMove=DELAYDUOJI;                                //舵機(jī)移動(dòng)延遲結(jié)束
  118.                         ucFlagDuoJiMove=NO;                                                //舵機(jī)開始移動(dòng)的標(biāo)志,此標(biāo)志為YES時(shí)uiDelayDuoJiMove開始減
  119.                         ucFlagCSBBegin=NO;                                                //超聲波開始檢測(cè)標(biāo)志,當(dāng)uiDelayDuoJiMove為0時(shí),為YES
  120.                         ucNumS=0;                                                                        //ulS數(shù)組的第幾位
  121.                         ucNumCSB=0;                                                                //進(jìn)入超聲波檢測(cè)的次數(shù),用來控制什么時(shí)候結(jié)束檢測(cè),開始轉(zhuǎn)彎
  122.                         uiDelayTurn=DELAYTURN;                                        //轉(zhuǎn)彎結(jié)束,大概90°
  123.                         ucFlagTurn=NO;                                                        //開始轉(zhuǎn)動(dòng)的標(biāo)志,此標(biāo)志為YES時(shí)uiDelayTurn開始減
  124.                         ucFlagTurnOver=NO;                                                //轉(zhuǎn)彎結(jié)束標(biāo)志,為YES時(shí),退出轉(zhuǎn)彎
  125.                         ucFlagSMGLock=NO;                                                        //數(shù)碼管鎖,從檢測(cè)到障礙,到轉(zhuǎn)彎結(jié)束,這段時(shí)間鎖上不顯示
  126.                         ucFlagGuiZhong=NO;                                                //頭一次進(jìn)入避障模式先歸中
  127.                         ucFlagBegin=NO;                                                        //歸中后此位為YES
  128.                         ucFlagBackOK=NO;                                                //后退OK標(biāo)識(shí),后退結(jié)束后,才開始轉(zhuǎn)彎
  129.                         ucPwm=4;
  130.                         ucFlagChangeState=NO;
  131.                 }
  132.                 if(uc_delay_task_cnt[0]==0)
  133.                 {
  134.                         YaoKong();
  135.                         ET0=0;//在中斷中也有可能變化的變量在更改前時(shí)先關(guān)閉中斷
  136.                         uc_delay_task_cnt[0]=TIME_YAOKONG_50HZ;
  137.                         ET0=1;
  138.                 }
  139.                 //遙控模式
  140.                 if(ucFlagState==FLAG_YAOKONG)
  141.                 {
  142.                         switch(ucFlagControl)
  143.                         {
  144.                                 case FLAG_GO:
  145.                                         Go();
  146.                                         break;
  147.                                 case FLAG_STOP:
  148.                                         Stop();
  149.                                         break;
  150.                                 case FLAG_BACK:
  151.                                         Back();
  152.                                         break;
  153.                                 case FLAG_TURNLEFT:
  154.                                         TurnLeft();
  155.                                         break;
  156.                                 case FLAG_TURNRIGHT:
  157.                                         TurnRight();
  158.                                         break;
  159.                                 default:
  160.                                         break;
  161.                         }
  162.                 }
  163.                 //循跡模式
  164.                 if(ucFlagState==FLAG_XUNJI)
  165.                 {
  166.                         if(LEFT_XJ==1&&RIGHT_XJ==1)
  167.                         {
  168.                                 ucPwm=3;
  169.                                 Go();
  170.                         }
  171.                         else if(RIGHT_XJ==0)
  172.                         {
  173.                                 ucPwm=8;
  174.                                 TurnRight();
  175.                         }
  176.                         else if(LEFT_XJ==0)
  177.                         {
  178.                                 ucPwm=8;
  179.                                 TurnLeft();
  180.                         }
  181.                                
  182.                 }
  183.                 //跟隨模式
  184.                 if(ucFlagState==FLAG_GENSUI)
  185.                 {
  186.                         if(LEFT_GS==1&&RIGHT_GS==1)                                                //左右都檢測(cè)到物體
  187.                         {
  188.                                 Stop();
  189.                         }
  190.                         else if(LEFT_GS==0&&RIGHT_GS==1)                            //左側(cè)未檢測(cè)到,右側(cè)檢測(cè)到
  191.                         {
  192.                                 TurnRight();                                                                                                                                  
  193.                         }
  194.                         else if(LEFT_GS==1&&RIGHT_GS==0)                                //右側(cè)未檢測(cè)到,左側(cè)檢測(cè)到
  195.                         {
  196.                                 TurnLeft();
  197.                         }
  198.                         else                                                                                        //左右都未檢測(cè)到
  199.                         {
  200.                                 Go();
  201.                         }       
  202.                 }
  203.                 //超聲波+紅外避障模式

  204.                 //ucFlagBegin=NO,
  205.                 if(ucFlagState==FLAG_BIZHANG)
  206.                 {
  207.                         if(ucFlagBegin==NO)
  208.                         {
  209.                                 ucPwmDuoj=ucDuoJiPosition[2];
  210.                                 ucFlagGuiZhong=YES;
  211.                         }
  212.                         else
  213.                         {
  214. //                                if(ucFlagSMGLock==NO&&uc_delay_task_cnt[1]==0)                                                //數(shù)碼管刷新
  215.                                 if(uc_delay_task_cnt[1]==0)                                                //數(shù)碼管刷新
  216.                                 {
  217.                                         Display();
  218.                                         ET0=0;//在中斷中也有可能變化的變量在更改前時(shí)先關(guān)閉中斷
  219.                                         uc_delay_task_cnt[1]=TIME_SUMA_300HZ;
  220.                                         ET0=1;
  221.                                 }
  222.        
  223.                                 if(ucFlagTurning==NO)                                                        //沒在轉(zhuǎn)彎
  224.                                 {                                                                                                 
  225.                                         if(ucLockCSBCheck==NO&&uc_delay_task_cnt[2]==0)        //超聲波自動(dòng)檢測(cè)
  226.                                         {
  227.                                                 CSB ();
  228.                                                 ET0=0;//在中斷中也有可能變化的變量在更改前時(shí)先關(guān)閉中斷
  229.                                                 uc_delay_task_cnt[2]=TIME_CSB_5HZ;
  230.                                                 ET0=1;
  231.                                                 if(S<=40)
  232.                                                 {
  233.                                                          ucLockCSBCheck=YES;
  234.                                                          ucFlagSMGLock=YES;
  235.                                                          Stop();
  236.                                                 }
  237.                                         }
  238.        
  239.                                         if(ucLockCSBCheck==NO)
  240.                                         {
  241.                                                 Go();
  242.                                         }
  243.                                        
  244.                                         if(ucLockCSBCheck==YES)                                                        //遇到障礙后超聲波檢測(cè)整個(gè)過程開始
  245.                                         {
  246.                                                 if(ucFlagCSBBegin==NO)                                                                //超聲波檢測(cè)未開始
  247.                                                 {                                                                                                       
  248.                                                         ucPwmDuoj=ucDuoJiPosition[ucFlagDuoJiPositon];        //正在檢測(cè)的角度,隨著ucFlagDuoJiPositon變化而變化
  249.                                                         ucFlagDuoJiMove=YES;
  250.                                                 }
  251.                                                 if(ucFlagCSBBegin==YES)
  252.                                                 {
  253. //                                                        if(ucFlagDuoJiPositon<2)                                                //只在0°,180°進(jìn)行超聲波檢測(cè)
  254. //                                                        {
  255.                                                                 CSB ();
  256.                                                                 CSB ();
  257.                                                                 CSB ();
  258.                                                                 ulS[ucNumS]=S;                                                                //將距離數(shù)據(jù)存起來
  259. //                                                                if(ucNumS<2)
  260.                                                                         ucNumS++;
  261. //                                                        }
  262.                                                         if(++ucFlagDuoJiPositon>2)
  263.                                                                 ucFlagDuoJiPositon=0;
  264.                                                         if(++ucNumCSB>=3)                                                               
  265.                                                         {
  266.                                                                  ucFlagTurning=YES;                                                        //激活轉(zhuǎn)彎
  267.                                                                  ucLockCSBCheck=NO;                                                       
  268.                                                                  ucNumCSB=0;                                                                //進(jìn)入檢測(cè)的次數(shù)清0
  269.                                                                  ucNumS=0;                                                                        //存儲(chǔ)距離數(shù)據(jù)的位置清0
  270.                                                         }
  271.                                                         ucFlagCSBBegin=NO;                                                                //超聲波檢測(cè)結(jié)束
  272.                                                 }
  273.                
  274.                                         }
  275.                                 }
  276.                                 else                                                                                                                //正在轉(zhuǎn)彎
  277.                                 {
  278.                                         if(ucFlagBackOK==NO)
  279.                                         {
  280.                                                 if(        ulS[2]<30)
  281.                                                 {
  282.                                                         Back();
  283.                                                         CSB();
  284.                                                         ulS[3]=S;
  285.                                                         if(ulS[3]>=30)
  286.                                                                 ucFlagBackOK=YES;       
  287.                                                 }
  288.                                                 else
  289.                                                         ucFlagBackOK=YES;
  290.                                         }
  291.                                         else
  292.                                         {
  293.                                                 if(ucFlagTurnOver==NO)                                                                        //未轉(zhuǎn)彎結(jié)束
  294.                                                 {
  295.                                                         ucFlagTurn=YES;
  296.                                                         if(ulS[0]>ulS[1])                                                                        //左側(cè)>右側(cè)
  297.                                                                 TurnLeft();
  298.                                                         else
  299.                                                                 TurnRight();
  300.                                                 }
  301.                                                 else
  302.                                                 {
  303.                                                         ucFlagTurning=NO;
  304.                                                         ucFlagTurnOver=NO;
  305.                                                         ucFlagSMGLock=NO;
  306.                                                         ucFlagBackOK=NO;
  307.                                                 }
  308.                                         }       
  309.                                 }
  310.                         }
  311.                 }
  312.         }
  313. }

  314. //中斷函數(shù)
  315. void timer0(void) interrupt 1
  316. {
  317.         unsigned char i;
  318.         TR0=0;
  319.         TH0=255-TIME_CLOCK/TIME_PER_SEC/12/256;
  320.         TL0=255-TIME_CLOCK/TIME_PER_SEC/12%256;
  321.         //task_delay[]減到0時(shí),相應(yīng)的函數(shù)準(zhǔn)備就緒
  322.         for(i=0;i<NUM_TASK_REFRESH;i++)
  323.         {
  324.                 if(uc_delay_task_cnt[i]!=0)//延遲不為0時(shí)才減
  325.                         {uc_delay_task_cnt[i]--;};
  326.         }
  327.         ucPwmCountDianJ++;
  328.         if(ucPwmCountDianJ  >= 10)
  329.         {
  330.                 ucPwmCountDianJ  = 0;
  331.         }
  332.        
  333.         //舵機(jī)轉(zhuǎn)動(dòng)距離控制
  334.         if(ucFlagDuoJiMove==YES||ucFlagGuiZhong==YES)
  335.         {
  336.                 ucPwmCountDuoJ++;
  337.                 if(ucPwmCountDuoJ>205)                                                //0.5+20(ms),整個(gè)周期長(zhǎng)度
  338.                 {
  339.                         ucPwmCountDuoJ=0;
  340.                 }
  341.                 PwmServomoto();
  342.         }

  343.         //舵機(jī)轉(zhuǎn)動(dòng)時(shí)間控制
  344.         if(ucFlagDuoJiMove==YES)
  345.         {
  346.                 if(uiDelayDuoJiMove!=0)
  347.                         uiDelayDuoJiMove--;
  348.                 else
  349.                 {
  350.                         uiDelayDuoJiMove=DELAYDUOJI;
  351.                         ucFlagDuoJiMove=NO;
  352.                         ucFlagCSBBegin=YES;       
  353.                 }       
  354.         }
  355.         //頭一次進(jìn)入避障模式的舵機(jī)歸中
  356.         if(ucFlagGuiZhong==YES)
  357.         {
  358.                 if(uiDelayDuoJiMove!=0)
  359.                         uiDelayDuoJiMove--;
  360.                 else
  361.                 {
  362.                         uiDelayDuoJiMove=DELAYDUOJI;
  363.                         ucFlagGuiZhong=NO;
  364.                         ucFlagBegin=YES;       
  365.                 }       
  366.         }

  367.         //轉(zhuǎn)彎延遲
  368.         if(ucFlagTurn==YES)
  369.         {
  370.                 if(uiDelayTurn!=0)
  371.                         uiDelayTurn--;
  372.                 else
  373.                 {
  374.                         uiDelayTurn=DELAYTURN;
  375.                         ucFlagTurn=NO;
  376.                         ucFlagTurnOver=YES;
  377.                 }       
  378.         }

  379.         TR0=1;
  380. ……………………

  381. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
8.6 No.1 超聲波避障基本可以用,還不完善.zip (90.83 KB, 下載次數(shù): 12)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:214762 發(fā)表于 2017-7-3 08:54

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜在线精品 | 香蕉视频在线播放 | 国产日韩久久 | 亚洲精品免费观看 | 黄色大片毛片 | 99这里只有精品视频 | 国内自拍真实伦在线观看 | 麻豆久久精品 | 日韩国产在线 | 羞羞的视频在线 | 久久夜视频| 欧美精品久久 | 亚州国产| 久久久天天 | 免费视频一区二区 | 美女在线观看av | 在线免费观看日本视频 | aaa一区| 亚洲精品一二三区 | 欧美一区二区在线播放 | 日本黄色一级视频 | 国产在线一区二区三区 | 一级一级一级毛片 | 国产91视频一区二区 | 精品九九在线 | 欧美另类视频在线 | 国产成人综合久久 | 99精品国产一区二区三区 | 日韩高清国产一区在线 | 日韩一区二区免费视频 | 欧美日韩在线免费观看 | 日韩精品一区二区三区在线观看 | 亚洲色图在线观看 | 一区精品视频在线观看 | 四虎永久在线精品免费一区二 | 国产乱码久久久久久 | 成人精品鲁一区一区二区 | 成人免费在线视频 | 在线国产视频 | 成人免费视频网站在线看 | 国产精品成人一区 |