超声波测距警报实验

本文介绍了一个基于超声波的测距系统,该系统能够测量2-100cm之间的距离。通过单片机控制超声波发射和接收,使用定时器进行时间测量,并通过外部中断计算回波时间,进而计算距离。此外,系统还包含了一个报警功能,当距离超过预设阈值时会触发报警。程序中包含了延时函数、数码管显示和中断处理等关键模块,实现了实时显示和报警提示。
摘要由CSDN通过智能技术生成

//超声波测距,可以测距离在2-100cm之间
#include <reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit trig = P3^3;
sbit echo=P3^2;
sbit test=P1^1;
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep = P2^3;
sbit key2=P3^4;
uint timeh,timel,distance;
uint ge,shi,bai,xiaoshu,flag,time;
//共阴极数码管不带小数点的代码表
uchar code list[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
};
//共阴极数码管带小数点的代码表
uchar code listtwo[]={
0xbf,0x86,0xdb,0xcf,0xe6,
0xed,0xfd,0x87,0xff,0xef};

void delay(uint z) //延时函数

{
uint x;uchar y;
for(x=z;x>0;x–);
for(y=110;y>0;y–);
}
void delay20us()
{
uchar a;
for(a=0;a<100;a++);
}

void beer() //报警函数
{
uchar j=0;
while(1)
{
if(distance >= 500)
{
beep = ~beep;
delay(700);
}
j++;
if(j==50)
{
break;
}
}
}

void initime0() //定时器初始化
{
TMOD=0x01;
TH0=0;
TL0=0;
EA=0;
ET0=0;
EX0=0;
}
void estern()interrupt 0 //外部中断函数
{
timeh=TH0;
timel=TL0;
beer();
flag=1; //进入中断,标志位置1
EX0=0; //同时关闭外部中断和定时器
TR0=0;
}
/*void buttons()
{
if(key2 == 0)
{
delay(10); //键盘消抖
if(key2==0)
{
TR0=0;
return;
}
}

}/
void display(distance)
{
bai=distance/1000;
shi=distance%1000/100;
ge=distance%100;
xiaoshu=distance%10;
dula=1;
P0=list[xiaoshu];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(2);
dula=1;
P0=listtwo[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(2);
dula=1;
P0=list[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;
P0=list[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
}
void diaoyong() //调用子函数
{
uint i;
EA=0;
echo=1;
trig=1;
delay20us();
trig=0;
while(echo == 0); //如果进入中断收到超声波后向下执行
flag=0; //清除标志位
EA=1; //打开总中断
EX0=1; //打开外部中断
TR0=1; //开定时器
TH0=0; //定时器清零
TL0=0;
for(i=0;i<100;i++) //等待测量结束
{
display(distance); //利用一百次显示循环来掩延时
}
delay(50); //延时函数,数码管闪烁
TR0=0; //关定时器
EX0=0; //关外部中断
if(flag==1)
{
time=timeh
256+timel; //计算测定距离
distance=time*0.1720;
display(distance);
}
if(flag==0) //如果没有进入中断定时器为0
{
distance=0;
test = !test;
}
}
void main()
{

TH0=0
TL0=0

ET0=1;

initime0();
test=0;
trig=0;
EA=1;
while(1)
{
diaoyong();
display(distance);
if(key2 == 0)
{
delay(10); //键盘消抖
if(key2==0)
{
TR0=0;
while(!key2);
}
}
}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值