单片机
返回首页

ESP8266无线18B20温度手机接收有源代码和开源

2019-11-25 来源:51hei

WIFI无线通信结合手机E4A编程,很好的学习例程,开源全部代码,如ESP8266无线网地址是直接做进E4A了,每次一键接入,初始值10.10.10.208
端口5000
不会E4A的就只能按这个值烧录ESP8266模块了。会E4A就直接改成你自己的IP

 

单片机源程序:

/********************************************************************/ 

/*         WIFI无线传输手机显示                                                                        */

/********************************************************************/

#include

#include

#include

#define uint unsigned int 

#define uchar unsigned char 


/*****************相关变量**************/ 

uint Receive,i,xm1,xm2,xm3,xm0;                              

long s;  


[size=36.9444px]uchar Recive_table[40];                  //用于接收wifi模块反馈到MCU上的数据 [/size]

uchar code ta[]='0123456789- '; //测试一下 

uchar table[]='温度:00.0 C';//传送用定位模板


sbit dq=P3^7;//18B20总线接口。DQ


bit tflag;//定义一个温度标志位。+、-

uint tvalue;//定义一个全局变量,用来合高低8位温度//显示温度




void delay (int a)//毫秒级延时

{

int x,y;

for(x=a;x>0;x--)

        for(y=110;y>0;y--);

}

void delayus(int t)//微秒级延时

{

while(t--);

}

/******************************************************************* 

名称:延时函数  作用:毫秒级延时,微妙级延时函数,为数据收发完成作等待.......  

********************************************************************/ 

void ms_delay(uint t) 

{  

        uint i,j;  

        for(i=t;i>0;i--)   

        for(j=110;j>0;j--); 

}   


void us_delay(uchar t) 

{  

        while(t--); 

}         

/*------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

长度如下 T=tx2+5 uS 

------------------------------------------------*/

void DelayUs2x(unsigned char t);

/*------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编

------------------------------------------------*/

void DelayMs(unsigned char t);

/*------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

长度如下 T=tx2+5 uS 

------------------------------------------------*/

void DelayUs2x(unsigned char t)

{   

[size=36.9444px]         while(--t);[/size]

}

/*------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编

------------------------------------------------*/

void DelayMs(unsigned char t)

{

[size=36.9444px]          while(t--)                 //大致延时1mS[/size]

[size=36.9444px]         {[/size]

[size=36.9444px]             DelayUs2x(245);[/size]

                 DelayUs2x(245);

[size=36.9444px]         }[/size]

}


[size=36.9444px]void Uart_Init()                                //使用定时器1作为波特率发生器(STC89C52、STC89C51、AT89C51等均可) [/size]

