找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机通过esp8266和温度传感器将温度显示到手机上

  [复制链接]
跳转到指定楼层
楼主
需要的硬件:51单片机,ESP8266(wifi模块),DS18b20(温度传感器)
需要的软件:
手机要下载一个网络调试助手,浏览器就有。
      

部分代码:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P2^4;
sbit k1=P1^0;
sbit fmq=P1^4;
char receiveTable[20]="";
char aa[1]="";
uint temp,shi,ge,a,i,flag;
void delay(uint i)                //5us
{
        do
        {
                _nop_();             
                _nop_();
                _nop_();
                i--;
        }
        while(i);       
}
void delay1(uint z)                 //1ms
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void sendChar(uchar a)                                 //单片机发送一个字节
{
        SBUF = a;
        while(TI==0);
        TI=0;       
}

void sendString(uchar *s)                        //发送一个字符串
{
        while(*s!='\0')
        {
                sendChar(*s);
                s++;
        }
               
}
void init()
{
        /*串口中断定时器初始化*/
        TMOD=0x20;                                                        //定时器1工作在方式2  
        TH1=0xfd;                                                        //波特率为9600,精振为11.0592MHz
        TL1=0xfd;
        REN=1;                                                                //启动串行口接收数据
        SM0=0;                                                                //串口工作在方式1
        SM1=1;                                                                //串行口工作方式选择
        EA=1;                                                                //打开总中断
        TR1=1;                                                                //打开定时器中断
        /*esp8266初始化*/
    delay1(100);//延时
        sendString("AT+CWMODE=2\r\n");            //设置ESP8266工作在station模式
        delay1(100);       
//        sendString("AT+CIOBAUD=9600\r\n");        //设置9600波特率,因为esp8266波特率默认是115200
//        delay1(10);       
        sendString("AT+CIPMUX=1\r\n");                  //允许多连接
        delay1(100);
        sendString("AT+CIPSERVER=1,8080\r\n"); //设置端口号
        delay1(100);
        ES=1;                                          //开串口中断
}

void DS()        //初始化
{
        uchar x=0;
        DQ=1;                  //首先先拉高电平,为复位做准备
        delay(10);          //延迟一下
        DQ=0;                  //将电平拉低,延迟至少480us
        delay(120);          //一次为5us,此处延迟600us,足以等待存在脉冲
        DQ=1;                  //复位信号给出后,将电平拉高,等待获取存在脉冲
        delay(16);          //延迟15~60us,此处延迟90us,足以给存在脉冲时间
        x=DQ;                  //读取存在脉冲
        delay(80);          //读取存在脉冲,存在脉冲至少为60us到240us的低电平信号,这里给出400us
        DQ=1;                 
}
uchar Read1b()    //读取1个字节
{
        uchar i=0;
        uchar dat=0;
        for(i=0;i<8;i++)
        {
                DQ=0;                 //数据线拉成低电平,表示读数据的开始
                delay(1);                 //读数据时,需要低电平保持至少1us
                DQ=1;                         //释放数据总线
                dat>>=1;                 //一位一位的保存读取到的数据,所以需要移位处理
                if(DQ)                         //读取数据的高电平
                dat|=0x80;                 //与操作一下,得到我们需要的数据,读取数据需要在15us内读取,这样才能保证读取的数据是正确的
                delay(11);
        }
        return(dat);
}
void Write1b(uchar dat)
{
        uchar i=0;
        for(i=0;i<8;i++)
        {
                DQ=0;
                _nop_();
                DQ=dat&0x01;
                delay(12);
                DQ=1;
                dat>>=1;
                delay(5);       
        }                                                  
}                                  
uint Get()
{
        uchar templ,temph,tt;
        uint t;
        DS();                                   //初始化
        Write1b(0XCC);           //因为我们是一个单片机和一个DS18B20连接,故在对ROM指令操作时,选择0xCC跳过ROM指令,不对ROM编码作出反应
        Write1b(0x44);           //RAM操作中的温度转换指令,将转换的温度存入RAM的1,2地址
        DS();                                   //初始化
        Write1b(0xcc);           //同上
        Write1b(0xbe);           //从RAM中读取数据,从0地址读到9地址
        templ=Read1b();           //从DS18B20中读取温度数据中低八位
        temph=Read1b();           //从DS18B20中读取温度数据中的高八位,温度数据由16位数据组成
        t=temph;
        t<<=8;
        t=t|templ;
        tt=t*0.0625;                   /*真实温度的转换*/
        return(tt);               
}
void show(uint wd)
{
        aa[0]=wd/10+'0';          
        aa[1]=wd%10+'0';
}
void main()
{       

        init();
        while(1)
        {
                show(Get())        ;
        }
}
手机显示温度.zip (1.92 KB, 下载次数: 201)






评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:337280 发表于 2019-7-30 11:20 | 只看该作者
先收藏一下,以后能用到。楼主会不会那种手机上弄个APP的。
回复

使用道具 举报

板凳
ID:545795 发表于 2019-7-30 15:07 | 只看该作者
弓长张 发表于 2019-7-30 11:20
先收藏一下,以后能用到。楼主会不会那种手机上弄个APP的。

我的同学做出来了,但我不会。
回复

使用道具 举报

地板
ID:545795 发表于 2019-8-3 10:47 | 只看该作者
啦啦啦屁屁怪 发表于 2019-8-2 14:51
好想参考参考,没什么思路

可以先学习一下串口通信。
回复

使用道具 举报

5#
ID:666656 发表于 2019-12-17 23:25 来自手机 | 只看该作者
收藏了,学习下怎么配esp8266
回复

使用道具 举报

6#
ID:233456 发表于 2019-12-18 19:24 来自手机 | 只看该作者
为啥我在电脑上测试就可以连接手机,一安到单片机上就不行了呀
回复

使用道具 举报

7#
ID:65956 发表于 2019-12-19 18:02 | 只看该作者
下载学习了,谢谢分享
回复

使用道具 举报

8#
ID:617305 发表于 2019-12-20 10:04 | 只看该作者
收藏学习,下次验证
回复

使用道具 举报

9#
ID:718334 发表于 2020-4-26 19:34 来自手机 | 只看该作者
y晓风残月 发表于 2019-12-18 19:24
为啥我在电脑上测试就可以连接手机,一安到单片机上就不行了呀

你好 请问这个你解决了吗 我现在也碰到这个问题
回复

使用道具 举报

10#
ID:459794 发表于 2020-5-7 23:24 | 只看该作者
东宫承鄞 发表于 2020-4-26 19:34
你好 请问这个你解决了吗 我现在也碰到这个问题

是说用TTL转串口可以单片机不可以的意思吗?单片机的话需要代码哒
回复

使用道具 举报

11#
ID:459794 发表于 2020-5-8 14:46 | 只看该作者
sendString("AT+CWMODE=2\r\n");
注释错了,2应该是AP模式
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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