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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3351|回復: 3
收起左側

"盲人眼睛"的小制作 利用超聲波測距離 怎么才能讓蜂鳴器靈敏一些

[復制鏈接]
ID:149043 發表于 2017-8-17 17:13 | 顯示全部樓層 |閱讀模式
    現在我打算做一個利用超聲波測距離的東西,現在有一個ii c接口的模塊,和開發板一塊,希望做一個”盲人眼睛”的小制作,就是利用超聲波模塊和蜂鳴器兩部分,物體離得越近,蜂鳴器可以響的越快,但是測試后總覺得蜂鳴器反應比較遲鈍,有物體在前面出現不能立刻察覺到,可是用數碼管動態顯示就可以察覺到有快速的東西從超聲波探頭閃過,求大神可以告訴我怎么才能讓蜂鳴器靈敏一些!以下是我的程序

第一張

第一張

第二張

第二張

第三張

第三張

第四章

第四章

  1. #include <reg51.h>
  2. #include <intrins.h>
  3. sbit SDA=P3^6;         // 此引腳須上拉 4.7K 電阻至 VCC
  4. sbit SCL=P3^7;         // 此引腳須上拉 4.7K 電阻至 VCC
  5. sbit beep=P1^5;
  6.       
  7. unsigned int range=0;
  8. //unsigned int range1=0;
  9. //unsigned int range2=0;
  10. //unsigned int range3=0;
  11. //unsigned int min=0;

  12. void delay50us_chengxv(void)   //誤差 0us
  13. {
  14.     unsigned char a,b;
  15.     for(b=9;b>0;b--)
  16.         for(a=1;a>0;a--);
  17. }

  18. void delay500ms(void)   //誤差 0us
  19. {
  20.     unsigned char a,b,c;
  21.     for(c=205;c>0;c--)
  22.         for(b=116;b>0;b--)
  23.             for(a=9;a>0;a--);
  24. }
  25. void delay300ms(void)   //誤差 0us
  26. {
  27.     unsigned char a,b,c;
  28.     for(c=5;c>0;c--)
  29.         for(b=212;b>0;b--)
  30.             for(a=140;a>0;a--);
  31. }
  32.       


  33. void beepcv()
  34. {
  35.         unsigned int a;
  36.         if(range<=1500&&range>=0)
  37.         {
  38.                 if(range<=1500&&range>=900)
  39.                 {
  40.                   for(a=600;a>0;a--)
  41.                   {
  42.                           beep=1;
  43.                           delay1(10);
  44.                           beep=0;
  45.                           delay1(10);
  46.                           delay1(175);
  47.                   }      
  48.             }
  49.         else if(range>=300&&range<900)
  50.         {
  51.           for(a=600;a>0;a--)
  52.           {
  53.                   beep=1;
  54.                   delay1(10);
  55.                   beep=0;
  56.                   delay1(10);
  57.                   delay1(100);
  58.           }
  59.         }
  60.           else if(range>=0&&range<300)
  61.           {
  62.             for(a=600;a>0;a--)
  63.                     {
  64.                                   beep=1;
  65.                                   delay1(10);
  66.                                   beep=0;
  67.                                   delay1(10);
  68.                                   delay1(50);
  69.                     }                                       
  70.       }                    
  71.    }
  72. }
  73. void delay(void)         //short delay 使用速度較快的單片機時,I2C 通訊可能不正常,在此函數中多加 4~8 個_nop_();即可
  74. {
  75.         _nop_(); _nop_(); _nop_(); _nop_();
  76.         _nop_(); _nop_(); _nop_(); _nop_();
  77.         _nop_(); _nop_(); _nop_(); _nop_();
  78.         _nop_(); _nop_(); _nop_(); _nop_();
  79. }
  80. void start(void) //I2C start
  81. {
  82.         SDA = 1;
  83.         delay();
  84.         SCL = 1;
  85.         delay();
  86.         SDA = 0;
  87.         delay();                 
  88. }
  89. void stop(void)         //I2C stop
  90. {      
  91.         SDA = 0;      
  92.         delay();      
  93.         SCL = 1;      
  94.         delay();      
  95.         SDA = 1;      
  96.         delay();      
  97. }
  98. void ack(void)         //ack
  99. {      
  100.     unsigned char i;      
  101.         SCL = 1;      
  102.         delay();      
  103.         while(SDA == 1 && i < 200)      
  104.         {      
  105.                 i++;      
  106.         }      
  107.                 SCL = 0;      
  108.                 delay();      
  109.         }      

  110. void no_ack()         //not ack
  111. {      
  112.         SDA = 1;      
  113.         delay();      
  114.         SCL = 1;      
  115.         delay();      
  116.         SCL = 0;      
  117.         delay();      
  118. }      
  119. void i2c_write_byte(unsigned char dat) //write a byte
  120. {
  121.         unsigned char i;
  122.         SCL = 0;
  123.         for(i = 0; i < 8; i++)
  124.         {
  125.                 if(dat & 0x80)
  126.         {
  127.                 SDA = 1;
  128.         }
  129.         else
  130.         {
  131.                 SDA = 0;
  132.         }
  133.                 dat = dat << 1;
  134.                 delay();
  135.                 SCL = 1;
  136.                 delay();
  137.                 SCL = 0;
  138.                 delay();
  139.         }
  140.         SDA = 1;
  141.         delay();
  142. }
  143. unsigned char i2c_read_byte(void) //read a byte
  144. {
  145.         unsigned char i,dat;
  146.         SCL = 0;
  147.         delay();
  148.         SDA = 1;
  149.         delay();
  150.         for(i = 0; i < 8; i++)
  151.         {
  152.                 SCL = 1;
  153.                 delay();
  154.                 dat = dat << 1;
  155.                 if(SDA == 1)
  156.                 {
  157.                         dat++;
  158.                 }
  159.                 SCL = 0;
  160.                 delay();
  161.         }
  162.                 return dat;
  163. }
  164. void init_i2c(void)         //i2c init
  165. {      
  166.         SDA = 1;      
  167.         SCL = 1;      
  168. }      
  169. void write_byte(unsigned char address,unsigned char reg,unsigned char command) //address+register+command      
  170. {      
  171.         init_i2c();      
  172.         start();      
  173.         i2c_write_byte(address);      
  174.         ack();      
  175.         i2c_write_byte(reg);      
  176.         ack();      
  177.         i2c_write_byte(command);      
  178.         ack();      
  179.         stop();      
  180. }      

  181. unsigned char read_byte(unsigned char address,unsigned char reg) //address(with bit 0 set) + register
  182. {
  183.         unsigned char dat;
  184.         init_i2c();
  185.         start();
  186.         i2c_write_byte(address);
  187.         ack();
  188.         i2c_write_byte(reg);
  189.         ack();
  190.         start();
  191.         i2c_write_byte(address+1);
  192.         ack();
  193.         delay();delay();delay();delay();delay(); //此處延時對于 STC89C 系列單片機,可以刪除,如果對于快速單
  194.         //片機,需要加至少 50us 的延時,才可以可靠讀到數據
  195.         dat = i2c_read_byte();
  196.         no_ack();
  197.         stop();
  198.         return dat;
  199. }
  200. void delayms(unsigned int ms) //delay ms
  201. {
  202.         unsigned char i;
  203.         unsigned int j;
  204.         for(i=0;i<110;i++)
  205.         for(j=0;j<ms;j++);
  206. }
  207. /*void change_i2c_address(unsigned char addr_old, unsigned char addr_new)
  208. // addr_old is the address now, addr_new will be the new address
  209. { //that you want change to
  210.         delayms(2000);         // Protect the eeprom ,you can delete this sentence
  211.         write_byte(addr_old,2,0x9a);      
  212.         delayms(1);      
  213.         write_byte(addr_old,2,0x92);      
  214.         delayms(1);      
  215.         write_byte(addr_old,2,0x9e);      
  216.         delayms(1);      
  217.         write_byte(addr_old,2, addr_new);      
  218.       
  219.         delayms(500);         //Protect the eeprom, you can delete this sentence
  220. }        
  221. void config_0x71_0x7d(unsigned char addr_old, unsigned char flag)      
  222. //flag will be 0x71,0x72,0x73,0x74,0x7a,0x7b,0x7c,0x7d      
  223. { //that you want change to
  224.         delayms(2000);         // Protect the eeprom ,you can delete this sentence
  225.         write_byte(addr_old,2,0x9c);      
  226.         delayms(1);      
  227.         write_byte(addr_old,2,0x95);      
  228.         delayms(1);      
  229.         write_byte(addr_old,2,0x98);      
  230.         delayms(1);      
  231.         write_byte(addr_old,2, flag);      

  232.         delayms(500);         //Protect the eeprom, you can delete this sentence
  233. }*/      

  234. unsigned int detect(unsigned char address,unsigned char command) //0xe8(address) + 0x30(command)
  235. {
  236.         unsigned int distance,count;
  237.         write_byte(address,2,command); //use command "0x30" to detect the distance
  238.         delayms(1); //安全延時,如果顯示不清晰可以將延時調大一些
  239.         //delayms(80); //如果是探測溫度此處延時需根據表 1 所列時間相應延長
  240.         count=800;
  241.         while(--count || !SCL)         //等待探測結束,count 值調小將減小探測等待時間
  242.         {      

  243.         ; // 空語句
  244. //        DigDisplay(range);         //顯示語句,可根據需要保留或刪除
  245.         }      

  246.         // while(!SCL)display(range); //you can delete "display(range)"
  247.         //通過查詢 SCL 線來智能識別探測是否結束,使用本語句可刪除上條語句(count=800;while…)以節省探測時間
  248.         distance=read_byte(address,2);
  249.         distance <<= 8;
  250.         distance += read_byte(address,3);
  251.         return distance;         //return 16 bit distance in millimeter
  252. }      
  253. void main(void)      
  254. {      
  255.         //change_i2c_address(0xe8,0xfe); //change default address 0xe8 to 0xfe
  256.         while(1)
  257.         {
  258.                 range = detect(0xe8,0x30);
  259.                 //0xe8 is the address; 0x30 is the command.you just need the only one sentence to get the range.
  260.                 beepcv();
  261.         }
  262. }
