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

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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 13157|回復(fù): 15
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)智能小車(chē) 功能 循跡,紅外遙控,超聲波避障,舵機(jī),PWM,跟蹤

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


下載:
智能小車(chē)資料.zip (89.07 KB, 下載次數(shù): 231)

一些問(wèn)題:

問(wèn):
   大神請(qǐng)教個(gè)問(wèn)題,我用keil給51單片機(jī)寫(xiě)的程序能運(yùn)行在其中設(shè)備上嗎?因?yàn)槲沂怯幸粋(gè)打算就是用我的單片機(jī)作試驗(yàn),再把程序?qū)懙阶约涸O(shè)計(jì)的電路中去,我需要用到什么芯片才能執(zhí)行這個(gè)程序

答:
我就是用的KEIL+51單片機(jī),你可以在自己的開(kāi)發(fā)板上做實(shí)驗(yàn),只要單品機(jī)是一樣的就完全可以,即使不完全一樣,也僅僅需要改改IO口等

是用的兩個(gè)紅外,兩個(gè)紅外之間距離遠(yuǎn)點(diǎn),另外我這個(gè)直走和轉(zhuǎn)彎是兩個(gè)不同的PWM速度,轉(zhuǎn)彎大概是直走的2倍左右,效果好點(diǎn).
下面是智能小車(chē)外形圖:


小車(chē)是用的慧靜4WD小車(chē),程序是自己寫(xiě)的.





遙控子程序:
  1. #include <reg52.h>
  2. #include "SmartCar.h"
  3. //#include "Dianji.h"
  4. #include "RTX51TNY.H"


  5. #define Imax 14000    //此處為晶振為11.0592時(shí)的取值,
  6. #define Imin 8000    //如用其它頻率的晶振時(shí),
  7. #define Inum1 1450    //要改變相應(yīng)的取值。
  8. #define Inum2 700
  9. #define Inum3 3000

  10. unsigned char f=0;                                                        //找到起始碼時(shí)置1
  11. unsigned char Im[4]={0x00,0x00,0x00,0x00};  //分別存儲(chǔ),客戶碼1,客戶碼2,操作碼,操作碼反碼
  12. unsigned int  Tc = 0;                                                //Tc時(shí)間間隔
  13. unsigned char m = 0;                                                //m往Im存數(shù)時(shí)計(jì)數(shù)用
  14. unsigned char IrOK = 0;                                                //提取成功后置1

  15. unsigned char ImOld=0;                                                //儲(chǔ)存舊命令,用于加減速控制

  16. //unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
  17. //unsigned char const positon[3]={ 0xfe,0xfd,0xfb};
  18. //sbit FM  = P2^6;                                                        //test

  19. /************************************************************************/        
  20. //遙控
  21. void YaoKong (void)
  22. {
  23.         if(IrOK==1)
  24.         {
  25. //                                FM=0;
  26.                 switch(Im[2])
  27.                 {
  28.                         case 0x18:                                        //前進(jìn)
  29.                         {
  30.                                 ucFlagControl=FLAG_GO;                        
  31.                         }                             
  32.                              break;
  33.                     case 0x52:                                  //后退
  34.                         {
  35.                                 ucFlagControl=FLAG_BACK;                        
  36.                         }                                    
  37.                             break;
  38.                     case 0x1C:                                  //停止
  39.                         {
  40.                                 ucFlagControl=FLAG_STOP;                        
  41.                         }                                    
  42.                             break;                                       
  43.                         case 0x08:                                        //左轉(zhuǎn)
  44.                         {
  45.                                 ucFlagControl=FLAG_TURNLEFT;                        
  46.                         }
  47.                                 break;
  48.                         case 0x5A:                                    //右轉(zhuǎn)
  49.                         {
  50.                                 ucFlagControl=FLAG_TURNRIGHT;                        
  51.                         }
  52.                                 break;
  53.                         case 0x15:                                    //加速
  54.                         {
  55.                                 if(++ucPwm>10)
  56.                                 {
  57.                                         ucPwm=10;
  58.                                 }                        
  59.                         }
  60.                                 break;
  61.                         case 0x07:                                    //減速
  62.                         {
  63.                                 if(--ucPwm==0)
  64.                                 {
  65.                                         ucPwm=1;                        //Pwm至少為1
  66.                                 }                        
  67.                         }
  68.                                 break;
  69.                         case 0x0C:                                    //遙控模式
  70.                         {
  71.                             ucFlagState = FLAG_YAOKONG;
  72.                         }
  73.                                 break;
  74.                         case 0x5E:                                    //循跡模式
  75.                         {
  76.                             ucFlagState = FLAG_XUNJI;
  77.                         }
  78.                                 break;
  79.                         case 0x42:                                    //跟隨模式
  80.                         {
  81.                             ucFlagState = FLAG_GENSUI;
  82.                         }
  83.                                 break;
  84.                         case 0x4A:                                    //避障模式
  85.                         {
  86.                             ucFlagState = FLAG_BIZHANG;
  87.                                 ucFlagChangeState=YES;
  88.                         }
  89.                                 break;
  90.                         default:
  91.                                 break;
  92.                 }
  93.                 IrOK=0;                                                        //將成功標(biāo)記位置位
  94.         }
  95. }


  96. //外部中斷解碼程序
  97. void intersvr1() interrupt 2
  98. {
  99.         Tc=TH1*256+TL1;     //提取中斷時(shí)間間隔時(shí)長(zhǎng),兩次下降沿之間的時(shí)間間隔
  100.     TH1=0;
  101.     TL1=0;              //定時(shí)中斷重新置零

  102.         if((Tc>Imin)&&(Tc<Imax))
  103.     {
  104.                   m=0;
  105.             f=1;
  106.             return;
  107.     }
  108.     if(f==1)          //找到啟始碼
  109.     {
  110.                 if(Tc>Inum1&&Tc<Inum3)                                         
  111.                    {
  112.                     Im[m/8]=Im[m/8]>>1|0x80; m++;
  113.             }
  114.               if(Tc>Inum2&&Tc<Inum1)
  115.         {
  116.                 Im[m/8]=Im[m/8]>>1; m++; //取碼
  117.                 }
  118.                   if(m==32)
  119.                    {
  120.                     m=0;  
  121.                 f=0;
  122.                 if(Im[2]==~Im[3])
  123.                 {
  124.                         IrOK=1;
  125.                            }
  126.                 else IrOK=0;   //取碼完成后判斷讀碼是否正確
  127.             }
  128.     }
  129. }
  130.                
