找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14538|回复: 33
打印 上一主题 下一主题
收起左侧

超声波测距ESP8266 WIFI无线传输手机显示原理图+app+源码

  [复制链接]
跳转到指定楼层
楼主


手机app:


全部资料51hei下载地址:
A60_ESP01_超声波测距APP.zip (1.79 MB, 下载次数: 500)


ESP8266可以配置成station 、AP、station+AP三种模式,就是说模块可以当成一个设备(client)连接局域网内的路由,也可以设置成是一个路由(sever),也可以既作为局域网里面的client同时又是其它client的sever

单片机源程序如下:
  1. /********************************************************************/
  2. /*        超声波测距 WIFI无线传输手机显示                                                                        */
  3. /********************************************************************/
  4. #include <REGX51.H>
  5. #include<intrins.h>
  6. #include <stdio.h>
  7. #define uint unsigned int
  8. #define uchar unsigned char
  9. sbit LED0=P3^2;  
  10. sbit TRIG=P2^0;                //TRIG
  11. sbit ECHO=P2^1;            //ECHO
  12. sbit DQ=P2^7;                //ds18b20 端口
  13. /*****************相关变量**************/
  14. uchar Receive,i,xm1,xm2,xm3,xm0;                              
  15. uint s,j;  
  16. uchar Recive_table[40];                  //用于接收wifi模块反馈到MCU上的数据
  17. uchar code ta[]="0123456789- ";  
  18. uchar table[]="温度: 25.4℃   距离:2.56m";
  19. float csbc,wdz;
  20. int temp;
  21. bit zf,flag;

  22. unsigned int ReadTemperature(void);
  23. bit Init_DS18B20(void);
  24. unsigned char ReadOneChar(void);
  25. void WriteOneChar(unsigned char dat);
  26. unsigned int ReadTemperature(void);
  27. bit Init_DS18B20(void);
  28. unsigned char ReadOneChar(void);
  29. void WriteOneChar(unsigned char dat);

  30. /*******************************************************************
  31. 名称:延时函数  作用:毫秒级延时,微妙级延时函数,为数据收发完成作等待.......  
  32. ********************************************************************/
  33. void ms_delay(uint t)
  34. {  
  35.         uint i,j;  
  36.         for(i=t;i>0;i--)   
  37.         for(j=110;j>0;j--);
  38. }   

  39. void us_delay(uchar t)
  40. {  
  41.         while(t--);
  42. }         
  43. /*------------------------------------------------
  44. uS延时函数,含有输入参数 unsigned char t,无返回值
  45. unsigned char 是定义无符号字符变量,其值的范围是
  46. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  47. 长度如下 T=tx2+5 uS
  48. ------------------------------------------------*/
  49. void DelayUs2x(unsigned char t);
  50. /*------------------------------------------------
  51. mS延时函数,含有输入参数 unsigned char t,无返回值
  52. unsigned char 是定义无符号字符变量,其值的范围是
  53. 0~255 这里使用晶振12M,精确延时请使用汇编
  54. ------------------------------------------------*/
  55. void DelayMs(unsigned char t);
  56. /*------------------------------------------------
  57. uS延时函数,含有输入参数 unsigned char t,无返回值
  58. unsigned char 是定义无符号字符变量,其值的范围是
  59. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  60. 长度如下 T=tx2+5 uS
  61. ------------------------------------------------*/
  62. void DelayUs2x(unsigned char t)
  63. {   
  64.          while(--t);
  65. }
  66. /*------------------------------------------------
  67. mS延时函数,含有输入参数 unsigned char t,无返回值
  68. unsigned char 是定义无符号字符变量,其值的范围是
  69. 0~255 这里使用晶振12M,精确延时请使用汇编
  70. ------------------------------------------------*/
  71. void DelayMs(unsigned char t)
  72. {
  73.           while(t--)                 //大致延时1mS
  74.          {
  75.              DelayUs2x(245);
  76.                  DelayUs2x(245);
  77.          }
  78. }


  79. /*------------------------------------------------
  80.                     18b20初始化
  81. ------------------------------------------------*/
  82. bit Init_DS18B20(void)
  83. {
  84.         bit dat=0;
  85.         DQ = 1;                                    //DQ复位
  86.          DelayUs2x(8);                   //稍做延时
  87.          DQ = 0;                         //单片机将DQ拉低
  88.          DelayUs2x(255);                 //精确延时 大于 480us 小于960us
  89.          DelayUs2x(255);
  90.          DQ = 1;                                //拉高总线
  91.          DelayUs2x(70);                         //15~60us 后 接收60-240us的存在脉冲
  92.          dat=DQ;                                //如果x=0则初始化成功, x=1则初始化失败
  93.          DelayUs2x(40);                         //稍作延时返回
  94.          return dat;
  95. }
  96. /*------------------------------------------------
  97.                     读取一个字节
  98. ------------------------------------------------*/
  99. unsigned char ReadOneChar(void)
  100. {
  101.         unsigned char i=0;
  102.         unsigned char dat = 0;
  103.         for (i=8;i>0;i--)
  104.          {
  105.                   DQ = 0;                         // 给脉冲信号
  106.                   dat>>=1;
  107.                   DQ = 1;                         // 给脉冲信号
  108.                   if(DQ)
  109.                    dat|=0x80;
  110.                   DelayUs2x(40);
  111.          }
  112.          return(dat);
  113. }
  114. /*------------------------------------------------
  115.                     写入一个字节
  116. ------------------------------------------------*/
  117. void WriteOneChar(unsigned char dat)
  118. {
  119.          unsigned char i=0;
  120.          for (i=8; i>0; i--)
  121.          {
  122.                   DQ = 0;
  123.                   DQ = dat&0x01;
  124.                   DelayUs2x(40);
  125.                   DQ = 1;
  126.                   dat>>=1;
  127.          }
  128.         DelayUs2x(40);
  129. }
  130. /*------------------------------------------------
  131.                     读取温度
  132. ------------------------------------------------*/
  133. unsigned int ReadTemperature(void)
  134. {
  135.         unsigned char a=0;
  136.         int b=0;
  137.         int t=0;
  138.         float tt=0;
  139.         while(Init_DS18B20());         //检测初始化是否成功
  140.         WriteOneChar(0xCC);         // 跳过读序号列号的操作
  141.         WriteOneChar(0x44);         // 启动温度转换
  142.         DelayMs(10);
  143.         Init_DS18B20();
  144.         WriteOneChar(0xCC);         //跳过读序号列号的操作
  145.         WriteOneChar(0xBE);         //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  146.         a=ReadOneChar();                   //低位
  147.         b=ReadOneChar();                   //高位
  148.         t=b;
  149.          t<<=8;
  150.          t=t|a;
  151.          tt=t*0.0625;
  152.          t= tt*10+0.5;
  153.          return(t);
  154. }
  155. void Uart_Init()                                //使用定时器1作为波特率发生器(STC89C52、STC89C51、AT89C51等均可)
  156. {  
  157.     TMOD = 0x21;
  158.     SCON = 0x50;                                 //设置串行方式
  159.     TH1 = 0xFD;                                         //波特率9600
  160.     TL1 = TH1;
  161.     PCON = 0x00;
  162.     EA = 1;                                                //总中断打开
  163.     ES = 1;                                                //开串口中断  
  164.     TR1 = 1;                                        //启动定时器1
  165. }

  166. /********************************************************************
  167. 名称:串口发送函数  功能:MCU向无线WIFI模块ESP8266发送数据  
  168. ********************************************************************/
  169. void Send_Uart(uchar value)
  170. {  
  171.         ES=0;                                                  //关闭串口中断  
  172.         TI=0;                                           //清发送完毕中断请求标志位   
  173.         SBUF=value;                                 //发送  
  174.         while(TI==0);                                 //等待发送完毕   
  175.         TI=0;                                           //清发送完毕中断请求标志位   
  176.         ES=1;                                                  //允许串口中断
  177.         TH0=0;
  178.         TL0=0;  
  179. }  

  180. /********************************************************************
  181. 名称:WIFI模块设置函数  作用: 启动模块,以便可以实现无线接入和控制  
  182. ********************************************************************/

  183. void ESP8266_Set(uchar *puf)         // 数组指针*puf指向字符串数组               
  184. {   
  185.         while(*puf!='\0')                    //遇到空格跳出循环  
  186.         {   
  187.                 Send_Uart(*puf);                  //向WIFI模块发送控制指令。   
  188.                 us_delay(5);   
  189.                 puf++;   
  190.         }  
  191.         us_delay(5);  
  192.         Send_Uart('\r');                         //回车  
  193.         us_delay(5);  
  194.         Send_Uart('\n');                           //换行  
  195. }

  196. /********************************************************************
  197. 名称:主函数  作用:程序的执行入口  
  198. ********************************************************************/

  199. void main()
  200. {         
  201.         Uart_Init();                                                                                        //波特率发生器
  202.         ms_delay(10);
  203.         ESP8266_Set("AT+CWMODE=2");                                                         //设置路由器模式1 station,模式2 AP,模式3 station+AP混合模式   
  204.         ms_delay(500);
  205. //        ESP8266_Set("AT+RST");                                                                         //重新启动wifi模块            
  206. //  ms_delay(1000);
  207.         ESP8266_Set("AT+CWSAP=\"wifi_yuan\",\"123456789\",11,4");          //AT+CWSAP="wifi_yuan","123456789",11,4  设置模块SSID:WIFI, PWD:密码 及安全类型加密模式(WPA2-PSK)
  208.         ms_delay(500);
  209.         ESP8266_Set("AT+CIPMUX=1");                                                                //开启多连接模式,允许多个各客户端接入
  210.         ms_delay(500);
  211.         ESP8266_Set("AT+CIPSERVER=1,5000");                                          //启动TCP/IP 实现基于网络//控制         ESP8266_Set("AT+CIPSERVER=1,5000");  
  212.         ms_delay(500);
  213.         ESP8266_Set("AT+CIPSTO=0");                                                         //永远不超时
  214.         ms_delay(500);
  215.         Init_DS18B20();         //初始化DS18B20温度传感器
  216.         ReadTemperature();
  217.         ES=1;                                                                                           //允许串口中断                 
  218.         LED0=0;         
  219.         while(1)   
  220.         {
  221.                 temp=ReadTemperature();                //测量温度
  222.                 if(temp<0)                                  //温度正负值判断处理
  223.                 {
  224.                            temp=-(temp-1);
  225.                            zf=1;
  226.                 }
  227.                 else
  228.                 {
  229.                         zf=0;
  230.                 }
  231.                 xm0=temp/1000;
  232.                 xm1=temp/100%10;//显示十位
  233.                 xm2=temp%100/10;//显示个位
  234.                 xm3=temp%10; //小数
  235.         if(zf==0)
  236.             {
  237.                         if(temp<1000)
  238.                         {
  239.                                 xm0=11;
  240.                                 if(temp<100)
  241.                                    {
  242.                                       xm1=11;
  243.                                 }
  244.                         }
  245.                 }
  246.                 else
  247.                 {
  248.                         if(temp<1000)
  249.                         {
  250.                                    xm0=10;
  251.                                    if(temp<100)
  252.                                    {
  253.                                         xm0=11;
  254.                                            xm1=10;
  255.                                 }
  256.                         }
  257.                 }
  258.                 table[6]=ta[xm0];
  259.                   table[7]=ta[xm1];
  260.                   table[8]=ta[xm2];
  261.                 table[10]=ta[xm3];
  262.                   TRIG=1;                               //启动一次HC-SR04超声波测距模块
  263.                   _nop_();
  264.                   _nop_();
  265.                   _nop_();
  266.                   _nop_();
  267.                   _nop_();
  268.                   _nop_();
  269.                   _nop_();
  270.                   _nop_();
  271.                   _nop_();
  272.                   _nop_();
  273.                   _nop_();
  274.                   _nop_();
  275.                   _nop_();
  276.                   _nop_();
  277.                   _nop_();
  278.                   _nop_();
  279.                   TRIG=0;
  280.                 ET0=1;        //启动计数器T0,用以计时
  281.                 TR0=1;
  282.                 EA=1;
  283.                 j=60;        //延时                  
  284.             while(j--)
  285.                 {
  286.                 }
  287.                 ECHO=1;
  288.         j=0;
  289.                    while(ECHO)                        //判断接收回路是否收到超声波的回波
  290.                 {
  291.                         j++;
  292.                         if(j>=2500)                        //如果达到一定时间没有收到回波,则将ECHO置零,退出接收回波处理程序
  293.                         ECHO=0;
  294.                 }
  295.                 TR0=0;
  296.                 s=TH0*256+TL0;                        //读取时间数据
  297.                 TH0=0;
  298.                 TL0=0;
  299.                 wdz=0.00000607*temp;   //温度补偿计算
  300.                 if(zf==0)
  301.                 {                                                                                                                                                                                       
  302. ……………………

  303. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


评分

参与人数 3黑币 +69 收起 理由
hbnpmw + 12
zqy181818 + 7
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏21 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:311663 发表于 2018-4-19 14:41 | 只看该作者
好东西,我也在研究!
回复

使用道具 举报

板凳
ID:303246 发表于 2018-5-7 11:42 | 只看该作者
楼主,请问一个问题,手机那个超声波测距的APP怎么连接到ESP8266呀,一直显示设备未连接,怎么连接上呀
回复

使用道具 举报

地板
ID:402683 发表于 2018-9-26 14:43 | 只看该作者
非常给力,正在研究
回复

使用道具 举报

5#
ID:104477 发表于 2018-10-7 21:40 来自手机 | 只看该作者
你们为什么写那个复杂程序,老师讲的同样的功能程序就那么简洁
回复

使用道具 举报

6#
ID:65956 发表于 2018-10-9 16:45 | 只看该作者
这个值得下载学习
回复

使用道具 举报

7#
ID:3802 发表于 2018-10-15 11:37 | 只看该作者
好东西,我也在研究!
回复

使用道具 举报

8#
ID:385681 发表于 2018-10-23 14:51 | 只看该作者
好东西,学习下
回复

使用道具 举报

9#
ID:63317 发表于 2018-10-25 05:28 | 只看该作者
谢谢分享资料
回复

使用道具 举报

10#
ID:427139 发表于 2018-11-15 16:17 | 只看该作者
以前做过,不过做的不深入,感谢
回复

使用道具 举报

11#
ID:104477 发表于 2018-11-16 19:58 来自手机 | 只看该作者
编译错误,说是SBUF   TI未定义
回复

使用道具 举报

12#
ID:430087 发表于 2018-11-25 12:55 | 只看该作者
好东西,我也在研究!
回复

使用道具 举报

13#
ID:432831 发表于 2018-11-25 14:55 | 只看该作者
好东西啊
回复

使用道具 举报

14#
ID:399179 发表于 2018-11-25 18:50 来自手机 | 只看该作者
努力学习中!
回复

使用道具 举报

15#
ID:434246 发表于 2018-11-28 12:35 | 只看该作者
很好,实训需要
回复

使用道具 举报

16#
ID:430534 发表于 2018-12-19 16:21 来自手机 | 只看该作者
这需要用那些软件编写程序啊
回复

使用道具 举报

17#
ID:450340 发表于 2018-12-20 23:50 来自手机 | 只看该作者
楼主,请问一个问题,手机那个超声波测距的APP怎么连接到ESP8266呀,一直显示设备未连接,怎么连接上呀
回复

使用道具 举报

18#
ID:450340 发表于 2018-12-20 23:51 来自手机 | 只看该作者
楼主,请问一个问题,手机那个超声波测距的APP怎么连接到ESP8266呀,一直显示设备未连接,怎么连接上呀
回复

使用道具 举报

19#
ID:358930 发表于 2018-12-28 06:27 来自手机 | 只看该作者
31143114sushe 发表于 2018-12-20 23:51
楼主,请问一个问题,手机那个超声波测距的APP怎么连接到ESP8266呀,一直显示设备未连接,怎么连接上呀

这个APP有一个固定IP和端口没办法直接改,要用E4A进行编程重新生成APP手机软件,不然就只能把的固件IP和端口烧成他的一样的。
回复

使用道具 举报

20#
ID:110875 发表于 2019-1-10 11:19 | 只看该作者
冰冰洁洁 发表于 2018-12-28 06:27
这个APP有一个固定IP和端口没办法直接改,要用E4A进行编程重新生成APP手机软件,不然就只能把的固件IP和 ...

我查看了APP的源码,这个APP的ip地址是192.168.4.1,端口号5000,一般的ESP8266_01/01s就是这个地址,可以直接连接,但是连接上了好像也没有数据显示 。
“事件 按钮1.被单击()
        客户1.连接服务器("192.168.4.1",5000,2000)
结束 事件”
回复

使用道具 举报

21#
ID:358930 发表于 2019-1-10 13:11 来自手机 | 只看该作者
13118302007 发表于 2019-1-10 11:19
我查看了APP的源码,这个APP的ip地址是192.168.4.1,端口号5000,一般的ESP8266_01/01s就是这个地址,可 ...

他的内网要改成10.10.10.208你说的那个IP和ESP8266固件版本中的定义不同,另他的编程有小问题,或是有意无意产生的,要改下不能直接编译用的,但我重做了E4A和下位机基本通过,只是原代码看来是增加了功能没调通,少有基础,仔细看一个晚上就能调通,因这个例程基础没有原则问题,只是小问题…………不行改天我上个调通版的,思路告诉大家,就是他程序中的温度补偿好像有问题,我也是迷茫了一阵子。这个程序完善的我没有发是因为原作者的程序很不错,不想画蛇添足了………再说我也没有时候去深找温度补偿的原因,就只是调通而已。。哈哈哈哈苏州冰冰洁洁

15470968581030.9181547079634033.jpg (222.13 KB, 下载次数: 39)

15470968581030.9181547079634033.jpg
回复

使用道具 举报

22#
ID:358930 发表于 2019-1-10 13:28 来自手机 | 只看该作者
13118302007 发表于 2019-1-10 11:19
我查看了APP的源码,这个APP的ip地址是192.168.4.1,端口号5000,一般的ESP8266_01/01s就是这个地址,可 ...

你不会没有烧写ESP8266固件吧?要烧的,烧完后改E4A中你看到IP为:10.10.10.208且固件烧好还要先用电脑网页去联ESP8266修改IP为10.10.40.208端口5000后保存。
回复

使用道具 举报

23#
ID:404522 发表于 2019-1-23 23:19 | 只看该作者
好东西,我也在研究!
回复

使用道具 举报

24#
ID:358930 发表于 2019-1-24 02:11 来自手机 | 只看该作者
13118302007 发表于 2019-1-10 11:19
我查看了APP的源码,这个APP的ip地址是192.168.4.1,端口号5000,一般的ESP8266_01/01s就是这个地址,可 ...

不要相信一般的,按我说的试试,反正我联上了,因为ESP8266是要烧固件的,你那一般的怎联人家这个不一般的呢?
回复

使用道具 举报

25#
ID:343102 发表于 2019-1-24 08:58 | 只看该作者
努力学习中!
回复

使用道具 举报

26#
ID:472368 发表于 2019-1-24 09:37 | 只看该作者
好东西,努力研究中
回复

使用道具 举报

27#
ID:472368 发表于 2019-1-24 09:48 | 只看该作者
关注中
回复

使用道具 举报

28#
ID:470227 发表于 2019-4-10 12:49 | 只看该作者
谢谢楼主,太赞了!
回复

使用道具 举报

29#
ID:518027 发表于 2019-4-21 19:41 | 只看该作者
谢谢楼主
回复

使用道具 举报

30#
ID:531751 发表于 2019-6-7 15:44 | 只看该作者
冰冰洁洁 发表于 2019-1-24 02:11
不要相信一般的,按我说的试试,反正我联上了,因为ESP8266是要烧固件的,你那一般的怎联人家这个不一般 ...

烧说明固件呢??能说一下吗?刚接触8266
回复

使用道具 举报

31#
ID:326512 发表于 2019-6-17 13:38 | 只看该作者
不错,好东西
回复

使用道具 举报

32#
ID:585455 发表于 2019-7-22 15:28 | 只看该作者
感謝無私分享
回复

使用道具 举报

33#
ID:837635 发表于 2020-11-10 16:18 来自手机 | 只看该作者
13118302007 发表于 2019-1-10 11:19
我查看了APP的源码,这个APP的ip地址是192.168.4.1,端口号5000,一般的ESP8266_01/01s就是这个地址,可 ...

最后调试好了吗,是什么问题呢
回复

使用道具 举报

34#
ID:626682 发表于 2021-6-28 09:23 | 只看该作者
很棒的案例66
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表