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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6893|回復: 16
收起左側

這是單片機超聲波測距,我想讓它超過一定距離使蜂鳴器響,可蜂鳴器一直不響求詳解

  [復制鏈接]
ID:301339 發表于 2018-5-7 16:40 | 顯示全部樓層 |閱讀模式
20黑幣
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

         
sbit Lcd1602_RS = P2^6;
sbit Lcd1602_RW = P2^5;
sbit Lcd1602_EN = P2^7;
        
sbit Trig = P2^1;                                                      
sbit Echo = P2^0;
sbit beep = P2^3;

unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};                  
unsigned int  time=0;
unsigned long S=0;
bit      flag =0;
uchar disdat[4] ={0,0,0,0,};

void delayms(uint ms)
{
    uchar i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                  
                }
        }
}


void Lcd1602_Write_com(uchar cmd)
{
        Lcd1602_RS=0;
        P0=cmd;
        delayms(1);
        Lcd1602_EN =1;
    delayms(1);
        Lcd1602_EN =0;
    delayms(1);
}

void Lcd1602_Write_Data(uchar shu)
{
        Lcd1602_RS=1;
        P0=shu;
        delayms(1);
        Lcd1602_EN =1;
    delayms(1);
        Lcd1602_EN =0;
        delayms(1);
}

void write_1602(uchar add,uchar sj)
{
        Lcd1602_Write_com(0x80+0x40+add);
        Lcd1602_Write_Data(sj) ;
}               

void zifuchuan(uchar *ch)         
{
    while(*ch!=0)   
    Lcd1602_Write_Data(*ch++);
        delayms(5);
}                                                                                                                                                                                                                    //仔細看一下那個程序

void feng()
{
        
   if((S>=50)||flag==1)
        {
               
                beep = ~beep;           
        }
        else
        {
                 
                beep = 1;                //取消報警
        }        
}

void LcdInit()                                                
{
         Lcd1602_EN =0;
         Lcd1602_RW =0;
         Lcd1602_Write_com(0x38);  
     Lcd1602_Write_com(0x0c);  
         Lcd1602_Write_com(0x06);  
         Lcd1602_Write_com(0x80);  
         Lcd1602_Write_com(0x01);  
         zifuchuan("cejujuli") ;
}
  void Conut(void)
{
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;
         S=(time*1.7)/100;
         disdat[0]=S%1000/100;                           
         disdat[1]=S%1000%100/10;                  
         disdat[2]=S%1000%10%10;                  
         write_1602(1,disdat[0]+0x30);                                         
         write_1602(2,disdat[1]+0x30);               
         write_1602(3,disdat[2]+0x30);
         write_1602(5,'c');
     write_1602(6,'m');
         
         

         }                                 


void zd0() interrupt 1                  
  {
    flag=1;                                                        
  }

void  StartModule()                          
  {
          Trig=1;                                             
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          Trig=0;
  }




void main(void)
{

         delayms(5);
     LcdInit();
         TMOD=0x01;                  
         TH0=0;
         TL0=0;         
         ET0=1;            
         EA=1;        
         beep = 0;                    
         delayms(150);
         
        while(1)
{
         StartModule();
     while(!Echo);               
         TR0=1;                           
     while(Echo);                        
         TR0=0 ;
         if((S>=50)||flag==1)
{               
         flag = 0;
                   feng ();   
                        if(beep == 1);
                          Conut();               
     delayms(5);
        
        }
                        
}
  }

回復

使用道具 舉報

ID:244869 發表于 2018-5-7 18:07 | 顯示全部樓層
有沒有測試過你的測距結果是否準確?
回復

使用道具 舉報

ID:301339 發表于 2018-5-7 18:19 | 顯示全部樓層
47253 發表于 2018-5-7 18:07
有沒有測試過你的測距結果是否準確?

完全沒有問題我用實物測得,現在只是蜂鳴器模塊的問題這個蜂鳴器是無源的
回復

使用道具 舉報

ID:276761 發表于 2018-5-7 19:39 | 顯示全部樓層
蜂鳴器取反之后(beep = ~beep;)沒有延時,普通的無源蜂鳴器都要在特定的頻率才會響,一般1~5KHZ
回復

使用道具 舉報

ID:301339 發表于 2018-5-7 23:20 | 顯示全部樓層
cliang223 發表于 2018-5-7 19:39
蜂鳴器取反之后(beep = ~beep;)沒有延時,普通的無源蜂鳴器都要在特定的頻率才會響,一般1~5KHZ

能試著改一下嗎,我加了延時沒什么用啊,確實是需要頻率但是這個不斷取反是可以滿足的。
回復

使用道具 舉報

ID:342731 發表于 2018-6-18 23:19 | 顯示全部樓層
是不是io口沒有接對。
回復

使用道具 舉報

ID:354047 發表于 2018-6-19 10:01 | 顯示全部樓層
改過的程序能借用一下嗎 大佬
回復

使用道具 舉報

ID:424310 發表于 2018-11-10 23:12 | 顯示全部樓層
你無源接口電路有接三極管放大驅動嗎,另外無源蜂螨器的驅動電壓都要比較高。
回復

使用道具 舉報

ID:94031 發表于 2018-11-11 10:19 | 顯示全部樓層
這和硬件也有關系,要有硬件原理圖。
回復