復(fù)制代碼

電機(jī)子程序:
  1. #include <reg52.h>
  2. #include <INTRINS.H>
  3. #include "SmartCar.h"
  4. #include "Yaokong.h"

  5. sbit IN1 = P1^0;           //  左1電機(jī)           高電平前進(jìn)
  6. sbit IN2 = P1^1;           //  左1電機(jī)     高電平后退        可以改接成PWM輸出
  7. sbit IN3 = P1^2;           //  左2電機(jī)     高電平前進(jìn)
  8. sbit IN4 = P1^3;           //  左2電機(jī)     高電平后退        可以改接成PWM輸出
  9. sbit IN5 = P1^4;           //  右1電機(jī)     高電平前進(jìn)
  10. sbit IN6 = P1^5;           //  右1電機(jī)     高電平后退        可以改接成PWM輸出
  11. sbit IN7 = P1^6;           //  右2電機(jī)     高電平前進(jìn)
  12. sbit IN8 = P1^7;           //  右2電機(jī)     高電平后退        可以改接成PWM輸出

  13. unsigned char ucFlagDirection = 0;                                            //方向,0為前進(jìn),1為后退

  14. //sbit FM  = P2^6;

  15. void PwmLeft (void);
  16. void PwmRight (void);

  17. //前進(jìn)函數(shù)
  18. void Go(void)
  19. {
  20.         ucFlagDirection = 0;

  21.         IN2=0;                 //左1電機(jī)  
  22.         IN4=0;                 //左2電機(jī)

  23.         IN6=0;                 //右1電機(jī)  
  24.         IN8=0;                 //右2電機(jī)
  25.         
  26.         PwmLeft();         
  27.         PwmRight();
  28.         
  29. }

  30. //后退函數(shù)
  31. void Back(void)
  32. {

  33.         ucFlagDirection = 1;

  34.         IN1=0;                 //左1電機(jī)         
  35.         IN3=0;                 //左2電機(jī)  

  36.         IN5=0;                 //右1電機(jī)  
  37.         IN7=0;                 //右2電機(jī)   

  38.         PwmLeft();         
  39.         PwmRight();
  40. }

  41. //小車(chē)左轉(zhuǎn)函數(shù)                                
  42. void TurnLeft(void)
  43. {
  44.         ucFlagDirection = 0;
  45.         IN6=0;                 //右1電機(jī)  
  46.         IN8=0;                 //右2電機(jī)
  47.         
  48.         IN2=0;                 //左1電機(jī)
  49.         IN4=0;           //左2電機(jī)
  50.         IN1=0;
  51.         IN3=0;
  52.          
  53.         //右側(cè)繼續(xù)前進(jìn)
  54.         PwmRight();
  55. }

  56. //小車(chē)右轉(zhuǎn)函數(shù)                        
  57. void TurnRight(void)
  58. {
  59.         ucFlagDirection = 0;
  60.         IN2=0;                 //左1電機(jī)  
  61.         IN4=0;                 //左2電機(jī)

  62.         IN6=0;                 //右1電機(jī)  
  63.         IN8=0;                 //右2電機(jī)
  64.         IN5=0;
  65.         IN7=0;
  66.          
  67.         //左側(cè)繼續(xù)前進(jìn)
  68.         PwmLeft();         
  69. }

  70. //電機(jī)停止轉(zhuǎn)動(dòng)函數(shù)            
  71. void Stop(void)
  72. {
  73.         P1 = 0x00;
  74. }

  75. //PwmLeft
  76. void PwmLeft (void)
  77. {  
  78.         if(ucPwmCountDianJ  <= ucPwm)
  79.         {
  80.             if(ucFlagDirection == 0)                                //前進(jìn)時(shí)
  81.                 {
  82.                         IN1 = 1;
  83.                         IN3 = 1;
  84.                 }
  85.                 else if(ucFlagDirection == 1)                //后退時(shí)
  86.                 {
  87.                         IN2 = 1;
  88.                         IN4 = 1;
  89.                 }
  90.         }
  91.         else
  92.     {
  93.             if(ucFlagDirection == 0)                                //前進(jìn)時(shí)
  94.                 {
  95.                         IN1 = 0;
  96.                         IN3 = 0;
  97.                 }
  98.                 else if(ucFlagDirection == 1)                //后退時(shí)
  99.                 {
  100.                         IN2 = 0;
  101.                         IN4 = 0;
  102.                 }
  103.     }
  104. //        if(ucPwmCountDianJ  >= 10)
  105. //        {
  106. //                TR0=0;
  107. //                ucPwmCountDianJ  = 0;
  108. //                TR0=1;
  109. //        }
  110. }

  111. //PwmRight
  112. void PwmRight (void)
  113. {  
  114.         if(ucPwmCountDianJ  <= ucPwm)
  115.         {
  116.             if(ucFlagDirection == 0)                                //前進(jìn)時(shí)
  117.                 {
  118.                         IN5 = 1;
  119.                         IN7 = 1;
  120.                 }
  121.                 else if(ucFlagDirection == 1)                //后退時(shí)
  122.                 {
  123.                         IN6 = 1;
  124.                         IN8 = 1;
  125.                 }
  126.         }
  127.         else
  128.     {
  129.             if(ucFlagDirection == 0)                                //前進(jìn)時(shí)
  130.                 {
  131.                         IN5 = 0;
  132.                         IN7 = 0;
  133.                 }
  134.                 else if(ucFlagDirection == 1)                //后退時(shí)
  135.                 {
  136.                         IN6 = 0;
  137.                         IN8 = 0;
  138.                 }
  139.     }
  140. //        if(ucPwmCountDianJ  >= 10)
  141. //        {
  142. //                TR0=0;
  143. //                ucPwmCountDianJ  = 0;
  144. //                TR0=1;
  145. //        }
  146. }
