找回密码
 立即注册

QQ登录

只需一步,快速开始

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

C51单片机利用ESP8266配置WIFI,发送温度数据的源码

  [复制链接]
跳转到指定楼层
楼主
ID:317239 发表于 2018-4-26 18:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用DS18B20,ESP8266,实现WIFI传输温度,底层部分代码。其中WIFI是作为服务器,上位机作为客户端。

单片机源程序如下:
  1. /***********************
  2. 程序名:wifi_3.c
  3. 功能:单片机与手机通信,实现温度信息的传输
  4. 编程人: baxlumen
  5. ************************/
  6. #include "reg52.h"
  7. #include<intrins.h>
  8. #define uint unsigned int
  9. #define uchar unsigned char
  10. #define ulong  unsigned long
  11. typedef unsigned int u16;       
  12. typedef unsigned char u8;
  13. sbit DSPORT=P3^7;
  14. sbit moto=P1^1;


  15. sbit CLK  = P3^6;          //时钟
  16. sbit DIN  = P3^4;          //输入
  17. sbit CS   = P3^5;          //片选

  18. #define LCD1602_DATAPINS P0
  19. sbit LCD1602_E=P2^7;
  20. sbit LCD1602_RW=P2^5;
  21. sbit LCD1602_RS=P2^6;


  22. u16 sun;    //光照
  23. int temp;
  24. int sdata;           //温度
  25. int xiaoshu1;
  26. int xiaoshu2;

  27. float tp;
  28. uchar DisplayData[]={0,0,0,0,0,0,0,0};

  29. /*****************
  30. 定义程序中所需要的延时
  31. ********************/
  32. void Delay1ms(uint y)   
  33. {
  34.         uint x;
  35.         for( ; y>0; y--)
  36.         {
  37.                 for(x=110; x>0; x--);
  38.         }
  39. }
  40. void delay(u16 i)
  41. {
  42.         while(i--);       
  43. }
  44. void delay1ms()
  45. {
  46. unsigned char i;
  47. for(i=124;i>0;i--);  //延时124*8+10=1002us
  48. }
  49. /*******************************************************************************
  50. * 函 数 名         : Lcd1602_Delay1ms
  51. * 函数功能                   : 延时函数,延时1ms
  52. * 输    入         : c
  53. * 输    出         : 无
  54. * 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
  55. *******************************************************************************/

  56. void Lcd1602_Delay1ms(uint c)   //误差 0us
  57. {
  58.     uchar a,b;
  59.         for (; c>0; c--)
  60.         {
  61.                  for (b=199;b>0;b--)
  62.                  {
  63.                           for(a=1;a>0;a--);
  64.                  }      
  65.         }           
  66. }
  67. /****************
  68. 初始化DS18B20
  69. ****************/
  70. uchar Ds18b20Init()
  71. {
  72.         uchar i;
  73.         DSPORT = 0;                         //将总线拉低480us~960us
  74.         i = 70;       
  75.         while(i--);//延时642us
  76.         DSPORT = 1;                        //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
  77.         i = 0;
  78.         while(DSPORT)        //等待DS18B20拉低总线
  79.         {
  80.                 Delay1ms(1);
  81.                 i++;
  82.                 if(i>5)//等待>5MS
  83.                 {
  84.                         return 0;//初始化失败
  85.                 }
  86.        
  87.         }
  88.         return 1;//初始化成功
  89. }



  90. void Ds18b20WriteByte(uchar dat)//写入数据
  91. {
  92.         uint i, j;

  93.         for(j=0; j<8; j++)
  94.         {
  95.                 DSPORT = 0;                       //每写入一位数据之前先把总线拉低1us
  96.                 i++;
  97.                 DSPORT = dat & 0x01;  //然后写入一个数据,从最低位开始
  98.                 i=6;
  99.                 while(i--); //延时68us,持续时间最少60us
  100.                 DSPORT = 1;        //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
  101.                 dat >>= 1;
  102.         }
  103. }

  104. uchar Ds18b20ReadByte()          //读数据
  105. {
  106.         uchar byte, bi;
  107.         uint i, j;       
  108.         for(j=8; j>0; j--)
  109.         {
  110.                 DSPORT = 0;//先将总线拉低1us
  111.                 i++;
  112.                 DSPORT = 1;//然后释放总线
  113.                 i++;
  114.                 i++;//延时6us等待数据稳定
  115.                 bi = DSPORT;         //读取数据,从最低位开始读取               
  116.                 byte = (byte >> 1) | (bi << 7);                                                  
  117.                 i = 4;                //读取完之后等待48us再接着读取下一个数
  118.                 while(i--);
  119.         }                               
  120.         return byte;
  121. }

  122. void  Ds18b20ChangTemp() //设置DS18B20
  123. {
  124.         Ds18b20Init();
  125.         Delay1ms(1);
  126.         Ds18b20WriteByte(0xcc);                //跳过ROM操作命令                 
  127.         Ds18b20WriteByte(0x44);            //温度转换命令
  128.         //Delay1ms(100);        //等待转换成功,而如果你是一直刷着的话,就不用这个延时了
  129.    
  130. }

  131. void  Ds18b20ReadTempCom()        //读取温度数据
  132. {       

  133.         Ds18b20Init();
  134.         Delay1ms(1);
  135.         Ds18b20WriteByte(0xcc);         //跳过ROM操作命令
  136.         Ds18b20WriteByte(0xbe);         //发送读取温度命令
  137. }

  138. void Ds18b20ReadTemp()                //将温度数据转化为十进制
  139. {
  140.        
  141.         uchar tmh, tml,tem,tem2,tem3;
  142.         Ds18b20ChangTemp();                                 //先写入转换命令
  143.         Ds18b20ReadTempCom();                        //然后等待转换完后发送读取温度命令
  144.         tml = Ds18b20ReadByte();                //读取温度值共16位,先读低字节
  145.         tmh = Ds18b20ReadByte();                //再读高字节
  146.         sdata = tml/16+tmh*16;
  147.         if(sdata>29)       
  148.            //直流电机,当温度数值超过30度时启动
  149.                 {
  150.                   moto=1;
  151.                   Delay1ms(3000);
  152.                   moto=0;       
  153.                 }         
  154.         tem=tml/16+tmh*16;
  155.         xiaoshu1 = (tml&0x0f)*10/16; //小数第一位
  156.         xiaoshu2 = (tml&0x0f)*100/16%10;//小数第二位
  157.         tem2=(tml&0x0f)*10/16;
  158.     tem3=(tml&0x0f)*100/16%10;
  159.   
  160.     DisplayData[0] = sdata/10;
  161.         DisplayData[1] = sdata%10;
  162.         DisplayData[2] = '.';
  163.            DisplayData[3] =xiaoshu1;
  164.         DisplayData[4] =xiaoshu2;



  165.                
  166. }

  167. /********************
  168. 串口通信初始化
  169. *********************/
  170. void UsartInit()
  171. {
  172.         SCON=0X50;                        //设置为工作方式1
  173.         TMOD=0X20;                        //设置计数器工作方式2
  174.         PCON=0X80;                        //波特率加倍
  175.         TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
  176.         TL1=0XF3;
  177.         ES=1;                                                //打开接收中断
  178.         EA=1;                                                //打开总中断
  179.         TR1=1;                                                //打开计数器
  180. }
  181. void send(uchar *p)  //串口发送
  182. {       
  183.         while(*p != '\0')
  184.         {               
  185.                 SBUF = *p;
  186.                 while(!TI);
  187.                 TI = 0;                   //如果发送完毕,硬件会置位TI
  188.                 p++;                                                //TI清零
  189.         }                                                                         
  190. }
  191. void zhuanhuan(int i)
  192. {
  193. switch(i){         //温度数据的十位
  194.            case 1:
  195.            send("1");
  196.            break;
  197.            case 2:
  198.           send("2");
  199.            break;
  200.            case 3:
  201.            send("3");
  202.            break;
  203.            case 4:
  204.            send("4");
  205.            break;
  206.            case 5:
  207.            send("3");
  208.            break;
  209.            case 6:
  210.            send("6");
  211.            break;
  212.            case 7:
  213.            send("7");
  214.            break;
  215.            case 8:
  216.            send("8");
  217.            break;
  218.            case 9:
  219.            send("9");
  220.            break;
  221.        case 0:
  222.            send("0");
  223.            break;
  224. }
  225. }
  226. void zhuan2(int i)
  227. {
  228. switch(i){         //温度数据的十位
  229.            case 1:
  230.            send("1\r\n");
  231.            break;
  232.            case 2:
  233.           send("2\r\n");
  234.            break;
  235.            case 3:
  236.            send("3\r\n");
  237.            break;
  238.            case 4:
  239.            send("4\r\n");
  240.            break;
  241.            case 5:
  242.            send("5\r\n");
  243.            break;
  244.            case 6:
  245.            send("6\r\n");
  246.            break;
  247.            case 7:
  248.            send("7\r\n");
  249.            break;
  250.            case 8:
  251.            send("8\r\n");
  252.            break;
  253.            case 9:
  254.            send("9\r\n");
  255.            break;
  256.        case 0:
  257.            send("0\r\n");
  258.            break;
  259. }
  260. }
  261. /**********************
  262. *  函数功能:将温度光照数据转化为字符串类型,并发送出去
  263. *
  264. ***********************/
  265. void chuansong()
  266. {
  267.          zhuanhuan(sdata/10);
  268.          zhuanhuan(sdata%10);
  269.          send(".");
  270.          zhuanhuan(xiaoshu1);
  271.          zhuan2(xiaoshu2);
  272.          zhuanhuan(sun/1000);
  273.          zhuanhuan(sun%1000/100);
  274.          zhuanhuan(sun%1000%100/10);
  275.          zhuan2(sun%1000%100%10);


  276. }
  277. void SPI_Start(void)                //初始化数模SPI
  278. {
  279.         CLK = 0;
  280.         CS  = 1;
  281.         DIN = 1;
  282.         CLK = 1;
  283.         CS  = 0;               
  284. }
  285. void SPI_Write(uchar dat)        //使用SPI写入数据
  286. {
  287.         uchar i;
  288.         CLK = 0;
  289.         for(i=0; i<8; i++)
  290.         {
  291.                 DIN = dat >> 7;          //放置最高位
  292.                 dat <<= 1;
  293.                 CLK = 0;                        //上升沿放置数据

  294.                 CLK = 1;

  295.         }
  296. }
  297. uint SPI_Read(void)                  //使用SPI读取数据
  298. {
  299.         uint i, dat=0;
  300.         CLK = 0;
  301.         for(i=0; i<12; i++)                //接收12位数据
  302.         {
  303.                 dat <<= 1;

  304.                 CLK = 1;
  305.                 CLK = 0;

  306.                 dat |= DSPORT;

  307.         }
  308.         return dat;       
  309. }
  310. uint Read_AD_Data(uchar cmd)          //读取数摸数据
  311. {
  312.         uchar i;
  313.         uint AD_Value;
  314.         CLK = 0;
  315.         CS  = 0;
  316.         SPI_Write(cmd);
  317.         for(i=6; i>0; i--);         //延时等待转换结果
  318.         CLK = 1;          //发送一个时钟周期,清除BUSY
  319.         _nop_();
  320.         _nop_();
  321.         CLK = 0;
  322.         _nop_();
  323.         _nop_();
  324.         AD_Value=SPI_Read();
  325.         CS = 1;
  326.         return AD_Value;       
  327. }
  328. void datapros()                //读取光照值,设置读取间隔
  329. {

  330.         static u8 i;

  331.         if(i==5)
  332.         {
  333.                 i=0;
  334.                 sun = Read_AD_Data(0xA4);                //   AIN2 光敏电阻
  335.         }
  336.         i++;
  337.                                     
  338. }
  339. /*************************
  340. * 函数功能:将光照值按位放于字符数组DisplayData中
  341. *
  342. **************************/
  343. void suntr()
  344. {
  345.     int sun1,sun2,sun3;
  346.         sun1=sun%1000/100;
  347.         sun2=sun%1000%100/10;
  348.         sun3=sun%1000%100%10;
  349.         DisplayData[5]=sun1;
  350.         DisplayData[6]=sun2;
  351.         DisplayData[7]=sun3;
  352.        
  353. }
  354. /*******************************************************************************
  355. * 函 数 名         : LcdWriteCom
  356. * 函数功能                   : 向LCD写入一个字节的命令
  357. * 输    入         : com
  358. * 输    出         : 无
  359. *******************************************************************************/
  360. #ifndef         LCD1602_4PINS         //当没有定义这个LCD1602_4PINS时
  361. void LcdWriteCom(uchar com)          //写入命令
  362. {
  363.         LCD1602_E = 0;     //使能
  364.         LCD1602_RS = 0;           //选择发送命令
  365.         LCD1602_RW = 0;           //选择写入
  366.        
  367.         LCD1602_DATAPINS = com;     //放入命令
  368.         Lcd1602_Delay1ms(1);                //等待数据稳定

  369.         LCD1602_E = 1;                  //写入时序
  370.         Lcd1602_Delay1ms(5);          //保持时间
  371.         LCD1602_E = 0;
  372. }
  373. #else
  374. void LcdWriteCom(uchar com)          //写入命令
  375. {
  376.         LCD1602_E = 0;         //使能清零
  377.         LCD1602_RS = 0;         //选择写入命令
  378.         LCD1602_RW = 0;         //选择写入

  379.         LCD1602_DATAPINS = com;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
  380.         Lcd1602_Delay1ms(1);

  381.         LCD1602_E = 1;         //写入时序
  382.         Lcd1602_Delay1ms(5);
  383.         LCD1602_E = 0;

  384.         LCD1602_DATAPINS = com << 4; //发送低四位
  385.         Lcd1602_Delay1ms(1);

  386.         LCD1602_E = 1;         //写入时序
  387.         Lcd1602_Delay1ms(5);
  388.         LCD1602_E = 0;
  389. }
  390. #endif
  391. /*******************************************************************************
  392. * 函 数 名         : LcdWriteData
  393. * 函数功能                   : 向LCD写入一个字节的数据
  394. * 输    入         : dat
  395. * 输    出         : 无
  396. *******************************************************************************/                  
  397. #ifndef         LCD1602_4PINS                  
  398. void LcdWriteData(uchar dat)                        //写入数据
  399. {
  400.         LCD1602_E = 0;        //使能清零
  401.         LCD1602_RS = 1;        //选择输入数据
  402.         LCD1602_RW = 0;        //选择写入

  403.         LCD1602_DATAPINS = dat; //写入数据
  404.         Lcd1602_Delay1ms(1);

  405.         LCD1602_E = 1;   //写入时序
  406.         Lcd1602_Delay1ms(5);   //保持时间
  407.         LCD1602_E = 0;
  408. }
  409. #else
  410. void LcdWriteData(uchar dat)                        //写入数据
  411. {
  412.         LCD1602_E = 0;          //使能清零
  413.         LCD1602_RS = 1;          //选择写入数据
  414.         LCD1602_RW = 0;          //选择写入

  415.         LCD1602_DATAPINS = dat;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
  416.         Lcd1602_Delay1ms(1);

  417.         LCD1602_E = 1;          //写入时序
  418.         Lcd1602_Delay1ms(5);
  419.         LCD1602_E = 0;

  420.         LCD1602_DATAPINS = dat << 4; //写入低四位
  421.         Lcd1602_Delay1ms(1);

  422.         LCD1602_E = 1;          //写入时序
  423.         Lcd1602_Delay1ms(5);
  424.         LCD1602_E = 0;
  425. }
  426. #endif
  427. /*******************************************************************************
  428. * 函 数 名       : LcdInit()
  429. * 函数功能                 : 初始化LCD屏
  430. * 输    入       : 无
  431. * 输    出       : 无
  432. *******************************************************************************/                  
  433. #ifndef                LCD1602_4PINS
  434. void LcdInit()                                                  //LCD初始化子程序
  435. {
  436.         LcdWriteCom(0x38);  //开显示
  437.         LcdWriteCom(0x0c);  //开显示不显示光标
  438.         LcdWriteCom(0x06);  //写一个指针加1
  439.         LcdWriteCom(0x01);  //清屏
  440.         LcdWriteCom(0x80);  //设置数据指针起点
  441. }
  442. #else
  443. void LcdInit()                                                  //LCD初始化子程序
  444. {
  445.         LcdWriteCom(0x32);         //将8位总线转为4位总线
  446.         LcdWriteCom(0x28);         //在四位线下的初始化
  447.         LcdWriteCom(0x0c);  //开显示不显示光标
  448.         LcdWriteCom(0x06);  //写一个指针加1
  449.         LcdWriteCom(0x01);  //清屏
  450.         LcdWriteCom(0x80);  //设置数据指针起点
  451. }
  452. #endif

  453.   void LEDshow()
  454.   {
  455.   suntr();
  456.        LcdInit();
  457.            LcdWriteCom(0x88);        //写地址 80表示初始地址
  458.            LcdWriteData('C');
  459.            LcdWriteCom(0xc8);        //写地址 80表示初始地址
  460.            LcdWriteData('L');
  461.                    LcdWriteCom(0x82);                  //写地址 80表示初始地址
  462.             LcdWriteData('0'+DisplayData[0]); //百位
  463.                 LcdWriteCom(0x83);                 //写地址 80表示初始地址
  464.         LcdWriteData('0'+DisplayData[1]);
  465.         LcdWriteCom(0x84);               
  466.         LcdWriteData('0'+DisplayData[2]);
  467.                 LcdWriteCom(0x85);               
  468.         LcdWriteData('0'+DisplayData[3]);
  469.                 LcdWriteCom(0x86);               
  470.         LcdWriteData('0'+DisplayData[4]);
  471.                 LcdWriteCom(0xc2);                  //0x40+0x80为第二行
  472.             LcdWriteData('0'+DisplayData[5]); //百位
  473.                 LcdWriteCom(0xc3);                  
  474.             LcdWriteData('0'+DisplayData[6]);
  475.                 LcdWriteCom(0xc4);                  
  476.             LcdWriteData('0'+DisplayData[7]);
  477.                      
  478.   }  
  479. void main()
  480. {       
  481.    
  482.         UsartInit();
  483.      LcdInit();
  484.        
  485.         while(1)
  486.         {               
  487.        Ds18b20ReadTemp();          
  488.            datapros();
  489.                   
  490.            LEDshow();
  491.            Delay1ms(100);          
  492.           send("AT+CIPMUX=1\r\n");          //设置为多路链接
  493.           Delay1ms(100);
  494.       send("AT+CIPSERVER=1,8080\r\n");        //配置为服务器,8080端口
  495.           Delay1ms(100);                                                 
  496.      send("AT+CIPSEND=0,11\r\n");          //发送数据,并且数据长度为2个字节
  497.           Delay1ms(100);
  498.           chuansong();         //将温度数据发送出去
  499.           
  500.         }               
  501. }
