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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

超聲波測距顯示并避障的單片機程序

[復制鏈接]
ID:194367 發表于 2017-11-30 22:17 | 顯示全部樓層 |閱讀模式
超聲波測距顯示和避障

單片機源程序如下:
  1. #include <reg52.h>
  2. #define        uchar unsigned char
  3. #define uint unsigned int
  4. sbit K1=P1^0;          //P1.0到P1.4為尋線檢測端
  5. sbit K2=P1^1;
  6. sbit K3=P1^2;
  7. sbit K4=P1^3;
  8. sbit K5=P1^4;
  9. sbit KIN1=P1^5;           //P1.5 P1.6是避障檢測端
  10. sbit KIN2=P1^6;
  11. sbit out1 = P2^0  ;           //P2.0到P2.3是電機驅動輸出控制端
  12. sbit out2 = P2^1  ;
  13. sbit out3 = P2^2  ;
  14. sbit out4 = P2^3  ;
  15. sbit Trig  = P3^3; //產生脈沖引腳
  16. sbit Echo  = P3^2; //回波引腳
  17. sbit beem=  P3^7;                   //蜂鳴器控制引腳
  18. sbit PWM=P1^7; //舵機pwm//


  19. sbit SET1=P2^4        ;
  20. sbit SET2 =P2^5;
  21. sbit SET3 =P2^6;
  22. sbit SET4 =P2^7;
  23. uchar code seg7code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  24. uint distance[4];  //測距接收緩沖區
  25. uint distance1;
  26. uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,PDATA;  //自定義寄存器
  27. bit succeed_flag;  //測量成功標志

  28. unsigned long xdata rec_code;
  29. unsigned long xdata time_us;
  30. unsigned char xdata rec_cnt;
  31. unsigned char xdata kbuf;
  32. uchar sdata,flag;          //sdata是紅外遙控接收鍵值變量  flag是啟動小車 或停止小車變量
  33. uint j,a;
  34. uchar pro;
  35. bit rec_b;
  36. bit key_save;
  37. bit keyp;
  38. void chaoshengbo();
  39. void conversion(uint temp_data);
  40. void delay_20us();
  41. void delay_ms(uint x);
  42. void display ();

  43. void Init()                         //初始化
  44. {

  45.     flag=0;
  46.     Trig=0;
  47.        
  48.         TMOD = 0x11;        //T/C1采用16位定時器/計數器
  49.         ET1  = 1;                //定時器1開中斷
  50.     ET0  = 1;
  51.         TH0 = 0x00;
  52.     TL0 = 0x00;
  53.         TH1 = 0xff;
  54.     TL1 = 0xce;
  55.         TR1=0;
  56.     TR0        = 0;
  57.                         //定時計數器啟動計數
  58.         EX0         = 1;                //外部中斷0關中斷
  59.         PX0 = 1;
  60.         PT1 = 1;
  61.         EA         = 1;                //CPU開中斷
  62. }

  63. //--------------------------------------------------
  64. //-------超聲波測距----------------------------
  65. void chaoshengbo()
  66. {           
  67.     uint distance_data;

  68.                  display ();
  69.                  EA=0;
  70.              Trig=1;
  71.          delay_20us();
  72.          Trig=0;         //產生一個20us的脈沖,在Trig引腳  
  73.          while(Echo==0); //等待Echo回波引腳變高電平
  74.              succeed_flag=0; //清測量成功標志
  75.                  TH0=0;          //定時器1清零
  76.          TL0=0;          //定時器1清零
  77.                  EX0=1;          //打開外部中斷
  78.          TR0=1;          //啟動定時器1
  79.                  EA=1;
  80.                  display ();
  81.                  display ();
  82.                  display ();
  83.                  display ();
  84.                  display ();

  85.                  EX0=0;          //打開外部中斷
  86.          TR0=0;
  87.                  if(succeed_flag==1)
  88.              {        
  89.                    distance_data=outcomeH;                //測量結果的高8位
  90.            distance_data<<=8;                   //放入16位的高8位
  91.                      distance_data=distance_data|outcomeL;//與低8位合并成為16位結果數據                     
  92.            distance_data=(distance_data/25)*43/100+1;                 
  93.          }
  94.                          a=distance_data;          //超聲波測距 距離  
  95.                         distance1=a;
  96.                     display ();
  97.                         display ();         display ();
  98. }

  99. void delay_us(uint x)           //演示程序
  100. {
  101. do {
  102.      x--;
  103.    }

  104. while(x>1);
  105. }
  106. void delay_ms(uint x)
  107. {
  108. while(x!=0)
  109. {
  110. delay_us(500);
  111. x--;
  112. }
  113. }

  114. void baidong()        //舵機轉動
  115. {
  116. TR1=1;
  117. pro=30;        //90°
  118. delay_ms(100);

  119.   pro=10;  //小于10°
  120. delay_ms(100);

  121. pro=50;   //大于160°
  122. delay_ms(100);

  123. pro=25;   //90°
  124. delay_ms(100);
  125. TR1=0;
  126. }


  127. void timer0() interrupt 3//定時0.1ms
  128. {
  129. EX0=0;
  130. TH1=0xff;
  131. TL1=0xce;
  132. j++;
  133. if(j<=pro)
  134. {
  135. PWM=1;
  136. }
  137. else
  138. {
  139. PWM=0;
  140. }
  141. if(j==400)   //周期20ms
  142. {
  143.    j=0;
  144.    PWM=~PWM;
  145. }
  146. }

  147. //左轉
  148. void comeleft()
  149. {
  150.         out1=0;
  151.         out2=1;
  152.         out3=1;
  153.         out4=0;
  154.         delay_ms(40);
  155. }
  156. //右轉
  157. void comeright ()
  158. {
  159.         out1=1;
  160.         out2=0;
  161.         out3=0;
  162.         out4=1;
  163.         delay_ms(40);
  164. }
  165. //前進加速;
  166. void comeon()
  167. {          out2=1;
  168.         delay_us(440);
  169.         out2=0;

  170.         out4=0;
  171.         out1=1;
  172.         out3=1;
  173. }

  174. //后退;
  175. void back()
  176. {          out2=1;
  177.         out4=1;
  178.         out1=0;
  179.         out3=0;
  180.         delay_ms(200);
  181. }

  182. void stop()                  //停止
  183. {       
  184.                    out1=0;
  185.                 out2=0;
  186.                 out3=0;
  187.                 out4=0;
  188. }

  189. //避障
  190. void shunback()
  191. {        uint DATA1,DATA2,i;

  192.          chaoshengbo();
  193.          display ();
  194.        
  195.         if(distance1<12)        //當超聲波測距距離小于8則
  196.         {
  197.         stop();                //小車停止運動
  198.           beem=0;
  199.           for(i=0;i<200;i++){display ();}
  200.           beem=1;
  201.           for(i=0;i<200;i++){display ();}
  202.           beem=0 ;
  203.           for(i=0;i<200;i++){display ();}
  204.           beem=1;
  205.           EX0=0;            //關閉外部中斷
  206.          TR0=0;
  207.          TR1=1;
  208.          pro=10;        //舵機轉動到0°  
  209.         delay_ms(50);
  210.          TR1=0;
  211.          PWM=1;
  212.          delay_ms(10);
  213.          chaoshengbo();        //檢測0°方向 障礙物距離
  214.          DATA1= distance1;
  215.           for(i=0;i<200;i++){display ();}
  216.           distance1=0;
  217.           EX0=0;            //關閉外部中斷
  218.          TR0=0;
  219.          TR1=1;
  220.          pro=50;        //舵機轉動到180°
  221.          delay_ms(50);
  222.          TR1=0;
  223.          PWM=1;
  224.          delay_ms(10);
  225.          chaoshengbo();        //檢測180°方向障礙物距離
  226.          DATA2= distance1;
  227.           for(i=0;i<200;i++){display ();}
  228.           distance1=0;
  229.          
  230.          EX0=0;            //關閉外部中斷
  231.          TR0=0;
  232.          TR1=1;
  233.          pro=25;        //舵機返回90°方向       
  234.          delay_ms(50);
  235.          TR1=0;
  236.          delay_ms(10);
  237.          if(DATA1>=12 && DATA1>DATA2){comeright ();comeon();  }//當0度方向大于 8cm  并大于180度方向 則右轉 前進
  238.          else if (DATA2>=12 && DATA2>=DATA1){comeleft(); comeon(); }        //當180度方向大于 8cm  并大于0度方向 則左轉 前進
  239.          else if (DATA2<12 && DATA1<8) {back(); comeleft();comeon();  }//當180度方向和0度方向都小于8cm 則小車后退一定距離 左轉 前進
  240.         }
  241.         else{ comeon(); }//否則小車直走

  242. }
  243. void display ()

  244. {

  245.         P2=P2|0XF0;
  246.         P0=~seg7code[0];
  247.         SET1=0;
  248.         delay_us(20);
  249.         P2=P2|0XF0;
  250.   
  251.         P0=~seg7code[distance1/100];
  252.         SET2=0;
  253.         delay_us(20);
  254.         P2=P2|0XF0;

  255.         P0=~seg7code[(distance1%100)/10];
  256.         SET3=0;
  257.         delay_us(20);
  258.         P2=P2|0XF0;

  259.         P0=~seg7code[distance1%10];
  260.         SET4=0;
  261.         delay_us(20);
  262.         P2=P2|0XF0;
  263.    
  264. }


  265. void main(void)
  266. {
  267.         P1=0XFF;
  268.         P2=0XFF;
  269.         P3=0XFF;          
  270.         P0=0XFF;
  271.         Init();   //初始化
  272.         baidong();
  273.         while(1)
  274.          {
  275.          shunback();
  276. ……………………

  277. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
超聲波測距顯示并避障.rar (33.77 KB, 下載次數: 10)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区麻豆 | 玖玖玖在线| 久久久久久国产精品 | 久久亚洲一区二区三区四区 | 91私密视频 | 国产精品高清在线 | 日韩www| av天空| 国产麻豆乱码精品一区二区三区 | 亚洲一区毛片 | 在线一区 | 国产欧美日韩精品一区 | 精品欧美一区二区三区 | 国产精品久久久免费 | 国产乱码精品一区二区三区中文 | 精品福利av导航 | 在线成人 | 久久久精 | 久久69精品久久久久久久电影好 | 午夜精品一区二区三区在线视频 | 国产在线激情视频 | 亚洲国产精品一区二区三区 | av在线免费观看网站 | 成人高清视频在线观看 | 久久久在线视频 | 欧美九九| 日本三级网址 | 亚洲五码在线 | 国产一区久久久 | 欧美一级久久 | 亚洲午夜精品在线观看 | 亚洲精品一区在线观看 | 精品一区二区三区在线视频 | 精品欧美乱码久久久久久1区2区 | 日日天天| 成人精品一区亚洲午夜久久久 | 亚洲一区二区三区 | 99视频在线播放 | 黑人精品欧美一区二区蜜桃 | 在线欧美 | 日韩亚洲视频在线 |