找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

智能小車雙舵機(jī)避障4WD小車單片機(jī)程序 舵機(jī)轉(zhuǎn)向智能小車

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
看了好多智能小車,都是兩輪或者4輪麥克輪轉(zhuǎn)向的,一直想模仿阿克曼智能ROS 機(jī)器人,利用舵機(jī)來轉(zhuǎn)向的智能小車。經(jīng)過多天學(xué)習(xí)c++語言和51芯片資料,通過改寫程序,買了舵機(jī)轉(zhuǎn)向前輪配件,用4wd小車改裝的舵機(jī)轉(zhuǎn)向智能小車,實(shí)現(xiàn)A舵機(jī)避障+B舵機(jī)轉(zhuǎn)向功能,經(jīng)過多次場地測試,前進(jìn)速度盡量降低一點(diǎn)能實(shí)現(xiàn)完美避障。比以前4個(gè)tt電機(jī)驅(qū)動轉(zhuǎn)向功耗小很多,玩耍時(shí)間更長。最后附有程序和圖文組裝說明壓縮包。
4輪小車雙舵機(jī)避障零件清單
151主板1個(gè)+51單片機(jī)芯片
2、SG90舵機(jī)1個(gè)+塑料云臺空殼1個(gè)
3、HC-SR04超聲波測距1個(gè)
4、TT電機(jī)2個(gè)
5、L298N驅(qū)動1個(gè)
6、小車前輪舵機(jī)轉(zhuǎn)向組1套
7、小車后輪2個(gè)
8、理電池7.4v一個(gè)。(5號電池不耐用,費(fèi)錢)
9、鋁合金或亞克力板底盤1個(gè)
10、螺絲、導(dǎo)線若干。
實(shí)物圖片如下:

