导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→LM1812测距模块[wowo198579]

 *第26225篇: LM1812测距模块

  
楼 主:wowo198579 2008年6月13日10:01
 LM1812测距模块
LM1812测距模块,使用一个探头进行收发,由8脚来控制。载波频率40KHZ,每次发射200us的超声波。接收状态定时20ms,保证能够测距3米。
8脚通过电平转换接到单片机AT89C51的P2.7,14脚检测器输出接P3.2(INT0)(接收到超声波回波后14脚会输出一个负脉冲).看到好多资料都写14脚出来接计数门,那个是怎么来实现的?我这个硬件电路中没有加入计数门。液晶为金鹏电子的OMJ4X8C 128*64的。程序如下,但测得距离始终为0,请大家帮忙看下程序哪有问题?谢谢!

#include   <reg51.h>  
#define uint  unsigned int
#define uchar unsigned char
#define x1    0x80
#define x2    0x88
#define y     0x80
#define comm  0
#define dat   1
sbit fs=P2^7;
sbit cs   = P2^0;
sbit std  = P2^1;
sbit sclk = P2^2;
sbit psb  = P2^3;   //H=并口; L=串口;
sbit rst  = P2^4;   //Reset Signal 低电平有效
bit flag;
uint jsh,jsl;
float  distance,t;

void wr_lcd (uchar dat_comm,uchar content);
void delay (uint us);
uchar data  display [4] =   {0x00,0x00,0x00,0x00};
uchar code tab1[]={
"倒车距离        "
"                "
};

/*------------------初始化-----------------*/
void init_lcd (void)
{
  rst=1;
  psb=0;
  wr_lcd (comm,0x30);  /*30---基本指令动作*/   
  wr_lcd (comm,0x01);  /*清屏,地址指针指向00H*/
  delay (100);
  wr_lcd (comm,0x06);  /*光标的移动方向*/
  wr_lcd (comm,0x0c);  /*开显示,关游标*/
}

//----------上半屏显示汉字或字符------------
void chn_disp1 (uchar code *chn)
{
  uchar i,j;
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x80);
  j=0;
  for (i=0;i  <16;i++)
  wr_lcd (dat,chn[j*16+i]);
  wr_lcd (comm,0x90);
  j=1;
  for (i=0;i  <16;i++)
  wr_lcd (dat,chn[j*16+i]);
}

/*--------------清DDRAM------------------*/
void clrram (void)
{
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x01);
  delay (180);
}
/*---------------------------------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
  uchar a,i,j;
  delay (100);
  a=content;
  cs=1;
  sclk=0;
  std=1;
  for(i=0;i  <5;i++)
  {
    sclk=1;
    sclk=0;
  }
  std=0;
  sclk=1;
  sclk=0;
  if(dat_comm)
    std=1;   //data
  else
    std=0;   //command
  sclk=1;
  sclk=0;
  std=0;
  sclk=1;
  sclk=0;
  for(j=0;j  <2;j++)
  {
    for(i=0;i  <4;i++)
    {
      a=a  <  <1;
      std=CY;
      sclk=1;
      sclk=0;
    }
    std=0;
    for(i=0;i  <4;i++)
    {
      sclk=1;
      sclk=0;
    }
  }
}


void computer(void)
 {

  t=(float)(jsh*256+jsl);
 distance=t*0.172 ;

  }
  void timer0(void) interrupt 1 
  {
     TR1=0;
     if(flag=0)    //20ms dao
     {
       fs=0; //此时超声波传感器处于发射状态
       TH0=0xFF;  //200us 定时
    TL0=0x38; 
       TR1=1;   //开始计时
    flag=1;
        }
     else if (flag=1)  //200USdao
     {
       fs=1;  //此时超声波传感器处于接收状态
       TH0=0xB1;   //20ms 定时
    TL0=0xE0; 
    delay(150);   //延时大约1.5ms后开外中断0(避免余震的影响)  估计延时写在这有问题,请帮忙看看,谢谢 
         EX0=1;  //开外部中断0
   flag=0;
     }  
  }
 

 void jieshou(void) interrupt 0 using 1
{
    TR1=0;  //收到回波,停止计数
 jsh=TH1;
  jsl=TL1;
     computer();
     EX0=0; 
 }

 
Displayjl()      //
{  
 
 display [3]=(uint)(distance)/1000+0x30 ;
   display [1]=(uint)(distance)%1000 ;
   display [2]=display [1]/100+0x30 ;
   display [0]=display [1]%100;
   display [1]=display [0]/10+0x30;
   display [0]=display [0]%10+0x30;

   if(display [3]==0x30)        //高位为0,不显示   
          display [3]=0x20 ; 
             
      wr_lcd(comm,0x84);
      wr_lcd(dat,display1[3]);   //百位数显示 
      wr_lcd(dat,display1[2]);   //十位数显示 

      wr_lcd(comm,0x85);
      wr_lcd(dat,display1[1]);   //个位数显示 
      wr_lcd(dat,0x2E);

   wr_lcd(comm,0x86);
      wr_lcd(dat,display1[0]);   //小数位数显示 
      wr_lcd(dat,0x20);     
   
   wr_lcd(comm,0x87);
      wr_lcd(dat,0x63);
      wr_lcd(dat,0x6D);   

 }
/*------------------主程序--------------------*/
void main ()
{
 TMOD=0x11;  //两个定时器都工作在方式1
 EA=1;
 TR0=1;
 ET0=1;
 IT0=0;   //设置外部中断0为低电平触发方式
 IE0=1;
 fs=1;  //初始状态是接收状态
 TH0=0xB1;
 TL0=0xE0;
 flag=0;
 TH1=0;
 TL1=0;   
   init_lcd ();
  while (1)
  {
 
  clrram(); 

    chn_disp1 (tab1);
 delay1(80);
    DS18B20_Read_Temperature();
     DS18B20_Disp_Temperature();
     Displayjl(); 

    delay1 (5000); 
    
  }


      
      
      


   } 


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:[推荐]赴日嵌入式招聘

[下一篇主题]:下载的PDG格式书籍怎么打开啊?