復制代碼









回復

使用道具 舉報

ID:111517 發表于 2017-8-19 21:45 | 顯示全部樓層
是不是你蜂鳴器那里有問題?如果超聲波探測的距離有變化,但是你的蜂鳴器程序當時卻剛加入響應之前那個距離的程序,這是不是就相當于延時,此時反應比較慢也就情有可原了。

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:123289 發表于 2017-8-18 00:13 | 顯示全部樓層
蜂鳴器由你的程序指揮,程序讓它快一些不就行了嗎?
回復

使用道具 舉報

ID:149043 發表于 2017-8-20 20:22 | 顯示全部樓層
滄浪 發表于 2017-8-19 21:45
是不是你蜂鳴器那里有問題?如果超聲波探測的距離有變化,但是你的蜂鳴器程序當時卻剛加入響應之前那個距離 ...

是這樣的,這個程序目前只能這樣了,不是特別靈活

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产高清一区二区三区 | 国产h视频| 精品国产乱码久久久久久老虎 | www.嫩草| 91pron在线 | 欧美色综合一区二区三区 | 欧美日韩在线精品 | 99精品国自产在线观看 | 91精品午夜窝窝看片 | 成人夜晚看av | 黄色大片免费观看 | 国产精品一区久久久 | 99精品国自产在线观看 | 天天干b | 国产精品久久久久久久久久久久久 | 免费国产精品久久久久久 | 人妖videosex高潮另类 | 中文一区| 午夜激情影院 | 在线观看www | 欧美男人天堂 | 九九免费视频 | 热99精品视频 | 四虎影院在线免费观看 | 特级生活片 | 日韩欧美综合 | 天堂色网 | 日韩精品一区二区三区第95 | 久草青青 | 五月免费视频 | 人人干人人草 | 美国av片在线观看 | 黄色男女网站 | 久热免费在线 | 亚洲vs天堂 | 一区二区三区在线观看视频 | 亚洲综合色丁香婷婷六月图片 | 国产精品九九九 | 狠狠久| 韩国精品在线观看 | 91久久精品日日躁夜夜躁国产 |