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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2188|回復: 0
收起左側

求大神幫忙看看3路超聲波控制小車程序,始終不動

[復制鏈接]
ID:321034 發表于 2018-5-24 21:34 | 顯示全部樓層 |閱讀模式
我  編寫了一套  3路超聲波控制小車進行測距的程序   ,   程序一直顯示沒有問題,但是小車始終不動   我不知道是哪的狀況   ,求各位大神幫忙看看  小弟感激不盡!!

源程序如下:
  1. # include "reg52.h"
  2. # include "intrins.h"

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit L298N_INA = P1^0;
  6. sbit L298N_INB = P1^1;
  7. sbit L298N_INC = P1^2;
  8. sbit L298N_IND = P1^3;

  9. sbit ENA_pwm = P2^6;
  10. sbit ENB_pwm = P2^7;

  11. sbit Trlg1 = P2^0;
  12. sbit Echo1 = P2^1;

  13. sbit Trlg2 = P3^1;
  14. sbit Echo2 = P3^2;

  15. sbit Trlg3 = P3^3;
  16. sbit Echo3 = P3^4;

  17. bit flag = 0;

  18. unsigned char pwm_val_left =0;    //pwm變量定義
  19. unsigned char push_val_left =0;   // 左電機占空比N/10

  20. unsigned char pwm_val_right =0;
  21. unsigned char push_val_right=0;   // 右電機占空比N/10


  22. unsigned int time=0;

  23. unsigned long S1 = 0;            //距離  
  24. unsigned long S2 = 0;           
  25. unsigned long S3 = 0;


  26. /************************************************************************/
  27.                             /* 運動模塊*/
  28. void Go_forward()
  29. {
  30.     push_val_left=4;
  31.     push_val_right=4;
  32.     L298N_INA = 0;
  33.     L298N_INB = 1;
  34.     L298N_INC = 1;
  35.     L298N_IND = 0;
  36. }

  37. void Go_back()
  38. {
  39.     push_val_left=4;
  40.     push_val_right=4;
  41.     L298N_INA = 1;
  42.     L298N_INB = 0;
  43.     L298N_INC = 0;
  44.     L298N_IND = 1;        
  45. }

  46. void Go_left()
  47. {
  48.     push_val_left=3;
  49.     push_val_right=3;
  50.     L298N_INA = 0;
  51.     L298N_INB = 1;
  52.     L298N_INC = 1;
  53.     L298N_IND = 1;
  54. }

  55. void Go_right()
  56. {
  57.     push_val_left=3;
  58.     push_val_right=3;
  59.     L298N_INA = 1;
  60.     L298N_INB = 0;
  61.     L298N_INC = 0;
  62.     L298N_IND = 0;
  63. }

  64. void Stop()
  65. {
  66.     L298N_INA = 0;
  67.     L298N_INB = 0;
  68.     L298N_INC = 0;
  69.     L298N_IND = 0;
  70. }

  71. /************************************************************************/
  72.                           /* 延時模塊*/      
  73. void delay(uint c)      //1ms延時函數
  74. {
  75.     uint a, b;
  76.     for(a=c;a>0;a--)
  77.     {
  78.        for(b=110;b>0;b--);
  79.     }
  80. }
  81. void Delay10us_CSB1(unsigned char i)   //10us延時函數 啟動超聲波模塊時使用
  82. {
  83.    unsigned char j;
  84.         do{
  85.                 j = 10;
  86.                 do{
  87.                         _nop_();
  88.                                 _nop_();
  89.                 }while(--j);
  90.         }while(--i);
  91. }        
  92. void Delay10us_CSB2(unsigned char i)        
  93. {
  94.    unsigned char j;
  95.         do{
  96.                 j = 10;
  97.                 do{
  98.                         _nop_();
  99.                                 _nop_();
  100.                 }while(--j);
  101.         }while(--i);
  102. }
  103. void Delay10us_CSB3(unsigned char i)      
  104. {
  105.    unsigned char j;
  106.         do{
  107.                 j = 10;
  108.                 do{
  109.                         _nop_();
  110.                                 _nop_();
  111.                 }while(--j);
  112.         }while(--i);
  113. }
  114. /************************************************************************/
  115.                      /* PWM調制電機轉速 */
  116. void pwm_out_left_moto(void)
  117. {  
  118.                 if(pwm_val_left<=push_val_left)
  119.                         ENA_pwm=1;
  120.                 else
  121.                         ENA_pwm=0;
  122.                 if(pwm_val_left==10)            //  0~10  ,  0最小,10最大
  123.                         pwm_val_left=0;
  124. }

  125. void pwm_out_right_moto(void)
  126. {
  127.                 if(pwm_val_right<=push_val_right)                          
  128.                         ENB_pwm=1;
  129.                 else
  130.                         ENB_pwm=0;
  131.                 if(pwm_val_right==10)           //  0~10  ,  0最小,10最大
  132.                         pwm_val_right=0;
  133. }
  134.                             /*中斷函數產生PWM信號*/
  135. void timer1()interrupt 3            
  136. {        
  137.      TH1=(65536-10)/256;          //10US定時
  138.      TL1=(65536-10)%256;
  139.    
  140.      pwm_val_left++;
  141.      pwm_val_right++;

  142.      pwm_out_left_moto();
  143.      pwm_out_right_moto();                                  //定時器100US為準。在這個基礎上延時
  144. }  

  145.                                 /* 計時器溢出模塊*/            
  146. void timer0() interrupt 1        
  147. {
  148.         flag=1;                                                
  149. }

  150. /************************************************************************/
  151.         /*計算超聲波所測距離并顯示   */
  152. void Conut1(void)                   //計算距離
  153.         {  
  154.               while(!Echo1);        //當(ECHO信號回響)為零時等待
  155.             TR0=1;               //開啟計數
  156.             while(Echo1);        
  157.             TR0=0;               //關閉計數  
  158.                                          
  159.             time=TH0*256+TL0;                   //讀取脈寬長度
  160.             TH0=0;
  161.             TL0=0;
  162.             S1=(float)(time*1.085)*0.17;
  163.                 if((S1>=7000)||(flag == 1))
  164.                 {
  165.                      flag = 0;
  166.                 }
  167.         }
  168. void Conut2(void)                   //計算距離
  169.         {   
  170.               while(!Echo2);        //當(ECHO信號回響)為零時等待
  171.             TR0=1;               //開啟計數
  172.             while(Echo2);        
  173.             TR0=0;               //關閉計數
  174.                                           
  175.             time=TH0*256+TL0;               
  176.             TH0=0;
  177.             TL0=0;
  178.             S2=(float)(time*1.085)*0.17;        
  179.                 if((S2>=7000)||(flag == 1))
  180.                 {
  181.                      flag = 0;
  182.                 }
  183.         }
  184. void Conut3(void)                   //計算距離
  185.         {
  186.                 while(!Echo3);        //當(ECHO信號回響)為零時等待
  187.             TR0=1;               //開啟計數
  188.             while(Echo3);        
  189.             TR0=0;               //關閉計數

  190.             time=TH0*256+TL0;               
  191.             TH0=0;
  192.             TL0=0;
  193.             S3=(float)(time*1.085)*0.17;
  194.                 if((S3>=7000)||(flag == 1))                                                                                         
  195.                 {
  196.                     flag = 0;
  197.                 }
  198.         }

  199. void  bizhang (void)                       
  200. {                        
  201.            Trlg1=1;
  202.            Delay10us_CSB1(5);
  203.            Trlg1=0;          //啟動超聲波測距
  204.            Conut1();                           //計算距離
  205.                  
  206.            Trlg2=1;
  207.            Delay10us_CSB2(5);
  208.            Trlg2=0;         
  209.            Conut2();                       
  210.                           
  211.            Trlg3=1;
  212.            Delay10us_CSB3(5);
  213.            Trlg3=0;         
  214.            Conut3();                                                  
  215.     if(S1<50 && S2<50 && S3<50)
  216.     {
  217.        Go_back();
  218.          delay(50);
  219.          Stop();
  220.          if(S2<50 && S3>50)
  221.           {
  222.              Go_right();
  223.           }
  224.      
  225.        if(S2>50 && S3<50)
  226.        {
  227.            Go_left();
  228.        }
  229.     }
  230.     else if(S1>50 && S2<50 && S3<50)
  231.     {
  232.          Stop();
  233.          delay(50);
  234.          if(S2<50 && S3>50)
  235.           {
  236.              Go_right();
  237.           }
  238.      
  239.        if(S2>50 && S3<50)
  240.        {
  241.            Go_left();
  242.        }
  243.    
  244.     }      
  245.     else if(S1>50&& S2>50 && S3>50)
  246.     {
  247.         Go_forward();
  248.     }                                                                                                         
  249. }

  250. void main(void)
  251. {
  252.         TMOD |= 0x20;//定時器1工作模式2,8位自動重裝。用于產生PWM
  253.         TMOD |= 0x01;//定時器0工作模塊1,16位定時模式。T0用測Echo脈沖長度
  254.         TH1=220;
  255.         TL1=220;
  256.         TH0 = 0;
  257.         TL0 = 0;        
  258.         ET1 = 1;     //允許T1中斷
  259.         ET0 = 1;     //允許T0中斷
  260.         TR1 = 1;     //啟動定時器1
  261.         EA  = 1;     //啟動總中斷         
  262.         while(1)
  263.         {                           
  264.            bizhang();
  265.              delay(65);                                      
  266.           }
  267. }
復制代碼


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人免费视频观看视频 | 国产精品久久久久久久久久久久久 | 在线欧美 | 欧美日韩在线成人 | a级毛片免费高清视频 | 在线成人www免费观看视频 | 武道仙尊动漫在线观看 | 青青草久久 | 黄色欧美 | 中文字幕欧美日韩一区 | 99精品久久 | 做a网站| 欧美一区二区三区四区在线 | 久久成人一区 | 高清一区二区三区 | 中文字幕在线观看 | 成人精品国产一区二区4080 | 黑人中文字幕一区二区三区 | 亚洲狠狠爱 | 毛片视频免费 | 国产精品一区二区三区四区五区 | 国产精品久久在线 | 91精品亚洲 | 国产精品久久久久久妇女6080 | 欧美成人免费在线视频 | 国产精品电影在线观看 | 欧美a视频 | 99看片网 | 在线免费观看日本视频 | 在线观看免费高清av | 精品国产青草久久久久96 | 亚洲福利在线观看 | 国产成人精品综合 | 97碰碰碰 | 亚洲午夜视频在线观看 | 一区二区三区在线 | 欧美群妇大交群中文字幕 | 国产资源视频 | 999久久久 | 在线成人免费av | 精品成人 |