标题:
超声波测试距离程序,判断设置的范围值做一个抽水检测部分
[打印本页]
作者:
精致男孩
时间:
2019-7-29 15:19
标题:
超声波测试距离程序,判断设置的范围值做一个抽水检测部分
基于AT89C52,和超声波模块编辑的抽水检测系统。LCD1602做显示部分,通过超声波数据判断是否符合条件要求 可以判断水面距离检测,通过判断识别1水位是否有水,有水就检测2水位,无就继续循环。判断识别2水位是否有水,如果有水则进行循环,无水则再执行上水命令。有效避免只能测试一个位而反复上水,本文有效的拉开了上水距离。避免反复不停抽水烧机器问题。
单片机源程序如下:
/******************************************************************************/
/* 项目名称 : 超声波测距并且判断条件距离 */
/* 主控芯片 : STC89C52 */
/* 文件名称 : 超声波判断距离并报警 */
/* 文件功能1 : 通过超声波数据判断是否符合条件要求 可以判断水面距离检测 */
/* 文件功能2 : 通过判断识别1水位是否有水,有水就检测2水位,无就继续循环 */
/* 文件功能 : 判断识别2水位是否有水,检测2水位是否有水。再执行上水命令 */
/* 文件功能 : 有效避免只能测试一个位而反复上水,拉开上水距离避免烧机器 */
/******************************************************************************/
/**********************************包含头文件**********************************/
#include <reg52.h>
#include "1602.h"
/************************************宏定义************************************/
#define VELOCITY_30C 3495 //30摄氏度时的声速,声速V= 331.5 + 0.6*温度;
#define VELOCITY_23C 3453 //23摄氏度时的声速,声速V= 331.5 + 0.6*温度;
/************************************位定义************************************/
sbit INPUT = P1^6; //回声接收端口
sbit OUTPUT = P1^7; //超声触发端口
sbit Beep = P2^3; // 蜂鸣器
sbit D1 = P1^0; //LED灯
/********************************定义变量和数组********************************/
long int distance=0; //距离变量
uchar table[]=" Welcome to use "; //开机显示1 "欢迎使用"
uchar table0[]=" ZHANGHAO "; //开机显示2
uchar table1[]="There's no echo.";
uchar table2[]=" QQ:2638831886 "; //固定在液晶显示屏上,一段字体
uchar table3[]="Distance:"; //固定在液晶显示屏上,"测试距离"
uchar count;
unsigned int dz,k,s,j,bgz,k,bian,bianb;
/***********************************函数声明***********************************/
extern void initLCD();
extern void write_date(uchar date);
extern void write_com(uchar com);
extern void delay(uint x);
/******************************************************************************/
/* 函数名称 : Delay_xMs */
/* 函数描述 : 延时函数 */
/* 输入参数 : x */
/* 参数描述 : 延时时间 */
/* 返回值 : 无 */
/******************************************************************************/
void Delay_xMs(unsigned int x)
{
unsigned int i,j;
for(i = 0;i < x;i++ )
{
for(j = 0;j < 3;j++ )
{
;
}
}
}
/******************************************************************************/
/* 函数名称 : Alarm */
/* 函数描述 : 蜂鸣器发声函数 */
/* 输入参数 : t */
/* 参数描述 : 发声的次数 */
/* 返回值 : 无 */
/******************************************************************************/
void Alarm(uchar t)
{
uchar i;
for(i = 0;i < t;i++)
{
Beep = 0;
Delay_xMs(1000);
Beep = 1;
Delay_xMs(1000);
}
}
/******************************************************************************/
/* 函数名称 : delayt */
/* 函数描述 : 延时函数 */
/* 输入参数 : x */
/* 参数描述 : 延时时间数据 */
/* 返回值 : 无 */
/******************************************************************************/
void delayt(uint x)
{
uchar j;
while(x-- > 0)
{
for(j = 0;j < 125;j++)
{
;
}
}
}
/******************************************************************************/
/* 函数名称 : Init_MCU */
/* 函数描述 : 初始化单片机函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Init_MCU(void)
{
TMOD = 0x01; //定时器2初始化,设置为16位自动重装模式
TL0 = 0x66;
TH0 = 0xfc; //1ms
ET0 = 1; //开定时器2
EA = 1; //总中断使能
}
/******************************************************************************/
/* 函数名称 : Init_Parameter */
/* 函数描述 : 初始化参数和IO口函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Init_Parameter(void)
{
OUTPUT =1;
INPUT = 1;
count = 0;
distance = 0;
}
/******************************************************************************/
/* 函数名称 : display_char */
/* 函数描述 : 显示字符串函数 */
/* 输入参数 : point,address */
/* 参数描述 : 写入的字符串的地址指针 1602显示对应的地址 */
/* 返回值 : 无 */
/******************************************************************************/
void display_char(uchar *point,uchar address)
{
uchar i;
write_com(0x80 + address);
for(i = 0;i < 16; i++)
{
write_date(*point);
point++;
}
}
/******************************************************************************/
/* 函数名称 : display */
/* 函数描述 : 显示数字 */
/* 输入参数 : number,address */
/* 参数描述 : number写入的数据,address地址 */
/* 返回值 : 无 */
/******************************************************************************/
void display(int number,uchar address)
{
uchar b,c,d,e;
b= (number / 1000);
c= (number / 100) % 10;
d = (number / 10) % 10;
e = number % 10;
write_com(0x80 + address);
write_date(b + 48); //米
write_date(c + 48); //分米
write_date(d + 48); //厘米
write_date(46); //小数点的ASCII
write_date(e + 48); //毫米
write_date(99); //"c"的ASCII
write_date(109); //"m"的ASCII
bianb=b; //可以复制米的数据
}
/******************************************************************************/
/* 函数名称 : Trig_SuperSonic */
/* 函数描述 : 发出声波函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Trig_SuperSonic(void)//出发声波
{
OUTPUT = 1;
delayt(1);
OUTPUT = 0;
}
/******************************************************************************/
/* 函数名称 : Measure_Distance */
/* 函数描述 : 计算距离函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Measure_Distance(void)
{
uchar l;
uint h,y;
TR0 = 1;
while(INPUT)
{
;
}
TR0 = 0;
l = TL0;
h = TH0;
y = (h << 8) + l;
y = y - 0xfc66;//us部分
distance = y + 1000 * count;//计算总时间
TL0 = 0x66;
TH0 = 0xfc;
delayt(30);
distance = VELOCITY_30C * distance / 20000;
// distance =3000; //这样写显示为300.0cm不变
}
/******************************************************************************/
/* 函数名称 : Distance_panduan */
/* 函数描述 : 计算距离判断函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Distance_panduan(void)
{
if(distance>=70) //2000为m以此类推
{
D1=0;
}
else
D1=1;
}
/******************************************************************************/
/* 函数名称 : main */
/* 函数描述 : 主函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void main(void)
{
initLCD();
Init_MCU();
Init_Parameter();
Alarm(2);
display_char(table,0x00);
display_char(table0,0x40);
Delay_xMs(30000);
display_char(table2,0x00);
display_char(table1,0x40);
while(1)
{
Trig_SuperSonic(); //触发超声波发射
while(INPUT == 0) //等待回声
{
;
}
Measure_Distance(); //计算脉宽并转换为距离
display_char(table3,0x40);
display(distance,0x49); //显示距离
Distance_panduan(); //测试距离判断是否满足设置条件
Init_Parameter(); // 参数重新初始化
delayt(100); //延时,两次发射之间要至少有10ms间隔
}
}
/******************************************************************************/
/* 函数名称 : timer0 */
/* 函数描述 : T0中断处理函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void timer0 (void) interrupt 1
{
TF0 = 0;
TL0 = 0x66;
TH0 = 0xfc;
count++;
if(count == 18)//超声波回声脉宽最多18ms
{
TR0 =0;
TL0 = 0x66;
TH0 = 0xfc;
count = 0;
}
}
/******************************************************************************/
复制代码
所有资料51hei提供下载:
超声波判断距离并报警.zip
(8.81 KB, 下载次数: 21)
2019-7-29 15:12 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1