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

標題: 紅外避障舵機控制源程序 [打印本頁]

作者: baoliang666    時間: 2017-11-11 17:54
標題: 紅外避障舵機控制源程序
  1. /*****************ZYDJ-CSB09A舵機控制*****************
  2. // 本程序主要將循跡程序、紅外避障程序、遙控器程序綜合在一起,通過主板按鍵切換
  3. ,藍色小主板是右邊按鍵S4切換,數碼管顯示1,就是循跡模式,按一下按鍵數碼管顯示2,
  4. 就是避障模式,按一下按鍵數碼管顯示3,就是紅外遙控程序,周而復始切換模式。

  5. ******************************************************************/

  6. //注意程序只做參考之用,要達到最理想的尋跡效果,還需要同學們細心調試。

  7. #include<AT89X52.H>    //包含51單片機頭文件,內部有各種寄存器定義
  8. #include<ZY-4WD_PWM.H>    //包含HL-1藍牙智能小車驅動IO口定義等函數
  9. #include <intrins.h>
  10. #define uint    unsigned int                          //重定義無符號整數類型
  11. #define uchar   unsigned char                         //重定義無符號字符類型
  12. uchar code  LedShowData[]={0x03,0x9F,0x25,0x0D,0x99,  //定義數碼管顯示數據
  13.                             0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9
  14. uchar code  RecvData[]={0x19,0x46,0x15,0x44,0x43,0x40,0x0D,0x0E,0x00,0x0F};
  15. uchar IRCOM[7];
  16. unsigned char RunFlag=0;                              //定義運行標志位
  17. bit EnableLight=0;                                    //定義指示燈使能位
  18. sbit IRIN=P3^3;                                       //定義紅外接收端口
  19. /*********完成紅外接收端口的定義*************/
  20. #define ShowPort P2                                   //定義數碼管顯示端口
  21. sbit pwm=P1^6;//PWM信號輸出口  舵機信號輸出口
  22. unsigned char n,count,angle;//距離標志位,0.5ms次數,角度標識
  23. uchar i;
  24. extern void ControlCar(uchar CarType);                //聲明小車控制子程序
  25. unsigned char temp = 1;
  26. void delay_nus(unsigned int i)  //延時:i>=12 ,i的最小延時單12 us
  27. {
  28.   i=i/10;
  29.   while(--i);
  30. }   
  31. void delay_nms(unsigned int n)  //延時n ms
  32. {
  33.   n=n+1;
  34.   while(--n)  
  35.   delay_nus(900);         //延時 1ms,同時進行補償
  36.   
  37. }
  38. void delayms(unsigned char x)                         //0.14mS延時程序
  39. {
  40.   unsigned char i;                                    //定義臨時變量
  41.   while(x--)                                          //延時時間循環
  42.   {
  43.     for (i = 0; i<13; i++) {}                         //14mS延時
  44.   }
  45. }
  46. void Delay5()                                          //定義延時子程序
  47. { uint DelayTime=30000;                               //定義延時時間變量
  48.   while(DelayTime--);                                 //開始進行延時循環
  49.   return;                                             //子程序返回
  50. }
  51. /*------------------------------------------------
  52.                     定時器01初始化
  53. //定時器1工作方式1 (舵機 ),定時器0 電機PWM調速控制信號
  54. ------------------------------------------------*/
  55. void ControlCar(unsigned char ConType)    //定義電機控制子程序
  56. {

  57. switch(ConType)                          //判斷用戶設定電機形式
  58. {
  59.   case 1:  //前進                         //判斷用戶是否選擇形式1
  60.   {
  61.     run();   //調用前進函數
  62. angle=12 ;
  63. ShowPort=LedShowData[1];
  64.     break;
  65.   }
  66.   case 2: //后退                              //判斷用戶是否選擇形式2
  67.   {
  68.     Rearrun ();  //后退  1600MS
  69. angle=12;
  70. ShowPort=LedShowData[2];                             //M2電機反轉
  71.     break;
  72.   }
  73.   case 3: //左轉                              //判斷用戶是否選擇形式3
  74.   {
  75.     leftrun();    //調用小車左轉  函數
  76.     angle=14;  
  77. ShowPort=LedShowData[3];                             //M2電機正轉
  78. break;
  79.   }
  80.   case 4: //右轉                              //判斷用戶是否選擇形式4
  81.   {
  82.                                   //M1電機正轉
  83.     rightrun();     //調用小車右轉 函數
  84.     angle=10;                                      //M2電機反轉
  85. ShowPort=LedShowData[4];
  86. break;
  87.   }
  88.   case 5: //停止                          //判斷用戶是否選擇形式8
  89.   {
  90.     Stoptrun();
  91. angle=12;
  92. ShowPort=LedShowData[0];
  93. break;                                //退出當前選擇
  94.   }
  95. }
  96. }
  97. void ControlCar_yaokong(unsigned char ConType)    //定義電機控制子程序 (紅外遙控單獨設置一個 switch  case  語句  )
  98. {

  99. switch(ConType)                          //判斷用戶設定電機形式
  100. {
  101.   case 1:  //前進                         //判斷用戶是否選擇形式1
  102.   {
  103.     run();   //調用前進函數
  104. angle=12 ;
  105. ShowPort=LedShowData[1];
  106.     break;
  107.   }
  108.   case 2: //后退                              //判斷用戶是否選擇形式2
  109.   {
  110.     Rearrun ();  //后退  1600MS
  111. angle=12;
  112. ShowPort=LedShowData[2];                             //M2電機反轉
  113.     break;
  114.   }
  115.   case 3: //左轉                              //判斷用戶是否選擇形式3
  116.   {
  117.     leftrun();    //調用小車左轉  函數
  118.     angle=14;  
  119. ShowPort=LedShowData[3];                             //M2電機正轉
  120. break;
  121.   }
  122.   case 4: //右轉                              //判斷用戶是否選擇形式4
  123.   {
  124.                                   //M1電機正轉
  125.     rightrun();     //調用小車右轉 函數
  126.     angle=10;                                      //M2電機反轉
  127. ShowPort=LedShowData[4];
  128. break;
  129.   }
  130.   case 5: //停止                          //判斷用戶是否選擇形式8
  131.   {
  132.     Stoptrun();
  133. angle=12;
  134. ShowPort=LedShowData[0];
  135. break;                                //退出當前選擇
  136.   }
  137. }
  138. }
  139. void Robot_Avoidance()                   //機器人避障子程序
  140. {
  141.    //有信號為0  沒有信號為1
  142.               if(LeftIRBZ ==1&&RightIRBZ ==1)  // 前面 沒有障礙物  前速前進
  143.      {
  144.      run();   //調用前進函數
  145.      angle=12 ;
  146.      }
  147.       if(RightIRBZ ==0&&LeftIRBZ ==0)  //左右兩邊同時檢測到障礙物
  148.       {   
  149.          
  150.      
  151.        Rearrun ();  //后退  1600MS
  152.        angle=12;
  153.             delay_nms(500);

  154.       leftrun();    //調用小車左轉  函數
  155.                      angle=14;
  156.       delay_nms(1000);
  157.       }
  158.             
  159.       if(LeftIRBZ ==0&&RightIRBZ ==1)     //左邊檢測到障礙物
  160.       {
  161.       
  162.       rightrun();     //調用小車右轉 函數
  163.       angle=10;
  164.         }
  165.       
  166.      if(RightIRBZ ==0&&LeftIRBZ ==1)  //右邊檢測到障礙物
  167.       {   
  168.          
  169.        leftrun();    //調用小車左轉  函數
  170.                       angle=14;
  171.       }
  172. }
  173. //機器人循跡子程序
  174. void Robot_Traction()                     //機器人循跡子程序
  175. {
  176.      if(Left_1_led==0&&Right_1_led==0)
  177.      {
  178.      run();   //調用前進函數
  179.      angle=12 ;
  180.      }
  181.   else
  182. {     
  183.      if(Left_1_led==0&&Right_1_led==1)     //左邊檢測到黑線
  184.     {
  185.       
  186.     rightrun();     //調用小車右轉 函數
  187.     angle=10;
  188.      }
  189.       
  190.    if(Right_1_led==0&&Left_1_led==1)  //右邊檢測到黑線
  191.    {   
  192.          
  193.                leftrun();    //調用小車左轉  函數
  194.                angle=14;
  195.    }
  196. }
  197. }
  198. void Time1_Int() interrupt 3//舵機
  199. {
  200. TH1=0xff;
  201. TL1=0xa3;
  202. if(count<angle)//判斷0.5ms次數是否小于角度標識
  203.     pwm=1;//確實小于,pwm輸出高電平
  204.     else
  205.     pwm=0;//大于則輸出低電平
  206. count=(count+1);//0.5ms次數加1
  207. count=count%40;//次數始終保持為40即保持周期為20ms
  208. }

  209. //主函數
  210. void main(void)
  211. {
  212. angle=12;//舵機居中
  213.     count=0;
  214.     P0=0XF0;   //關電機
  215.     //本實驗學習的知識蜂鳴器,注意要在HJ-4WD頭文件里定義IO口
  216. BUZZ=0; //50次檢測K4確認是按下之后,蜂鳴器發出“滴”聲響,然后啟動小車。
  217. delay(50);
  218.     BUZZ=1;//響50ms后關閉蜂鳴器
  219. TMOD=0X11;
  220.     TH0= 0XFc;    //1ms定時
  221.     TL0= 0X18;
  222.     TR0= 1;
  223.     ET0= 1;
  224. EA = 1;      //開總中斷
  225. TH1=0xff;
  226. TL1=0xa3;
  227. ET1=1;
  228. TR1= 1;
  229.    
  230. IT1=1;                                               //設定外部中斷1為低邊緣觸發類型
  231.     Stoptrun();
  232. while(1) //無限循環
  233. {
  234.    if(P3_2 == 0)
  235.    {
  236.     delay_nms(10);
  237.     if(P3_2 == 0)
  238.     {
  239.        temp++;
  240.     while(!P3_2);
  241.     }
  242.    }
  243.    if(temp > 3)
  244.    {
  245.    temp = 1;
  246.    }
  247.    switch(temp)
  248.    {
  249.      case 1: ShowPort = LedShowData[1];Robot_Traction();EX1 = 0;break;
  250.   case 2: ShowPort = LedShowData[2];Robot_Avoidance();EX1 = 0;break;
  251.   case 3: ShowPort = LedShowData[3];EX1 = 1;break;
  252.    }
  253.   
  254.   }
  255. }
  256. //----------紅外遙控-------------------------------------------------------------
  257. void IR_IN() interrupt 2 using 0                      //定義INT2外部中斷函數
  258. {
  259.   unsigned char j,k,N=0;                              //定義臨時接收變量
  260.    
  261.   EX1 = 0;                                            //關閉外部中斷,防止再有信號到達   
  262.   delayms(15);                                        //延時時間,進行紅外消抖
  263.   if (IRIN==1)                                        //判斷紅外信號是否消失
  264.   {  
  265.      EX1 =1;                                          //外部中斷開
  266.   return;                                          //返回
  267.   }
  268.                            
  269.   while (!IRIN)                                       //等IR變為高電平,跳過9ms的前導低電平信號。
  270.   {
  271.       delayms(1);                                     //延時等待
  272.   }
  273.   for (j=0;j<4;j++)                                   //采集紅外遙控器數據
  274.   {
  275.     for (k=0;k<8;k++)                                 //分次采集8位數據
  276.     {
  277.        while (IRIN)                                   //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
  278.        {
  279.          delayms(1);                                  //延時等待
  280.        }
  281.       
  282.        while (!IRIN)                                  //等 IR 變為高電平
  283.        {
  284.          delayms(1);                                  //延時等待
  285.        }
  286.    
  287.        while (IRIN)                                   //計算IR高電平時長
  288.        {
  289.          delayms(1);                                  //延時等待
  290.          N++;                                         //計數器加加
  291.          if (N>=30)                                   //判斷計數器累加值
  292.       {
  293.            EX1=1;                                     //打開外部中斷功能
  294.         return;                                    //返回
  295.          }                  
  296.        }
  297.                                        
  298.       IRCOM[j]=IRCOM[j] >> 1;                         //進行數據位移操作并自動補零
  299.      
  300.       if (N>=8)                                       //判斷數據長度
  301.       {
  302.          IRCOM[j] = IRCOM[j] | 0x80;                  //數據最高位補1
  303.       }
  304.       N=0;                                            //清零位數計錄器
  305.     }
  306.   }
  307.    
  308.   if (IRCOM[2]!=~IRCOM[3])                            //判斷地址碼是否相同
  309.   {
  310.      EX1=1;                                           //打開外部中斷
  311.      return;                                          //返回
  312.   }
  313.   for(j=0;j<10;j++)                                   //循環進行鍵碼解析
  314.    {
  315.       if(IRCOM[2]==RecvData[j])                       //進行鍵位對應
  316.       {
  317.        // ControlCar(j);
  318.   ControlCar_yaokong(j);                               //數碼管顯示相應數碼
  319.       }
  320.    }
  321.    EX1 = 1;                                           //外部中斷開
  322. }
復制代碼





歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国内精品视频一区二区三区 | 国产乱码精品一品二品 | 国产精品亚洲片在线播放 | 久久国产亚洲 | 色接久久 | 亚洲一区二区三区四区五区中文 | 在线91 | 在线观看亚洲 | 亚洲视频中文字幕 | 久久久精彩视频 | 亚洲精品一区二区 | 亚洲九九 | 欧美国产日韩一区二区三区 | 久久久久久久久久爱 | 亚洲精品一区二区三区在线 | 亚洲成人免费视频在线观看 | 天堂精品视频 | 亚洲最色视频 | 成人在线中文字幕 | 免费国产一区二区视频 | 久久精品国产一区二区电影 | 亚洲中国字幕 | 日韩三极| 91久久夜色 | 欧美久久国产 | 久久成人一区 | 成人国产在线视频 | 色婷婷av一区二区三区软件 | 国产99精品 | 日本精品久久 | 国产日韩欧美在线 | 国产人成在线观看 | 日韩一区二区三区四区五区六区 | 久久久久久久国产 | 国产一区二区久久 | 一区在线视频 | 国产精品久久久久久久久久久久午夜片 | 久久99精品久久 | 中文字幕一区二区三区在线观看 | 国产不卡在线观看 | 久久精品综合 |