|
我买了一个超声波距离探测器的成品。想自己用C编程测距,现在遇到以下问题:
1,发射完12个40KHz的波之后延时2微秒,然后一开中断就被触发,显示的数值和我设定延时的时间有关。
2,我发的波结束时有震荡,而原版的没有。
3,我发射12个20KHz的波,结束时没震荡,而且可以测距30厘米左右。
因为硬件肯定没有问题,所以肯定是我软件的问题。
还请指教!!
#include "reg51.h"
#include<absacc.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define c 344
sbit port_ex0=P3^2;
sbit p33=P3^3;
sbit p34=P3^4;
uchar T[6]=0x00;
ulong s=0;
uint time=0;
uchar emitter;
uchar overtop;
uchar m=0;
uchar d=0;
uchar receiver;
void DelayMs(uchar dlyms)
{
uchar i;
uint j=50;
for(i=0; i<dlyms; i++)
{
j=107;
while(j--) ;
}
}
void Delay1(uint j)//延时100US
{
uint m;
for(;j>0;j--)
{
for(m=0;m<=76;m++)
{;}
}
}
void Delay(uint j)//延时
{
uint m;
for(;j>0;j--)
{
for(m=0;m<=124;m++)
{;}
}
}
void Senddata(uchar Data)
{
SBUF=Data;
while(TI==0);
TI=0;
}
Distance_detect(void) interrupt 2 //受到中断后的测距处理
{
uchar i=0;
TR0=0;EX1=0;
receiver=1;
Senddata(0xbb);//发个BB这样在显示器上好把每次显示的值分开
time=((uint)TH0<<8)|((uint)TL0);
s=(ulong)time ;
s*=17;
s=s/1000;
s=s-4;//误差修正
T[0]=(s%1000)/100;
T[1]=(s%100)/10;
T[2]=s%10;
for(i=0;i<3;i++)
Senddata(T);
TH0=0x00;
TL0=0x00;
receiver=1;
}
void send_40()//发射超声波12个,这里TH1=0xf3;所以每半个周期是12微秒,加上for语句的时间,周期约为40KHz。接收是CX20106A,发射是中周。
{
uchar i;
ES=0;
for(i=0;i<24;i++)
{
do{ } while(!TF1);//查询等待TF1置位
port_ex0=!port_ex0; //定时反向
TF1=0; //软件清TF1
}
TH1=0xf3;
ES=1;
}
serial(void) interrupt 4
{
if(RI)
{
RI=0;
m=SBUF;
}
}
void instate()//初始化
{
port_ex0 = 1;
receiver=0;
emitter=0;
overtop=1;
TMOD=0x21;
TH0=0x00;
TL0=0x00;
TH1=0xf3; //波特率4800
PCON=0x80; //SMOD=1
SCON=0x40; //串口工作方式1
REN=1;//允许串口接收
TR0=0;
TR1=1;
IT1=1;//负跳变触发
EA=1;//cpu开放总中断
EX1=0;//禁止允许外部中断1
ES=1;//允许串口中断
}
void main()
{
uchar j;
instate();
for(;;)
{
// m=0x01;Delay(800);
if(m==0x01)
{receiver=0;m=0x00;
TH0=0;TL0=0;
send_40();
TR0=1;
Delay1(20);
EX1=1;
DelayMs(400);
if(receiver==0)
Senddata(0xff);//没接到回波,测距失败。
}
}
} |
|