单片机----超声波----7

//***************************************************************************
//RayDecode_Ser.h
//***************************************************************************
#ifndef Acoustic_Drive
#define Acoustic_Drive

sbit Pulse=P3^4; //输出脉冲10μs以上,触发测量模块,发送超声波模块
extern void Acoustic_Init(); //超声波初始化定时器
extern void Accoustic_Amount_Ser(); //超声波测量服务
extern u16 xdata Acoustic_Distance; //超声波测量结果

#endif

//***************************************************************************
//RayDecode_Ser.c
//***************************************************************************

#include “all.h”

u16 xdata Timer1_Plus ;//定时器值保存
u16 xdata Acoustic_Distance; //距离保存
//***************************************************************************
//定时器1的服务函数
//***************************************************************************
void Timer1_Routine() interrupt 3
{
Timer1_Plus++; //测量结束的值,就是距离多少毫米。P3.3口连接超声波接收端口,如果有超声波高电平信号,中断开始计数,定时器1变为外部脉冲计数。
if(Timer1_Plus>=500) //假如模块被拔掉,高电平永远有,就会连续中断导致死机
{
TR1=0; //关闭定时器。等待下次启动。
Acoustic_Distance=0;
}

}
//***************************************************************************
//定时器1的配置初始化
//***************************************************************************
void Timer1_INT1_Init()
{
AUXR|=0x40; // 0100 0000 定时器1速度控制位,速度为传统8051的12倍,不分频。进入时钟就是30M=0.03333us.5.78/0.03333=174。255(1111 1111)-173=83(0x53).八位自动重装。
TMOD&=0x0f; //0000 1111 八位自动重装初值GATE置1,只有P33口是高电平才能使用定时器。
TMOD|=0xA0; //1010 0000 GATE置1,只有P33口是高电平才能使用定时器。其中M1=1.M0=0:8位自动重装定时器模式,当溢出时将TH1存放的值自动重装如TL1。
TL1=0x53; //定时器初始值,不同晶振都是算5.78us 0101 0011
TH1=0x53; //时间是声波传播来回算2mm所需要的时间。5.78us
TF1=0;
TR1=0; //发送10us脉冲之后,再然TR1=1;定时器的打开和关闭。
ET1=1; //总中断控制开关闭合EA=1;定时/计数器T1的溢出中断允许位。1位允许。0为禁止。

}
//***************************************************************************
//超声波初始化
//***************************************************************************
void Acoustic_Init()
{
Timer1_INT1_Init();
Pulse=0;

}

//***************************************************************************
//超声波触发与测量服务
//***************************************************************************
void Accoustic_Amount_Ser()
{
static xdata u16 count=0;
switch(count)
{
case 1:Pulse=1;TR1=1;Timer1_Plus=0;break; //发送脉冲,定时器允许,定时器的打开和关闭。
case 2:Pulse=0;break;
case 1000:count=0;Acoustic_Distance=Timer1_Plus;break; //赋值

}

count++;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_49327613

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值