ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

超声波测距系统

2026/8/22 17:46:38 拓冰建站 浏览量
超声波测距系统

文章目录

  • 前言
  • 一、功能描述
    • 一、界面一
    • 二、界面二
    • 三、界面三
    • 四、界面四
    • 五、初始界面
  • 二、编程实现


前言

  具有测距、温度补充、实时时钟、记忆、阈值警报、串口数据发送等等功能,通过LCD1602显示,按键进行相关操作。

一、功能描述

  LCD1602显示共有五个界面,按键一用于切换显示界面。

一、界面一

  此界面测距为连续测距模式,LCD1602不间断刷新测量距离和温度,一旦测量距离小于设置的阈值,单片机将会发出警报。此界面按下按键4可进入与上位机连接状态,当上位机发送1至单片机后,mcu立刻将测量数据发送至上位机。

二、界面二

  此界面为阈值设置界面,按键二用于改变设置位(上限还是下限),设置位会闪烁显示,以此提示。按键三四用于加减。

三、界面三

  此界面测距为单次测距模式,按键二按下测量一次,按键三按下则将当前测量距离和测量时间(如23:59:45时测量距离为45cm)保存到EEPROM里面,最多可以记录十次,第十一次将会覆盖第一次数据。

四、界面四

  此界面测距为回放模式,按下按键二三切换回放序号,LCD1602会显示在界面三时记录的距离和测量时间。

五、初始界面

  上电后,LCD1602会显示DS1302的初始时间设置,此时需要通过按键二三四进行时间设置。设置完成后,按下按键一,系统进入界面一,开始工作。

二、编程实现

  核心代码main.c如下:

#include "main.h"
typedef unsigned char u8;
#define outputp0(y,x) P0=x,P2&=0x1f,P2=y,P2&=0x1f;u8 keynum=0,show_page=0,distance_set_flag=0,save_times=1,set_time_flag=0,save_distance_addr=0x04;
int distance_h=350,distance_l=6,LCD_showflag=0;
u8 distance_limit[4]={0};
float temper=0;void main_Delay1ms(int t)	//@11.0592MHz
{unsigned char data i, j;while(t--){_nop_();_nop_();_nop_();i = 11;j = 190;do{while (--j);} while (--i);}
}void work_key()
{if(keynum){if(keynum==1){show_page++;show_page%=4;if(show_page==0){TR0=0;temper=rd_temper();TR0=1;work_ultra();LCD_ShowString(1,1,"Distance:   . CM");LCD_ShowString(2,1,"Temper:    .  C ");}else if(show_page==1){outputp0(0xa0,0x00);distance_set_flag=0;LCD_showflag=0;LCD_ShowString(1,1,"High:   CM      ");LCD_ShowString(2,1,"Low:   CM       ");}else if(show_page==2){			LCD_ShowString(1,1,"Distance:   . CM");LCD_ShowString(2,1,"Time:  -  -     ");}else if(show_page==3){save_distance_addr=0x04;save_times=1;LCD_ShowString(1,1,"Save_Dis:   . CM");LCD_ShowString(2,1,"Time:  -  -     ");TR0=0;at24c02_read_multi(read_time,save_distance_addr,3);distance=at24c02_read(save_distance_addr+3)*256+at24c02_read(save_distance_addr+4);TR0=1;}}else if(keynum==2){if(show_page==1)distance_set_flag=!distance_set_flag;else if(show_page==2){				TR0=0;temper=rd_temper();TR0=1;work_ultra();}	else if(show_page==3){if(save_distance_addr<=48