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

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

QQ登錄

只需一步,快速開始

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

51單片機(jī)智能車超聲波舵機(jī)避障程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:893682 發(fā)表于 2021-4-25 16:37 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include <reg52.h>//51頭文件
  2. #include <QX_A11.h>//QX_A11智能小車配置文件
  3. #include <intrins.h>
  4. bit Timer1Overflow;        //計(jì)數(shù)器1溢出標(biāo)志位
  5. unsigned char disbuff[4]={0,0,0,0};//用于分別存放距離的值米,厘米,毫米
  6. unsigned int LeftDistance = 0, RightDistance = 0, FrontDistance = 0; //云臺(tái)測(cè)距距離緩存
  7. unsigned int DistBuf[5] = {0};//distance data buffer
  8. unsigned char        pwm_val_left,pwm_val_right;        //中間變量,用戶請(qǐng)勿修改。
  9. unsigned char         pwm_left,pwm_right;                        //定義PWM輸出高電平的時(shí)間的變量。用戶操作PWM的變量。
  10. #define                PWM_DUTY                200                        //(用于舵機(jī)時(shí)不可修改)定義PWM的周期,數(shù)值為定時(shí)器0溢出周期,假如定時(shí)器溢出時(shí)間為100us,則PWM周期為20ms。
  11. #define                PWM_HIGH_MIN        70                        //限制PWM輸出的最小占空比。用戶請(qǐng)勿修改。
  12. #define                PWM_HIGH_MAX        PWM_DUTY        //限制PWM輸出的最大占空比。用戶請(qǐng)勿修改。

  13. void Timer0_Init(void); //定時(shí)器0初始化
  14. void Timer1_Init(void);//定時(shí)器1初始化
  15. void LoadPWM(void);//裝入PWM輸出值
  16. void Delay_Ms(unsigned int ms);//毫秒級(jí)延時(shí)函數(shù)
  17. void forward(unsigned char LeftSpeed,unsigned char RightSpeed);//QX_A11智能小車前進(jìn)
  18. void left_run(unsigned char LeftSpeed,unsigned char RightSpeed);//QX_A11智能小車左轉(zhuǎn)  
  19. void right_run(unsigned char LeftSpeed,unsigned char RightSpeed);//QX_A11智能小車右轉(zhuǎn)
  20. //void back_run(unsigned char LeftSpeed,unsigned char RightSpeed);//QX_A11智能小車后退
  21. void stop(void);//QX_A11智能小車停車
  22. void Delay18450us(void);        //@11.0592MHz
  23. void Delay1550us(void);                //@11.0592MHz
  24. void Delay19400us(void);        //@11.0592MHz
  25. void Delay600us(void);                //@11.0592MHz
  26. void Delay17500us(void);        //@11.0592MHz
  27. void Delay2500us(void);                //@11.0592MHz
  28. void QXMBOT_bubble(unsigned int *a,unsigned char n);//冒泡排序
  29. void QXMBOT_ServoFront(void);//舵機(jī)向前
  30. void QXMBOT_ServoLeft(void);//舵機(jī)左轉(zhuǎn)
  31. void QXMBOT_ServoRight(void);//舵機(jī)右轉(zhuǎn)
  32. void  QXMBOT_PTZ_Avoid(unsigned int val);//舵機(jī)云臺(tái)避障
  33. unsigned int QXMBOT_GetDistance(void);//獲取超聲波距離
  34. void QXMBOT_TrigUltrasonic(void);// 觸發(fā)超聲波
  35. unsigned int QXMBOT_RefreshDistance(void);//超聲波測(cè)距

  36. /*主函數(shù)*/     
  37. void main(void)
  38. {
  39.         Timer0_Init();//定時(shí)0初始化
  40.         Timer1_Init();//定時(shí)0初始化
  41.         EA_on;        //開中斷
  42.         QXMBOT_ServoFront();//舵機(jī)向前
  43.         Delay_Ms(1000);
  44.         forward(120,120);//前進(jìn)
  45.         while(1)
  46.         {
  47.                 QXMBOT_PTZ_Avoid(300);//舵機(jī)云臺(tái)避障,LCD1602顯示距離,形參設(shè)置觸發(fā)距離,單位:毫米
  48.         }        
  49. }


  50. /*********************************************
  51. QX_A11智能小車前進(jìn)
  52. 入口參數(shù):LeftSpeed,RightSpeed
  53. 出口參數(shù): 無
  54. 說明:LeftSpeed,RightSpeed分別設(shè)置左右車輪轉(zhuǎn)速
  55. **********************************************/
  56. void forward(unsigned char LeftSpeed,unsigned char RightSpeed)
  57. {
  58.         pwm_left = LeftSpeed,pwm_right =  RightSpeed;//設(shè)置速度
  59.         left_motor_go; //左電機(jī)前進(jìn)
  60.         right_motor_go; //右電機(jī)前進(jìn)
  61. }
  62. /*小車左轉(zhuǎn)*/
  63. /*********************************************
  64. QX_A11智能小車左轉(zhuǎn)
  65. 入口參數(shù):LeftSpeed,RightSpeed
  66. 出口參數(shù): 無
  67. 說明:LeftSpeed,RightSpeed分別設(shè)置左右車輪轉(zhuǎn)速
  68. **********************************************/
  69. void left_run(unsigned char LeftSpeed,unsigned char RightSpeed)
  70. {
  71.         pwm_left = LeftSpeed,pwm_right =  RightSpeed;//設(shè)置速度
  72.         left_motor_back; //左電機(jī)后退
  73.         right_motor_go; //右電機(jī)前進(jìn)        
  74. }

  75. /*********************************************
  76. QX_A11智能小車右轉(zhuǎn)
  77. 入口參數(shù):LeftSpeed,RightSpeed
  78. 出口參數(shù): 無
  79. 說明:LeftSpeed,RightSpeed分別設(shè)置左右車輪轉(zhuǎn)速
  80. **********************************************/
  81. void right_run(unsigned char LeftSpeed,unsigned char RightSpeed)
  82. {
  83.         pwm_left = LeftSpeed,pwm_right =  RightSpeed;//設(shè)置速度
  84.         right_motor_back;//右電機(jī)后退
  85.         left_motor_go;    //左電機(jī)前進(jìn)
  86. }
  87. /*********************************************
  88. QX_A11智能小車后退
  89. 入口參數(shù):LeftSpeed,RightSpeed
  90. 出口參數(shù): 無
  91. 說明:LeftSpeed,RightSpeed分別設(shè)置左右車輪轉(zhuǎn)速
  92. **********************************************/
  93. //void back_run(unsigned char LeftSpeed,unsigned char RightSpeed)
  94. //{
  95. //        pwm_left = LeftSpeed,pwm_right =  RightSpeed;//設(shè)置速度
  96. //        right_motor_back;//右電機(jī)后退
  97. //        left_motor_back; //左電機(jī)后退
  98. //}
  99. /*********************************************
  100. QX_A11智能小車停車
  101. 入口參數(shù):無
  102. 出口參數(shù): 無
  103. 說明:QX_A11智能小車停車
  104. **********************************************/
  105. void stop(void)
  106. {
  107.         left_motor_stops;
  108.         right_motor_stops;
  109. }

  110. /*====================================
  111. 函數(shù):void Delay_Ms(INT16U ms)
  112. 參數(shù):ms,毫秒延時(shí)形參
  113. 描述:12T 51單片機(jī)自適應(yīng)主時(shí)鐘毫秒級(jí)延時(shí)函數(shù)
  114. ====================================*/
  115. void Delay_Ms(unsigned int ms)
  116. {
  117.      unsigned int i;
  118.          do{
  119.               i = MAIN_Fosc / 96000;
  120.                   while(--i);   //96T per loop
  121.      }while(--ms);
  122. }

  123. /*舵機(jī)方波延時(shí)朝向小車正前方*/
  124. void Delay1550us()                //@11.0592MHz
  125. {
  126.         unsigned char i, j;

  127.         i = 3;
  128.         j = 196;
  129.         do
  130.         {
  131.                 while (--j);
  132.         } while (--i);
  133. }

  134. void Delay18450us()                //@11.0592MHz
  135. {
  136.         unsigned char i, j;

  137.         _nop_();
  138.         i = 34;
  139.         j = 16;
  140.         do
  141.         {
  142.                 while (--j);
  143.         } while (--i);
  144. }
  145. /*舵機(jī)方波延時(shí)向小車右方*/
  146. void Delay600us()                //@11.0592MHz
  147. {
  148.         unsigned char i, j;

  149.         _nop_();
  150.         i = 2;
  151.         j = 15;
  152.         do
  153.         {
  154.                 while (--j);
  155.         } while (--i);
  156. }
  157. void Delay19400us()                //@11.0592MHz
  158. {
  159.         unsigned char i, j;

  160.         _nop_();
  161.         i = 35;
  162.         j = 197;
  163.         do
  164.         {
  165.                 while (--j);
  166.         } while (--i);
  167. }
  168. /*舵機(jī)方波延時(shí)朝向小車左方*/
  169. void Delay17500us()                //@11.0592MHz
  170. {
  171.         unsigned char i, j;

  172.         i = 32;
  173.         j = 93;
  174.         do
  175.         {
  176.                 while (--j);
  177.         } while (--i);
  178. }
  179. void Delay2500us()                //@11.0592MHz
  180. {
  181.         unsigned char i, j;

  182.         i = 5;
  183.         j = 120;
  184.         do
  185.         {
  186.                 while (--j);
  187.         } while (--i);
  188. }
  189. /*********************************************
  190. QX_A11智能小車PWM輸出
  191. 入口參數(shù):無
  192. 出口參數(shù): 無
  193. 說明:裝載PWM輸出,如果設(shè)置全局變量pwm_left,pwm_right分別配置左右輸出高電平時(shí)間
  194. **********************************************/
  195. void LoadPWM(void)
  196. {
  197.         if(pwm_left > PWM_HIGH_MAX)                pwm_left = PWM_HIGH_MAX;        //如果左輸出寫入大于最大占空比數(shù)據(jù),則強(qiáng)制為最大占空比。
  198.         if(pwm_left < PWM_HIGH_MIN)                pwm_left = PWM_HIGH_MIN;        //如果左輸出寫入小于最小占空比數(shù)據(jù),則強(qiáng)制為最小占空比。
  199.         if(pwm_right > PWM_HIGH_MAX)        pwm_right = PWM_HIGH_MAX;        //如果右輸出寫入大于最大占空比數(shù)據(jù),則強(qiáng)制為最大占空比。
  200.         if(pwm_right < PWM_HIGH_MIN)        pwm_right = PWM_HIGH_MIN;        //如果右輸出寫入小于最小占空比數(shù)據(jù),則強(qiáng)制為最小占空比。
  201.         if(pwm_val_left<=pwm_left)                Left_moto_pwm = 1;  //裝載左PWM輸出高電平時(shí)間
  202.         else Left_moto_pwm = 0;                                                     //裝載左PWM輸出低電平時(shí)間
  203.         if(pwm_val_left>=PWM_DUTY)                pwm_val_left = 0;        //如果左對(duì)比值大于等于最大占空比數(shù)據(jù),則為零

  204.         if(pwm_val_right<=pwm_right)        Right_moto_pwm = 1; //裝載右PWM輸出高電平時(shí)間
  205.         else Right_moto_pwm = 0;                                                         //裝載右PWM輸出低電平時(shí)間
  206.         if(pwm_val_right>=PWM_DUTY)                pwm_val_right = 0;        //如果右對(duì)比值大于等于最大占空比數(shù)據(jù),則為零
  207. }
  208. //冒泡排序
  209. void QXMBOT_bubble(unsigned int *a,unsigned char n) /*定義兩個(gè)參數(shù):數(shù)組首地址與數(shù)組大小*/
  210. {
  211.         unsigned int i,j,temp;        
  212.         for(i = 0;i < n-1; i++)        
  213.         {        
  214.                 for(j = i + 1; j < n; j++) /*注意循環(huán)的上下限*/
  215.                 {
  216.                         if(a[i] > a[j])
  217.                         {
  218.                                 temp = a[i];               
  219.                                 a[i] = a[j];               
  220.                                 a[j] = temp;                        
  221.                         }
  222.                 }
  223.         }

  224. }
  225. /*====================================
  226. 函數(shù)名        :QXMBOT_RefreshDistance
  227. 參數(shù)        :無
  228. 返回值        :經(jīng)過冒泡排序后的距離
  229. 描述        :經(jīng)過5次測(cè)距,去除最大值和最小值,取中間3次平均值
  230. 距離單位:毫米
  231. ====================================*/
  232. unsigned int QXMBOT_RefreshDistance()
  233. {
  234.         unsigned char num;
  235.         unsigned int Dist;
  236.         for(num=0; num<5; num++)
  237.         {
  238.                 DistBuf[num] = QXMBOT_GetDistance();
  239.                 Delay_Ms(60);//測(cè)距周期不低于60毫秒        
  240.         }
  241.         QXMBOT_bubble(DistBuf, 5);//
  242.         Dist = (DistBuf[1]+DistBuf[2]+DistBuf[3])/3; //去掉最大和最小取中間平均值
  243.         return(Dist);
  244. }
  245. /*超聲波觸發(fā)*/
  246. void QXMBOT_TrigUltrasonic()
  247. {
  248.         TrigPin = 0; //超聲波模塊Trig        控制端
  249.         _nop_();
  250.         _nop_();
  251.         _nop_();
  252.         _nop_();
  253.         _nop_();
  254.         TrigPin = 1; //超聲波模塊Trig        控制端
  255.         _nop_();_nop_();_nop_();_nop_();_nop_();
  256.         _nop_();_nop_();_nop_();_nop_();_nop_();
  257.         _nop_();_nop_();_nop_();_nop_();_nop_();
  258.         TrigPin = 0; //超聲波模塊Trig        控制端
  259. }
  260. /*====================================
  261. 函數(shù)名        :QXMBOT_GetDistance
  262. 參數(shù)        :無
  263. 返回值        :獲取距離單位毫米
  264. 描述        :超聲波測(cè)距
  265. 通過發(fā)射信號(hào)到收到回響信號(hào)的時(shí)間測(cè)試距離
  266. 單片機(jī)晶振11.0592Mhz
  267. 注意測(cè)距周期為60ms以上
  268. ====================================*/
  269. unsigned int QXMBOT_GetDistance()
  270. {
  271.         unsigned int Distance = 0;        //超聲波距離
  272.         unsigned int  Time=0;                //用于存放定時(shí)器時(shí)間值
  273.         QXMBOT_TrigUltrasonic();        //超聲波觸發(fā)
  274.         while(!EchoPin);          //判斷回響信號(hào)是否為低電平
  275.         Timer1On;                        //啟動(dòng)定時(shí)器1
  276.         while(EchoPin);                //等待收到回響信號(hào)
  277.         Timer1Off;                        //關(guān)閉定時(shí)器1
  278.         Time=TH1*256+TL1;        //讀取時(shí)間
  279.         TH1=0;
  280.         TL1=0;                                //清空定時(shí)器
  281.     Distance = (float)(Time*1.085)*0.17;//算出來是MM
  282.         return(Distance);//返回距離                                
  283. }
  284. /*====================================
  285. 函數(shù)名        :QXMBOT_PTZ_Avoid
  286. 參數(shù)        :val設(shè)置避障觸發(fā)距離
  287. 返回值        :無
  288. 描述        :智能小車舵機(jī)云臺(tái)避障
  289. 距離單位:毫米
  290. ====================================*/
  291. void  QXMBOT_PTZ_Avoid(unsigned int val)
  292. {
  293.         unsigned int Dis;//距離暫存變量
  294.         Dis = QXMBOT_GetDistance();//獲取超聲波測(cè)距距離,單位:毫米
  295.         if((Dis > 30) && (Dis < val))
  296.         {
  297.                 LED1=0,LED2=0,beep=0;//LED1,2點(diǎn)亮,鳴笛        
  298.                 stop();        //停車
  299.                 Delay_Ms(100);
  300.                 LED1=1,LED2=1,beep=1;//LED1,2熄滅,靜音

  301.                 /*舵機(jī)左轉(zhuǎn)測(cè)距*/
  302.                 QXMBOT_ServoLeft();
  303.                 LeftDistance = QXMBOT_RefreshDistance();

  304.                 /*舵機(jī)右轉(zhuǎn)測(cè)距*/
  305.                 QXMBOT_ServoRight();
  306.                 RightDistance = QXMBOT_RefreshDistance();

  307.                 /*舵機(jī)正前方測(cè)距*/
  308.                 QXMBOT_ServoFront();
  309.                 FrontDistance = QXMBOT_RefreshDistance();
  310.                 if((FrontDistance<100) && (LeftDistance<100) && (RightDistance<100))
  311.                 {
  312.                         do{
  313.                                 left_run(160, 160);//原地左轉(zhuǎn)
  314.                                 Delay_Ms(60);
  315.                                 /*舵機(jī)正前方測(cè)距*/
  316.                                 QXMBOT_ServoFront();
  317.                                 Dis = QXMBOT_RefreshDistance();               
  318.                         }while(Dis < 200);
  319.                 }else if((FrontDistance>LeftDistance) && (FrontDistance>RightDistance))
  320.                 {
  321.                         stop();        //停車
  322.                         Delay_Ms(100);
  323.                         forward(120, 120);//前進(jìn)
  324.                 }else if(LeftDistance > RightDistance)
  325.                 {
  326.                         LED1=1,LED2=0;//LED1滅,2點(diǎn)亮
  327.                         stop();        //停車
  328.                         Delay_Ms(100);
  329.                         left_run(160, 160);//原地左轉(zhuǎn)
  330.                         Delay_Ms(60);
  331.                         LED1=1,LED2=1;//LED1滅,2點(diǎn)滅               
  332.                 }else if(RightDistance > LeftDistance)
  333.                 {
  334.                         LED1=0,LED2=1;//LED1亮,2點(diǎn)滅
  335.                         stop();        //停車
  336.                         Delay_Ms(100);
  337.                         right_run(160, 160);//原地右轉(zhuǎn)
  338.                         Delay_Ms(60);
  339.                         LED1=1,LED2=1;//LED1滅,2點(diǎn)滅        
  340.                 }               
  341.         }
  342.         else
  343.         {
  344.                 forward(120, 120);//前進(jìn)
  345.                 Delay_Ms(60);        
  346.         }                        
  347. }
  348. /*=================================================
  349. *函數(shù)名稱:QXMBOT_ServoFront
  350. *函數(shù)功能:云臺(tái)向前轉(zhuǎn)動(dòng)
  351. *調(diào)用:
  352. *輸入:
  353. =================================================*/
  354. void QXMBOT_ServoFront()
  355. {
  356.         char i;
  357.         EA_off;        //關(guān)閉中斷否則會(huì)影響舵機(jī)轉(zhuǎn)向
  358.         for(i=0;i<10;i++)
  359.         {        
  360.                 ServoPin = 1;
  361.                 Delay1550us();
  362.                 ServoPin = 0;
  363.                 Delay18450us();
  364.         }
  365.         EA_on;        //開中斷
  366.         Delay_Ms(100);
  367. }
  368. /*=================================================
  369. *函數(shù)名稱:QXMBOT_ServoLeft
  370. *函數(shù)功能:云臺(tái)向左轉(zhuǎn)動(dòng)
  371. *調(diào)用:
  372. *輸入:
  373. =================================================*/
  374. void QXMBOT_ServoLeft()
  375. {
  376.         char i;
  377.         EA_off;        //關(guān)閉中斷否則會(huì)影響舵機(jī)轉(zhuǎn)向
  378.         for(i=0;i<10;i++)
  379.         {        
  380.                 ServoPin = 1;
  381.                 Delay2500us();
  382.                 ServoPin = 0;
  383.                 Delay17500us();
  384.         }
  385.         EA_on;        //開中斷
  386.         Delay_Ms(100);
  387. }
  388. /*=================================================
  389. *函數(shù)名稱:QXMBOT_ServoFront
  390. *函數(shù)功能:云臺(tái)向右轉(zhuǎn)動(dòng)
  391. *調(diào)用:
  392. *輸入:
  393. =================================================*/
  394. void QXMBOT_ServoRight()
  395. {
  396.         char i;
  397.         EA_off;        //關(guān)閉中斷否則會(huì)影響舵機(jī)轉(zhuǎn)向
  398.         for(i=0;i<10;i++)
  399.         {        
  400.                 ServoPin = 1;
  401.                 Delay600us();
  402.                 ServoPin = 0;
  403.                 Delay19400us();
  404.         }
  405.         EA_on;        //開中斷
  406.         Delay_Ms(100);
  407. }
  408. /********************* Timer0初始化************************/
  409. void Timer0_Init(void)
  410. {
  411.         TMOD |= 0x02;//定時(shí)器0,8位自動(dòng)重裝模塊
  412.         TH0 = 164;
  413.         TL0 = 164;//11.0592M晶振,12T溢出時(shí)間約等于100微秒
  414.         TR0 = 1;//啟動(dòng)定時(shí)器0
  415.         ET0 = 1;//允許定時(shí)器0中斷        
  416. }
  417. /*定時(shí)器1初始化*/
  418. void Timer1_Init(void)               
  419. {
  420.         TMOD |= 0x10;        //定時(shí)器1工作模式1,16位定時(shí)模式。T1用測(cè)ECH0脈沖長(zhǎng)度
  421.         TH1 = 0;                  
  422.     TL1 = 0;
  423.         ET1 = 1;             //允許T1中斷
  424. }

  425. /********************* Timer0中斷函數(shù)************************/
  426. void timer0_int (void) interrupt 1
  427. {
  428.          pwm_val_left++;
  429.          pwm_val_right++;
  430.          LoadPWM();//裝載PWM輸出
  431. }
  432. /* Timer0 interrupt routine */
  433. void tm1_isr() interrupt 3 using 1
  434. {
  435.         Timer1Overflow = 1;        //計(jì)數(shù)器1溢出標(biāo)志位
  436.         EchoPin = 0;                //超聲波接收端        
  437. }        
