找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6864|回复: 26
打印 上一主题 下一主题
收起左侧

这是单片机超声波测距,我想让它超过一定距离使蜂鸣器响,可蜂鸣器一直不响求详细解答

  [复制链接]
跳转到指定楼层
楼主
ID:301339 发表于 2018-5-5 11:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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);
       
        }
                       
}
  }

评分

参与人数 1黑币 +10 收起 理由
cciejs12345 + 10

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:241128 发表于 2018-5-5 15:38 | 只看该作者
S=(time*1.7)/100; 里面的time 不知道会不会计算有问题使S得出结果一直小于50,还有你蜂鸣器函数的这句if((S>=50)||flag==1)这个判断flag==1是不是已经没有意义了,只要判断S的值就可以了。你在程序运行蜂鸣器函数前flag的值永远为0,。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:301339 发表于 2018-5-6 10:22 | 只看该作者
fzhlpp 发表于 2018-5-5 15:38
S=(time*1.7)/100; 里面的time 不知道会不会计算有问题使S得出结果一直小于50,还有你蜂鸣器函数的这句if( ...

你说的这个问题对我来说没影响而且S的算法是正确的就是正常测距就是超过50cm就会响至于中断等于1就是超过一定时间没波返回会中断,我这个蜂鸣器模块不是很清楚一是不响我想问一下哪里有问题,求解答谢谢

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:269211 发表于 2018-5-6 17:26 | 只看该作者
你只要判断S就行了,上面子函数feng(),好像没什么意义的

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:241128 发表于 2018-5-7 09:10 | 只看该作者
523633035 发表于 2018-5-6 10:22
你说的这个问题对我来说没影响而且S的算法是正确的就是正常测距就是超过50cm就会响至于中断等于1就是超过 ...

建议单独测试你的蜂鸣器,就是去掉判断直接让蜂鸣器在主循环里工作以检查你的蜂鸣器模块是否正常。如果这样都不叫,说明蜂鸣器模块是坏的。你的S算法是正确的有什么依据吗?大于50你有方法判断确认的是吧,如果是的话那只有硬件问题了。程序目前我看对蜂鸣器鸣叫没有问题。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:301339 发表于 2018-5-7 15:21 | 只看该作者
fzhlpp 发表于 2018-5-7 09:10
建议单独测试你的蜂鸣器,就是去掉判断直接让蜂鸣器在主循环里工作以检查你的蜂鸣器模块是否正常。如果这 ...

很简单就是距离公式经过化简单位转换得到的,我通过实物测出来没有错误,不过我蜂鸣器不知怎么用那个模块好像有问题,我就是再能测距的基础上加了一个限制超过这个限制蜂鸣器就会响

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:301339 发表于 2018-5-7 15:22 | 只看该作者
chaoself 发表于 2018-5-6 17:26
你只要判断S就行了,上面子函数feng(),好像没什么意义的

大佬能不能细说一下如何才能使它有意义,蜂鸣器模块哪一部分有问题求解答谢谢,我的问题是单片机超过了设置的距离不会响应该是这个模块用错误

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:192357 发表于 2018-5-7 20:16 | 只看该作者
先不说程序是否正确,蜂鸣器是不是有源蜂鸣器,如果IO口单独控制蜂鸣器,给个高电平看看蜂鸣器响不响,如果不响。可能是单片机的驱动电流不够,加一个三极管驱动电路就能解决;也可能蜂鸣器坏了,那就更好解决了。
回复

使用道具 举报

9#
ID:241128 发表于 2018-5-8 12:14 | 只看该作者
楼主还没搞定啊,楼上这位说的也可以考虑一下,你先不管程序,把蜂鸣器直接用硬件方法让它叫起来,测试你的蜂鸣器是怎么样才能叫的然后用软件去实现你的硬件功能。做这样一个功能产品楼主对硬件应该不至于搞不定蜂鸣器的。蜂鸣器有源无源也是一个问题,别说你的是无源的哦。先用硬件让他叫吧....
回复

使用道具 举报

10#
ID:301339 发表于 2018-5-9 17:42 | 只看该作者
fzhlpp 发表于 2018-5-8 12:14
楼主还没搞定啊,楼上这位说的也可以考虑一下,你先不管程序,把蜂鸣器直接用硬件方法让它叫起来,测试你的 ...

我的是无源的我大体看了一下该模块编程,蜂鸣器模块没有问题,我自己再看看
回复

使用道具 举报

11#
ID:326244 发表于 2018-5-9 20:09 | 只看该作者

你只要判断S就行了,上面子函数feng(),好像没什么意义的
回复

使用道具 举报

12#
ID:241128 发表于 2018-5-10 08:37 | 只看该作者
无源的那你的程序就驱动不了,你的程序只有一次IO口变化,无源的蜂鸣器是不会鸣叫的,要不断变化IO口电平才能使无源蜂鸣器发出声。
比如这样:
void main()
{        
        while(1)
        {        
                beep=~beep;
                delay(10); //延时大约100us   通过修改此延时时间达到不同的发声效果        
        }
}
这段代码来自这里网友red_R的回复:http://www.51hei.com/bbs/dpj-112490-1.html
回复

使用道具 举报

13#
ID:301339 发表于 2018-5-13 17:37 | 只看该作者
fzhlpp 发表于 2018-5-10 08:37
无源的那你的程序就驱动不了,你的程序只有一次IO口变化,无源的蜂鸣器是不会鸣叫的,要不断变化IO口电平才 ...

谢谢你啊,我终于知道我哪错了,我定义错蜂鸣器引脚了真蠢
回复

使用道具 举报

14#
ID:306018 发表于 2018-5-17 09:24 | 只看该作者
楼主能不能帮个忙,我也是做这个,我在程序上碰到一些问题。qq1522305747
回复

使用道具 举报

15#
ID:332006 发表于 2018-5-17 11:48 来自手机 | 只看该作者
你确定你的蜂鸣器是有源的,其次在检查接三极管没
回复

使用道具 举报

16#
ID:332006 发表于 2018-5-17 11:48 来自手机 | 只看该作者
你单独测一下你的蜂鸣器先
回复

使用道具 举报

17#
ID:241128 发表于 2018-5-17 12:46 | 只看该作者
523633035 发表于 2018-5-13 17:37
谢谢你啊,我终于知道我哪错了,我定义错蜂鸣器引脚了真蠢

恭喜恭喜!
如果你只修改定义引脚就正常了,那说明你的蜂鸣器是有源的。
回复

使用道具 举报

18#
ID:333473 发表于 2018-5-19 10:17 | 只看该作者
先不说程序,首先你的蜂鸣器是哪种蜂鸣器?有源无源?
回复

使用道具 举报

19#
ID:333535 发表于 2018-5-19 11:14 | 只看该作者
首先你的蜂鸣器是有源无源蜂鸣器.有源的,只要加电就响,无源的,要脉冲驱动,一般用1K赫兹,还要注意驱动电流够不够,不够要加驱动电路。
回复

使用道具 举报

20#
ID:301339 发表于 2018-5-20 09:05 | 只看该作者
fzhlpp 发表于 2018-5-17 12:46
恭喜恭喜!
如果你只修改定义引脚就正常了,那说明你的蜂鸣器是有源的。

不是我改了引脚,在蜂鸣器模块上弄了一个While循环,使输入电平不断取反,并每次对它进行延时使它形成具有一定频率的脉冲信号,我这个是最初版本好像没改
回复

使用道具 举报

21#
ID:301339 发表于 2018-5-20 09:06 | 只看该作者
lin81156418 发表于 2018-5-19 11:14
首先你的蜂鸣器是有源无源蜂鸣器.有源的,只要加电就响,无源的,要脉冲驱动,一般用1K赫兹,还要注意驱动 ...

嗯对是这样的,无源的稍微麻烦一点点
回复

使用道具 举报

22#
ID:301339 发表于 2018-5-20 09:09 | 只看该作者
fzhlpp 发表于 2018-5-10 08:37
无源的那你的程序就驱动不了,你的程序只有一次IO口变化,无源的蜂鸣器是不会鸣叫的,要不断变化IO口电平才 ...

对必须给它输入一个有一定频率的电平,我用的这个然后随便改了改不知哪错了到最后发现引脚定义错了,还是很谢谢你能够认真看出来而不是纠结我的S测距公式
回复

使用道具 举报

23#
ID:301339 发表于 2018-5-20 09:13 | 只看该作者
灿燕520 发表于 2018-5-17 11:48
你单独测一下你的蜂鸣器先

恩没问题我已经解决了谢谢
回复

使用道具 举报

24#
ID:301339 发表于 2018-5-20 09:14 | 只看该作者
Tarantino丶 发表于 2018-5-19 10:17
先不说程序,首先你的蜂鸣器是哪种蜂鸣器?有源无源?

无源的
回复

使用道具 举报

25#
ID:301339 发表于 2018-5-25 17:09 | 只看该作者
fzhlpp 发表于 2018-5-5 15:38
S=(time*1.7)/100; 里面的time 不知道会不会计算有问题使S得出结果一直小于50,还有你蜂鸣器函数的这句if( ...

我想问一下再给程序中定时器/计数器T0到底是执行的定时功能还是计数功能。当发射超声波时开始计数接收到超声波后停止计数,要按这样说的话应该是定时功能吧。可是当ECHo端接收到一个信号后它会输出一个持续的高电平,可这时候定时器/计数器T0已经停止计数了,但ECHo端输出了一个持续的高电平就是超声波测传播时间,是不是该程序没有用到该高电平,如果用到的话应该就是计数功能了吧,能不能解释一下。
回复

使用道具 举报

26#
ID:63146 发表于 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])
                        {
                                //打开接收成功指示
                                //无线答应信号温度       
                                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;                        //关闭接受射指示灯
                                TXLED_R=0;                        //打开发射指示灯
                                TX_Mode(TX_BUF);        // 把nRF24L01设置为发送模式并发送数据
                                Check_ACK(1);        // 等待发送完毕,清除TX FIFO
                                delay_ms(100);       
                                //发送成功指示
                                TXLED_R=1;                        //关闭发射指示灯
                                RX_Mode();                           // 设置为接收模式               
                        }
回复

使用道具 举报

27#
ID:526791 发表于 2019-5-4 09:45 | 只看该作者
523633035 发表于 2018-5-20 09:05
不是我改了引脚,在蜂鸣器模块上弄了一个While循环,使输入电平不断取反,并每次对它进行延时使它形成具 ...

有没有完整的修改过的程序啊,我还是没看懂,我也在做这个实验
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表