復(fù)制代碼
主程序:
  1. /*******************************************************
  2. * 項(xiàng)目名稱(chēng):循跡避障小車(chē)
  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;                                                //用于判斷是否需要停車(chē)檢測(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è)過(guò)程中時(shí),此為YES,鎖住紅外傳感器的檢測(cè)
  86. unsigned int  uiDelayDuoJiMove=DELAYDUOJI;                                //舵機(jī)移動(dòng)延遲結(jié)束
  87. unsigned char ucFlagDuoJiMove=NO;                                                //舵機(jī)開(kāi)始移動(dòng)的標(biāo)志,此標(biāo)志為YES時(shí)uiDelayDuoJiMove開(kāi)始減
  88. unsigned char ucFlagCSBBegin=NO;                                                //超聲波開(kāi)始檢測(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ù),用來(lái)控制什么時(shí)候結(jié)束檢測(cè),開(kāi)始轉(zhuǎn)彎
  91. unsigned int  uiDelayTurn=DELAYTURN;                                        //轉(zhuǎn)彎結(jié)束,大概90°
  92. unsigned char ucFlagTurn=NO;                                                        //開(kāi)始轉(zhuǎn)動(dòng)的標(biāo)志,此標(biāo)志為YES時(shí)uiDelayTurn開(kāi)始減
  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é)束后,才開(kāi)始轉(zhuǎn)彎


  99. //unsigned char ucCSBDirection = 0;                                                //用來(lái)記錄并判斷檢測(cè)后行進(jìn)方向
  100. //unsigned char ucCSBFlag     = 0;                                                //用來(lái)激活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ù)開(kāi)始***********************************************/
  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è)過(guò)程中時(shí),此為YES,鎖住紅外傳感器的檢測(cè)
  117.                         uiDelayDuoJiMove=DELAYDUOJI;                                //舵機(jī)移動(dòng)延遲結(jié)束
  118.                         ucFlagDuoJiMove=NO;                                                //舵機(jī)開(kāi)始移動(dòng)的標(biāo)志,此標(biāo)志為YES時(shí)uiDelayDuoJiMove開(kāi)始減
  119.                         ucFlagCSBBegin=NO;                                                //超聲波開(kāi)始檢測(cè)標(biāo)志,當(dāng)uiDelayDuoJiMove為0時(shí),為YES
  120.                         ucNumS=0;                                                                        //ulS數(shù)組的第幾位
  121.                         ucNumCSB=0;                                                                //進(jìn)入超聲波檢測(cè)的次數(shù),用來(lái)控制什么時(shí)候結(jié)束檢測(cè),開(kāi)始轉(zhuǎn)彎
  122.                         uiDelayTurn=DELAYTURN;                                        //轉(zhuǎn)彎結(jié)束,大概90°
  123.                         ucFlagTurn=NO;                                                        //開(kāi)始轉(zhuǎn)動(dòng)的標(biāo)志,此標(biāo)志為YES時(shí)uiDelayTurn開(kāi)始減
  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é)束后,才開(kāi)始轉(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)                                                        //沒(méi)在轉(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è)過(guò)程開(kāi)始
  245.                                         {
  246.                                                 if(ucFlagCSBBegin==NO)                                                                //超聲波檢測(cè)未開(kāi)始
  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ù)存起來(lái)
  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ū)
  382. void initial_myself(void)//第一區(qū) 初始化單片機(jī)
  383. {
  384.         unsigned char i;
  385.         for(i=0;i<NUM_TASK_REFRESH;i++)uc_delay_task_cnt[i]=0;//初始化讓所有任務(wù)就緒
  386.         TMOD=0X11; //定時(shí)器0、1為16位不自動(dòng)重裝
  387.         TH0=255-TIME_CLOCK/TIME_PER_SEC/12/256;
  388.         TL0=255-TIME_CLOCK/TIME_PER_SEC/12%256;
  389.         TH1=0;
  390.         TL1=0;
  391.         TH2=0;
  392.         TL2=0;
  393.         DUOJI=0;                                                //防止舵機(jī)轉(zhuǎn)動(dòng),同時(shí)不情愿的開(kāi)啟了第四個(gè)數(shù)碼管的顯示
  394. }

  395. void initial_peripheral(void) //第二區(qū) 初始化外圍
  396. {
  397.         EA=1;                     //開(kāi)總中斷
  398.         ET0=1;                    //允許定時(shí)器中斷

  399.     IT1=1;                          //下降沿觸發(fā)
  400.     EX1=1;                         //允許外部1中斷

  401.     TR0=1;                    //啟動(dòng)定時(shí)器0
  402.     TR1=1;                         //啟動(dòng)定時(shí)器1
  403. }

  404. void delay100ms(void)                //@11.0592MHz
  405. {
  406.         unsigned char i, j, k;

  407.         ;
  408.         ;
  409.         i = 5;
  410.         j = 52;
  411.         k = 195;
  412.         do
  413.         {
  414.                 do
  415.                 {
  416.                         while (--k);
  417.                 } while (--j);
  418.         } while (--i);
  419. }

