pengkingli 发表于 2011-8-29 16:55:26

超声波测距程序

发个超声波测距程序,今年电子大赛想用,求高手指教改进。
1602液晶显示。液晶显示没问题,发射脉冲有问题
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit enable=P2^4;
sbit wela=P2^6;//以下四个定义液晶的,不用看
sbit dula=P2^7;
sbit lcden=P3^4;
sbit lcdrs=P3^5;//
ucharlength[]="00.0000m";       
float time,len;
uchar flag=0,num=0,flag2=0;
void init();
void delay(uint);
void ledinit();
void write_com(uchar);
void write_date(uchar);
void lcddisplay();
void separate();

void main()
{
uchar i;
init();
while(1)
        {
        if(flag2==1)//外部中断收到后,显示距离
                {
                for(i=3;i>0;i--)
                        {
                  separate();
                  lcddisplay();
                        }
               num=0;
                      flag=0;
               flag2=0;
               TR0=1;
               }
        }
}

void init()//初始化
{
        TMOD=0x02;
        TH0=224;
        TL0=224;
        EA=1;
        ET0=1;
        TR0=1;
        IT0=1;
        EX0=0;
        enable=0;
    ledinit();
}

void timer1() interrupt 1//定时器里循环发脉冲波
{   
            switch(flag)
              {
                      case 0:       
                                    EX0=0;
                                    num=0;
                                    enable=1;                  
                                 flag=1;
                               break;//高电平100微秒

                   case 1:
                                 num++ ;
                                  if(num==3)
                               {
                                  TR0=0;
                                  num=0;
                                  enable=0;
                                  flag=2;
                                  TR0=1;
                               }
                               break;//低电平大概50微秒

                  case 2:
                                  num++;
                               if(num==1)
                                {
                                  TR0=0;
                                   num=0;               
                                  flag=3;
                                  TR0=1;
                                }
                                break;
                case 3:             EX0=1;               
                                  num++;
                               if(num>=188)//大于188说明接收失败,外部中断没收到,循环;收到后进入外部中断
                                   {
                                     TR0=0;
                                     num=0;
                                  flag=0;
                                     TR0=1;
                             }
                              break;
        }
}


voidtimer2() interrupt 0//收到后进入外部中断,flag2置1
{
TR0=0;
time=num*12.0/11059200+0.00015;
len=346.4*time/2;//计算
flag2=1;
EX0=0;
}

/******************液晶显示子函数****************************/
void ledinit()
{
wela=0;
dula=0;
write_com(0x38);
write_com(0x0f);
write_com(0x06);
write_com(0x10);
delay(5);
}

void write_com(uchar com)
{
lcdrs=0;
delay(5);
P1=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
lcdrs=1;

}

void write_date(uchar date)
{
lcdrs=1;
delay(5);
P1=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
lcdrs=1;

}
void lcddisplay()
{
uint j;
write_com(0x80+0x01);
for(j=0;j<8;j++)
write_date(length);
/*for(j=0;j<8;j++)
   write_com(0x80+0x09);
write_date(' ');
write_com(0x80+0x40);
for(j=0;j<16;j++)
write_date(' ');       */
}

/***************分离各位数*****************/
void separate()
{
length=((int)(len*10000))%10+'0';
length=((int)(len*1000))%10+'0';
length=((int)(len*100))%10+'0';
length=((int)(len*10))%10+'0';
length=((int)len)%10+'0';
length=((int)len)/10+'0';
}
/**************************************************/
void delay(uint z)
{
   uint x,y;
for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}

my_love 发表于 2011-8-29 17:05:06

呵呵上午调好的超声波可惜只能测到3米 不知道为什么 距离远了 就出错

kenssonyoung 发表于 2011-8-29 17:59:41

呵呵,先收下,学习一下

hit_yyl 发表于 2011-8-29 19:24:19

回复【楼主位】pengkingli
-----------------------------------------------------------------------

求讲解。。。。

402261102 发表于 2011-8-29 20:21:29

能注释下么~哈哈,看不懂啊。我也刚学

402261102 发表于 2011-8-29 20:21:43

能注释下么~哈哈,看不懂啊。我也刚学

wzz951 发表于 2011-8-31 14:25:37

你的超声波模块不行,一般的能够测量3cm到3m的范围,国外的可以测量3cm到10M的范围,呵呵 换个就行了

SHUDAIZI13 发表于 2012-5-5 12:17:32

本帖最后由 SHUDAIZI13 于 2012-5-5 13:23 编辑

求高手按电路图写程序。。。也是超声波测距

sn516952 发表于 2012-5-5 13:56:16

lz说的发射脉冲有问题是指的啥问题? 这个程序不好使??
页: [1]
查看完整版本: 超声波测距程序