`
hzy3774
  • 浏览: 986421 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

51单片机使用超声波测距模块测距

 
阅读更多

一般超声波模块有4个引脚,使用很方便:



 

 

时序:

所以,我们需要测距的话所要做的就是触发Trig,然后用计时器统计Echo的高电平时长,就可以算出距离了:

代码:

#include <reg51.h>
#include <stdio.h>

#define uchar unsigned char
#define uint unsigned int

#define BAUD 9600L
#define FOSC 22118400L
#define CYCLE (12000000.0/FOSC)	//周期 us

sbit Trig = P2^5;
sbit Echo = P2^6;

void sendByte(uchar dat) {
    ES = 0;		//关闭中断
    SBUF = dat;	//写入数据
    while(!TI);	//等待数据发送结束
    TI = 0;		//手动置0
    ES = 1;		//打开中断
}

void sleep() {
    uchar i, j, k;
    for(i = 0; i < 255; i++)
        for(j = 0; j < 255; j++)
            for(k = 0; k < 16; k++);
}

void writeString(char *str) {
    while(*str) {
        sendByte(*str);
        str++;
    }
}


void uartInit() {
    TMOD = 0x20;		//定时器1用于串口
    TH1 = TL1 = -(FOSC/12/32/BAUD);		//设置装入初值
    TR1 = 1;							//启动定时器1
    SM0 = 0;
    SM1 = 1;							//设置串口为方式一
    REN = 1;							//接收使能
    ES = 1;								//打开中断
    EA = 1;
}

float getDist() {
    uchar i = 100;
    float dist = 0.0f;
    uint count = 0;

    Trig = 1;		//打开触发
    while(i--);		//延时一会儿
    TMOD = 0x01;	//计时器0方式1
    TH0 = TL0 = 0;	//装入初值
    Trig = 0;		//关闭触发
    while(!Echo);	//测距过程中
    TR0 = 1;		//打开中断
    while(Echo);	//等待输出电平结束
    TR0 = 0;		//关闭中断
    count = (TH0 << 8) | TL0;	//读取16位计时器里的数字
    dist = CYCLE * count * 0.017;	//0.034cm/us
    return dist;
}

void main() {
    char buffer[16] = {0};

    Trig = 0;
    Echo = 1;
    while(1) {
        sprintf(buffer,"%.2f cm\n",getDist());
        uartInit();
        writeString(buffer);
        sleep();
    }
}

 串口输出:



 模块连接:



 
 

  • 大小: 51.5 KB
  • 大小: 68.4 KB
  • 大小: 79.1 KB
  • 大小: 37.3 KB
  • 大小: 99 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics