历史上的今天
今天是:2024年12月16日(星期一)
2019年12月16日 | C51单片机利用ESP8266配置WIFI,发送温度数据的源码
2019-12-16 来源:51hei
使用DS18B20,ESP8266,实现WIFI传输温度,底层部分代码。其中WIFI是作为服务器,上位机作为客户端。
单片机源程序如下:
/***********************
程序名:wifi_3.c
功能:单片机与手机通信,实现温度信息的传输
编程人: baxlumen
************************/
#include "reg52.h"
#include #define uint unsigned int #define uchar unsigned char #define ulong unsigned long typedef unsigned int u16; typedef unsigned char u8; sbit DSPORT=P3^7; sbit moto=P1^1; sbit CLK = P3^6; //时钟 sbit DIN = P3^4; //输入 sbit CS = P3^5; //片选 #define LCD1602_DATAPINS P0 sbit LCD1602_E=P2^7; sbit LCD1602_RW=P2^5; sbit LCD1602_RS=P2^6; u16 sun; //光照 int temp; int sdata; //温度 int xiaoshu1; int xiaoshu2; float tp; uchar DisplayData[]={0,0,0,0,0,0,0,0}; /***************** 定义程序中所需要的延时 ********************/ void Delay1ms(uint y) { uint x; for( ; y>0; y--) { for(x=110; x>0; x--); } } void delay(u16 i) { while(i--); } void delay1ms() { unsigned char i; for(i=124;i>0;i--); //延时124*8+10=1002us } /******************************************************************************* * 函 数 名 : Lcd1602_Delay1ms * 函数功能 : 延时函数,延时1ms * 输 入 : c * 输 出 : 无 * 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。 *******************************************************************************/ void Lcd1602_Delay1ms(uint c) //误差 0us { uchar a,b; for (; c>0; c--) { for (b=199;b>0;b--) { for(a=1;a>0;a--); } } } /**************** 初始化DS18B20 ****************/ uchar Ds18b20Init() { uchar i; DSPORT = 0; //将总线拉低480us~960us i = 70; while(i--);//延时642us DSPORT = 1; //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低 i = 0; while(DSPORT) //等待DS18B20拉低总线 { Delay1ms(1); i++; if(i>5)//等待>5MS { return 0;//初始化失败 } } return 1;//初始化成功 } void Ds18b20WriteByte(uchar dat)//写入数据 { uint i, j; for(j=0; j<8; j++) { DSPORT = 0; //每写入一位数据之前先把总线拉低1us i++; DSPORT = dat & 0x01; //然后写入一个数据,从最低位开始 i=6; while(i--); //延时68us,持续时间最少60us DSPORT = 1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值 dat >>= 1; } } uchar Ds18b20ReadByte() //读数据 { uchar byte, bi; uint i, j; for(j=8; j>0; j--) { DSPORT = 0;//先将总线拉低1us i++; DSPORT = 1;//然后释放总线 i++; i++;//延时6us等待数据稳定 bi = DSPORT; //读取数据,从最低位开始读取 byte = (byte >> 1) | (bi << 7); i = 4; //读取完之后等待48us再接着读取下一个数 while(i--); } return byte; } void Ds18b20ChangTemp() //设置DS18B20 { Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0x44); //温度转换命令 //Delay1ms(100); //等待转换成功,而如果你是一直刷着的话,就不用这个延时了 } void Ds18b20ReadTempCom() //读取温度数据 { Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0xbe); //发送读取温度命令 } void Ds18b20ReadTemp() //将温度数据转化为十进制 { uchar tmh, tml,tem,tem2,tem3; Ds18b20ChangTemp(); //先写入转换命令 Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令 tml = Ds18b20ReadByte(); //读取温度值共16位,先读低字节 tmh = Ds18b20ReadByte(); //再读高字节 sdata = tml/16+tmh*16; if(sdata>29) //直流电机,当温度数值超过30度时启动 { moto=1; Delay1ms(3000); moto=0; } tem=tml/16+tmh*16; xiaoshu1 = (tml&0x0f)*10/16; //小数第一位 xiaoshu2 = (tml&0x0f)*100/16%10;//小数第二位 tem2=(tml&0x0f)*10/16; tem3=(tml&0x0f)*100/16%10; DisplayData[0] = sdata/10; DisplayData[1] = sdata%10; DisplayData[2] = '.'; DisplayData[3] =xiaoshu1; DisplayData[4] =xiaoshu2; } /******************** 串口通信初始化 *********************/ void UsartInit() { SCON=0X50; //设置为工作方式1 TMOD=0X20; //设置计数器工作方式2 PCON=0X80; //波特率加倍 TH1=0XF3; //计数器初始值设置,注意波特率是4800的 TL1=0XF3; ES=1; //打开接收中断 EA=1; //打开总中断 TR1=1; //打开计数器
下一篇:基于51单片机八路抢答器资料
史海拾趣
|
概述: CN3063是可以用太阳能电池供电的单节锂电池充电管理芯片.该器件 内部包括功率晶体管,应用时不需要外部的电流检测电阻和阻流二极管. 内 ...… 查看全部问答> |
|
摩托罗拉的MC9S08AC16的I/O口带负载能力是多少呀? 如题。 刚刚用这个东西,翻了规格书也不知道。 MC9S08AC16的I/O究竟可以驱动多大的电流,希望各位可以给出一个精确的数据。 谢谢啦。… 查看全部问答> |
|
一、概述 对于一般控制,设备间连锁可以通过串行网络完成。因此,BOSCH公司开发了CAN总线(Controller Area Network),并已取得国际标准化组织认证(ISO11898),其总线结构可参照I SO/OSI参考模型。同时,国际上一些大的半导体 ...… 查看全部问答> |
|
Directory(\"\\123\"):-Directory(\"war3 \") 可以在mycomputer目录下创建一个文件夹,请问这个文件夹的属性要怎么设置 ?… 查看全部问答> |
|
编译embedded flash出现了impossible constraint in `asm\'错误,不知道怎么解决,是修改makefile文件么?… 查看全部问答> |
|
本人最近在做T-DMB项目,想问问AAC++方面的! 我现在把SL包解析后获得SL包负载数据是如何组织的?我要对AAC++解码,该如何处理SL包的负载? 有搞过这方面的大侠吗?给点提示,定重谢! 我最想知道到底解析音频SL包后的数据是啥格 ...… 查看全部问答> |