復(fù)制代碼





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

使用道具 舉報(bào)

沙發(fā)
ID:103810 發(fā)表于 2017-3-6 12:18 | 只看該作者
效果還是不錯(cuò)的啊
回復(fù)

使用道具 舉報(bào)

板凳
ID:185968 發(fā)表于 2017-5-1 22:08 | 只看該作者
厲害了我的哥
回復(fù)

使用道具 舉報(bào)

地板
ID:160485 發(fā)表于 2017-5-23 19:56 | 只看該作者
厲害了,大神。我最近在搞超聲波跟隨小車(chē),但是都已失敗告終。反反復(fù)復(fù)上網(wǎng)查資料,還是沒(méi)結(jié)果。看了您的程序后稍有思緒,但是有些地方?jīng)]看懂,也許是接觸的太少的緣故罷了。向您學(xué)習(xí)。
回復(fù)

使用道具 舉報(bào)

5#
ID:204673 發(fā)表于 2017-5-25 12:52 | 只看該作者
謝謝啦很受用
回復(fù)

使用道具 舉報(bào)

6#
ID:140358 發(fā)表于 2017-5-26 07:24 來(lái)自手機(jī) | 只看該作者
我最近也在做小車(chē),只是效果有點(diǎn)不理想,看了感覺(jué)有點(diǎn)啟發(fā)
回復(fù)

