超声波测距系统
文章目录
- 前言
- 一、功能描述
- 一、界面一
- 二、界面二
- 三、界面三
- 四、界面四
- 五、初始界面
- 二、编程实现
前言
具有测距、温度补充、实时时钟、记忆、阈值警报、串口数据发送等等功能,通过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