找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7811|回復(fù): 26
打印 上一主題 下一主題
收起左側(cè)

這是單片機(jī)超聲波測(cè)距,我想讓它超過(guò)一定距離使蜂鳴器響,可蜂鳴器一直不響求詳細(xì)解答

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:301339 發(fā)表于 2018-5-5 11:45 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#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);
}                                                                                                                                                                                                                    //仔細(xì)看一下那個(gè)程序

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

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 ();    //報(bào)警函數(shù)
                        if(beep == 1);
                          Conut();               
     delayms(5);
       
        }
                       
}
  }

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
cciejs12345 + 10

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:241128 發(fā)表于 2018-5-5 15:38 | 只看該作者
S=(time*1.7)/100; 里面的time 不知道會(huì)不會(huì)計(jì)算有問(wèn)題使S得出結(jié)果一直小于50,還有你蜂鳴器函數(shù)的這句if((S>=50)||flag==1)這個(gè)判斷flag==1是不是已經(jīng)沒(méi)有意義了,只要判斷S的值就可以了。你在程序運(yùn)行蜂鳴器函數(shù)前flag的值永遠(yuǎn)為0,。

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:301339 發(fā)表于 2018-5-6 10:22 | 只看該作者
fzhlpp 發(fā)表于 2018-5-5 15:38
S=(time*1.7)/100; 里面的time 不知道會(huì)不會(huì)計(jì)算有問(wèn)題使S得出結(jié)果一直小于50,還有你蜂鳴器函數(shù)的這句if( ...

你說(shuō)的這個(gè)問(wèn)題對(duì)我來(lái)說(shuō)沒(méi)影響而且S的算法是正確的就是正常測(cè)距就是超過(guò)50cm就會(huì)響至于中斷等于1就是超過(guò)一定時(shí)間沒(méi)波返回會(huì)中斷,我這個(gè)蜂鳴器模塊不是很清楚一是不響我想問(wèn)一下哪里有問(wèn)題,求解答謝謝

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:269211 發(fā)表于 2018-5-6 17:26 | 只看該作者
你只要判斷S就行了,上面子函數(shù)feng(),好像沒(méi)什么意義的

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:241128 發(fā)表于 2018-5-7 09:10 | 只看該作者
523633035 發(fā)表于 2018-5-6 10:22
你說(shuō)的這個(gè)問(wèn)題對(duì)我來(lái)說(shuō)沒(méi)影響而且S的算法是正確的就是正常測(cè)距就是超過(guò)50cm就會(huì)響至于中斷等于1就是超過(guò) ...

建議單獨(dú)測(cè)試你的蜂鳴器,就是去掉判斷直接讓蜂鳴器在主循環(huán)里工作以檢查你的蜂鳴器模塊是否正常。如果這樣都不叫,說(shuō)明蜂鳴器模塊是壞的。你的S算法是正確的有什么依據(jù)嗎?大于50你有方法判斷確認(rèn)的是吧,如果是的話那只有硬件問(wèn)題了。程序目前我看對(duì)蜂鳴器鳴叫沒(méi)有問(wèn)題。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:301339 發(fā)表于 2018-5-7 15:21 | 只看該作者
fzhlpp 發(fā)表于 2018-5-7 09:10
建議單獨(dú)測(cè)試你的蜂鳴器,就是去掉判斷直接讓蜂鳴器在主循環(huán)里工作以檢查你的蜂鳴器模塊是否正常。如果這 ...

很簡(jiǎn)單就是距離公式經(jīng)過(guò)化簡(jiǎn)單位轉(zhuǎn)換得到的,我通過(guò)實(shí)物測(cè)出來(lái)沒(méi)有錯(cuò)誤,不過(guò)我蜂鳴器不知怎么用那個(gè)模塊好像有問(wèn)題,我就是再能測(cè)距的基礎(chǔ)上加了一個(gè)限制超過(guò)這個(gè)限制蜂鳴器就會(huì)響

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

7#
ID:301339 發(fā)表于 2018-5-7 15:22 | 只看該作者
chaoself 發(fā)表于 2018-5-6 17:26
你只要判斷S就行了,上面子函數(shù)feng(),好像沒(méi)什么意義的

大佬能不能細(xì)說(shuō)一下如何才能使它有意義,蜂鳴器模塊哪一部分有問(wèn)題求解答謝謝,我的問(wèn)題是單片機(jī)超過(guò)了設(shè)置的距離不會(huì)響應(yīng)該是這個(gè)模塊用錯(cuò)誤

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

8#
ID:192357 發(fā)表于 2018-5-7 20:16 | 只看該作者
先不說(shuō)程序是否正確,蜂鳴器是不是有源蜂鳴器,如果IO口單獨(dú)控制蜂鳴器,給個(gè)高電平看看蜂鳴器響不響,如果不響?赡苁菃纹瑱C(jī)的驅(qū)動(dòng)電流不夠,加一個(gè)三極管驅(qū)動(dòng)電路就能解決;也可能蜂鳴器壞了,那就更好解決了。
回復(fù)

使用道具 舉報(bào)

9#
ID:241128 發(fā)表于 2018-5-8 12:14 | 只看該作者
樓主還沒(méi)搞定啊,樓上這位說(shuō)的也可以考慮一下,你先不管程序,把蜂鳴器直接用硬件方法讓它叫起來(lái),測(cè)試你的蜂鳴器是怎么樣才能叫的然后用軟件去實(shí)現(xiàn)你的硬件功能。做這樣一個(gè)功能產(chǎn)品樓主對(duì)硬件應(yīng)該不至于搞不定蜂鳴器的。蜂鳴器有源無(wú)源也是一個(gè)問(wèn)題,別說(shuō)你的是無(wú)源的哦。先用硬件讓他叫吧....
回復(fù)

使用道具 舉報(bào)

10#
ID:301339 發(fā)表于 2018-5-9 17:42 | 只看該作者
fzhlpp 發(fā)表于 2018-5-8 12:14
樓主還沒(méi)搞定啊,樓上這位說(shuō)的也可以考慮一下,你先不管程序,把蜂鳴器直接用硬件方法讓它叫起來(lái),測(cè)試你的 ...

我的是無(wú)源的我大體看了一下該模塊編程,蜂鳴器模塊沒(méi)有問(wèn)題,我自己再看看
回復(fù)

使用道具 舉報(bào)

11#
ID:326244 發(fā)表于 2018-5-9 20:09 | 只看該作者

你只要判斷S就行了,上面子函數(shù)feng(),好像沒(méi)什么意義的
回復(fù)

使用道具 舉報(bào)

12#
ID:241128 發(fā)表于 2018-5-10 08:37 | 只看該作者
無(wú)源的那你的程序就驅(qū)動(dòng)不了,你的程序只有一次IO口變化,無(wú)源的蜂鳴器是不會(huì)鳴叫的,要不斷變化IO口電平才能使無(wú)源蜂鳴器發(fā)出聲。
比如這樣:
void main()
{        
        while(1)
        {        
                beep=~beep;
                delay(10); //延時(shí)大約100us   通過(guò)修改此延時(shí)時(shí)間達(dá)到不同的發(fā)聲效果        
        }
}
這段代碼來(lái)自這里網(wǎng)友red_R的回復(fù):http://www.torrancerestoration.com/bbs/dpj-112490-1.html
回復(fù)

使用道具 舉報(bào)

13#
ID:301339 發(fā)表于 2018-5-13 17:37 | 只看該作者
fzhlpp 發(fā)表于 2018-5-10 08:37
無(wú)源的那你的程序就驅(qū)動(dòng)不了,你的程序只有一次IO口變化,無(wú)源的蜂鳴器是不會(huì)鳴叫的,要不斷變化IO口電平才 ...

謝謝你啊,我終于知道我哪錯(cuò)了,我定義錯(cuò)蜂鳴器引腳了真蠢
回復(fù)

使用道具 舉報(bào)

14#
ID:306018 發(fā)表于 2018-5-17 09:24 | 只看該作者
樓主能不能幫個(gè)忙,我也是做這個(gè),我在程序上碰到一些問(wèn)題。qq1522305747
回復(fù)

使用道具 舉報(bào)

15#
ID:332006 發(fā)表于 2018-5-17 11:48 來(lái)自手機(jī) | 只看該作者
你確定你的蜂鳴器是有源的,其次在檢查接三極管沒(méi)
回復(fù)

使用道具 舉報(bào)

16#
ID:332006 發(fā)表于 2018-5-17 11:48 來(lái)自手機(jī) | 只看該作者
你單獨(dú)測(cè)一下你的蜂鳴器先
回復(fù)

使用道具 舉報(bào)

17#
ID:241128 發(fā)表于 2018-5-17 12:46 | 只看該作者
523633035 發(fā)表于 2018-5-13 17:37
謝謝你啊,我終于知道我哪錯(cuò)了,我定義錯(cuò)蜂鳴器引腳了真蠢

恭喜恭喜!
如果你只修改定義引腳就正常了,那說(shuō)明你的蜂鳴器是有源的。
回復(fù)

使用道具 舉報(bào)

18#
ID:333473 發(fā)表于 2018-5-19 10:17 | 只看該作者
先不說(shuō)程序,首先你的蜂鳴器是哪種蜂鳴器?有源無(wú)源?
回復(fù)

使用道具 舉報(bào)

19#
ID:333535 發(fā)表于 2018-5-19 11:14 | 只看該作者
首先你的蜂鳴器是有源無(wú)源蜂鳴器.有源的,只要加電就響,無(wú)源的,要脈沖驅(qū)動(dòng),一般用1K赫茲,還要注意驅(qū)動(dòng)電流夠不夠,不夠要加驅(qū)動(dòng)電路。
回復(fù)

使用道具 舉報(bào)

20#
ID:301339 發(fā)表于 2018-5-20 09:05 | 只看該作者
fzhlpp 發(fā)表于 2018-5-17 12:46
恭喜恭喜!
如果你只修改定義引腳就正常了,那說(shuō)明你的蜂鳴器是有源的。

不是我改了引腳,在蜂鳴器模塊上弄了一個(gè)While循環(huán),使輸入電平不斷取反,并每次對(duì)它進(jìn)行延時(shí)使它形成具有一定頻率的脈沖信號(hào),我這個(gè)是最初版本好像沒(méi)改
回復(fù)

使用道具 舉報(bào)

21#
ID:301339 發(fā)表于 2018-5-20 09:06 | 只看該作者
lin81156418 發(fā)表于 2018-5-19 11:14
首先你的蜂鳴器是有源無(wú)源蜂鳴器.有源的,只要加電就響,無(wú)源的,要脈沖驅(qū)動(dòng),一般用1K赫茲,還要注意驅(qū)動(dòng) ...

嗯對(duì)是這樣的,無(wú)源的稍微麻煩一點(diǎn)點(diǎn)
回復(fù)

使用道具 舉報(bào)

22#
ID:301339 發(fā)表于 2018-5-20 09:09 | 只看該作者
fzhlpp 發(fā)表于 2018-5-10 08:37
無(wú)源的那你的程序就驅(qū)動(dòng)不了,你的程序只有一次IO口變化,無(wú)源的蜂鳴器是不會(huì)鳴叫的,要不斷變化IO口電平才 ...

對(duì)必須給它輸入一個(gè)有一定頻率的電平,我用的這個(gè)然后隨便改了改不知哪錯(cuò)了到最后發(fā)現(xiàn)引腳定義錯(cuò)了,還是很謝謝你能夠認(rèn)真看出來(lái)而不是糾結(jié)我的S測(cè)距公式
回復(fù)

使用道具 舉報(bào)

23#
ID:301339 發(fā)表于 2018-5-20 09:13 | 只看該作者
燦燕520 發(fā)表于 2018-5-17 11:48
你單獨(dú)測(cè)一下你的蜂鳴器先

恩沒(méi)問(wèn)題我已經(jīng)解決了謝謝
回復(fù)

使用道具 舉報(bào)

24#
ID:301339 發(fā)表于 2018-5-20 09:14 | 只看該作者
Tarantino丶 發(fā)表于 2018-5-19 10:17
先不說(shuō)程序,首先你的蜂鳴器是哪種蜂鳴器?有源無(wú)源?

無(wú)源的
回復(fù)

使用道具 舉報(bào)

25#
ID:301339 發(fā)表于 2018-5-25 17:09 | 只看該作者
fzhlpp 發(fā)表于 2018-5-5 15:38
S=(time*1.7)/100; 里面的time 不知道會(huì)不會(huì)計(jì)算有問(wèn)題使S得出結(jié)果一直小于50,還有你蜂鳴器函數(shù)的這句if( ...

我想問(wèn)一下再給程序中定時(shí)器/計(jì)數(shù)器T0到底是執(zhí)行的定時(shí)功能還是計(jì)數(shù)功能。當(dāng)發(fā)射超聲波時(shí)開(kāi)始計(jì)數(shù)接收到超聲波后停止計(jì)數(shù),要按這樣說(shuō)的話應(yīng)該是定時(shí)功能吧?墒钱(dāng)ECHo端接收到一個(gè)信號(hào)后它會(huì)輸出一個(gè)持續(xù)的高電平,可這時(shí)候定時(shí)器/計(jì)數(shù)器T0已經(jīng)停止計(jì)數(shù)了,但ECHo端輸出了一個(gè)持續(xù)的高電平就是超聲波測(cè)傳播時(shí)間,是不是該程序沒(méi)有用到該高電平,如果用到的話應(yīng)該就是計(jì)數(shù)功能了吧,能不能解釋一下。
回復(fù)

使用道具 舉報(bào)

26#
ID:63146 發(fā)表于 2018-5-25 19:29 | 只看該作者
                        if(RX_BUF[0]==CMD[0]&&RX_BUF[1]==CMD[1]&&RX_BUF[2]==CMD[2]&&RX_BUF[3]==CMD[3])
                        {
                                //打開(kāi)接收成功指示
                                //無(wú)線答應(yīng)信號(hào)溫度       
                                tmpchange();
                                T_=tmp();
                                TX_BUF[0]=0xAA;
                                //T溫度
                                TX_BUF[1]=T_&0x00ff;
                                //RH濕度
                                TX_BUF[2]=(T_>>8)&0x00ff;
                                TX_BUF[3]=0xdd;
                                delay_ms(100);
                                RXLED_Y=1;                        //關(guān)閉接受射指示燈
                                TXLED_R=0;                        //打開(kāi)發(fā)射指示燈
                                TX_Mode(TX_BUF);        // 把nRF24L01設(shè)置為發(fā)送模式并發(fā)送數(shù)據(jù)
                                Check_ACK(1);        // 等待發(fā)送完畢,清除TX FIFO
                                delay_ms(100);       
                                //發(fā)送成功指示
                                TXLED_R=1;                        //關(guān)閉發(fā)射指示燈
                                RX_Mode();                           // 設(shè)置為接收模式               
                        }
回復(fù)

使用道具 舉報(bào)

27#
ID:526791 發(fā)表于 2019-5-4 09:45 | 只看該作者
523633035 發(fā)表于 2018-5-20 09:05
不是我改了引腳,在蜂鳴器模塊上弄了一個(gè)While循環(huán),使輸入電平不斷取反,并每次對(duì)它進(jìn)行延時(shí)使它形成具 ...

有沒(méi)有完整的修改過(guò)的程序啊,我還是沒(méi)看懂,我也在做這個(gè)實(shí)驗(yàn)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表