复制代码

所有资料51hei提供下载:
WIFI.zip (3.76 KB, 下载次数: 263)


评分

参与人数 3黑币 +64 收起 理由
kljie1000 + 9
20180426 + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:318944 发表于 2018-4-29 15:37 | 只看该作者
你好,学长,这个代码很好,我想请教你一些东西,希望你能帮助我!
回复

使用道具 举报

板凳
ID:439093 发表于 2018-12-4 12:13 | 只看该作者
有问题大家别套用
回复

使用道具 举报

地板
ID:333124 发表于 2018-12-12 16:24 | 只看该作者
参考一下。感谢。
回复

使用道具 举报

5#
ID:445069 发表于 2019-1-21 10:07 | 只看该作者
多谢分享,参考学习。
回复

使用道具 举报

6#
ID:445069 发表于 2019-1-21 10:08 | 只看该作者
多谢分享,参考学习了。目前也正在学习ESP8266。
回复

使用道具 举报

7#
ID:383374 发表于 2019-1-22 00:45 来自手机 | 只看该作者
局域网还远程控制
回复

使用道具 举报

8#
ID:493151 发表于 2019-4-11 11:16 | 只看该作者
chuangsong函数没有啊
回复

使用道具 举报

9#
ID:514974 发表于 2019-4-17 21:09 | 只看该作者
多谢分享,参考学习了!

