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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2215|回復(fù): 1
收起左側(cè)

關(guān)于單片機(jī)超聲波避障的代碼

[復(fù)制鏈接]
ID:500854 發(fā)表于 2019-4-6 22:55 | 顯示全部樓層 |閱讀模式
關(guān)于一些簡單的超聲波避障代碼

單片機(jī)源程序如下:
  1. #include<reg52.h>

  2. //定義選擇開關(guān)
  3. sbit selet1 = P3^5;
  4. sbit selet2 = P3^4;
  5. //sbit selet3 = P3^3;

  6. //定義L298N端口
  7. sbit in1 = P0^0;
  8. sbit in2 = P0^1;
  9. sbit in3 = P0^2;
  10. sbit in4 = P0^3;
  11. sbit enA = P0^4;
  12. sbit enB = P0^5;

  13. //定義微動開關(guān)端口
  14. sbit key1 = P1^0;
  15. sbit key2 = P1^1;

  16. //定義蜂鳴器
  17. sbit beep = P3^6;

  18. //定義超聲波模塊端口
  19. sbit Trig = P1^2;
  20. sbit Echo = P1^3;
  21. unsigned int distance_cm = 0;          //距離
  22. unsigned int overflow_count = 0;  //溢出計(jì)數(shù)
  23. unsigned int status = 0;                  //超聲波模塊狀態(tài)
  24. unsigned int dis_count = 0;                  //計(jì)數(shù)

  25. unsigned char tmp, dat, flat;         
  26. unsigned int num, model, c=0;
  27. unsigned int speed = 100;

  28. //static unsigned int car_statues = 5; //小車默認(rèn)狀態(tài)為停止

  29. void delay(unsigned int z);
  30. void delay_us(unsigned int aa);
  31. void forward(unsigned char pwm);
  32. void f(void);
  33. void back(unsigned char pwm);
  34. void b(void);
  35. void left(unsigned char pwm);
  36. void l(void);
  37. void right(unsigned char pwm);
  38. void r(void);
  39. void stop(void);
  40. void laba(unsigned int i);
  41. void chaoshengbo_init(void);
  42. void GetDistance(void);
  43. void lanya_init();   //串口初始化
  44. void send(unsigned char a);        //單字節(jié)發(fā)送函數(shù)
  45. void ctrl(); //接收處理函數(shù)
  46. void get_model(unsigned char value);

  47. void main(void)
  48. {
  49.         unsigned int n = 0;
  50.         //chaoshengbo_init();
  51.         lanya_init();                         //藍(lán)牙模塊初始化
  52.         speed = 40;
  53.         while(1)
  54.         {

  55.                 get_model(SBUF);
  56.                 if(model == 1)
  57.                         forward(speed);
  58.                 if(model == 2)
  59.                         left(speed);
  60.                 if(model == 3)
  61.                         right(speed);
  62.                 if(model == 4)
  63.                         back(speed);
  64.                 if(model == 5)
  65.                         stop();
  66.                 if(model == 6)
  67.                         speed = 40;
  68.                 if(model == 7)
  69.                         speed = 75;
  70.                 if(model == 8)
  71.                         speed = 100;
  72.                 if(RI==1)                     // 是否有數(shù)據(jù)到來
  73.                 {
  74.                         RI = 0;
  75.                         ctrl();
  76.                 }      

  77.                 if(selet1 == 0)                //S1被按下時(shí),前進(jìn),微動開關(guān)模式
  78.                 {
  79.                         delay(5);          //消抖
  80.                         if(selet1 == 0)                //確認(rèn)按鍵被按下
  81.                         {
  82.                                 while(!selet1)        //松開按鍵檢測
  83.                                         ;
  84.                                 n = 1;                        //n賦值為1,微動開關(guān)模式
  85.                         }                                
  86.                 }

  87.                 if(selet2 == 0)                //S2被按下時(shí),后退,超聲波避障模式
  88.                 {
  89.                         delay(5);                  //消抖
  90.                         if(selet2 == 0)           //確認(rèn)按鍵被按下
  91.                         {
  92.                                 while(!selet2)         //按鍵松開檢測
  93.                                         ;
  94.                                 n = 2;                         //n賦值為2,超聲波避障模式
  95.                         }                        
  96.                 }
  97.                    /*
  98.                 if(selet3 == 0)                //S3被按下時(shí),手機(jī)藍(lán)牙控制模式
  99.                 {
  100.                         delay(5);                                //消抖
  101.                         if(selet3 == 0)                        //確認(rèn)按鍵被按下
  102.                         {
  103.                                 while(!selet3)                //按鍵松開檢測
  104.                                         ;
  105.                                 n = 3;                           //n賦值為3,藍(lán)牙控制模式
  106.                                 lanya_init();
  107.                         }                                
  108.                 }
  109.            */
  110.                 if( n == 1)                                 //若n為1,微動開關(guān)模式
  111.                 {
  112.                         f();                         //默認(rèn)前進(jìn)

  113.                         if(key1 == 0)                          //若左邊微動開關(guān)被按下
  114.                         {
  115.                                 delay(5);                                //消抖
  116.                                 if(key1 == 0)                        //確認(rèn)左邊微動開關(guān)被按下
  117.                                 {
  118.                                         //while(!key1);                //按鍵松開檢測
  119.                                         b();                                //先后退
  120.                                         delay(1000);
  121.                                         r();                                //再左轉(zhuǎn)
  122.                                         delay(1000);
  123.                                 }        
  124.                         }
  125.                         if(key2 == 0)                   //若右邊微動開關(guān)被按下
  126.                         {        
  127.                                 delay(5);                        //消抖
  128.                                 if(key2 == 0)                        //確認(rèn)右邊微動開關(guān)被按下
  129.                                 {
  130.                                         //while(!key2);                 //按鍵松開檢測
  131.                                         b();                                 //先后退
  132.                                         delay(1000);
  133.                                         r();                         //在右轉(zhuǎn)
  134.                                         delay(1000);
  135.                                 }        
  136.                         }
  137.                 }

  138.                 else if( n == 2)                        //若n為2,超聲波避障模式
  139.                 {
  140.                         ES = 0;
  141.                         TR1 = 0;
  142.                         chaoshengbo_init();                //超聲波模塊初始化
  143.                         //speed = 100;
  144.                         b();                                        //默認(rèn)后退
  145.                         GetDistance();                        //獲取距離
  146.                         if(distance_cm > 0 && distance_cm <= 15)                //若獲取的距離大于0且小于等于15cm時(shí)
  147.                         {
  148.                                 f();                                                           //先前進(jìn)(與默認(rèn)行駛方式相反)
  149.                                 delay(1000);
  150.                                 r();                                                          //再右轉(zhuǎn)
  151.                                 delay(1000);
  152.                         }
  153.                 }
  154.          /*
  155.                 else if( n == 3)                        //若n為3, 藍(lán)牙控制模式
  156.                 {
  157.                         //TR2 = 0;                                //關(guān)閉超聲波模塊開的定時(shí)器2
  158.                         lanya_init();                         //藍(lán)牙模塊初始化
  159.                         stop();                                        //默認(rèn)停止
  160.                         get_model(SBUF);                //獲取信號
  161.                         speed = 35;

  162.                         if(model == 1)                        //若接收到的信號為1,前進(jìn)
  163.                                 forward(speed);                        //前進(jìn)
  164.                         if(model == 2)                        //若接收到的信號為2,左轉(zhuǎn)
  165.                                 left(speed);                                //左轉(zhuǎn)
  166.                         if(model == 3)                        //若接收到的信號為3,右轉(zhuǎn)
  167.                                 right(speed);                        //右轉(zhuǎn)
  168.                         if(model == 4)                        //若接收到的信號為4,后退
  169.                                 back(speed);                                //后退
  170.                         if(model == 5)                        //若接收到的信號為5,停止
  171.                                 stop();                                //停止
  172.                         if(model == 6)                        //若接收到的信號為6,一檔
  173.                                 speed = 35;                        //speed為35
  174.                         if(model == 7)                        //若接收到的信號為7,二擋
  175.                                 speed = 70;                        //speed為70
  176.                         if(model == 8)                        //若接收到的信號為8,三擋
  177.                                 speed = 100;                //speed為100

  178.                         if(RI==1)               //判斷是否有數(shù)據(jù)到來
  179.             {
  180.                                 RI = 0;
  181.                                 ctrl();
  182.                         }                                 
  183.                 }
  184.                 */
  185.         }
  186. }

  187. //小車右轉(zhuǎn)
  188. void right(unsigned char pwm)
  189. {
  190.         enA = 1;
  191.         in1 = 0;
  192.         in2 = 1;
  193.         in3 = 0;
  194.         in4 = 0;
  195.         delay_us( pwm );
  196.         
  197.         enA = 1;
  198.         in1 = 0;
  199.         in2 = 0;
  200.         in3 = 0;
  201.         in4 = 0;
  202.         delay_us( 100 - pwm );
  203. }
  204. void r(void)
  205. {
  206.         enA = 1;
  207.         in1 = 0;
  208.         in2 = 1;
  209.         in3 = 0;
  210.         in4 = 0;
  211. }

  212. //小車左轉(zhuǎn)
  213. void left(unsigned char pwm)
  214. {
  215.         enA = 1;
  216.         in1 = 0;
  217.         in2 = 0;
  218.         in3 = 1;
  219.         in4 = 0;
  220.         delay_us( pwm );
  221.         
  222.         enA = 1;
  223.         in1 = 0;
  224.         in2 = 0;
  225.         in3 = 0;
  226.         in4 = 0;
  227.         delay_us( 100 - pwm );
  228. }
  229. void l(void)
  230. {
  231.         enA = 1;
  232.         in1 = 0;
  233.         in2 = 0;
  234.         in3 = 1;
  235.         in4 = 0;
  236. }

  237. //小車后退
  238. void back(unsigned char pwm)
  239. {
  240.         enA = 1;
  241.         enB = 1;
  242.         in1 = 1;
  243.         in2 = 0;
  244.         in3 = 1;
  245.         in4 = 0;
  246.         delay_us( pwm );
  247.         
  248.         enA = 1;
  249.         in1 = 0;
  250.         in2 = 0;
  251.         in3 = 0;
  252.         in4 = 0;
  253.         delay_us( 100 - pwm );
  254. }
  255. void b(void)
  256. {
  257.         enA = 1;
  258.         enB = 1;
  259.         in1 = 1;
  260.         in2 = 0;
  261.         in3 = 1;
  262.         in4 = 0;
  263. }

  264. //小車前進(jìn)
  265. void forward(unsigned char pwm)
  266. {
  267.         enA = 1;
  268.         enB = 1;
  269.         in1 = 0;
  270.         in2 = 1;
  271.         in3 = 0;
  272.         in4 = 1;
  273.         delay_us( pwm );
  274.         
  275.         enA = 1;
  276.         in1 = 0;
  277.         in2 = 0;
  278.         in3 = 0;
  279.         in4 = 0;
  280.         delay_us( 100 - pwm );
  281. }
  282. void f(void)
  283. {
  284.         enA = 1;
  285.         enB = 1;
  286.         in1 = 0;
  287.         in2 = 1;
  288.         in3 = 0;
  289.         in4 = 1;
  290. }

  291. //小車停止
  292. void stop(void)
  293. {
  294.         enB = 1;
  295.         in1 = 0;
  296.         in2 = 0;
  297.         in3 = 0;
  298.         in4 = 0;
  299. }

  300. /*
  301. //喇叭
  302. void laba(unsigned int i)
  303. {
  304.         unsigned char j;

  305.         if( i == 1 )
  306.                 forward();
  307.         else if( i == 2 )
  308.                 left();
  309.         else if( i == 3 )
  310.                 right();
  311.         else if( i == 4 )
  312.                 back();
  313.         else if( i == 5 )
  314.                 stop();

  315.         for(j=200; j>0; j--)
  316.         {
  317.                 beep = ~beep;
  318.                 delay_us(500);
  319.         }
  320.         delay(500);
  321.         for(j=200; j>0; j--)
  322.         {
  323.                 beep = ~beep;
  324.                 delay_us(500);
  325.         }
  326. }
  327. */

  328. //超聲波模塊初始化
  329. void chaoshengbo_init(void)
  330. {
  331.         Trig = 0;
  332.         //TH2 = RCAP2H = 0;
  333.         //TL2 = RCAP2L = 0;
  334.         TH0 = TL0 = 0;
  335.         TR0 = 0;        //關(guān)閉定時(shí)器0
  336.         ET0 = 1;        //允許T0中斷
  337. }

  338. //超聲波模塊獲取距離
  339. void GetDistance(void)
  340. {
  341.         Trig = 1;        //發(fā)送觸發(fā)信號
  342.         status = 1;          //狀態(tài)1為發(fā)射超聲波
  343.         TH0 = 0;         
  344.         TL0 = 0;
  345.         TR0 = 1;        //打開定時(shí)器0
  346.         while(TL0 < 42)                //產(chǎn)生超過10us的脈沖
  347.                 ;
  348.         status = 2;          //狀態(tài)2為發(fā)射完超聲波后
  349.         Trig = 0;
  350.         TR0 = 0;
  351.         TH0 = 0;
  352.         TL0 = 0;
  353.         overflow_count = 0;
  354.         TR0 = 1;                  //打開定時(shí)器0
  355.         while(Echo == 0)   //當(dāng)無信號返回時(shí)
  356.         {
  357.                 if(status == 5)                //狀態(tài)5表示超時(shí)
  358.                 {
  359.                         status = 0;
  360.                         distance_cm = 0;
  361.                         break ;        //失敗
  362.                 }
  363.         }
  364.         TR0 = 0;        //清空計(jì)數(shù)
  365.         TH0 = 0;
  366.         TL0 = 0;
  367.         overflow_count = 0;
  368.         TR0 = 1;
  369.         while(Echo == 1)        //有信號返回時(shí),開始計(jì)算長度
  370.         {
  371.                 if(status == 5)        //status為5時(shí)失敗
  372.                 {
  373.                         status = 0;
  374.                         distance_cm = 0;
  375.                         TR0 = 0;
  376.                         break ;
  377.                 }
  378.         }
  379.         dis_count = overflow_count * 65536 + TH0 * 256 + TL0;
  380.         TR0 = 0;
  381.         distance_cm = (unsigned int)( (long)(dis_count) * 34 / 10000);
  382.         status = 0 ;        //準(zhǔn)備下次發(fā)送
  383. }

  384. //定時(shí)器2中斷
  385. void Timer0Int() interrupt 1
  386. {
  387.         TF0 = 0;
  388.         overflow_count++;
  389.         TH0 = 0;
  390.         TL0 = 0;
  391.         if(overflow_count == 2)
  392.         {
  393.                 status = 5;                //超時(shí)
  394.         }
  395. }

  396. //藍(lán)牙模塊
  397. void get_model(unsigned char value)
  398. {                  
  399.         unsigned char shu1,value1;
  400.         value1=value-48;
  401.         //bai=value1/16;
  402.         shu1=value1%16;


  403.    switch(shu1)
  404.    {
  405.            case 1:model = 1;break;        //model賦值為1,前進(jìn)
  406.         case 2:model = 2;break;        //model賦值為2,左轉(zhuǎn)
  407.         case 3:model = 3;break;        //model賦值為3,右轉(zhuǎn)
  408.         case 4:model = 4;break;        //model賦值為4,后退
  409.         case 5:model = 5;break;        //model賦值為5,停止
  410.         case 6:model = 6;break; //model賦值為6,一檔
  411.         case 7:model = 7;break; //model賦值為7,二擋
  412.         case 8:model = 8;break; //model賦值為8;三擋
  413.         //case 9:model = 6;break;        //model賦值為6,喇叭
  414.    }

  415. }        

  416. void lanya_init()        //串口初始化
  417. {
  418.         TR1 = 0;
  419.         ES=0;                                                                  //關(guān)中斷
  420.         SCON = 0x50;                        // 即10010000,REN為1,串口工作模式為2
  421.                                                                                 //

  422.         TMOD = 0x20;                        // 定時(shí)器1工作于方式2,8位自動重載模式, 用于產(chǎn)生波特率
  423.         TH1=TL1=0xFD;                       // 初始值設(shè)為FD,產(chǎn)生9600波特率
  424.          
  425.         PCON &= 0x7f;                       // 即SMOD1為0,波特率不倍增
  426.         TR1 = 1;                                                          //定時(shí)器1開始工作,產(chǎn)生波特率
  427.                                                                                 //發(fā)送標(biāo)志位置0
  428.         TI=0;                                                                  //接收標(biāo)志位置0
  429.         RI=0;
  430.                   
  431.         //EA=0;
  432.         ES=1;
  433. }

  434. void send(unsigned char a)        //單字節(jié)數(shù)據(jù)發(fā)送
  435. {                                                        
  436.         TI=0;        
  437.         SBUF=a;
  438.         while(TI==0);
  439.         TI=0;

  440. }

  441. void ctrl()                            //接收處理函數(shù)
  442. {
  443.         //static unsigned int car_statues = 5; //小車默認(rèn)狀態(tài)為停止
  444.         switch(tmp)
  445.         {
  446.                 case '1':send(tmp);break;        //前進(jìn)                                       
  447.                 case '2':send(tmp);break;        //左轉(zhuǎn)
  448.                 case '3':send(tmp);break;        //右轉(zhuǎn)
  449.                 case '4':send(tmp);break;        //后退
  450.                 case '5':send(tmp);break;        //停止
  451.                 case '6':send(tmp);break;        //一檔
  452.                 case '7':send(tmp);break;        //二擋
  453.                 case '8':send(tmp);break;        //三擋
  454.                 //case '9':send(tmp);break;        //喇叭
  455.                 default:send(tmp);
  456.         }
  457. }

  458. void delay(unsigned int z)
  459. {
  460.         unsigned int x, y;
  461.         for(x = z; x > 0 ; x--)
  462.                 for(y=110;y>0;y--)
  463.                         ;
  464. }

  465. void delay_us(unsigned int aa)
  466. {
  467.         while(aa--);
  468. }
