基于单片机和超声波测距模块的距离检测

2020-02-12来源: 51hei关键字:单片机  超声波测距  距离检测

这是我前几天写的一个超声波测距模块程序,超声波测距模块用的是HC-SR04,单片机是STC80C52RC,不过我买的是一块单片机开发板,上面已经装好了液晶,我只需要通过杜邦线把测距模块连接到单片机上即可,具体程序如下,注意,超声波测距模块就四个引脚,很容易看出来怎么和单片机连接,把引脚相对应连接好即可。


下面是完整的程序代码,超声波测距模块工作原理可以参看附件,建议将功能程序模块化,即一个功能用一个函数来描写,这样更加清晰直观。


#include

#define Lcd1602_DB P0

typedef unsigned char uchar;

typedef unsigned int uint;



sbit trig = P1^2;

sbit echo = P1^3;


sbit Lcd1602_RS = P1^0;

sbit Lcd1602_RW = P1^1;

sbit Lcd1602_E = P1^5;


void LcdWaitReady()

{

        uchar sta;

        Lcd1602_DB = 0xff;

        Lcd1602_RS = 0;

        Lcd1602_RW = 1;

        do{

                Lcd1602_E = 1;

                sta = Lcd1602_DB;

                Lcd1602_E = 0;

        }while(sta & 0x80);

}

/*向Lcd602液晶写入一字节命令*/

void LcdWriteCmd(uchar cmd)

{

        LcdWaitReady();

        Lcd1602_RS = 0;

        Lcd1602_RW = 0;

        Lcd1602_DB = cmd;

        Lcd1602_E = 1;

        Lcd1602_E = 0;

}

/*向Lcd602液晶写入一字节数据*/

void LcdWriteDat(uchar dat)

{

        LcdWaitReady();

        Lcd1602_RS = 1;

        Lcd1602_RW = 0;

        Lcd1602_DB = dat;

        Lcd1602_E = 1;

        Lcd1602_E = 0;

}

/*设置显示RAM起始地址,亦即光标位置*/

void LcdSetCursor(uchar x,uchar y)

{

        uchar addr;

        if(y == 0)

                addr = 0x00 + x;

        else

                addr = 0x40 + x;

        LcdWriteCmd(addr | 0x80);

}

/*在液晶上显示字符串*/

void LcdShowStr(uchar x,uchar y,uchar *str)

{

        LcdSetCursor(x,y);//设置起始地址

        while(*str != '')

        {

                LcdWriteDat(*str++);

        }

}

/*液晶输出数字*/

void LCDNumPrint(uint num)

{

        LcdWriteDat(num/1000 + 0x30);//num的千位//因为LCD1602显示的数字0,是用0x30表示的,也可以把0当做字符显示

        LcdWriteDat(num % 1000 / 100 + 0x30);//num的百位

        LcdWriteDat(num % 100 /10 + 0x30);//num的十位

        LcdWriteDat(num % 10 + 0x30);//num的个位

}

/*初始化液晶*/

void InitLcd1602()

{

        LcdWriteCmd(0x38);

        LcdWriteCmd(0x0c);

        LcdWriteCmd(0x06);

        LcdWriteCmd(0x01);//清屏

}

uint GetDistance(void)

{

        uint ss;//用于记录测得的距离

        trig = 1;

        delay(2);

        trig = 0;

        while(!echo);//当echo为高电平的时候,跳出循环

        TH0 = 0;

        TL0 = 0;

        TF1 = 0;//计数溢出标志

        TR0 = 1;//启动定时器0,开启计时

        while(echo);//echo不为0,即脉冲返回结束,计时结束

        TR0 = 0;//停止计时

        ss = ((TH0 * 256 + TL0) * 0.34) / 2;//单位是cm

        TH0 = 0;

        TL0 = 0;

        

        return ss;

}

/*延时ms的函数*/

void delay(uchar ms)

{

        uchar x;

        uchar y;

        for(x = ms;x > 0;x--)

                for(y = 123;y > 0;y--);

}


