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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1546|回復: 0
打印 上一主題 下一主題
收起左側

基于ZYWIFI094小車實現循跡、紅外避障、遙控綜合程序-采用PWM調速方式

[復制鏈接]
跳轉到指定樓層
#
ID:1101034 發表于 2023-11-24 15:15 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
基于ZYWIFI094小車實現循跡、紅外避障、遙控綜合程序--采用PWM調速方式
keil工程文件來自實訓師傅分享以及自己修改,基于ZYWIFI094小車(STC89C52RC芯片),可以實現循跡紅外避障以及遙控等功能。
歡迎大家交流指正!

單片機源程序如下:
  1. /**********************ZYWIFI0939C-WIFI機器人實驗板例程************************
  2. *  平臺:ZYWIFI0939C-WIFI機器人 + Keil U4 + STC89C52
  3. *  名稱:ZY-1智能小車參考程序
  4. *  硬件設置:要有自己動手能力,才能完成實驗
  5. *  使用說明:根據下面IO口自己用杜邦線連接各種模塊,可以自己修改各種模塊IO口
  6. *  視頻教程:本小車配套學習C語言詳細視頻教程,資料統一網盤下載
  7.    重點提示:本程序只做參考,不提供技術支持,請自己研究吸收。
  8.    
  9. ******************************************************************/  
  10. #include <AT89x51.H>
  11. #include <intrins.h>
  12. #include <HJ-4WD_PWM.H>                  //包含HL-1藍牙智能小車驅動IO口定義等函數
  13. #define Left_1_led        P3_7         //左循跡傳感器   

  14. #define Right_1_led       P3_6         //右循跡傳感器

  15. #define LeftIRBZ          P3_4         //左避障傳感器         

  16. #define RightIRBZ         P3_5         //右避障傳感器            

  17. sbit SB1=P2^3;                            //定義蜂鳴器端口
  18. sbit IRIN=P3^3;                                       //定義紅外接收端口

  19. unsigned char code  LedShowData[]={0x03,0x9F,0x25,0x0D,0x99,  //定義數碼管顯示數據
  20.                                    0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9
  21. unsigned char code  RecvData[]={0x19,0x46,0x15,0x43,0x44,0x40,0x0d};//遙控器鍵碼
  22. unsigned char IRCOM[7];

  23. //#define ShowPort P0                                   //定義數碼管顯示端口
  24. unsigned char temp = 1;

  25. void Delay1ms(unsigned int i)         //延時1ms
  26. {
  27. unsigned char j,k;
  28. do{
  29.   j = 10;
  30.   do{
  31.    k = 50;
  32.    do{
  33.     _nop_();
  34.    }while(--k);     
  35.   }while(--j);
  36. }while(--i);

  37. }

  38. void delay_nus(unsigned int i)  //延時:i>=12 ,i的最小延時單12 us
  39. {
  40.   i=i/10;
  41.   while(--i);
  42. }   
  43. void delay_nms(unsigned int n)  //延時n ms
  44. {
  45.   n=n+1;
  46.   while(--n)  
  47.   delay_nus(900);         //延時 1ms,同時進行補償
  48.   
  49. }  

  50. void delayms(unsigned char x)                         //0.14mS延時程序
  51. {
  52.   unsigned char i;                                    //定義臨時變量
  53.   while(x--)                                          //延時時間循環
  54.   {
  55.     for (i = 0; i<13; i++) {}                         //14mS延時
  56.   }
  57. }

  58. void Delay()                                          //定義延時子程序
  59. {
  60.   unsigned int DelayTime=30000;                       //定義延時時間變量
  61.   while(DelayTime--);                                 //開始進行延時循環
  62.   return;                                             //子程序返回
  63. }

  64. void ControlCar_yaokong(unsigned char ConType)    //定義電機控制子程序        (紅外遙控單獨設置一個 switch  case  語句  )
  65. {

  66.   stop();
  67. switch(ConType)                          //判斷用戶設定電機形式
  68. {
  69.          case 0:
  70.          {
  71.                  EX1=0;
  72.                   break;
  73.          }
  74.   case 1:  //前進                         //判斷用戶是否選擇形式1
  75.   {
  76.     stop();                                                      //進入前進之前 先停止一段時間  防止電機反向電壓沖擊主板 導致系統復位
  77.         Delay1ms(150);
  78.         run();
  79.     break;
  80.   }
  81.   case 2: //后退                          //判斷用戶是否選擇形式2
  82.   {
  83.     stop();                                                                      //進入后退之前 先停止一段時間  防止電機反向電壓沖擊主板 導致系統復位
  84.     Delay1ms(150);         
  85.         back();                                 //M2電機反轉
  86.     break;
  87.   }
  88.   case 3: //右轉                          //判斷用戶是否選擇形式3
  89.   {
  90.      stop();                                                                  //進入左轉之前 先停止一段時間  防止電機反向電壓沖擊主板 導致系統復位
  91.          Delay1ms(150);
  92.          rightrun1s();                                //M2電機正轉
  93.          break;
  94.   }
  95.   case 4: //左轉                          //判斷用戶是否選擇形式4
  96.   {
  97.      stop();                                                                  //進入右轉之前 先停止一段時間  防止電機反向電壓沖擊主板 導致系統復位
  98.          Delay1ms(150);
  99.      leftrun1s();                                  //M1電機正轉  //M2電機反轉
  100.           break;
  101.   }
  102.   case 5: //停止                          //判斷用戶是否選擇形式5
  103.   {
  104.     stop();
  105.         break;                                //退出當前選擇
  106.   }
  107. }
  108. }

  109. //機器人避障子程序   0代表有障礙
  110. void Robot_Avoidance()                  
  111. {
  112.             
  113.                                   if((RightIRBZ&LeftIRBZ)==0)                //檢測到障礙
  114.                                   {         
  115.                                    SB1=0;                //蜂鳴器響
  116.                                          stop();                     //停止
  117.            Delay1ms(200);                 //停止MS   防止電機反相電壓沖擊  導致系統復位
  118.                                          back();                         //小車后退
  119.                                         Delay1ms(300);         //后退ms
  120.                                                 SB1=1;
  121.                                                  stop();
  122.                                                 EX1=1;
  123.                                                 while(IRCOM[2]!=RecvData[0])
  124.                                                 {
  125.                                                         EX1=1;
  126.                                                 }

  127.                                   }
  128.                   
  129. }
  130. //機器人循跡子程序
  131. void Robot_Traction()                     //機器人循跡子程序   1代表檢測到黑線
  132. {
  133.   
  134.    //SB1=1;
  135.    if(Left_1_led  == 0 && Right_1_led == 0)    //沒檢測到黑線,就前進,1代表檢測到黑線         Left_1_led           Right_1_led
  136.    {
  137.       run();                     
  138.       delay_nms (10);
  139.           SB1=1;
  140.    }
  141.    
  142.    else if(Left_1_led  == 0 && Right_1_led == 1)
  143.    {
  144.       rightrun();                       //右側檢測到黑線,開始向右轉一定的角度
  145.       delay_nms (10);
  146.    }

  147.    else if(Left_1_led  == 1 &&  Right_1_led == 0)
  148.    {
  149.       leftrun();                         //左側檢測到黑線,開始向左轉一定的角度
  150.          
  151.       delay_nms (10);
  152.    }
  153.    else if(Left_1_led  == 1 &&  Right_1_led == 1)
  154.    {
  155.       SB1=1;
  156.           stop();                         //左右都檢測到黑線,停止
  157.          
  158.       delay_nms (10);
  159.    }
  160.      
  161. }

  162. //----------紅外遙控-------------------------------------------------------------
  163. void IR_IN() interrupt 2 using 0                      //定義INT2外部中斷函數
  164. {
  165.   unsigned char j,k,N=0;                              //定義臨時接收變量
  166.   
  167.   EX1 = 0;                                            //關閉外部中斷,防止再有信號到達   
  168.   delayms(15);                                        //延時時間,進行紅外消抖
  169.   if (IRIN==1)                                        //判斷紅外信號是否消失
  170.   {  
  171.      EX1 =1;                                          //外部中斷 開
  172.          return;                                          //返回
  173.   }
  174.                            
  175.   while (!IRIN)                                       //等IR變為高電平,跳過9ms的前導低電平信號。
  176.   {
  177.       delayms(1);                                     //延時等待
  178.   }

  179.   for (j=0;j<4;j++)                                   //采集紅外遙控器數據
  180.   {
  181.     for (k=0;k<8;k++)                                 //分次采集8位數據
  182.     {
  183.        while (IRIN)                                   //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
  184.        {
  185.          delayms(1);                                  //延時等待
  186.        }
  187.       
  188.        while (!IRIN)                                  //等 IR 變為高電平
  189.        {
  190.          delayms(1);                                  //延時等待
  191.        }
  192.    
  193.        while (IRIN)                                   //計算IR高電平時長
  194.        {
  195.          delayms(1);                                  //延時等待
  196.          N++;                                         //計數器加加
  197.          if (N>=30)                                   //判斷計數器累加值
  198.              {
  199.            EX1=1;                                     //打開外部中斷功能
  200.                return;                                    //返回
  201.          }                  
  202.        }
  203.                                        
  204.       IRCOM[j]=IRCOM[j] >> 1;                         //進行數據位移操作并自動補零
  205.      
  206.       if (N>=8)                                       //判斷數據長度
  207.       {
  208.          IRCOM[j] = IRCOM[j] | 0x80;                  //數據最高位補1
  209.       }
  210.       N=0;                                            //清零位數計錄器
  211.     }
  212.   }
  213.    
  214.   if (IRCOM[2]!=~IRCOM[3])                            //判斷地址碼是否相同
  215.   {
  216.      EX1=1;                                           //打開外部中斷
  217.      return;                                          //返回
  218.   }



  219.   for(j=0;j<7;j++)                                   //循環進行鍵碼解析
  220.    {
  221.       if(IRCOM[2]==RecvData[j])                       //進行鍵位對應
  222.       {
  223.                 ControlCar_yaokong(j);                               //遙控按鍵相應數碼
  224.       }
  225.    }

  226.    EX1 = 0;                                           //外部中斷關
  227. }
  228. //-------------------------------------------------------------------------------------------------------
  229. void main()                               //主程序入口
  230. {
  231.   TMOD=0X01;
  232.   TH0= 0XFc;                  //1ms定時
  233.   TL0= 0X18;
  234.   TR0= 1;
  235.   ET0= 1;
  236.   EA = 1;                           //開總中斷                                              //同意開啟外部中斷1
  237.   IT1=1;                                               //設定外部中斷1為低邊緣觸發類型

  238.   while(1)                                //程序主循環
  239.   {
  240.                
  241. //  Robot_Traction();               //尋跡
  242.                 EX1=1;
  243.                 if(IRCOM[2]==RecvData[6])   //遙控上的200+
  244.                 {
  245.                         stop();
  246.                         while(IRCOM[2]!=RecvData[0])    //遙控上的100+
  247.                         {
  248.                                 EX1=1;
  249.                         }
  250.                         IRCOM[2]=0x00;
  251.                 }
  252.                 Robot_Traction();               //尋跡
  253.   Robot_Avoidance();              //避障
  254.          
  255.   }
  256. }
復制代碼

原理圖: 無
仿真: 無
代碼: 循跡、紅外避障、遙控綜合程序--PWM調速.7z (631.5 KB, 下載次數: 17)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区二区视频 | 中文字幕欧美一区二区 | 国产中文字幕在线 | 99热视| 亚洲精品一区中文字幕乱码 | 懂色tv | 蜜月va乱码一区二区三区 | 国产精品夜夜夜一区二区三区尤 | 久艹网站 | 精品视频www | 最新免费黄色网址 | 久久黄色网 | 99在线资源 | 亚洲欧美一区在线 | 国产7777 | 亚洲在线中文字幕 | 午夜三级网站 | 精品久久久网站 | 日韩精品区 | 国产一区精品在线 | 999精彩视频| 欧美综合国产精品久久丁香 | 久久成人免费 | 久草中文网| 国产日产久久高清欧美一区 | 成人h电影在线观看 | av一二三区 | 米奇成人网 | 国产精品乱码一区二三区小蝌蚪 | 久久人人爽人人爽 | 久热精品在线观看视频 | 久久国产精品99久久久久久丝袜 | 亚洲欧美日韩中文在线 | 国产目拍亚洲精品99久久精品 | 国产精品一区二区三区免费观看 | 精品久久久久一区二区国产 | 久久一区二区精品 | 成人在线视频网站 | 亚洲天堂久久 | 一级看片| 久久综合久久久 |