|
需要的硬件:51單片機(jī),ESP8266(wifi模塊),DS18b20(溫度傳感器)
需要的軟件:
手機(jī)要下載一個(gè)網(wǎng)絡(luò)調(diào)試助手,瀏覽器就有。
3B5CEB49CD45841E04C3EB987DBC4EF7.jpg (129.18 KB, 下載次數(shù): 51)
下載附件
2019-7-29 16:23 上傳
C7B2329CF1334A55E1DE1B80B85A7E18.jpg (26.53 KB, 下載次數(shù): 82)
下載附件
2019-7-29 16:23 上傳
部分代碼:
#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) //單片機(jī)發(fā)送一個(gè)字節(jié)
{
SBUF = a;
while(TI==0);
TI=0;
}
void sendString(uchar *s) //發(fā)送一個(gè)字符串
{
while(*s!='\0')
{
sendChar(*s);
s++;
}
}
void init()
{
/*串口中斷定時(shí)器初始化*/
TMOD=0x20; //定時(shí)器1工作在方式2
TH1=0xfd; //波特率為9600,精振為11.0592MHz
TL1=0xfd;
REN=1; //啟動串行口接收數(shù)據(jù)
SM0=0; //串口工作在方式1
SM1=1; //串行口工作方式選擇
EA=1; //打開總中斷
TR1=1; //打開定時(shí)器中斷
/*esp8266初始化*/
delay1(100);//延時(shí)
sendString("AT+CWMODE=2\r\n"); //設(shè)置ESP8266工作在station模式
delay1(100);
// sendString("AT+CIOBAUD=9600\r\n"); //設(shè)置9600波特率,因?yàn)閑sp8266波特率默認(rèn)是115200
// delay1(10);
sendString("AT+CIPMUX=1\r\n"); //允許多連接
delay1(100);
sendString("AT+CIPSERVER=1,8080\r\n"); //設(shè)置端口號
delay1(100);
ES=1; //開串口中斷
}
void DS() //初始化
{
uchar x=0;
DQ=1; //首先先拉高電平,為復(fù)位做準(zhǔn)備
delay(10); //延遲一下
DQ=0; //將電平拉低,延遲至少480us
delay(120); //一次為5us,此處延遲600us,足以等待存在脈沖
DQ=1; //復(fù)位信號給出后,將電平拉高,等待獲取存在脈沖
delay(16); //延遲15~60us,此處延遲90us,足以給存在脈沖時(shí)間
x=DQ; //讀取存在脈沖
delay(80); //讀取存在脈沖,存在脈沖至少為60us到240us的低電平信號,這里給出400us
DQ=1;
}
uchar Read1b() //讀取1個(gè)字節(jié)
{
uchar i=0;
uchar dat=0;
for(i=0;i<8;i++)
{
DQ=0; //數(shù)據(jù)線拉成低電平,表示讀數(shù)據(jù)的開始
delay(1); //讀數(shù)據(jù)時(shí),需要低電平保持至少1us
DQ=1; //釋放數(shù)據(jù)總線
dat>>=1; //一位一位的保存讀取到的數(shù)據(jù),所以需要移位處理
if(DQ) //讀取數(shù)據(jù)的高電平
dat|=0x80; //與操作一下,得到我們需要的數(shù)據(jù),讀取數(shù)據(jù)需要在15us內(nèi)讀取,這樣才能保證讀取的數(shù)據(jù)是正確的
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); //因?yàn)槲覀兪且粋(gè)單片機(jī)和一個(gè)DS18B20連接,故在對ROM指令操作時(shí),選擇0xCC跳過ROM指令,不對ROM編碼作出反應(yīng)
Write1b(0x44); //RAM操作中的溫度轉(zhuǎn)換指令,將轉(zhuǎn)換的溫度存入RAM的1,2地址
DS(); //初始化
Write1b(0xcc); //同上
Write1b(0xbe); //從RAM中讀取數(shù)據(jù),從0地址讀到9地址
templ=Read1b(); //從DS18B20中讀取溫度數(shù)據(jù)中低八位
temph=Read1b(); //從DS18B20中讀取溫度數(shù)據(jù)中的高八位,溫度數(shù)據(jù)由16位數(shù)據(jù)組成
t=temph;
t<<=8;
t=t|templ;
tt=t*0.0625; /*真實(shí)溫度的轉(zhuǎn)換*/
return(tt);
}
void show(uint wd)
{
aa[0]=wd/10+'0';
aa[1]=wd%10+'0';
}
void main()
{
init();
while(1)
{
show(Get()) ;
}
}
手機(jī)顯示溫度.zip
(1.92 KB, 下載次數(shù): 201)
2019-7-29 16:29 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|