一:超声波作用:
超声波测距模块是用来测量距离的一种产品,通过发送和就接收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离。
二:超声波模块介绍 :
?此模块性能稳定,测度距离精确,模块高精度,盲区小。 产品应用领域: 机器人避障 物体测距 液位检测 公共安防 停车场检测 。 接线方式:VCC、trig(控制端)、 echo(接收端)、 GND
三:超声波工作时序:
介绍:
初始化时将trig和echo端口都置低,首先向给trig 发送至少10 us的高电平脉冲,启动超声波模块,模块自动向外发送8个40K的方,在一定范围内(大概2~400cm),方波反弹回来,超声波接收到方波时,echo会被拉高,这个高电平的持续时间就是从发送到接收到方波的时间,接收到方波时打开定时器开始计时,等待echo变成低电平,关闭定时器,读出计时器的时间,这就是超声波在空气中运行的时间,按照 测试距离=(高电平时间*声速(340M/S))/2 就可以算出超声波到障碍物的距离。
时序图
四:LCD1602介绍:
LCD602液晶显示屏除了电源、地以外,有3个控制引脚 RS R/W E 和8个数据引脚DB0-7。建议8个数据引脚接在同一组上,程序写起来比较简单。硬件连接参考如图。
?五:LCD1602初始化设置:
显示模式设置:
?
?
有关lcd1602的基础知识我就不给大家赘述了,大家可以找一下相关知识?
代码部分?
lcd1602.c
#include "lcd1602.h"
#include "main.h"
void lcd1602_busy()//检测lcd1602是否处于忙碌状态
{
u8 sta;
IO=0xff;//单片机IO口作为输入的时候先拉高
RS=0;
RW=1;//设置成读取模式
do //先执行里面语句,在判断while()是否成立
{
EN=1;
sta=IO;
EN=0;
}
while(sta & 0x80);//第七位等于1,表示液晶正在忙,重复检测直到其等于0
}
void lcd1602_cmd(u8 cmd)//输入指令
{
lcd1602_busy();
RS=0;
RW=0;
IO=cmd;
EN=1;
EN=0;
}
void lcd1602_date(u8 date)//输入数据
{
lcd1602_busy();
RS=1;
RW=0;
IO=date;
EN=1;
EN=0;
}
void lcd1602_sor(u8 x,u8 y)//显示字符的位置
{
u8 add;
if(y==1)
{
add=0x80+x;//第一行
}
else
{
add=0xc0+x;//第二行
}
lcd1602_cmd(add);
}
void lcd1602_str(unsigned char x,unsigned char y,unsigned char *str)//设置字符位置以及显示的字符
{
lcd1602_sor(x,y);
while(*str!='\0')//字符串最后一位是空字符
{
lcd1602_date(*str++);//先取str指向的数据,然后地址在自加
}
}
void lcd1602_init()
{
lcd1602_cmd(lcd1602_cmd1);//16*2显示 5*7点阵 8位数据接口
lcd1602_cmd(lcd1602_cmd7);//开显示器,光标关闭
lcd1602_cmd(lcd1602_cmd9);//文字不动,地址自动加1
lcd1602_cmd(lcd1602_cmd3);//清屏
}
?lcd1602.h
#ifndef __lcd1602_H__
#define __lcd1602_H__
#include "main.h"
#define IO P0//定义P0口
/*LCD1602指令控制*/
#define lcd1602_cmd1 0x38//八位数据口,两行,5*8点阵
#define lcd1602_cmd2 0x28//四位数据口,两行,5*8点阵
#define lcd1602_cmd3 0x01//清屏
#define lcd1602_cmd4 0x02//光标复位
/*显示开关控制指令*/
#define lcd1602_cmd5 0x0f//显示开,光标开,光标闪烁
#define lcd1602_cmd6 0x0e//显示开,光标开,光标不闪烁
#define lcd1602_cmd7 0x0c//显示开,光标关,光标不闪烁
#define lcd1602_cmd8 0x08//显示关,光标关,光标不闪烁
/*显示模式控制*/
#define lcd1602_cmd9 0x06//光标右移,显示不移动
#define lcd1602_cmd10 0x04//光标左移,显示不移动
#define lcd1602_cmd11 0x07//操作后,AC自加,画面平移
#define lcd1602_cmd12 0x05//操作后,AC自减,画面平移
/*光标,显示移动指令*/
#define lcd1602_cmd13 0x10//光标左移
#define lcd1602_cmd14 0x14//光标右移
#define lcd1602_cmd15 0x18//显示左移
#define lcd1602_cmd16 0x1c//显示右移
sbit EN=P2^7;
sbit RS=P2^6;
sbit RW=P2^5;
void lcd1602_init();//其他函数可以用到,声名一下
void lcd1602_str(unsigned char x,unsigned char y,unsigned char *str);
//需要被调用的函数,形参得写成直接形式,u8和u16没有被头文件调用
#endif
HC_SR04.c?
#include "HC_SR04.h"
#include "delay.h"
#include "lcd1602.h"
unsigned long time=0;
u16 S=0;
u16 dis_table[]={0x3f,0x06,0x5b,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管段码
u16 dis_table1[]={0,0,0,0,0,0,0,0};
u8 dis_table2[]="jvli: 000CM";
u8 dis_table3[]="-----------";
void sr04_init()
{
TMOD=0x01;//定时器0,工作方式1,16位
TH0=0;//定时器1来计算,声波返回的时间
TL0=0;
EA=1;
ET0=1;
TR0=0;
}
void sr04_count()
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100;
delayms(100);
/*******//*超声波基于lcd1602显示*//********/
if(S>=30)
{
lcd1602_str(0,1,dis_table3);
}
else
{
dis_table2[6]=S/100%10+'0';
dis_table2[7]=S/10%10+'0';
dis_table2[8]=S%10+'0';
lcd1602_str(0,1,dis_table2);
}
}
void sr04()
{
Trig=0;
Trig=1;
delay10us(2);
Trig=0;
while(!Echo);
TR0=1;
while(Echo);
TR0=0;
}
?main.c
#include "main.h"
#include "HC_SR04.h"
#include "lcd1602.h"
void main()
{
sr04_init();
lcd1602_init();
while(1)
{
sr04();
sr04_count();
}
}
|