欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的藍牙避障小車代碼

[復制鏈接]
跳轉到指定樓層
樓主
學習時候自己寫的,兩驅四驅皆可用

單片機源程序如下:
  1. /******************************************************************************
  2. 2021.9.27
  3. 單片機實踐二 孟瑞淞
  4. 超聲波舵機避障程序
  5. ******************************************************************************/
  6. #include <AT89x52.H>
  7. #include <intrins.h>
  8. #define led1 {P0_6=1,P0_6=0;}
  9. #define led2 {P0_7=0,P0_7=1;}
  10.        
  11. #define Right_moto_go     {P1_2=1,P1_3=0;}        //右邊電機向前走
  12. #define Right_moto_back   {P1_2=0,P1_3=1;}        //右邊電機向后走
  13. #define Right_moto_Stop   {P1_2=0,P1_3=0;}        //右邊電機停轉   

  14. #define Left_moto_go      {P1_6=1,P1_7=0;}  //左邊電機向前走
  15. #define Left_moto_back    {P1_6=1,P1_7=0;}         //左邊電機向后轉
  16. #define Left_moto_Stop    {P1_6=0,P1_7=0;}  //左邊電機停轉                     
  17.        
  18. #define Sevro_moto_pwm  P2_2      //接舵機信號端輸入PWM信號調節速度
  19. #define  ECHO  P2_0                                        //超聲波接口定義
  20. #define  TRIG  P2_1                                //超聲波接口定義
  21.        

  22. unsigned char const positon[3]={ 0xfe,0xfd,0xfb};
  23. unsigned char disbuff[4]={ 0,0,0,0,};
  24. unsigned char posit=0;

  25. unsigned char pwm_val_left  = 0;//變量定義
  26. unsigned char push_val_left =14;//舵機歸中,產生約,1.5MS 信號
  27. unsigned long S=0;
  28. unsigned long S1=0;
  29. unsigned long S2=0;
  30. unsigned long S3=0;
  31. unsigned long S4=0;
  32. unsigned int  time=0;                    //時間變量
  33. unsigned int  timer=0;                        //延時基準變量
  34. unsigned char timer1=0;                        //掃描時間變量                                       
  35.    
  36. /************************************************************************/       
  37. //延時函數       
  38. void delay(unsigned int k)
  39. {                               
  40.                    unsigned int x,y;
  41.                    for(x=0;x<k;x++)
  42.                    for(y=0;y<2000;y++);
  43. }
  44. /************************************************************************/       
  45. //前速前進
  46. void run(void)
  47. {
  48.    
  49.             Left_moto_go;    //左電機往前走
  50.             Right_moto_go ;  //右電機往前走
  51. }

  52. //前速后退
  53. void backrun(void)
  54. {
  55.    
  56.                  Left_moto_back ;   //左電機往前走
  57.                  Right_moto_back ;  //右電機往前走
  58. }

  59. //左轉
  60. void  leftrun(void)
  61. {
  62.    
  63.                   Right_moto_go ;  //右電機往前走 ;
  64.                   Left_moto_Stop ;   //左電機停止
  65. }

  66. //右轉
  67. void  rightrun(void)
  68. {
  69.    
  70.                    Left_moto_go ;   //左電機往前走
  71.                    Right_moto_Stop ;  //右電機停止
  72. }
  73. //停
  74. void  stoprun(void)
  75. {
  76.    
  77.                   Left_moto_Stop ;   //左電機往前走
  78.                   Right_moto_Stop ;  //右電機往前走
  79. }

  80. void  StartModule()                       //啟動測距信號
  81. {
  82.           TRIG=1;                                        
  83.           _nop_();
  84.           _nop_();
  85.           _nop_();
  86.           _nop_();
  87.           _nop_();
  88.           _nop_();
  89.           _nop_();
  90.           _nop_();
  91.           _nop_();
  92.           _nop_();
  93.           _nop_();
  94.           _nop_();
  95.           _nop_();
  96.           _nop_();
  97.           _nop_();
  98.           _nop_();
  99.           _nop_();
  100.           _nop_();
  101.           _nop_();
  102.           _nop_();
  103.           _nop_();
  104.           TRIG=0;
  105. }

  106. void Conut(void)                   //計算距離
  107. {
  108.           while(!ECHO);                       //當RX為零時等待
  109.           TR0=1;                               //開啟計數
  110.           while(ECHO);                           //當RX為1計數并等待
  111.           TR0=0;                                   //關閉計數
  112.           time=TH0*256+TL0;                   //讀取脈寬長度
  113.           TH0=0;
  114.           TL0=0;
  115.           S=(time*1.7)/100;        //算出來是CM
  116.           disbuff[0]=S%1000/100;   //更新顯示
  117.           disbuff[1]=S%1000%100/10;
  118.           disbuff[2]=S%1000%10 %10;
  119. }

  120. void  COMM( void )                      
  121. {
  122.                   push_val_left=5;          //舵機向左轉90度
  123.                   timer=0;
  124.                   while(timer<=4000); //延時400MS讓舵機轉到其位置
  125.                   StartModule();          //啟動超聲波測距
  126.           Conut();                           //計算距離
  127.                   S2=S;  
  128.   
  129.                   push_val_left=23;          //舵機向右轉90度
  130.                   timer=0;
  131.                   while(timer<=4000); //延時400MS讓舵機轉到其位置
  132.                   StartModule();          //啟動超聲波測距
  133.           Conut();                          //計算距離
  134.                   S4=S;        
  135.        
  136.                   push_val_left=14;          //舵機歸中
  137.                   timer=0;
  138.                   while(timer<=4000); //延時400MS讓舵機轉到其位置
  139.                   StartModule();          //啟動超聲波測距
  140.           Conut();                          //計算距離
  141.                   S1=S;        

  142.           if((S2<20)||(S4<20)) //只要左右各有距離小于,20CM小車后退
  143.                   {
  144.                   backrun();                   //后退
  145.                   timer=0;
  146.                   while(timer<=4000);
  147.                   }
  148.                   
  149.                   if(S2>S4)       
  150.                            
  151.                      {
  152.                                     rightrun();          //車的左邊比車的右邊距離小        右轉       
  153.                         timer=0;
  154.                         while(timer<=3500);//原4000
  155.                      }                                     
  156.                        else
  157.                      {
  158.                        leftrun();                //車的左邊比車的右邊距離大        左轉
  159.                        timer=0;
  160.                        while(timer<=3500);//原4000
  161.                      }
  162. }

  163. /*定時器產生100US定時信號*/
  164. void pwm_Servomoto(void)
  165. {  

  166.                    if(pwm_val_left<=push_val_left)
  167.                        Sevro_moto_pwm=1;
  168.                        else
  169.                        Sevro_moto_pwm=0;
  170.                        if(pwm_val_left>=200)
  171.                           pwm_val_left=0;
  172. }

  173. /*TIMER1中斷服務子函數產生PWM信號*/
  174. void time1()interrupt 3   using 2
  175. {       
  176.             TH1=(65536-100)/256;          //100US定時
  177.                 TL1=(65536-100)%256;
  178.                 timer++;                                  //定時器100US為準。在這個基礎上延時
  179.                 pwm_val_left++;
  180.                 pwm_Servomoto();
  181. }

  182. void delay1()
  183. {
  184.                 unsigned char i,j,k;
  185.                 for(i=1;i>0;i--)
  186.                    for(j=100;j>0;j--)
  187.                 for(k=250;k>0;k--);
  188. }

  189. void shansuo()
  190. {
  191.                      led1;
  192.                      delay1();
  193.                      led2;
  194.                      delay1();                 
  195. }
  196.          
  197. /*--主函數--*/
  198. void main(void)
  199. {
  200.           stoprun();
  201.               TMOD=0X11;
  202.               TH1=(65536-100)/256;          //100US定時
  203.               TL1=(65536-100)%256;
  204.               TH0=0;
  205.                TL0=0;  
  206.               TR1= 1;
  207.               ET1= 1;
  208.               ET0= 1;
  209.               EA = 1;
  210.               delay(100);
  211.           push_val_left=14;          //舵機歸中
  212.               while(1)                     
  213.               {
  214.                    shansuo();        //閃爍燈函數
  215.                    if(timer>=200)          //100MS檢測啟動檢測一次 原來500
  216.                    {
  217.                       timer=0;
  218.                           StartModule(); //啟動檢測
  219.                   Conut();                  //計算距離
  220.                   if(S<35)                  //距離小于20CM
  221.                           {
  222.                              stoprun();          //小車停止
  223.                              COMM();                                  //方向函數
  224.                           }
  225.                           else
  226.                           if(S>40)                  //距離大于,35CM往前走
  227.                           run();
  228.                    }
  229.                }
  230. }
  231.        
復制代碼

Keil代碼下載:
單片機實踐二.rar (364.02 KB, 下載次數: 17)


評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表