超声波测距系统


前言

  具有测距、温度补充、实时时钟、记忆、阈值警报、串口数据发送等等功能,通过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

相关推荐

  1. 超声波测距系统

    2023-12-24 09:34:02       65 阅读
  2. 51单片机超声波测距

    2023-12-24 09:34:02       61 阅读
  3. 51单片机超声波测距代码

    2023-12-24 09:34:02       40 阅读
  4. Go实现树莓派超声波测距

    2023-12-24 09:34:02       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-24 09:34:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-24 09:34:02       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-24 09:34:02       87 阅读
  4. Python语言-面向对象

    2023-12-24 09:34:02       96 阅读

热门阅读

  1. 算法训练营Day23

    2023-12-24 09:34:02       67 阅读
  2. C语言内存管理以及堆空间栈空间区别

    2023-12-24 09:34:02       62 阅读
  3. 优化for循环(js的问题)

    2023-12-24 09:34:02       60 阅读
  4. Shell Tools of Missing Semester(二)

    2023-12-24 09:34:02       47 阅读
  5. GO语言基础笔记(一):基本语法与数据类型

    2023-12-24 09:34:02       57 阅读
  6. ubuntu常用指令

    2023-12-24 09:34:02       62 阅读
  7. 基于jdk11和基于apache-httpclient的http请求工具类

    2023-12-24 09:34:02       48 阅读