超声波模块的使用——不使用51的串口实现

一、此次使用的显示为lcd1602,话不多说,直接看程序:

#include "reg51.h"
sbit RS=P3^5;
sbit RW=P3^4;
sbit E=P3^3;
sbit echo=P3^2;
sbit tr=P3^1;
unsigned long time=0;
unsigned char s[]={"0123456789"};
unsigned char s1[]={"DISTANCE:"};
unsigned int x=0;

void delay(unsigned int n)
{
    unsigned int i=0,j=0;
    for(i=0;i<n;i++)
    {
        for(j=0;j<120;j++);
    }
}

void delay1(unsigned int i)
{
    for(;i<0;i--);
}

void ceju()
{
    tr=1;
    delay1(15);
    tr=0;
    }

void dsqcsh()
{
    TMOD=0x01;//0000 0101
    TH0=0;
    TL0=0;
//    TH1=0xf8;
//    TH1=0x30
//    TR1=1
    TR0=0;
    ET0=1;
    EA=1;
}

void count()
{
    ceju();
    while(!echo);
    TR0=1;
    while (echo);
    TR0=0;
    
    time=TH0*256+TL0;
    TH0=0;
    TL0=0;
    
    x=(time*1.7)/100;
}

void writecom(unsigned char com)
{
    RS=0;
    E=0;
    RW=0;
    P2=com;
    delay(5);
    E=1;
    E=0;
}

void writedat(unsigned char dat )
{
    RS=1;
    E=0;
    RW=0;
    P2=dat;
    delay (5);
    E=1;
    E=0;
}


void xled()
{
    writecom (0x38);
    writecom (0x0C);
    writecom (0x06);
    writecom (0x01);
    
}


void display()
{
    unsigned int bai=0,shi=0,ge=0;
    unsigned int i=0;
    writecom(0x80);
    delay(10);
    while (s1[i]!='\0')
    {
        writedat(s1[i]);
        delay(10);
        i++;
    }
    x=x+1;
    bai=x/100;
    shi=(x%100)/10;
    ge=x%10;
    writecom(0xc6);
    delay(10);
    writedat(s[bai]);
    delay(10);
    writedat (s[shi]);
    delay(10);
    writedat(s[ge]);
    delay(10);
    writedat ('C');
    delay(10);
    writedat('M');
    delay(10);
    
}


void main()
{
    ceju();
      dsqcsh();
        xled();
    while (1)
    {
        display();
        count();
        delay(50);
    }
}

//void zd() interrupt 1
//{
//    
//    
//}

完整的程序就这样,已经焊接出模块,其实有很多bug,有什么问题请指正,这里仅供参考。

二、程序解读

1.超声波模块

超声波模块的使用——不使用51的串口实现

2、超声波模块时序图,

超声波模块的使用——不使用51的串口实现

如图 根据触发信号,我们需要把它拉高,然后作一个延时即可,就是这个函数,有了这个函数就可以开始发出信号

void ceju()
{
    tr=1;
    delay1(15);
    tr=0;
    }

这里使用的是定时器0,里面的时间全部清空,就是TR0=0;方便回响信号的计时

void dsqcsh()
{
    TMOD=0x01;//0000 0101
    TH0=0;
    TL0=0;
    TR0=0;
    ET0=1;
    EA=1;
}

初试化好触发信号与定时器0之后就可以使用超声波模块了,这里的思想是根据时序图的,看程序说明

void count()
{
    ceju();                // 发送触发信号,根据时序图,触发信号发出后,超声波模块自动循环发出8个40khz的脉冲,于是下面就是判断echo引脚是否收到回响信号,收到则为高电平,反之;
    while(!echo);     //判断超声波模块的echo引脚是否为高电平,若是则跳出while;
    TR0=1;              //打开定时器0,开始计时
    while (echo);      //判断回响是否发送数据完毕,发送完毕则为0,跳出while;
    TR0=0;               //关闭定时器0,这个时候定时器0里面已经存有了时间,


    //模块发送的超声波到达物体然后返回被模块接收到的时间

4.超声波模块测距原理公式

                         测试距离=(高电平时间*声速(340M/S))/2

                         s=(time*340m/s)/2

                          s=(time*1.7)/100      

                 
    time=TH0*256+TL0;    //时间
    TH0=0;                        //TR0清零方便下次测量计算
    TL0=0;
    
    x=(time*1.7)/100;     //距离厘米级别
}

三、总结

关于LCD1602的程序就不讲了,里面大多是初始化,后面是应用,这个超声波模块程序真的有很多BUG,它可以测量但是远距离不稳定,我不使用串口的原因是当时还不怎么会,所以自己随便用一个I/O口(上面是sbit echo=P3^2;sbit tr=P3^1这两个口;),好了,第一次写,后面会记录一下所学过的模块。

上一篇:基于51单片机简易函数信号发生器课设论文


下一篇:单片机:模块化程序设计