//***************************************************************************
//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++;
}