找回密码
 立即注册

QQ登录

只需一步,快速开始

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

如何在单片机超声波测距系统中加入蜂鸣器报警功能?

[复制链接]
跳转到指定楼层
楼主
ID:626477 发表于 2019-10-20 17:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C语言没学好,不会把报警程序加进去,各位大神帮我看看怎么改?实现的功能就是当计算出的距离 S<100时,蜂鸣器报警

单片机源程序如下:
#include<reg51.h>
#include<intrins.h>
#include"lcd.h"
sbit Trig = P2^1;
sbit Echo = P2^0;
unsigned char PuZh[]=" The Ultrasonic ";
unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
static unsigned char DisNum = 0; //显示用指针  
       unsigned int  time=0;
   unsigned long S=0;
   bit      flag =0;
   unsigned char disbuff[4]   ={ 0,0,0,0,};
/*******************************************************************************
* 函 数 名         : Conut()
* 函数功能   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100;     //算出来是CM
if((S>=700)||flag==1) //超出测量范围显示“-”
{
  flag=0;

  DisplayOneChar(0, 1, ASCII[11]);
  DisplayOneChar(1, 1, ASCII[10]);//显示点
  DisplayOneChar(2, 1, ASCII[11]);
  DisplayOneChar(3, 1, ASCII[11]);
  DisplayOneChar(4, 1, ASCII[12]);//显示M
}
else
{
  disbuff[0]=S%1000/100;
  disbuff[1]=S%1000%100/10;
  disbuff[2]=S%1000%10 %10;
  DisplayOneChar(0, 1, ASCII[disbuff[0]]);
  DisplayOneChar(1, 1, ASCII[10]);//显示点
  DisplayOneChar(2, 1, ASCII[disbuff[1]]);
  DisplayOneChar(3, 1, ASCII[disbuff[2]]);
  DisplayOneChar(4, 1, ASCII[12]);//显示M
}
}
void zd0() interrupt 1  //T0中断用来计数器溢出,超过测距范围
  {
    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 delayms(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
void main(void)
{
TMOD=0x01;   //设T0为方式1,GATE=1;
TH0=0;
TL0=0;         
ET0=1;             //允许T0中断
EA=1;   //开启总中断
LcdInit();
LcdShowStr(0,0,PuZh);
while(1)
{
StartModule();
     while(!Echo);//当RX为零时等待
     TR0=1;    //开启计数
     while(Echo);//当RX为1计数并等待
     TR0=0;//关闭计数
         Conut();//计算
delayms(80);
}
}
补充:#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
extern S;
sbit beep =P1^5;
void Delay_100us(void)
{
uint i;
for(i=0;i<=9;i++)
{
_nop_();
}
}
void Main(void)
{
while(S<100)
{
beep =~beep;        //蜂鸣器线圈无电流
Delay_100us(); //延时100微秒
}
}


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

使用道具 举报

沙发
ID:626477 发表于 2019-10-21 16:35 | 只看该作者
急需指导
回复

使用道具 举报

板凳
ID:584556 发表于 2019-10-22 08:26 | 只看该作者
如果你的超声波测距没有问题,那么你只需要判断你的距离,小于某值打开蜂鸣器就行了,非常简单
回复

使用道具 举报

地板
ID:626477 发表于 2019-10-24 15:42 | 只看该作者
一泓秋 发表于 2019-10-22 08:26
如果你的超声波测距没有问题,那么你只需要判断你的距离,小于某值打开蜂鸣器就行了,非常简单

已解决,谢谢
回复

使用道具 举报

5#
ID:643576 发表于 2019-11-29 20:27 | 只看该作者
你补充的是报警的程序吗
回复

使用道具 举报

6#
ID:904819 发表于 2021-4-15 08:13 | 只看该作者

楼主这个问题解决了吗,可以麻烦指导一下吗
回复

使用道具 举报

7#
ID:904819 发表于 2021-4-15 09:43 来自手机 | 只看该作者
楼主可以指导一下我吗,我也想插入一个蜂鸣器的程序
回复

使用道具 举报

8#
ID:906091 发表于 2021-4-15 10:33 | 只看该作者
将相应的程序插入位置,然后设置界限值,达到报警效果
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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