单片机超声波测距

项目简介:
用HC-SR04超声波模块测量距离,并用单片机(STC89C52RC)接收信号,计算距离,并在LCD1602上实时显示当前距离。
测量距离范围为:20mm ~ 4000mm。
C语言代码如下:

/*-----------------------
FileName: Ultrasonic.h
Function: 头文件
Author: Zhang Kaizhou
Date: 2019-6-16 18:26:16
------------------------*/
#include <reg52.h>
#include <string.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define FOSC 11.0592 // 系统晶振频率11.0592MHz
#define FACTOR 0.1845 // (距离计算因子)[(12 / FOSC) * 10^-6] * 340 / 2
	
/*主模块端口定义*/
sbit trig = P2^1; // 电平触发输入引脚
sbit echo = P2^0; // 回声输出引脚

/*LCD1602显示模块端口定义*/
sbit lcdrs = P1^0;
sbit lcdrw = P1^1;
sbit lcden = P2^5;

/*主模块函数声明*/
void startUltra();
void timerInit();
void delayUs(uint xus);
void computeDis();

/*LCD1602显示模块函数声明*/
void delay(uint xms);
void writeCommand(uchar command);
void writeDataLCD(uchar dat);
void LCDInit();
void display(float dat);
/*----------------------------------------
FileName: main.c
Function: 用HC-SR04超声波模块测量距离
Description: 用HC-SR04超声波模块测量距离,
并用单片机(STC89C52RC)接收信号,计算距离,
并在LCD1602上实时显示当前距离。
Author: Zhang Kaizhou
Date: 2019-6-16 18:24:39
----------------------------------------*/
#include "Ultrasonic.h"

/*定义全局变量*/
uint time = 0; // 记录回声高电平持续时间
float distance = 0; // 存放距离

/*主函数*/
void main(){
	LCDInit();
	timerInit();
	while(1){
		echo = 0; // 接收回音端置0
		startUltra(); // 启动超声测距
		while(!echo); // 等待回音
		TR0 = 1; // 开始计时
		while(echo);
		TR0 = 0; // 停止计时
		computeDis(); // 计算距离
		display(distance); // 显示距离
	}
}

/*启动超声波测距*/
void startUltra(){ // 产生一个大于10us的高电平
	trig = 1;
	delayUs(15);
	trig = 0;
}

/*timer初始化函数*/
void timerInit(){
	TMOD = 0x01; // timer0 定时模式 工作方式1 非门控启动
	TH0 = 0x00; // 置初值 
	TL0 = 0x00;
	ET0 = 1; // 开timer0溢出中断
	EA = 1; // 开全局中断
}

/*timer0溢出中断服务程序*/
void timer0Service() interrupt 1{ // 计数溢出说明超出测距范围
	echo = 0; // 强制关闭回音
}

/*延时xus*/
void delayUs(uint xus){
	uint i;
	for(i = xus; i > 0; i--){
		_nop_();
	}
}

/*计算距离*/
void computeDis(){
	time = TH0 * 256 + TL0;
	distance = FACTOR * time;
	TH0 = 0x00; // 重装初值
	TL0 = 0x00;
}
/*-----------------------------
FileName:display.c
Function: LCD1602显示函数
Author: Zhang Kaizhou
Date: 2019-6-16 18:25:29
------------------------------*/
#include "Ultrasonic.h"

uchar code table0[] = {"Distance Measure"};
uchar code table1[] = {"Distance:"};
uchar code table2[] = {"0123456789"};
uchar code table3[] = {"mm"};
uchar num = 0;

/*初始化LCD1602的设置*/
void LCDInit(){
	uchar i;
	lcden = 0; // 拉低使能端,准备产生使能高脉冲信号
	writeCommand(0x38); // 显示模式设置(16x2, 5x7点阵,8位数据接口)
	writeCommand(0x0c); // 开显示,不显示光标
	writeCommand(0x06); // 写一个字符后地址指针自动加1
	writeCommand(0x01); // 显示清零,数据指针清零
	
	/*LCD上电界面*/
	writeCommand(0x80); // 将数据指针定位到第一行首
	for(i = 0; i < strlen(table0); i++){
		writeDataLCD(table0[i]);
		delay(5);
	}
	
	writeCommand(0x80 + 0x40); // 将数据指针定位到第二行首
	for(i = 0; i < strlen(table1); i++){
		writeDataLCD(table1[i]);
		delay(5);
	}
}

/*LCD显示函数*/
void display(float dat){
	uint disINT = (uint)dat;
	uchar dis[4], i;
	dis[0] = disINT / 1000;
	dis[1] = disINT % 1000 / 100;
	dis[2] = disINT % 100 / 10;
	dis[3] = disINT % 10;
	for(i = 0; i < 4; i++){
		writeCommand(0x80 + 0x40 + strlen(table1) + i);
		writeDataLCD(table2[dis[i]]);
		delay(5);
	}
	for(i = 0; i < strlen(table3); i++){
		writeCommand(0x80 + 0x40 + strlen(table1) + 4 + i);
		writeDataLCD(table3[i]);
		delay(5);
	}
}

/*写指令函数*/
void writeCommand(uchar command){
	lcdrs = 0; // 命令选择
	lcdrw = 0;
	P0 = command;
	delay(5);
	
	lcden = 1; // 产生一个正脉冲使能信号
	delay(5);
	lcden = 0;
}

/*写数据函数*/
void writeDataLCD(uchar dat){
	lcdrs = 1; // 数据选择
	lcdrw = 0;
	P0 = dat;
	delay(5);
	
	lcden = 1;
	delay(5);
	lcden = 0;
}

/*延时xms函数*/
void delay(uint xms){
	uint i, j;
	for(i = xms; i > 0; i--)
		for(j = 110; j > 0; j--);
}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值