復(fù)制代碼


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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品久久久久久久久久吃药 | 黄色一级大片在线免费看产 | 国产97色| 欧美国产一区二区 | 天堂网中文 | av天天干| 午夜精品久久久 | 在线观看成人免费视频 | 中文二区 | 国产乱码久久久久久 | 羞羞视频免费在线观看 | 日韩视频中文字幕 | 一区二区久久精品 | 天天综合日日夜夜 | 日韩高清在线 | 国产精品美女久久久久久久网站 | 日本免费网 | 精品国产一区二区三区免费 | 中文字幕在线一区二区三区 | 国产精品爱久久久久久久 | 日韩精品视频中文字幕 | 亚洲中午字幕 | 91久久久久久久久久久久久 | 亚洲情综合五月天 | 国产在线播放av | 国产精品久久久久aaaa九色 | 欧美日韩在线一区二区 | 久久久精 | 国产精品一区二区日韩 | 国产精品精品久久久久久 | 欧美网站一区二区 | 日韩av一二三区 | 国产又色又爽又黄又免费 | 亚洲精品在线看 | 国产精品不卡一区 | 久久久久久亚洲精品 | 欧美一卡二卡在线观看 | 中文字幕精品一区 | www.youjizz.com日韩 | 免费观看一级毛片视频 | 欧美日韩国产一区二区三区 |