项目简介:
用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--);
}