回复

使用道具 举报

10#
ID:627209 发表于 2019-10-21 18:56 | 只看该作者
赞,学习了
回复

使用道具 举报

11#
ID:620291 发表于 2019-12-15 22:35 | 只看该作者

多谢分享,参考学习了!
回复

使用道具 举报

12#
ID:666656 发表于 2019-12-17 20:18 | 只看该作者
厉害了,认真学习一下
回复

使用道具 举报

13#
ID:666819 发表于 2019-12-17 23:15 | 只看该作者
你给的这个很好,我使用效果很帮。谢谢
回复

使用道具 举报

14#
ID:702628 发表于 2020-3-9 18:41 | 只看该作者
谢谢好人一生平安
回复

使用道具 举报

15#
ID:404726 发表于 2020-3-9 20:01 | 只看该作者
谢谢分享~~~~~~~~~~~~真实我需要的
回复

使用道具 举报

16#
ID:8222 发表于 2020-3-25 23:40 | 只看该作者
谢谢分享,下载学习。
回复

使用道具 举报

17#
ID:687694 发表于 2020-3-26 20:36 | 只看该作者
你这个zhuanhuan()有意思。。。其实数据+0x30即可。。
回复

使用道具 举报

18#
ID:695451 发表于 2020-6-1 16:28 | 只看该作者
大家能使用吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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