{  

    TMOD = 0x21;

[size=36.9444px]    SCON = 0x50;                                 //设置串行方式[/size]

[size=36.9444px]    TH1 = 0xFD;                                         //波特率9600[/size]

    TL1 = TH1;

    PCON = 0x00;

[size=36.9444px]    EA = 1;                                                //总中断打开 [/size]

[size=36.9444px]    ES = 1;                                                //开串口中断  [/size]

[size=36.9444px]    TR1 = 1;                                        //启动定时器1[/size]


/******************************************************************** 

名称:串口发送函数  功能:MCU向无线WIFI模块ESP8266发送数据  

********************************************************************/ 

void Send_Uart(uchar value) 

{  

        ES=0;                                                  //关闭串口中断  

        TI=0;                                           //清发送完毕中断请求标志位   

        SBUF=value;                                 //发送  

        while(TI==0);                                 //等待发送完毕   

        TI=0;                                           //清发送完毕中断请求标志位   

        ES=1;                                                  //允许串口中断

        TH0=0;

        TL0=0;  

}  


/******************************************************************** 

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

********************************************************************/ 


[size=36.9444px]void ESP8266_Set(uchar *puf)         // 数组指针*puf指向字符串数组                [/size]

{    

        while(*puf!='')                    //遇到空格跳出循环  

        {   

                Send_Uart(*puf);                  //向WIFI模块发送控制指令。   

                us_delay(5);   

                puf++;    

        }  

        us_delay(5);  

        Send_Uart('r');                         //回车  

        us_delay(5);  

        Send_Uart('n');                           //换行  

void ds18b20rst()//复位

{

dq=1;

delay(5);

dq=0;

delayus(400);

dq=1;

delayus(50);

}

uchar ds18b20rd()//读数据

{

uchar i=0;

uchar dat=0;//用DAT把读出来的数据存起来

for(i=0;i<8;i++)

{

dq=0;

dat>>=1;//DAT不但右移一位,还起到延时一微秒的作用

dq=1;

if(dq==1)//还可写(if(dq))

dat|=0x80;//DAT或上0X80

delayus(15);

}

return(dat);//调用DAT 

}

uchar ds18b20wr(uchar com)//写数据/命令 

{

                uchar i=0;

                for (i=0; i<8; i++)

  {

        dq=0;

        dq=com&0x01;//写的数和0x01与一下

        delayus(15);

        dq=1;

        com>>=1;//数据

        }

}

uint read_temp()//读温度,大于256用uint

{

uchar a,b;//定义两个数为二进制温度。

ds18b20rst();//复位

ds18b20wr(0xcc);//跳过读ROM

ds18b20wr(0x44);//发送温度转换指令

ds18b20rst();//复位

ds18b20wr(0xcc);//跳过读ROM

ds18b20wr(0xbe);//读暂存器

a=ds18b20rd();//A只能读到低8位。

b=ds18b20rd();//B只能读到高8位。

tvalue=b;

tvalue=tvalue<<8;//左移8位//把B中的数据去高8位。也可写成(tvalue=tvalue<<8;)//tvalue=tvalue*256;//tvalue<<=8;

tvalue|=a;//和A或一下,完整的tvalue值就被读走了

if(tvalue<0xffff)

                tflag=0;

  else 

  {

  tvalue=~tvalue+1;//得出原数据

                tflag=1;

        }

                tvalue=tvalue*0.625;//把数据乘以精度=温度。为了显示要扩大10倍。(0.0625)

                return(tvalue);//返回tvalue值

}


/******************************************************************** 

名称:主函数  作用:程序的执行入口  

********************************************************************/ 


void main() 

[size=36.9444px]{          [/size]

        Uart_Init();                                                                                        //波特率发生器 

        ms_delay(10);

        ESP8266_Set('AT+CWMODE=2');                                                         //设置路由器模式1 station,模式2 AP,模式3 station+AP混合模式   

        ms_delay(500);

[size=36.9444px]//        ESP8266_Set('AT+RST');                                                                         //重新启动wifi模块            [/size]

//  ms_delay(1000);

        ESP8266_Set('AT+CWSAP='wifi_yuan','123456789',11,4');          //AT+CWSAP='wifi_yuan','123456789',11,4  设置模块SSID:WIFI, PWD:密码 及安全类型加密模式(WPA2-PSK) 

        ms_delay(500);

        ESP8266_Set('AT+CIPMUX=1');                                                                //开启多连接模式,允许多个各客户端接入 

        ms_delay(500);

        ESP8266_Set('AT+CIPSERVER=1,5000');                                          //启动TCP/IP 实现基于网络//控制         ESP8266_Set('AT+CIPSERVER=1,5000');  

        ms_delay(500);

        ESP8266_Set('AT+CIPSTO=0');                                                         //永远不超时

        ms_delay(500);         

        ES=1;                                                                                           //允许串口中断                 


        while(1)   

        {                

            read_temp();//读温度

                  ms_delay(500);

                  s=tvalue;

                

                  xm0=(s/100)%10;//存放百位数据

[size=36.9444px]                  xm1=(s/10)%10;  //存放十位数据[/size]

[size=36.9444px]                  xm2=s%10;  //存放个位数据[/size]

                

                  table[6]=ta[xm0];

[size=36.9444px]                  table[7]=ta[xm1];[/size]

[size=36.9444px]                  table[9]=ta[xm2];  [/size]

           

                  ESP8266_Set(table);//距离数据发送出去

            ms_delay(500);

                

        }    

}    


/*********************************************************************  

名称:串行通讯中断  作用:发送或接收结束后进入该函数,对相应的标志位软件清0,实现模块对数据正常的收发。  

********************************************************************/ 


void Uart_Interrupt() interrupt 4         

{    

        static uchar i=0;  

        if(RI==1)  

        {   

                RI=0;   

                Receive=SBUF;                                                        //MCU接收wifi模块反馈回来的数据       

                Recive_table[i]=Receive;   

                if((Recive_table[i]=='n'))

                {                     

                        i=0;

                }    

                else i++;                                                                                  //遇到换行 重新装值  

        }   

        else TI=0;   

}  



进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 带有短路保护系统的5V直流稳压电源电路图

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章