功能介绍:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶实时循环显示3路超声波探测距离,同时WIFI串口上报
2.带有WiFi模块,可与手机实现数据交互,WiFi模块型号采用是常见到ESP8266
3.超声波模块采用的是分离式HC-SR04模块,该模块价格便宜,性能稳定,盲区只有几厘米,最大可测数米距离。
4.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:

PCB:

主程序:

#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include "delay.h"
#include "lcd1602.h"#define OFF 1
#define ON 0sbit TRIG_1 = P1^0; //接口定义
sbit ECHO_1 = P1^1; //接口定义
sbit LED_VOID_1 = P1^2;
sbit LED_PARKING_1 = P1^3;sbit TRIG_2 = P2^0; //接口定义
sbit ECHO_2 = P2^1; //接口定义
sbit LED_VOID_2 = P1^4;
sbit LED_PARKING_2 = P1^5;sbit TRIG_3 = P2^4; //接口定义
sbit ECHO_3 = P2^5; //接口定义
sbit LED_VOID_3 = P2^3;
sbit LED_PARKING_3 = P2^2;unsigned char dis0[21]; //定义显示区域临时存储数组bit disFlag = 0; //显示标志
unsigned char i;unsigned char occupiedFlag1 = 0; //位置标志1
unsigned char occupiedFlag2 = 0; //位置标志2
unsigned char occupiedFlag3 = 0; //位置标志3
unsigned char occupiedNum = 0; //占用总数
unsigned char channel = 0; //通道
float f_distance[3] = 0; //距离//函数声明
void Timer0_Init(void);
void Timer1_Init(void);
void Measuring(unsigned char channel);
void UART_SendStr(unsigned char *s, unsigned char length);
void UART_Init(void);
void UART_SendByte(unsigned char dat);void main(void)
{TRIG_1 = 0;TRIG_2 = 0;TRIG_3 = 0;Timer0_Init(); //定时器0初始化Timer1_Init(); //定时器1初始化DelayS(1);UART_Init(); //初始化串口/************************* WIFI模式配置 *************************/UART_SendStr("AT+CIPMUX=1\r\n", 13); //打开多连接DelayS(1);UART_SendStr("AT+CIPSERVER=1,8080\r\n", 21); //建立服务 端口号为8080LCD_Init();  //初始化液晶DelayMs(20); //延时有助于稳定LCD_Clear(); //清屏while (1){if (disFlag == 1) //定时显示 2s刷新一次{disFlag = 0; //标志位清零channel++;if (channel > 3){channel = 1;}Measuring(channel);sprintf(dis0, "   Channel %02d   ", (int)channel);LCD_DispStr(0, 0, dis0);sprintf(dis0, "    %7.2fmm   ", f_distance[channel-1]);LCD_DispStr(0, 1, dis0);UART_SendStr("AT+CIPSEND=0,21\r\n", 17); //发送数据DelayMs(100);sprintf(dis0, "Channel %02d:%7.2fmm\r\n", (int)channel, f_distance[channel-1]);UART_SendStr(dis0, 21); //发送数据}}
}void Measuring(unsigned char channel)
{static long cnt = 0; //定时器计数TR1 = 0;if (channel == 1){TRIG_1 = 1; //启动一次模块        //不可以使用其他终端 容易造成死循环DelayUs10x(1);TRIG_1 = 0;while (!ECHO_1);    //当RX为零时等待TR0 = 1; //开启计数while (ECHO_1); //当RX为1计数并等待TR0 = 0;cnt = (long)(TH0 * 256 + TL0);TH0 = 0;TL0 = 0;f_distance[0] = (float)cnt * 17 / 100.0 * 1.102; //算出来是mm (g_cnt * 340 / 2) / 1000.0 * 1.102;系数cnt = 0;}else if (channel == 2){TRIG_2 = 1; //启动一次模块      //不可以使用其他终端 容易造成死循环DelayUs10x(1);TRIG_2 = 0;while (!ECHO_2);    //当RX为零时等待TR0 = 1; //开启计数while (ECHO_2); //当RX为1计数并等待TR0 = 0;cnt = (long)(TH0 * 256 + TL0);TH0 = 0;TL0 = 0;f_distance[1] = (float)cnt * 17 / 100.0 * 1.102; //算出来是mm (g_cnt * 340 / 2) / 1000.0 * 1.102;系数cnt = 0;        }else if (channel == 3){TRIG_3 = 1; //启动一次模块      //不可以使用其他终端 容易造成死循环DelayUs10x(1);TRIG_3 = 0;while (!ECHO_3);    //当RX为零时等待TR0 = 1; //开启计数while (ECHO_3); //当RX为1计数并等待TR0 = 0;cnt = (long)(TH0 * 256 + TL0);TH0 = 0;TL0 = 0;f_distance[2] = (float)cnt * 17 / 100.0 * 1.102; //算出来是mm (g_cnt * 340 / 2) / 1000.0 * 1.102;系数cnt = 0;}TR1 = 1;
}void Timer0_Init(void)
{TMOD &= 0xF0;                //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TMOD |= 0x01;                //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH0 = 0; //重新赋值TL0 = 0;EA = 1;  //总中断打开
}void Timer1_Init(void)
{TMOD &= 0x0F;                //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TMOD |= 0x10;                //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TL1 = 0x00;     //设置定时初值 50msTH1 = 0x4C;       //设置定时初值EA = 1;  //总中断打开ET1 = 1; //定时器中断打开TR1 = 1; //定时器开关打开
}void Timer1_Interrupt(void) interrupt 3
{static unsigned int time_50ms = 0;TL1 = 0x00;        //设置定时初值 50msTH1 = 0x4C;       //设置定时初值time_50ms++;if (time_50ms >= 40){disFlag = 1;time_50ms = 0;}
}/************************* 串口配置 *************************/
void UART_Init(void)
{SCON = 0x50;TH2 = 0xFF;TL2 = 0xFD;RCAP2H = 0xFF;  //(65536-(FOSC/32/BAUD))   BAUD = 115200 FOSC = 11059200RCAP2L = 0xFD;/*****************/TCLK = 1;RCLK = 1;C_T2 = 0;EXEN2 = 0;/*****************/TR2 = 1;ES   = 0; //关闭串口中断EA   = 1; //打开总中断
}/************************* 串口发送字节 *************************/
void UART_SendByte(unsigned char dat) //串口发送单字节数据
{unsigned char time_out;time_out = 0;SBUF = dat;                        //将数据放入SBUF中while ((!TI) && (time_out < 100)) //检测是否发送出去{time_out++;DelayUs10x(2);}      //未发送出去 进行短暂延时TI = 0; //清除ti标志
}/************************* 串口发送字符串 *************************/
void UART_SendStr(unsigned char *s, unsigned char length)
{unsigned char num;num = 0x00;while (num < length) //发送长度对比{UART_SendByte(*s); //放松单字节数据s++;            //指针++num++;            //下一个++}
}void UART_Interrupt(void) interrupt 4 //串行中断服务程序
{if (RI)//判断是接收中断产生{RI = 0; //标志位清零}
}

