超声波物体定位c语言程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
TH1=0xf8;
TL1=0x30;
Display();
timer++;
if(timer>=400)
{
timer=0;
TX=1;
TX1=1;
//800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0; TX1=0; } } /*********************************************************/
void zd0() interrupt 1
//T0 中断用来计数器溢出,超过测距范围
{
flag=1;
//中断溢出标志
}
/********************************************************/
void zd3() interrupt 3
//T1 中断用来扫描数码管和计 800MS 启动模块
//“-”
disbuff[2]=10;
//“-”
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
}
}
/********************************************************/
unsigned char const positon[6]={ 0,1,2,3,4,5};
unsigned char disbuff[4] ={ 0,0,0,0,};
/********************************************************/
void Display(void)
delay(); if(key==0)
{ while(1)
{ while(!RX); TR0=1;
while(RX); TR0=0;
//当 RX 为零时等待 //开启计数 //当 RX 为 1 计数并等待 //关闭计数
Conut();
//计算
A=S;
if(key1==0)
{ TMOD=0x11;
//设 T0 为方式 1,GATE=1;
while(RX1); TR0=0;
//当 RX 为 1 计数并等待 //关闭计数
Conut();
//计算
D=S;
if(key2==0)
{
delay();
if(key2==0)
{ e1=A*A;
e2=D*D; X=(e2-e1+16)/8;
//通过公式计算
Y=sqrt(e2-X*X);
S1=X/100;
P2=4; delay1(2); P0=(discode[S6]); P2=5; delay1(2);
} } } } } } } } }
TH0=0;
TL0=0;
TH1=0xf8;
//2MS 定时
TL1=0x30;
ET0=1; ET1=1;
//允许 T0 中断 //允许 T1 中断
TR1=1; EA=1;
//开启定时器 //开启总中断
delay();
if(key1==0)
{
while(1)
{
while(!RX1); TR0=1;
//当 RX 为零时等待 //开启计数
//扫描数码管
{
if(posit==0)
{P0=(discode[disbuff[posit]])&0x7f;}
else
{P0=discode[disbuff[posit]];}
P2=positon[posit];
if(++posit>=3)
posit=0;
} /********************************************************/ void delay() { uint i,j;
void main( void )
{ while(1) { if(key==0) { TMOD=0x11; TH0=0; TL0=0; TH1=0xf8; TL1=0x30; ET0=1; ET1=1; TR1=1; EA=1;
//设 T0 为方式 1,GATE=1;
//2MS 定时
//允许 T0 中断 //允许 T1 中断 //开启定时器 //开启总中断
S2=X%100/10;
S3=X%10;
S4=Y/100;
S5=Y%100/10;
S6=Y%10;
while(1) { P0=0x00; delay1(2); P0=(discode[S1]);
P2=0; delay1(2); P0=(discode[S2]); P2=1; delay1(2);
P0=(discode[S3]); P2=2; delay1(2); P0=(discode[S4]); P2=3; delay1(2); P0=(discode[S5]);
//用于显示
unsigned int S1;
unsigned int S2;
unsigned int S3;
unsigned int S4;
unsigned int S5;
unsigned int S6;
unsigned int e1;
unsigned int e2; unsigned int X; unsigned int Y;
for(i=1;i>0;i--) for(j=1879;j>0;j--); }
void delay1(unsigned char e) {
unsigned char f; for(e;e>0;e--) for(f=110;f>0;f--);
} /********************************************************/
//x 的位移 //y 的位移
bit
flag =0;
sbit key=P3^2; //按键按下 模块 1 工作 sbit key1=P3^3; //模块 1 稳定 按键按下模块 2 工作
sbit key2=P3^4; //按下 显示 X,Y
unsigned char cons discode[] ={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff/*-*/};
#define TX P1_2 #define RX1 P1_3
//2 接收发射
#define TX1 P1_4
unsigned int time=0;
unsigned int timer=0;
unsigned char posit=0;
unsigned long A;
unsigned long D; unsigned long S=0;
附图:
超声波物体定位源程序
其中 D 是已经的距离 可自己设 L1 是超声波发射和接收 1,L2 是超声波发射和接收 2。 并通过数码管显示,然后通过按键调节。
程序代码:
#include <AT89x51.H> //头文件
#include <intrins.h>
#include <math.h>
#define uint unsigned int #define RX P1_1 //1 接收发射
void Conut(void) {
time=TH0Leabharlann Baidu256+TL0;
TH0=0; TL0=0;
S=(time*1.7)/100; //算出来是 CM
if((S>=700)||flag==1) //超出测量范围显示“-”
{
flag=0;
disbuff[0]=10;
//“-”
disbuff[1]=10;