#include
#include
#include"LCD1602.h"
sbit Trig=P1^0;
sbit Echo=P1^1;
bit flag=0;
/*
---------------------
延时函数
---------------------
*/
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=400;y>0;y--);
}
/*
---------------------
超声波启动函数
---------------------
*/
void start()
{
int i;
Trig=0; //控制端初始状态拉低
Echo=0; //初始状态接收端置0
Trig=1; //控制端拉高,给一个高电平
for(i=0;i<20;i++) //给至少10us的高电平
{
_nop_(); //精确延时,推荐使用,在头文件intrins.h中
}
Trig=0; //将控制端拉低,触发条件完成
}
/*
---------------------
LCD1602显示函数
---------------------
*/
void LcdDisplay(unsigned int temp)
{
LCD1602_writebyte("The Distance is:");
LCD1602_write(0,0x80+0x41);
LCD1602_write(1,temp/1000+0x30);
LCD1602_write(1,temp%1000/100+0x30);
LCD1602_write(1,temp%100/10+0x30);
LCD1602_write(1,46); //此处显示的是小数点.
LCD1602_write(1,temp%10+0x30);
LCD1602_write(1,0x43); //此处显示的是C,16进制对应的ASCII的值
//LCD1602_write(1,67); //十进制对应的ASCII值,此处显示的也是C
LCD1602_write(1,0x4d); //此处显示的是M,16进制对应的ASCII的值
//LCD1602_write(1,77); //十进制对应的ASCII值,此处显示的也是M
delay(400);
LCD1602_write(0,0x01); //1602 清屏 指令
}
/*
---------------------
距离计算与显示函数
---------------------
*/
void count()
{
unsigned int time,timeH,timeL;
float distance,falseValue;
timeH=TH0;
timeL=TL0;
TH0=0;
TL0=0;
time=timeH*256+timeL;
distance=time*1.7/100; //distance=(time/2)*340m/s time的单位是us转化为s等于time*10^(-6) 340m/s转化为cm是34000cm/s
//综合到一块就是:distance=17000*time*10^(-6)=time*1.7/100
distance=distance*10; //距离扩大10倍,为了能够精确到小数点后一位
if(distance<20 || distance>4500 || flag==0)
{
flag=1;
falseValue=8888;
LCD1602_write(0,0x80);
LCD1602_writebyte("Error!");
delay(200);
LCD1602_write(0,0x01);
delay(200);
LcdDisplay(falseValue);
}
else
{
LcdDisplay(distance);
}
}
/*
---------------------
主函数
---------------------
*/
void main()
{
LCD1602_cls();
while(1)
{
TMOD=0X11;
TH0=0;
TL0=0;
start();
while(!Echo);
TR0=1;
while(Echo);
TR0=0;
count();
delay(120);
}
}