使用道具 舉報(bào)

7#
ID:191542 發(fā)表于 2017-5-28 17:19 | 只看該作者
厲害了,準(zhǔn)備搞小車(chē)
回復(fù)

使用道具 舉報(bào)

8#
ID:157311 發(fā)表于 2017-8-8 17:56 | 只看該作者
有沒(méi)有壓縮包形式的資料
回復(fù)

使用道具 舉報(bào)

9#
ID:240102 發(fā)表于 2017-10-16 23:20 | 只看該作者
大神,能寫(xiě)下用到的 原件么?
回復(fù)

使用道具 舉報(bào)

10#
ID:240102 發(fā)表于 2017-10-16 23:20 | 只看該作者
大神能說(shuō)下用到的原件么?
回復(fù)

使用道具 舉報(bào)

11#
ID:240102 發(fā)表于 2017-10-16 23:21 | 只看該作者
大神能說(shuō)下用到的原件和電路圖么? 我也想做一個(gè)四驅(qū)
回復(fù)

使用道具 舉報(bào)

12#
ID:332698 發(fā)表于 2018-5-22 14:39 | 只看該作者
好資料,51黑有你更精彩!!!需要了解一下
回復(fù)

使用道具 舉報(bào)

13#
ID:336169 發(fā)表于 2018-5-22 23:38 來(lái)自手機(jī) | 只看該作者
確實(shí)不錯(cuò)
回復(fù)

使用道具 舉報(bào)

14#
ID:340236 發(fā)表于 2018-6-1 09:29 | 只看該作者
好資料,51黑有你更精彩!!!需要了解一下
回復(fù)

使用道具 舉報(bào)

15#
ID:356094 發(fā)表于 2018-6-21 15:33 | 只看該作者
確實(shí)很受用,謝謝樓主的分享
回復(fù)

使用道具 舉報(bào)

16#
ID:361651 發(fā)表于 2018-6-30 13:29 | 只看該作者
大神,求助,怎么讓小車(chē)按著走過(guò)的路線原路返回
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚卅毛片| 欧美成年人网站 | 一区二区在线 | 91免费看片神器 | 国产一区二区三区四区 | 日韩精品二区 | 久操伊人 | 亚洲 精品 综合 精品 自拍 | 国产一区二区三区四区在线观看 | 国内精品久久久久 | 午夜视频免费在线观看 | 一区二区高清 | 成人国产精品久久久 | 黑人久久久 | 日本精品一区二区 | 日韩精品亚洲专区在线观看 | 99re在线| 99精品国产一区二区三区 | 日韩精品亚洲专区在线观看 | 国产精品观看 | 久久大全 | 91国产视频在线观看 | 一级毛片免费看 | a级大片免费观看 | 欧美一区二区在线观看 | 手机av在线| 9999在线视频| 亚洲九色 | 国产欧美久久一区二区三区 | 天天干天天草 | 国产精品九九九 | 成人精品一区 | 国内精品久久久久久 | 日本不卡一区二区三区在线观看 | 99精品免费久久久久久日本 | 国产中文一区二区三区 | 国产亚洲一区二区精品 | 欧美在线观看免费观看视频 | 国产精品毛片一区二区三区 | 国产免费一区二区 | 中文精品视频 |