#include<reg51.h>
#include<intrins.h>
//#include<DS18B20.h>
#define uchar unsigned char /*缩定义*/
#define uint unsigned int
sbit vout=P1^7; /*声明40KHz脉冲信号输出口*/
//sbit P16=P1^6; /*看门狗复位引脚*/
sbit Led1= P1^5; /*收到回波指示*/
sbit Led2=P1^4; /*达到距离指示*/
sbit Led3=P1^3; /* 不在测试范围指示*/
//sbit DQ=P1^2;
sbit Out=P1^1;
uint i,time,distance; /*定义接收时间与距离变量*/
bit rec_flag; /*定义接收成功标志位*/
uchar k,j; /*定义脉冲个数与位选控制变量*/
int tempValue;
/**************************函数声明*****************************/
void Init(); /*初始化函数*/
/**************************延时函数*****************************/
void delay_1ms(uchar x)
{
uchar y;
while(x--)
for(y=0;y<110;y++);
}
/****************************主程序****************************/
void main()
{
Init();
while(1)
{
// sendChangeCmd();
// tempValue = getTmpValue();
if(rec_flag)
{
rec_flag=0;
Led1=1;
for(i=400;i>0;i--); /*测量间隔控制(约4*100=400MS)*/
if(distance>=130&&distance<=200) /*测试距离设置*/
{
Led2=1;
Led3=0;
// Out=1;
}
else
{
Led2=0;
Led3=1;
// Out=0;
}
}
EA=1;
TR0=1;
}
}
void Init() /*初始化函数*/
{
vout=0;
Led1=0;
Led2=0;
Led3=0;
TMOD=0x21; /*T1为8位自动重装模式*/
TH0=0x00; /*65ms计数初值*/
TL0=0x00;
TH1=0xf2; /*12us计数初值*/
TL1=0xf2;
// PX0=1;
PT1=1;
ET0=1;
EA=1;
TR0=1;
}
/************************定时器T0中断程序************************/
void TIMER0() interrupt 1
{
EA=0;
TH0=0x00;
TL0=0x00;
EA=1;
ET1=1;
TR1=1;
TR0=1;
}
/**********************定时器2中断程序************************/
void TIMER1() interrupt 3
{
vout=!vout;
k++;
if(k>=4) /*超声波肪冲个数控制(为赋值的一半)*/
{
k=0;
TR1=0;
ET1=0;
// for(j=200;j>0;j--); /*1ms延时避开盲区*/
delay_1ms(10);
EX0=1; /*开启外部中断0*/
// IT0=0;
}
}
/***************************外部中断0程序***************************/
void int0() interrupt 0
{
TR0=0;
TR1=0;
ET1=0;
EA=0;
EX0=0;
// sendChangeCmd();
// tempValue = getTmpValue();
rec_flag=1; /*接收成功标志位置1*/
time=TH0;
time=time*256+TL0;
time=time-120; /*补偿软件或硬件带来的误差*/
// distance=time*(331.5+tempValue/1000*0.607)*0.00005;
distance=time*(331.5+20*0.607)*0.00005;
}
贴上程序,希望大虾多多帮助了
|