#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
wdzh()
{
TR0=0;
TH1=0x00;
TL1=0x00;
csbint=1;
sx=0;
delay(1700);
csbfs();
csbout=1;
TR1=1;
i=yzsj;
while(i--)
{
}
i=0;
while(csbint) //判断接收回路是否收到超声波的回波
{
i++;
if(i>=3300)
csbint=0;
}
TR1=0;
s=TH1;
s=s*256+TL1;
TR0=1;
csbint=1;
jsz=s*csbc; //计算测量结果
jsz=jsz/2;
return jsz;
}
void delay50ms() //误差 0us
{
unsigned char a,b;
for(b=173;b>0;b--)
for(a=143;a>0;a--);
}
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管显示数字断码
uint ta0,ta1,ta2;
uint temp=0;
void Display(uint ta) //显示函数
{
ta0=ta/100;
ta1=ta%10/10;
ta2=ta%100;
uchar i,j;
for(i=0;i<3;i++)
{
// GPIO_DIG=table1[table[i]];//发送段码
switch(i) //位选,选择点亮的数码管,
{
case(0):
P2=table[ta0];P3^4=1;P3^2=0;P3^3=0; break;//显示第1位
case(1):
P2=table[ta1];P3^4=0;P3^2=1;P3^3=1; break;//显示第2位
case(2):
P2=table[ta2];P3^4=0;P3^2=1;P3^3=1; break;// 显示第3位
}
j=50; //扫描间隔时间设定
while(j--);
GPIO_DIG=0x00;//消隐
}
}
void key() ///按键函数,设置报警距离多少
{
delay50ms();
if(P3^7==0)
{temp++;}
else if(P3^6==0)
{temp--;}
}
viod main
{
uchar a,b=0;
while(1){
if(P3^7==0|P3^6==0) //判断按键是否按下
{
key();
for(a=0;<20;a++)
{
Display(temp);
}
delay50ms();
delay50ms();
}
Display(wdzh()) //显示当前距离
b=wdzh();
if(temp>b) //比较距离,是否报警
{
P2^7=0;
delay50ms();
P2^7=1;
}
}
}
超声波测距子程序:
void wdzh()
{
TR0=0;
TH1=0x00;
TL1=0x00;
csbint=1;
sx=0;
delay(1700);
csbfs();
csbout=1;
TR1=1;
i=yzsj;
while(i--)
{
}
i=0;
while(csbint) //判断接收回路是否收到超声波的回波
{
i++;
if(i>=3300)
csbint=0;
}
TR1=0;
s=TH1;
s=s*256+TL1;
TR0=1;
csbint=1;
jsz=s*csbc; //计算测量结果
jsz=jsz/2;
}
|