超声波装置有两个引脚,发射和接收
发送超声波信号,当遇到障碍时返回超声波就接受引脚接收,收到信号后,接收引脚变为低电平
在返回过程中,可以由定时器来进行计数用于知道时间的产生
计算公式 time *1.7 /100 距离为厘米
步骤: 变量定义引脚 P1^0 发送数据 P1^1接收数据
定义发送脉冲:
发送8个40Khz的脉冲 : 定义一个延时为12us的延时函数 打开TR 延时函数 关闭TR 延时函数 循环8次
对数据进行分析:
用到定时器,可以用定时器1,也可以用定时器0 不需要用到中断,但要用到溢出的标志位
定义变量接收数据,定时器赋初值 发送脉冲 等待接收脉冲信号 接收完后TR会变成第电平,或者等待计数的溢出, 然后根据 溢出位进行判断 ,为0表示没有溢出,然后用变量接收定时器计数的值,否则就是溢出了将溢出得标志位清0即可
数码管显示距离
#include <STC15F2K60S2.H>
#include "intrins.h"
sbit TX=P1^0;
sbit RX=P1^1;
unsigned int distance=0;
unsigned char code SMG_NoDot[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
void show();
void smgdelay(unsigned int i)
{
while(i--)
{
show();
}
}
void select138(unsigned char n)
{
switch(n)
{
case 4:
P2=(0x1f&P2)|0x80;
break;
case 5:
P2=(0x1f&P2)|0xa0;
break;
case 6:
P2=(0x1f&P2)|0xc0;
break;
case 7:
P2=(0x1f&P2)|0xe0;
break;
case 0:
P2=(0x1f&P2)|0x00;
break;
}
}
void Delay12us()
{
unsigned char i;
_nop_();
_nop_();
i=33;
while(--i);
}
void send_wave()
{
unsigned char i;
for(i=0;i<8;i++)
{
TX=1;
Delay12us();
TX=0;
Delay12us();
}
}
void measure_distance()
{
unsigned int time=0;
TMOD = 0x01;
TH0=0x00;
TL0=0x00;
send_wave();
TR0=1;
while((RX==1)&&(TF0==0));
TR0=0;
if(TF0==0)
{
time=TH0;
time=(time<<8)|TL0;
distance= (time*1.7)/100;
}
else
{
distance=999;
TF0=0;
}
}
void smgshow_bite(unsigned char date,unsigned char pos)
{
select138(6);
P0=0x01<<pos;
select138(7);
P0=date;
}
void smgshowall()
{
select138(6);
P0=0xff;
select138(7);
P0=0xff;
}
void delay(unsigned int i)
{
while(i--);
}
void show()
{
if(distance!=999)
{
smgshow_bite(SMG_NoDot[distance/100],5);
delay(500);
smgshow_bite(SMG_NoDot[(distance%100)/10],6);
delay(500);
smgshow_bite(SMG_NoDot[distance%10],7);
delay(500);
}
else
{
smgshow_bite(SMG_NoDot[15],0);
delay(500);
}
}
void main()
{
while(1)
{
measure_distance();
smgdelay(10);
}
}
|