復(fù)制代碼

所有資料51hei提供下載:
源碼.7z (4.11 KB, 下載次數(shù): 9)
回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2019-4-9 02:08 | 顯示全部樓層
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人免费在线网 | 免费一区二区 | 亚洲国产中文字幕 | 欧美精品在线一区二区三区 | 男女免费在线观看视频 | 亚洲视频三| 久久99久久99久久 | 成人免费看片 | 欧美另类视频在线 | 日韩有码一区二区三区 | 成人av色 | www.色综合| 午夜影院在线观看免费 | 九一视频在线播放 | 国产精品久久久久久久白浊 | 最新av在线网址 | 日韩在线免费 | 99久久中文字幕三级久久日本 | 亚洲国产一区二区视频 | 激情av网站 | 亚洲精品在线国产 | 日韩精品在线看 | 欧美视频在线播放 | 青青草视频免费观看 | 看一级毛片视频 | 国产成人免费视频网站高清观看视频 | 国产一级一级毛片 | 黄在线 | 欧美一区视频 | 欧美v日韩v | 97国产爽爽爽久久久 | 亚洲最新网址 | 国产欧美一区二区三区在线看 | 国产线视频精品免费观看视频 | 中文字幕加勒比 | 国产精品久久 | 国产亚洲日本精品 | 国产精品久久久久久久久久免费看 | 91精品国模一区二区三区 | 国产福利在线小视频 | 国产一区二区三区四区 |