void main()

{

        uint dist;

        InitLcd1602();

        TMOD = 0x01;

        LcdShowStr(0,0,"The Distance is:")

        LcdShowStr(4,1,"cm");

        while(1)

        {

                dist = GetDistance();

                LcdSetCursor(0,1);

                LCDNumPrint(dist);

        }

        

}

关键字:单片机  超声波测距  距离检测 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic487971.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:51单片机汇编控制nRF24L01源程序
下一篇:单片机LM75温度报警LCD1602显示实验

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

基于52单片机控制编码器显示程序
#include "reg52.h"    #define uchar unsigned char#define uint unsigned int#define LCD1602_DATAPINS P0sbit LCD1602_E=P2^7;sbit LCD1602_RW=P2^5;sbit LCD1602_RS=P2^6;sbit DIR=P1^0;sbit STEP=P1^1;sbit K1=P3^1;sbit K2=P3^0;typedef unsigned int u16;   //对数据类型进行声明定义typedef unsigned char
发表于 2020-02-08
单片机步进电机转速控制程序(速度LED显示)
单片机源程序如下://数码管位 高位-----低位//四个按键控制步进电机:正转,反转,加1,减1//上电时电机启动,数码管上显示速度最小档1,加减档位均能通过数码管显示出来,电机采用单双八拍方式//电机转速一共10档,通过按键调节转速 //电机正转时最高位数码管显示0,反转时显示1  #include<reg51.h>#define uchar unsigned char#define uint unsigned int#define led P0//数码管段选#define haha P2sbit s1 = P1^0;sbit s2 = P1^1;sbit s3 = P3^0;sbit
发表于 2020-02-08
单片机步进电机转速控制程序(速度LED显示)
STC单片机+DM134实现LED多段控制
 单片机源程序如下://============================================================================//================翼芯科技 LED流星灯8段16段==软件生成生成数据=================//============================================================================   //  此源码版权属 翼芯科技 全权享有,如欲引用,敬请署名并告知//         
发表于 2020-02-08
STC单片机+DM134实现LED多段控制
基于51单片机的数字电容测量仪设计
本设计详细介绍了一种基于单片机的数字式电容测量仪设计方案及实现方法。设计的主要方法是采用555芯片构成单稳态触发器,将电容容量转换为脉冲宽度。通过单片机的计时器测量脉宽, 根据已知的R值,通过单片机的运算功能,计算出电容容量,最后,再通过单片机的普通I/O口控制液晶屏显示出电容容量的计算结果。系统的测量范围为10pF~ 500uF, 具有多个量程,可根据用户需要由用户选择,与用户的交互是通过键盘实现,不同量程的实现是通过单片机的I/O口控制继电器的吸合与断开来选择不同的R值,从而实现不同的量程。同时,本设计注重设计方法及流程,首先根据原理设计电路,再通过protues仿真,利用keil编程,进而借助altium designer
发表于 2020-02-08
基于51单片机的数字电容测量仪设计
基于51单片机的pwm直流电机调速
仿真原理图如下单片机源程序如下:#include <reg52.h>/********************************************** 定时器初值*********************************************/#define T0HIGH        0xec#define T0LOWW        0x8a
发表于 2020-02-08
基于51单片机的pwm直流电机调速
手把手教你单片机串口通信-基础篇
1的个数之和应为偶数。接收字符时,对1的个数进行校验,若字符不一致,则说明传输数据过程中出现错误。代码和校验发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据时,同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,一致则无差。循环冗余校验通过某种数学预算实现有效信息与校验位之间的循环校验,常用语对磁盘信息的传输、存储区的完整性校验。串口的基本结构SBUF:51单片机中的特殊寄存器,串行数据缓冲器(一个接收一个发送),两个其实是共用的一个地址99H,但是两个在物理上面是分开的。当发送使用时,就采用SBUF=XXX;  
发表于 2020-02-08
手把手教你单片机串口通信-基础篇
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved