需要的硬件: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)
|