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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

紅外避障舵機(jī)控制源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:248426 發(fā)表于 2017-11-11 17:54 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
  1. /*****************ZYDJ-CSB09A舵機(jī)控制*****************
  2. // 本程序主要將循跡程序、紅外避障程序、遙控器程序綜合在一起,通過主板按鍵切換
  3. ,藍(lán)色小主板是右邊按鍵S4切換,數(shù)碼管顯示1,就是循跡模式,按一下按鍵數(shù)碼管顯示2,
  4. 就是避障模式,按一下按鍵數(shù)碼管顯示3,就是紅外遙控程序,周而復(fù)始切換模式。

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

  6. //注意程序只做參考之用,要達(dá)到最理想的尋跡效果,還需要同學(xué)們細(xì)心調(diào)試。

  7. #include<AT89X52.H>    //包含51單片機(jī)頭文件,內(nèi)部有各種寄存器定義
  8. #include<ZY-4WD_PWM.H>    //包含HL-1藍(lán)牙智能小車驅(qū)動IO口定義等函數(shù)
  9. #include <intrins.h>
  10. #define uint    unsigned int                          //重定義無符號整數(shù)類型
  11. #define uchar   unsigned char                         //重定義無符號字符類型
  12. uchar code  LedShowData[]={0x03,0x9F,0x25,0x0D,0x99,  //定義數(shù)碼管顯示數(shù)據(jù)
  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;                              //定義運(yùn)行標(biāo)志位
  17. bit EnableLight=0;                                    //定義指示燈使能位
  18. sbit IRIN=P3^3;                                       //定義紅外接收端口
  19. /*********完成紅外接收端口的定義*************/
  20. #define ShowPort P2                                   //定義數(shù)碼管顯示端口
  21. sbit pwm=P1^6;//PWM信號輸出口  舵機(jī)信號輸出口
  22. unsigned char n,count,angle;//距離標(biāo)志位,0.5ms次數(shù),角度標(biāo)識
  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,同時進(jìn)行補(bǔ)償
  36.   
  37. }
  38. void delayms(unsigned char x)                         //0.14mS延時程序
  39. {
  40.   unsigned char i;                                    //定義臨時變量
  41.   while(x--)                                          //延時時間循環(huán)
  42.   {
  43.     for (i = 0; i<13; i++) {}                         //14mS延時
  44.   }
  45. }
  46. void Delay5()                                          //定義延時子程序
  47. { uint DelayTime=30000;                               //定義延時時間變量
  48.   while(DelayTime--);                                 //開始進(jìn)行延時循環(huán)
  49.   return;                                             //子程序返回
  50. }
  51. /*------------------------------------------------
  52.                     定時器01初始化
  53. //定時器1工作方式1 (舵機(jī) ),定時器0 電機(jī)PWM調(diào)速控制信號
  54. ------------------------------------------------*/
  55. void ControlCar(unsigned char ConType)    //定義電機(jī)控制子程序
  56. {

  57. switch(ConType)                          //判斷用戶設(shè)定電機(jī)形式
  58. {
  59.   case 1:  //前進(jìn)                         //判斷用戶是否選擇形式1
  60.   {
  61.     run();   //調(diào)用前進(jìn)函數(shù)
  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電機(jī)反轉(zhuǎn)
  71.     break;
  72.   }
  73.   case 3: //左轉(zhuǎn)                              //判斷用戶是否選擇形式3
  74.   {
  75.     leftrun();    //調(diào)用小車左轉(zhuǎn)  函數(shù)
  76.     angle=14;  
  77. ShowPort=LedShowData[3];                             //M2電機(jī)正轉(zhuǎn)
  78. break;
  79.   }
  80.   case 4: //右轉(zhuǎn)                              //判斷用戶是否選擇形式4
  81.   {
  82.                                   //M1電機(jī)正轉(zhuǎn)
  83.     rightrun();     //調(diào)用小車右轉(zhuǎn) 函數(shù)
  84.     angle=10;                                      //M2電機(jī)反轉(zhuǎn)
  85. ShowPort=LedShowData[4];
  86. break;
  87.   }
  88.   case 5: //停止                          //判斷用戶是否選擇形式8
  89.   {
  90.     Stoptrun();
  91. angle=12;
  92. ShowPort=LedShowData[0];
  93. break;                                //退出當(dāng)前選擇
  94.   }
  95. }
  96. }
  97. void ControlCar_yaokong(unsigned char ConType)    //定義電機(jī)控制子程序 (紅外遙控單獨(dú)設(shè)置一個 switch  case  語句  )
  98. {

  99. switch(ConType)                          //判斷用戶設(shè)定電機(jī)形式
  100. {
  101.   case 1:  //前進(jìn)                         //判斷用戶是否選擇形式1
  102.   {
  103.     run();   //調(diào)用前進(jìn)函數(shù)
  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電機(jī)反轉(zhuǎn)
  113.     break;
  114.   }
  115.   case 3: //左轉(zhuǎn)                              //判斷用戶是否選擇形式3
  116.   {
  117.     leftrun();    //調(diào)用小車左轉(zhuǎn)  函數(shù)
  118.     angle=14;  
  119. ShowPort=LedShowData[3];                             //M2電機(jī)正轉(zhuǎn)
  120. break;
  121.   }
  122.   case 4: //右轉(zhuǎn)                              //判斷用戶是否選擇形式4
  123.   {
  124.                                   //M1電機(jī)正轉(zhuǎn)
  125.     rightrun();     //調(diào)用小車右轉(zhuǎn) 函數(shù)
  126.     angle=10;                                      //M2電機(jī)反轉(zhuǎn)
  127. ShowPort=LedShowData[4];
  128. break;
  129.   }
  130.   case 5: //停止                          //判斷用戶是否選擇形式8
  131.   {
  132.     Stoptrun();
  133. angle=12;
  134. ShowPort=LedShowData[0];
  135. break;                                //退出當(dāng)前選擇
  136.   }
  137. }
  138. }
  139. void Robot_Avoidance()                   //機(jī)器人避障子程序
  140. {
  141.    //有信號為0  沒有信號為1
  142.               if(LeftIRBZ ==1&&RightIRBZ ==1)  // 前面 沒有障礙物  前速前進(jìn)
  143.      {
  144.      run();   //調(diào)用前進(jìn)函數(shù)
  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();    //調(diào)用小車左轉(zhuǎn)  函數(shù)
  155.                      angle=14;
  156.       delay_nms(1000);
  157.       }
  158.             
  159.       if(LeftIRBZ ==0&&RightIRBZ ==1)     //左邊檢測到障礙物
  160.       {
  161.       
  162.       rightrun();     //調(diào)用小車右轉(zhuǎn) 函數(shù)
  163.       angle=10;
  164.         }
  165.       
  166.      if(RightIRBZ ==0&&LeftIRBZ ==1)  //右邊檢測到障礙物
  167.       {   
  168.          
  169.        leftrun();    //調(diào)用小車左轉(zhuǎn)  函數(shù)
  170.                       angle=14;
  171.       }
  172. }
  173. //機(jī)器人循跡子程序
  174. void Robot_Traction()                     //機(jī)器人循跡子程序
  175. {
  176.      if(Left_1_led==0&&Right_1_led==0)
  177.      {
  178.      run();   //調(diào)用前進(jìn)函數(shù)
  179.      angle=12 ;
  180.      }
  181.   else
  182. {     
  183.      if(Left_1_led==0&&Right_1_led==1)     //左邊檢測到黑線
  184.     {
  185.       
  186.     rightrun();     //調(diào)用小車右轉(zhuǎn) 函數(shù)
  187.     angle=10;
  188.      }
  189.       
  190.    if(Right_1_led==0&&Left_1_led==1)  //右邊檢測到黑線
  191.    {   
  192.          
  193.                leftrun();    //調(diào)用小車左轉(zhuǎn)  函數(shù)
  194.                angle=14;
  195.    }
  196. }
  197. }
  198. void Time1_Int() interrupt 3//舵機(jī)
  199. {
  200. TH1=0xff;
  201. TL1=0xa3;
  202. if(count<angle)//判斷0.5ms次數(shù)是否小于角度標(biāo)識
  203.     pwm=1;//確實(shí)小于,pwm輸出高電平
  204.     else
  205.     pwm=0;//大于則輸出低電平
  206. count=(count+1);//0.5ms次數(shù)加1
  207. count=count%40;//次數(shù)始終保持為40即保持周期為20ms
  208. }

  209. //主函數(shù)
  210. void main(void)
  211. {
  212. angle=12;//舵機(jī)居中
  213.     count=0;
  214.     P0=0XF0;   //關(guān)電機(jī)
  215.     //本實(shí)驗(yàn)學(xué)習(xí)的知識蜂鳴器,注意要在HJ-4WD頭文件里定義IO口
  216. BUZZ=0; //50次檢測K4確認(rèn)是按下之后,蜂鳴器發(fā)出“滴”聲響,然后啟動小車。
  217. delay(50);
  218.     BUZZ=1;//響50ms后關(guān)閉蜂鳴器
  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;                                               //設(shè)定外部中斷1為低邊緣觸發(fā)類型
  231.     Stoptrun();
  232. while(1) //無限循環(huán)
  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外部中斷函數(shù)
  258. {
  259.   unsigned char j,k,N=0;                              //定義臨時接收變量
  260.    
  261.   EX1 = 0;                                            //關(guān)閉外部中斷,防止再有信號到達(dá)   
  262.   delayms(15);                                        //延時時間,進(jìn)行紅外消抖
  263.   if (IRIN==1)                                        //判斷紅外信號是否消失
  264.   {  
  265.      EX1 =1;                                          //外部中斷開
  266.   return;                                          //返回
  267.   }
  268.                            
  269.   while (!IRIN)                                       //等IR變?yōu)楦唠娖剑^9ms的前導(dǎo)低電平信號。
  270.   {
  271.       delayms(1);                                     //延時等待
  272.   }
  273.   for (j=0;j<4;j++)                                   //采集紅外遙控器數(shù)據(jù)
  274.   {
  275.     for (k=0;k<8;k++)                                 //分次采集8位數(shù)據(jù)
  276.     {
  277.        while (IRIN)                                   //等 IR 變?yōu)榈碗娖剑^4.5ms的前導(dǎo)高電平信號。
  278.        {
  279.          delayms(1);                                  //延時等待
  280.        }
  281.       
  282.        while (!IRIN)                                  //等 IR 變?yōu)楦唠娖?br />
  283.        {
  284.          delayms(1);                                  //延時等待
  285.        }
  286.    
  287.        while (IRIN)                                   //計(jì)算IR高電平時長
  288.        {
  289.          delayms(1);                                  //延時等待
  290.          N++;                                         //計(jì)數(shù)器加加
  291.          if (N>=30)                                   //判斷計(jì)數(shù)器累加值
  292.       {
  293.            EX1=1;                                     //打開外部中斷功能
  294.         return;                                    //返回
  295.          }                  
  296.        }
  297.                                        
  298.       IRCOM[j]=IRCOM[j] >> 1;                         //進(jìn)行數(shù)據(jù)位移操作并自動補(bǔ)零
  299.      
  300.       if (N>=8)                                       //判斷數(shù)據(jù)長度
  301.       {
  302.          IRCOM[j] = IRCOM[j] | 0x80;                  //數(shù)據(jù)最高位補(bǔ)1
  303.       }
  304.       N=0;                                            //清零位數(shù)計(jì)錄器
  305.     }
  306.   }
  307.    
  308.   if (IRCOM[2]!=~IRCOM[3])                            //判斷地址碼是否相同
  309.   {
  310.      EX1=1;                                           //打開外部中斷
  311.      return;                                          //返回
  312.   }
  313.   for(j=0;j<10;j++)                                   //循環(huán)進(jìn)行鍵碼解析
  314.    {
  315.       if(IRCOM[2]==RecvData[j])                       //進(jìn)行鍵位對應(yīng)
  316.       {
  317.        // ControlCar(j);
  318.   ControlCar_yaokong(j);                               //數(shù)碼管顯示相應(yīng)數(shù)碼
  319.       }
  320.    }
  321.    EX1 = 1;                                           //外部中斷開
  322. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 涩涩鲁亚洲精品一区二区 | 天天综合天天 | japanhd成人| 99精品视频在线观看免费播放 | 草比av| 精品久久久久久一区二区 | 妖精视频一区二区三区 | 91亚洲精| 极品一区 | 婷婷一级片 | 亚洲福利一区 | 日韩一区二区三区视频 | 国产资源在线观看 | 国产精品综合 | 国产欧美日韩视频 | 亚洲在线一区 | 国产精品国产三级国产播12软件 | 国产免费观看久久黄av片涩av | 99reav| 在线观看成人小视频 | jlzzjlzz欧美大全 | 美女在线视频一区二区三区 | 不卡一区二区三区四区 | 亚洲在线视频 | www狠狠干 | 久久日韩精品 | 欧美色综合| 欧美视频一区二区三区 | 国产极品粉嫩美女呻吟在线看人 | 国产高清一二三区 | av网站在线看 | 亚洲免费影院 | 99re6在线视频精品免费 | 国产精品乱码一区二区三区 | 日韩欧美在线不卡 | 一级一级一级毛片 | 亚洲成人免费视频 | 在线观看成年人视频 | 欧美性猛交一区二区三区精品 | 中文字字幕一区二区三区四区五区 | 视频二区在线观看 |