欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
C51單片機利用ESP8266配置WIFI,發送溫度數據的源碼
[打印本頁]
作者:
baxlumen
時間:
2018-4-26 18:53
標題:
C51單片機利用ESP8266配置WIFI,發送溫度數據的源碼
使用DS18B20,ESP8266,實現WIFI傳輸溫度,底層部分代碼。其中WIFI是作為服務器,上位機作為客戶端。
單片機源程序如下:
/***********************
程序名:wifi_3.c
功能:單片機與手機通信,實現溫度信息的傳輸
編程人: baxlumen
************************/
#include "reg52.h"
#include<intrins.h>
#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; //打開計數器
}
void send(uchar *p) //串口發送
{
while(*p != '\0')
{
SBUF = *p;
while(!TI);
TI = 0; //如果發送完畢,硬件會置位TI
p++; //TI清零
}
}
void zhuanhuan(int i)
{
switch(i){ //溫度數據的十位
case 1:
send("1");
break;
case 2:
send("2");
break;
case 3:
send("3");
break;
case 4:
send("4");
break;
case 5:
send("3");
break;
case 6:
send("6");
break;
case 7:
send("7");
break;
case 8:
send("8");
break;
case 9:
send("9");
break;
case 0:
send("0");
break;
}
}
void zhuan2(int i)
{
switch(i){ //溫度數據的十位
case 1:
send("1\r\n");
break;
case 2:
send("2\r\n");
break;
case 3:
send("3\r\n");
break;
case 4:
send("4\r\n");
break;
case 5:
send("5\r\n");
break;
case 6:
send("6\r\n");
break;
case 7:
send("7\r\n");
break;
case 8:
send("8\r\n");
break;
case 9:
send("9\r\n");
break;
case 0:
send("0\r\n");
break;
}
}
/**********************
* 函數功能:將溫度光照數據轉化為字符串類型,并發送出去
*
***********************/
void chuansong()
{
zhuanhuan(sdata/10);
zhuanhuan(sdata%10);
send(".");
zhuanhuan(xiaoshu1);
zhuan2(xiaoshu2);
zhuanhuan(sun/1000);
zhuanhuan(sun%1000/100);
zhuanhuan(sun%1000%100/10);
zhuan2(sun%1000%100%10);
}
void SPI_Start(void) //初始化數模SPI
{
CLK = 0;
CS = 1;
DIN = 1;
CLK = 1;
CS = 0;
}
void SPI_Write(uchar dat) //使用SPI寫入數據
{
uchar i;
CLK = 0;
for(i=0; i<8; i++)
{
DIN = dat >> 7; //放置最高位
dat <<= 1;
CLK = 0; //上升沿放置數據
CLK = 1;
}
}
uint SPI_Read(void) //使用SPI讀取數據
{
uint i, dat=0;
CLK = 0;
for(i=0; i<12; i++) //接收12位數據
{
dat <<= 1;
CLK = 1;
CLK = 0;
dat |= DSPORT;
}
return dat;
}
uint Read_AD_Data(uchar cmd) //讀取數摸數據
{
uchar i;
uint AD_Value;
CLK = 0;
CS = 0;
SPI_Write(cmd);
for(i=6; i>0; i--); //延時等待轉換結果
CLK = 1; //發送一個時鐘周期,清除BUSY
_nop_();
_nop_();
CLK = 0;
_nop_();
_nop_();
AD_Value=SPI_Read();
CS = 1;
return AD_Value;
}
void datapros() //讀取光照值,設置讀取間隔
{
static u8 i;
if(i==5)
{
i=0;
sun = Read_AD_Data(0xA4); // AIN2 光敏電阻
}
i++;
}
/*************************
* 函數功能:將光照值按位放于字符數組DisplayData中
*
**************************/
void suntr()
{
int sun1,sun2,sun3;
sun1=sun%1000/100;
sun2=sun%1000%100/10;
sun3=sun%1000%100%10;
DisplayData[5]=sun1;
DisplayData[6]=sun2;
DisplayData[7]=sun3;
}
/*******************************************************************************
* 函 數 名 : LcdWriteCom
* 函數功能 : 向LCD寫入一個字節的命令
* 輸 入 : com
* 輸 出 : 無
*******************************************************************************/
#ifndef LCD1602_4PINS //當沒有定義這個LCD1602_4PINS時
void LcdWriteCom(uchar com) //寫入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //選擇發送命令
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待數據穩定
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5); //保持時間
LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com) //寫入命令
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 0; //選擇寫入命令
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = com; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = com << 4; //發送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 數 名 : LcdWriteData
* 函數功能 : 向LCD寫入一個字節的數據
* 輸 入 : dat
* 輸 出 : 無
*******************************************************************************/
#ifndef LCD1602_4PINS
void LcdWriteData(uchar dat) //寫入數據
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //選擇輸入數據
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = dat; //寫入數據
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5); //保持時間
LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat) //寫入數據
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //選擇寫入數據
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = dat; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //寫入低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 數 名 : LcdInit()
* 函數功能 : 初始化LCD屏
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
#ifndef LCD1602_4PINS
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //開顯示
LcdWriteCom(0x0c); //開顯示不顯示光標
LcdWriteCom(0x06); //寫一個指針加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //設置數據指針起點
}
#else
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x32); //將8位總線轉為4位總線
LcdWriteCom(0x28); //在四位線下的初始化
LcdWriteCom(0x0c); //開顯示不顯示光標
LcdWriteCom(0x06); //寫一個指針加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //設置數據指針起點
}
#endif
void LEDshow()
{
suntr();
LcdInit();
LcdWriteCom(0x88); //寫地址 80表示初始地址
LcdWriteData('C');
LcdWriteCom(0xc8); //寫地址 80表示初始地址
LcdWriteData('L');
LcdWriteCom(0x82); //寫地址 80表示初始地址
LcdWriteData('0'+DisplayData[0]); //百位
LcdWriteCom(0x83); //寫地址 80表示初始地址
LcdWriteData('0'+DisplayData[1]);
LcdWriteCom(0x84);
LcdWriteData('0'+DisplayData[2]);
LcdWriteCom(0x85);
LcdWriteData('0'+DisplayData[3]);
LcdWriteCom(0x86);
LcdWriteData('0'+DisplayData[4]);
LcdWriteCom(0xc2); //0x40+0x80為第二行
LcdWriteData('0'+DisplayData[5]); //百位
LcdWriteCom(0xc3);
LcdWriteData('0'+DisplayData[6]);
LcdWriteCom(0xc4);
LcdWriteData('0'+DisplayData[7]);
}
void main()
{
UsartInit();
LcdInit();
while(1)
{
Ds18b20ReadTemp();
datapros();
LEDshow();
Delay1ms(100);
send("AT+CIPMUX=1\r\n"); //設置為多路鏈接
Delay1ms(100);
send("AT+CIPSERVER=1,8080\r\n"); //配置為服務器,8080端口
Delay1ms(100);
send("AT+CIPSEND=0,11\r\n"); //發送數據,并且數據長度為2個字節
Delay1ms(100);
chuansong(); //將溫度數據發送出去
}
}
復制代碼
所有資料51hei提供下載:
WIFI.zip
(3.76 KB, 下載次數: 264)
2018-4-26 18:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
Kevin_CraZy
時間:
2018-4-29 15:37
你好,學長,這個代碼很好,我想請教你一些東西,希望你能幫助我!
作者:
1920787075@qq.c
時間:
2018-12-4 12:13
有問題大家別套用
作者:
nokialiu2002
時間:
2018-12-12 16:24
參考一下。感謝。
作者:
ontheroad
時間:
2019-1-21 10:07
多謝分享,參考學習。
作者:
ontheroad
時間:
2019-1-21 10:08
多謝分享,參考學習了。目前也正在學習ESP8266。
作者:
夢園心田
時間:
2019-1-22 00:45
局域網還遠程控制
作者:
jxjx
時間:
2019-4-11 11:16
chuangsong函數沒有啊
作者:
X1234561
時間:
2019-4-17 21:09
多謝分享,參考學習了!
作者:
Misty-CC
時間:
2019-10-21 18:56
贊,學習了
作者:
witp1
時間:
2019-12-15 22:35
多謝分享,參考學習了!
作者:
leonscott
時間:
2019-12-17 20:18
厲害了,認真學習一下
作者:
小黑14
時間:
2019-12-17 23:15
你給的這個很好,我使用效果很幫。謝謝
作者:
nqmysb
時間:
2020-3-9 18:41
謝謝好人一生平安
作者:
honjine
時間:
2020-3-9 20:01
謝謝分享~~~~~~~~~~~~真實我需要的
作者:
溫xyz
時間:
2020-3-25 23:40
謝謝分享,下載學習。
作者:
lovexulu
時間:
2020-3-26 20:36
你這個zhuanhuan()有意思。。。其實數據+0x30即可。。
作者:
一起擼
時間:
2020-6-1 16:28
大家能使用嗎
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1