單片機(jī)程序如下:
  1. /*********************************************************************************
  2. * 【版    本】: 1.1
  3. * 【實(shí)驗(yàn)平臺】: QX-A11智能小車  STC89C52
  4. * 【外部晶振】: 11.0592mhz        
  5. * 【主控芯片】: STC89C52
  6. * 【編譯環(huán)境】: Keil μVisio4
  7. *        Copyright(C) QXMBOT
  8. *        All rights reserved
  9. ***********************************************************************************
  10. * 【程序功能】:QX-A11舵機(jī)云臺避障參考程序                                                                                   
  11. * 【注意事項(xiàng)】:避免小車輪子堵轉(zhuǎn)
  12. **********************************************************************************/
  13. #include <reg52.h>//51頭文件
  14. #include <QX_A11.h>//QX_A11智能小車配置文件
  15. #include <intrins.h>
  16. bit Timer1Overflow;        //計(jì)數(shù)器1溢出標(biāo)志位
  17. unsigned char disbuff[4]={0,0,0,0};//用于分別存放距離的值米,厘米,毫米
  18. unsigned int LeftDistance = 0, RightDistance = 0, FrontDistance = 0; //云臺測距距離緩存
  19. unsigned int DistBuf[5] = {0};//distance data buffer
  20. unsigned char        pwm_val_left,pwm_val_right;        //中間變量,用戶請勿修改。
  21. unsigned char         pwm_left,pwm_right;                        //定義PWM輸出高電平的時(shí)間的變量。用戶操作PWM的變量(括號內(nèi)輸入數(shù)值)。
  22. #define                PWM_DUTY                200                        //(用于舵機(jī)時(shí)不可修改)定義PWM的周期,數(shù)值為定時(shí)器0溢出周期,假如定時(shí)器溢出時(shí)間為100us,則PWM周期為20ms。
  23. #define                PWM_HIGH_MIN        70                        //限制PWM輸出的最小占空比。用戶請勿修改。
  24. #define                PWM_HIGH_MAX        PWM_DUTY        //限制PWM輸出的最大占空比。用戶請勿修改。

  25. void Timer0_Init(void); //定時(shí)器0初始化
  26. void Timer1_Init(void);//定時(shí)器1初始化
  27. void LoadPWM(void);//裝入PWM輸出值
  28. void Delay_Ms(unsigned int ms);//毫秒級延時(shí)函數(shù)
  29. void forward(unsigned char LeftSpeed,unsigned char RightSpeed);//QX_A11智能小車前進(jìn)
  30. void left_run(unsigned char LeftSpeed,unsigned char RightSpeed);//QX_A11智能小車左轉(zhuǎn)  
  31. void right_run(unsigned char LeftSpeed,unsigned char RightSpeed);//QX_A11智能小車右轉(zhuǎn)
  32. void back_run(unsigned char LeftSpeed,unsigned char RightSpeed);//QX_A11智能小車后退
  33. void stop(void);//QX_A11智能小車停車
  34. void Delay18450us(void);        //@11.0592MHz
  35. void Delay1550us(void);                //@11.0592MHz
  36. void Delay19400us(void);        //@11.0592MHz
  37. void Delay600us(void);                //@11.0592MHz
  38. void Delay17500us(void);        //@11.0592MHz
  39. void Delay2500us(void);                //@11.0592MHz
  40. void QXMBOT_bubble(unsigned int *a,unsigned char n);//冒泡排序
  41. void QXMBOT_ServoFront(void);//舵機(jī)向前
  42. void QXMBOT_ServoLeft(void);//舵機(jī)左轉(zhuǎn)
  43. void QXMBOT_ServoRight(void);//舵機(jī)右轉(zhuǎn)
  44. void Servo1front(void);//舵機(jī)B向前
  45. void Servo1left(void);//舵機(jī)B左轉(zhuǎn)
  46. void Servo1right(void);//舵機(jī)B右轉(zhuǎn)
  47. void  QXMBOT_PTZ_Avoid(unsigned int val);//舵機(jī)云臺避障
  48. unsigned int QXMBOT_GetDistance(void);//獲取超聲波距離
  49. void QXMBOT_TrigUltrasonic(void);// 觸發(fā)超聲波
  50. unsigned int QXMBOT_RefreshDistance(void);//超聲波測距

  51. /*主函數(shù)*/     
  52. void main(void)
  53. {
  54.         Timer0_Init();//定時(shí)0初始化
  55.         Timer1_Init();//定時(shí)0初始化
  56.         EA_on;        //開中斷
  57.         QXMBOT_ServoFront();//舵機(jī)向前
  58.         Servo1front(); //B舵機(jī)向前
  59.         Delay_Ms(1000);
  60.         forward(20,20);//前進(jìn)5v速度,7.4v情況下forward全部調(diào)成(80,80)可調(diào)速。
  61.         while(1)
  62.         {
  63.                 QXMBOT_PTZ_Avoid(500);//舵機(jī)云臺避障,LCD1602顯示距離,設(shè)置觸發(fā)距離300毫米
  64.         }        
  65. }


  66. /*********************************************
  67. 小車前進(jìn)
  68. 入口參數(shù):LeftSpeed,RightSpeed
  69. 說明:LeftSpeed,RightSpeed分別設(shè)置左右車輪轉(zhuǎn)速
  70. **********************************************/
  71. void forward(unsigned char LeftSpeed,unsigned char RightSpeed)//不能放1號舵機(jī)參數(shù)Servo1front(),動力抖顫.
  72. {
  73.         pwm_left = LeftSpeed,pwm_right =  RightSpeed;//設(shè)置速度
  74.         left_motor_go; //左電機(jī)前進(jìn)
  75.         right_motor_go; //右電機(jī)前進(jìn)
  76. }
  77. /*********************************************
  78. 小車左轉(zhuǎn),入口參數(shù):LeftSpeed,RightSpeed
  79. 說明:LeftSpeed,RightSpeed分別設(shè)置左右車輪轉(zhuǎn)速
  80. **********************************************/
  81. void left_run(unsigned char LeftSpeed,unsigned char RightSpeed)
  82. {
  83.         pwm_left = LeftSpeed,pwm_right =  RightSpeed;//設(shè)置速度
  84.         left_motor_go; //左電機(jī)后退
  85.         right_motor_go; //右電機(jī)前進(jìn)        
  86. }

  87. /*********************************************
  88. 小車右轉(zhuǎn),入口參數(shù):LeftSpeed,RightSpeed
  89. 說明:LeftSpeed,RightSpeed分別設(shè)置左右車輪轉(zhuǎn)速
  90. **********************************************/
  91. void right_run(unsigned char LeftSpeed,unsigned char RightSpeed)
  92. {
  93.         pwm_left = LeftSpeed,pwm_right =  RightSpeed;//設(shè)置速度
  94.         right_motor_go;//右電機(jī)后退
  95.         left_motor_go;    //左電機(jī)前進(jìn)
  96. }
  97. /*********************************************
  98. 小車后退
  99. 入口參數(shù):LeftSpeed,RightSpeed
  100. 說明:LeftSpeed,RightSpeed分別設(shè)置左右車輪轉(zhuǎn)速
  101. **********************************************/
  102. void back_run(unsigned char LeftSpeed,unsigned char RightSpeed)
  103. {
  104. pwm_left = LeftSpeed,pwm_right =  RightSpeed;//設(shè)置速度
  105. right_motor_back;//右電機(jī)后退
  106. left_motor_back; //左電機(jī)后退
  107. }
  108. /*********************************************
  109. 小車停車
  110. 入口參數(shù):無
  111. 說明:小車停車
  112. **********************************************/
  113. void stop(void)
  114. {
  115.         left_motor_stops;
  116.         right_motor_stops;
  117. }

  118. /*====================================
  119. 函數(shù):void Delay_Ms(INT16U ms)
  120. 參數(shù):ms,毫秒延時(shí)形參
  121. 描述:12T 51單片機(jī)自適應(yīng)主時(shí)鐘毫秒級延時(shí)函數(shù)
  122. ====================================*/
  123. void Delay_Ms(unsigned int ms)
  124. {
  125.      unsigned int i;
  126.          do{
  127.               i = MAIN_Fosc / 96000;
  128.                   while(--i);   //96T per loop
  129.      }while(--ms);
  130. }

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

  135.         i = 3;
  136.         j = 196;
  137.         do
  138.         {
  139.                 while (--j);
  140.         } while (--i);
  141. }

  142. void Delay18450us()                //@11.0592MHz
  143. {
  144.         unsigned char i, j;

  145.         _nop_();
  146.         i = 34;
  147.         j = 16;
  148.         do
  149.         {
  150.                 while (--j);
  151.         } while (--i);
  152. }
  153. /*舵機(jī)方波延時(shí)向小車右方*/
  154. void Delay600us()                //@11.0592MHz
  155. {
  156.         unsigned char i, j;

  157.         _nop_();
  158.         i = 2;
  159.         j = 15;
  160.         do
  161.         {
  162.                 while (--j);
  163.         } while (--i);
  164. }
  165. void Delay19400us()                //@11.0592MHz
  166. {
  167.         unsigned char i, j;

  168.         _nop_();
  169.         i = 35;
  170.         j = 197;
  171.         do
  172.         {
  173.                 while (--j);
  174.         } while (--i);
  175. }
  176. /*舵機(jī)方波延時(shí)朝向小車左方*/
  177. void Delay17500us()                //@11.0592MHz
  178. {
  179.         unsigned char i, j;

  180.         i = 32;
  181.         j = 93;
  182.         do
  183.         {
  184.                 while (--j);
  185.         } while (--i);
  186. }
  187. void Delay2500us()                //@11.0592MHz
  188. {
  189.         unsigned char i, j;

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

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

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

  308.                 /*舵機(jī)左轉(zhuǎn)測距*/
  309.                 QXMBOT_ServoLeft();
  310.                 LeftDistance = QXMBOT_RefreshDistance();

  311.                 /*舵機(jī)右轉(zhuǎn)測距*/
  312.                 QXMBOT_ServoRight();
  313.                 RightDistance = QXMBOT_RefreshDistance();

  314.                 /*舵機(jī)正前方測距*/
  315.                 QXMBOT_ServoFront();
  316.                 FrontDistance = QXMBOT_RefreshDistance();
  317.                 if((FrontDistance<150) && (LeftDistance<150) && (RightDistance<150))
  318.                 {
  319.                         do{
  320.                             Servo1right();
  321.                                 Delay_Ms(60);
  322.                                 left_run(20, 100);//原地左轉(zhuǎn),電機(jī)動力值(0~200)超出200則為高電平全速運(yùn)行
  323.                                 Delay_Ms(200);//電機(jī)轉(zhuǎn)動時(shí)間
  324.                                 Servo1front();
  325.                                 /*舵機(jī)正前方測距*/
  326.                                 QXMBOT_ServoFront();
  327.                                 Dis = QXMBOT_RefreshDistance();               
  328.                         }while(Dis < 200);//循環(huán)、距離
  329.            }else if(FrontDistance<100)
  330.                 {
  331.                         stop();        //停車
  332.                         back_run(60, 60);//后退,電機(jī)動力值
  333.                         Delay_Ms(150);
  334.            }else if((FrontDistance>LeftDistance) && (FrontDistance>RightDistance))
  335.                 {
  336.                         stop();        //停車
  337.                         Delay_Ms(100);
  338.                         forward(20, 20);//前進(jìn),電機(jī)動力值        
  339.                 }else if(LeftDistance > RightDistance)
  340.                 {
  341.                         LED1=1,LED2=0;//LED1滅,2點(diǎn)亮
  342.                         stop();        //停車
  343.                         Servo1right();
  344.                         Delay_Ms(60);
  345.                         left_run(20, 100);//原地左轉(zhuǎn),電機(jī)動力值
  346.                         Delay_Ms(200);//電機(jī)轉(zhuǎn)動時(shí)間
  347.                         Servo1front();
  348.                         LED1=1,LED2=1;//LED1滅,2點(diǎn)滅               
  349.                 }else if(RightDistance > LeftDistance)
  350.                 {
  351.                         LED1=0,LED2=1;//LED1亮,2點(diǎn)滅
  352.                         stop();        //停車
  353.                            Servo1left();
  354.                         Delay_Ms(60);
  355.                         right_run(100, 20);//原地右轉(zhuǎn),電機(jī)動力值
  356.                         Delay_Ms(200);//電機(jī)轉(zhuǎn)動時(shí)間,
  357.                         LED1=1,LED2=1;//LED1滅,2滅        
  358.                         Delay_Ms(60);
  359.                         Servo1front();
  360.                 }               
  361.         }
  362.         else
  363.         {
  364.                 forward(20, 20);//前進(jìn)(不能放1號舵機(jī)參數(shù)Servo1front()動力抖顫)
  365.                 Delay_Ms(60);        
  366.         }                        
  367. }
  368. /*=================================================
  369. *函數(shù)名稱:QXMBOT_ServoFront
  370. *函數(shù)功能:云臺向前轉(zhuǎn)動
  371. *調(diào)用:
  372. *輸入:
  373. =================================================*/
  374. void QXMBOT_ServoFront()
  375. {
  376.         char i;
  377.         EA_off;        //關(guān)閉中斷否則會影響舵機(jī)轉(zhuǎn)向
  378.         for(i=0;i<10;i++)
  379.         {        
  380.                 ServoPin = 1;
  381.                 Delay1550us();
  382.                 ServoPin = 0;
  383.                 Delay18450us();
  384.         }
  385.         EA_on;        //開中斷
  386.         Delay_Ms(100);
  387. }
  388. /*=================================================
  389. *函數(shù)名稱:QXMBOT_ServoLeft
  390. *函數(shù)功能:云臺向左轉(zhuǎn)動
  391. =================================================*/
  392. void QXMBOT_ServoLeft()
  393. {
  394.         char i;
  395.         EA_off;        //關(guān)閉中斷否則會影響舵機(jī)轉(zhuǎn)向
  396.         for(i=0;i<10;i++)
  397.         {        
  398.                 ServoPin = 1;
  399.                 Delay2500us();
  400.                 ServoPin = 0;
  401.                 Delay17500us();
  402.         }
  403.         EA_on;        //開中斷
  404.         Delay_Ms(100);
  405. }
  406. /*=================================================
  407. *函數(shù)名稱:QXMBOT_ServoFront
  408. *函數(shù)功能:云臺向右轉(zhuǎn)動
  409. =================================================*/
  410. void QXMBOT_ServoRight()
  411. {
  412.         char i;
  413.         EA_off;        //關(guān)閉中斷否則會影響舵機(jī)轉(zhuǎn)向
  414.         for(i=0;i<10;i++)
  415.         {        
  416.                 ServoPin = 1;
  417.                 Delay600us();
  418.                 ServoPin = 0;
  419.                 Delay19400us();
  420.         }
  421.         EA_on;        //開中斷
  422.         Delay_Ms(100);
  423. }
  424. /*=================================================
  425. *函數(shù)名稱:QXMBOT_ServoFront
  426. *函數(shù)功能:云臺B轉(zhuǎn)動前(90°)
  427. =================================================*/
  428. void Servo1front()//舵機(jī)B向前
  429. {
  430.         char i;
  431.         EA_off;        //關(guān)閉中斷否則會影響舵機(jī)轉(zhuǎn)向
  432.         for(i=0;i<10;i++)
  433.         {        
  434.                 Servo1Pin = 1;
  435.                 Delay1550us();
  436.                 Servo1Pin = 0;
  437.                 Delay18450us();
  438.         }
  439.         EA_on;        //開中斷
  440.         Delay_Ms(60);
  441. }
  442. /*=================================================
  443. *函數(shù)名稱:QXMBOT_ServoFront
  444. *函數(shù)功能:云臺B向左轉(zhuǎn)動
  445. =================================================*/
  446. void Servo1left()//舵機(jī)B左轉(zhuǎn)45度
  447. {
  448.         char i;
  449.         EA_off;        //關(guān)閉中斷否則會影響舵機(jī)轉(zhuǎn)向
  450.         for(i=0;i<10;i++)
  451.         {        
  452.                 Servo1Pin = 1;
  453.                 Delay_Ms(2);
  454.                 Servo1Pin = 0;
  455.                 Delay_Ms(18);
  456.         }
  457.         EA_on;        //開中斷
  458.         Delay_Ms(60);
  459. }
  460. /*=================================================
  461. *函數(shù)名稱:QXMBOT_ServoFront
  462. *函數(shù)功能:云臺B向右轉(zhuǎn)動
  463. =================================================*/
  464. void Servo1right()//舵機(jī)B右轉(zhuǎn)45度
  465. {
  466.         char i;
  467.         EA_off;        //關(guān)閉中斷否則會影響舵機(jī)轉(zhuǎn)向
  468.         for(i=0;i<10;i++)
  469.         {        
  470.                 Servo1Pin = 1;
  471.                 Delay_Ms(1);
  472.                 Servo1Pin = 0;
  473.                 Delay_Ms(19);
  474.         }
  475.         EA_on;        //開中斷
  476.         Delay_Ms(60);
  477. }
  478. /********************* Timer0初始化************************/
  479. void Timer0_Init(void)
  480. {
  481.         TMOD |= 0x02;//定時(shí)器0,8位自動重裝模塊
  482.         TH0 = 164;
  483.         TL0 = 164;//11.0592M晶振,12T溢出時(shí)間約等于100微秒
  484.         TR0 = 1;//啟動定時(shí)器0
  485.         ET0 = 1;//允許定時(shí)器0中斷        
  486. }
  487. /*定時(shí)器1初始化*/
  488. void Timer1_Init(void)               
  489. {
  490.         TMOD |= 0x10;        //定時(shí)器1工作模式1,16位定時(shí)模式。T1用測ECH0脈沖長度
  491.         TH1 = 0;                  
  492.     TL1 = 0;
  493.         ET1 = 1;             //允許T1中斷
  494. }

  495. /********************* Timer0中斷函數(shù)************************/
  496. void timer0_int (void) interrupt 1
  497. {
  498.          pwm_val_left++;
  499.          pwm_val_right++;
  500.          LoadPWM();//裝載PWM輸出
  501. }
  502. /* Timer0 interrupt routine */
  503. void tm1_isr() interrupt 3 using 1
  504. {
  505.         Timer1Overflow = 1;        //計(jì)數(shù)器1溢出標(biāo)志位
  506.         EchoPin = 0;                //超聲波接收端        
  507. }        
復(fù)制代碼

圖文附件請下載: 4輪小車雙舵機(jī)避障程序 配件清單.zip (1.28 MB, 下載次數(shù): 22)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表