找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6236|回复: 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);
        
        }
                        
}
  }

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

使用道具 举报

沙发
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
回复

使用道具 举报

5#
ID:301339 发表于 2018-5-7 23:20 | 只看该作者
cliang223 发表于 2018-5-7 19:39
蜂鸣器取反之后(beep = ~beep;)没有延时,普通的无源蜂鸣器都要在特定的频率才会响,一般1~5KHZ

能试着改一下吗,我加了延时没什么用啊,确实是需要频率但是这个不断取反是可以满足的。
回复

使用道具 举报

6#
ID:342731 发表于 2018-6-18 23:19 | 只看该作者
是不是io口没有接对。
回复

使用道具 举报

7#
ID:354047 发表于 2018-6-19 10:01 | 只看该作者
改过的程序能借用一下吗 大佬
回复

使用道具 举报

8#
ID:424310 发表于 2018-11-10 23:12 | 只看该作者
你无源接口电路有接三极管放大驱动吗,另外无源蜂螨器的驱动电压都要比较高。
回复

使用道具 举报

9#
ID:94031 发表于 2018-11-11 10:19 | 只看该作者
这和硬件也有关系,要有硬件原理图。
回复

使用道具 举报

10#
ID:408178 发表于 2018-11-11 15:26 | 只看该作者
你在进入feng()函数前,已经检测过一遍距离了,进入feng()之后不用在检测了   //建议
无缘蜂鸣器需要频率,你不断取反延时也可以,延时时间设置二十微秒,而且需要持续的给高低电平,可以给两个for循环,一个5次,一个100次,持续的高低电平时间不够的话,是不工作的
回复

使用道具 举报

11#
ID:303050 发表于 2018-11-11 19:40 | 只看该作者
能上原理图不?
回复

使用道具 举报

12#
ID:830647 发表于 2021-3-21 18:45 来自手机 | 只看该作者
你的是不响,我的是停不下来
回复

使用道具 举报

13#
ID:823677 发表于 2021-3-21 20:24 | 只看该作者
1.蜂鸣器必须加三极管驱动
2.你可以先用有源的蜂鸣器测试
回复

使用道具 举报

14#
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可以驱动小功率蜂鸣器),所以要利用放大电路来驱动,一般使用三极管来放大电流就可以了。

    蜂鸣器驱动电路一般都包含以下几个部分:一个三极管、一个蜂鸣器、一个续流二极管和一个电源滤波电容
回复

使用道具 举报

15#
ID:420836 发表于 2021-3-22 02:15 | 只看该作者
无源蜂鸣器必须由交流信号驱动, 试着用频率为1kHz左右的。
回复

使用道具 举报

16#
ID:65956 发表于 2021-3-22 08:15 | 只看该作者
你应先计算和显示先来,然后再判断距离,超出才来响,看你这程序是先判断再来计算和显示,当然不会如你所愿了
回复

使用道具 举报

17#
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 单片机教程网

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