仿真演示视频:
https://www.bilibili.com/video/BV11Y411F7qa/

实物演示视频:
https://www.bilibili.com/video/BV1cr4y1t7HY/

基于51单片机的三路超声测距仪设计wifi通信proteus仿真原理图PCB相关推荐

  1. 基于51单片机的数字电容容值测量仪proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.系统支持15pF~450uF电容测量 2.按键可更改测量量程 3.除了采用LCD1602可以实时显示测量参数,同时具有LED可以显示各个档位 ...

  2. 基于51单片机的万年历(带温湿度)带闹钟功能proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶显示当前时间和温湿度 2.按键可切换页面,显示农历,显示闹钟设置 3.当时间到达设定闹钟时间时,蜂鸣器报警 原理图: PCB ...

  3. 基于51单片机的温度甲烷监测报警串口上报proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前温度和甲烷浓度 2.超过甲烷浓度阈值,蜂鸣器报警 3.按键可更改甲烷浓度阈值上限和启动/暂停检测 4.0`20% ...

  4. 基于51单片机的大棚环境土壤湿度光强监测系统proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.系统实时监测当前温湿度/土壤湿度/环境光强并显示 2.温湿度超过设定阈值范围,蜂鸣器响,同时开启对应控制继电器 3.土壤湿度低于设定下限,开启 ...

  5. 基于51单片机的水温水流量检测/智能水龙头控制系统proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.液晶实时显示当前的设定温度/实际温度/水龙头状态和水流量 2.按键可开关水龙头,当温度低于设定温度时,启动加热控制继电器,给水加热, 当加热到(设 ...

  6. 基于51单片机的八路多路温度测控系统proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时滚动显示8路温度传感器检测的温度值及设定温度值 2.当8路平均温度超过设定温度阈值范围,蜂鸣器报警,同时启动加热或降温装 ...

  7. 基于51单片机NRF24L01的远程水压监控及控制proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.系统分为主机和从机. 2.从机负责设定压力阈值.屏幕显示及蜂鸣器报警. 3.从机负责检测当前的水压值,并通过对比设定压力阈值,控制水泵继电器 ...

  8. 基于51单片机的汽车超声波防撞声光报警系统proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时距离阈值/测试距离 2.低于距离阈值将声光报警 3.按键可更改距离阈值 原理图: PCB: 主程序: #include ...

  9. 基于51单片机PM2.5空气质量检测系统(源程序+仿真+原理图+PCB+论文)

    资料编号:208 功能介绍:(全套毕设资料齐全) 本电路是由51单片机为控制核心,另外主要通过5个模块的电路设计实现功能,他们分别是LCD显示模块.粉尘传感器.A/D转换.蜂鸣器电路.LED指示电路. ...

最新文章

  1. shell shocked什么意思_Shell 启动类型探究 ── login interactive
  2. 20181110-软件开发架构2
  3. Caffe + Ubuntu 14.04 64bit + CUDA 6.5 配置说明
  4. sublime text2如何连接FTP/SFTP——图文详细教程
  5. 用十条命令在一分钟内检查Linux服务器性能
  6. 算法(26)-最长系列
  7. python类class定义_python基础教程之类class定义使用方法
  8. python实现文件编码转换_Python实现批量转换文件编码的方法
  9. ajax上传 java_使用Ajax进行文件与其他参数的上传功能(java开发)
  10. 宏文件下载_Catia常用宏文件分享(压箱底)
  11. Struts2的OGNL表达式
  12. 3D旋转相册代码及详细使用教程
  13. CentOs7中安装python模块psycopg2,报错Error: pg_config executable not found.
  14. 芯片的原理应用与分类
  15. Javaer换坑指南之Linux
  16. 数据挖掘学习路线【转知乎某人的观点】
  17. web前端开发规范项目流程总结
  18. 三、C++反作弊对抗实战 (实战篇 —— 3.如何获取游戏中角色人物角色的名称坐标、血量、武器信息(非CE扫描))
  19. c++ 写入文件_常见数据库写入Webshell汇总
  20. 微信小程序直播间实现下拉刷新(目前全网最优最美观的方法)

热门文章

  1. AAAI 2022 | MAVEx—基于知识的视觉问答方法
  2. 特斯拉员工年薪曝光:软件工程师 109 万元
  3. 关于三代基因测序,你所需要知道的都在这儿!
  4. 2007年大学生电子设计大赛国赛电源类题目设计报告
  5. 台服天堂2更新服务器无响应,天堂2台服被限制怎么回事?该怎么解决?
  6. 强烈推荐,建议收藏,Java经典书籍汇总!分享Java那些口口相传的好书籍
  7. Apache Echarts常用图表之柱状图
  8. chrome.exe(或其他exe)- 损坏的映像
  9. 「机器学习」天池比赛:金融风控贷款违约预测
  10. virtualBox安装centos6增强包报错解决及配置共享文件夹