使用道具 舉報

ID:408178 發表于 2018-11-11 15:26 | 顯示全部樓層
你在進入feng()函數前,已經檢測過一遍距離了,進入feng()之后不用在檢測了   //建議
無緣蜂鳴器需要頻率,你不斷取反延時也可以,延時時間設置二十微秒,而且需要持續的給高低電平,可以給兩個for循環,一個5次,一個100次,持續的高低電平時間不夠的話,是不工作的
回復

使用道具 舉報

ID:303050 發表于 2018-11-11 19:40 | 顯示全部樓層
能上原理圖不?
回復

使用道具 舉報

ID:830647 發表于 2021-3-21 18:45 來自手機 | 顯示全部樓層
你的是不響,我的是停不下來
回復

使用道具 舉報

ID:823677 發表于 2021-3-21 20:24 | 顯示全部樓層
1.蜂鳴器必須加三極管驅動
2.你可以先用有源的蜂鳴器測試
回復

使用道具 舉報

ID:68800 發表于 2021-3-21 21:54 | 顯示全部樓層
單片機驅動他激蜂鳴器的方式有兩種:一種是PWM輸出口直接驅動,另一種是利用I/O 定時翻轉電平產生驅動波形對蜂鳴器進行驅動。

  PWM 輸出口直接驅動是利用PWM輸出口本身可以輸出一定的方波來直接驅動蜂鳴器。在單片機的軟件設置中有幾個系統寄存器是用來設置PWM口的輸出的,可以設置占空比、周期等等,通過設置這些寄存器產生符合蜂鳴器要求的頻率的波形之后,只要打開PWM輸出,PWM輸出口就能輸出該頻率的方波,這個時候利用這個波形就可以驅動蜂鳴器了。比如頻率為2000Hz的蜂鳴器的驅動,可以知道周期為500μs,這樣只需要把PWM的周期設置為500μs,占空比電平設置為250μs,就能產生一個頻率為2000Hz的方波,通過這個方波再利用三極管就可以去驅動這個蜂鳴器了。



  而利用I/O定時翻轉電平來產生驅動波形的方式會比較麻煩一點,必須利用定時器來做定時,通過定時翻轉電平產生符合蜂鳴器要求的頻率的波形,這個波形就可以用來驅動蜂鳴器了。

    比如為2500Hz的蜂鳴器的驅動,可以知道周期為400μs,這樣只需要驅動蜂鳴器的I/O口每200μs翻轉一次電平就可以產生一個頻率為2500Hz,占空比為1/2duty的方波,再通過三極管放大就可以驅動這個蜂鳴器了。



  驅動電路

  由于蜂鳴器的工作電流一般比較大,以致于單片機的I/O 口是無法直接驅動的*(但AVR可以驅動小功率蜂鳴器),所以要利用放大電路來驅動,一般使用三極管來放大電流就可以了。

    蜂鳴器驅動電路一般都包含以下幾個部分:一個三極管、一個蜂鳴器、一個續流二極管和一個電源濾波電容
回復

使用道具 舉報

ID:420836 發表于 2021-3-22 02:15 | 顯示全部樓層
無源蜂鳴器必須由交流信號驅動, 試著用頻率為1kHz左右的。
回復

使用道具 舉報

ID:65956 發表于 2021-3-22 08:15 | 顯示全部樓層
你應先計算和顯示先來,然后再判斷距離,超出才來響,看你這程序是先判斷再來計算和顯示,當然不會如你所愿了
回復

使用道具 舉報

ID:844772 發表于 2021-3-22 15:31 | 顯示全部樓層
無源的要反復震蕩才響啊,你只取反一次,發的那一聲都難以察覺,我加了兩句,頻率控制在5k左右比較好,而且要反復調用這個函數百八十次,響個1秒半秒的才好。否則你就用有源的,你的程序就沒問題。
void feng()
{
if((S>=50)||flag==1)
  {  beep = ~beep;
     delayms(1); //延時1ms
     beep = ~beep;
  }      
   else
      beep = 1;      //取消報警        
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久国产精品精品 | 色综合一区二区三区 | 亚洲国产精品网站 | 男人的天堂视频网站 | 亚洲欧美综合 | 特黄色一级毛片 | 成年女人免费v片 | 视频1区2区| 毛片高清 | 成人在线精品 | www日本在线播放 | 欧美在线视频一区 | 亚洲成人一区二区三区 | 久草网址 | 久草网在线视频 | 国产精品99久久久久久久vr | 九九色综合 | 在线视频一区二区三区 | 亚洲高清一区二区三区 | 久久久久久国产精品免费免费 | 中文字幕国产视频 | caoporon| 色综合一区二区三区 | 精品视频www | 在线免费91| 国产精品视频久久 | 亚洲天天 | 久久久www成人免费无遮挡大片 | 久久久久久中文字幕 | 在线电影日韩 | 久久亚洲一区二区三区四区 | 中文二区| 亚洲欧美综合精品久久成人 | 国产精品日产欧美久久久久 | 国产一区在线免费观看 | 国产精品日韩在线观看 | 国产精品一区二区久久精品爱微奶 | 91亚洲国产成人久久精品网站 | 一区二区在线免费观看 | 欧美精品电影一区 | 亚洲视频欧美视频 |