|
使用DS18B20,ESP8266,實現(xiàn)WIFI傳輸溫度,底層部分代碼。其中WIFI是作為服務(wù)器,上位機作為客戶端。
單片機源程序如下:
- /***********************
- 程序名:wifi_3.c
- 功能:單片機與手機通信,實現(xiàn)溫度信息的傳輸
- 編程人: 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
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Lcd1602_Delay1ms
- * 函數(shù)功能 : 延時函數(shù),延時1ms
- * 輸 入 : c
- * 輸 出 : 無
- * 說 名 : 該函數(shù)是在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做出反應(yīng)會將在15us~60us后總線拉低
- i = 0;
- while(DSPORT) //等待DS18B20拉低總線
- {
- Delay1ms(1);
- i++;
- if(i>5)//等待>5MS
- {
- return 0;//初始化失敗
- }
-
- }
- return 1;//初始化成功
- }
- void Ds18b20WriteByte(uchar dat)//寫入數(shù)據(jù)
- {
- uint i, j;
- for(j=0; j<8; j++)
- {
- DSPORT = 0; //每寫入一位數(shù)據(jù)之前先把總線拉低1us
- i++;
- DSPORT = dat & 0x01; //然后寫入一個數(shù)據(jù),從最低位開始
- i=6;
- while(i--); //延時68us,持續(xù)時間最少60us
- DSPORT = 1; //然后釋放總線,至少1us給總線恢復(fù)時間才能接著寫入第二個數(shù)值
- dat >>= 1;
- }
- }
- uchar Ds18b20ReadByte() //讀數(shù)據(jù)
- {
- uchar byte, bi;
- uint i, j;
- for(j=8; j>0; j--)
- {
- DSPORT = 0;//先將總線拉低1us
- i++;
- DSPORT = 1;//然后釋放總線
- i++;
- i++;//延時6us等待數(shù)據(jù)穩(wěn)定
- bi = DSPORT; //讀取數(shù)據(jù),從最低位開始讀取
- byte = (byte >> 1) | (bi << 7);
- i = 4; //讀取完之后等待48us再接著讀取下一個數(shù)
- while(i--);
- }
- return byte;
- }
- void Ds18b20ChangTemp() //設(shè)置DS18B20
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令
- //Delay1ms(100); //等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個延時了
-
- }
- void Ds18b20ReadTempCom() //讀取溫度數(shù)據(jù)
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令
- }
- void Ds18b20ReadTemp() //將溫度數(shù)據(jù)轉(zhuǎn)化為十進制
- {
-
- uchar tmh, tml,tem,tem2,tem3;
- Ds18b20ChangTemp(); //先寫入轉(zhuǎn)換命令
- Ds18b20ReadTempCom(); //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
- tml = Ds18b20ReadByte(); //讀取溫度值共16位,先讀低字節(jié)
- tmh = Ds18b20ReadByte(); //再讀高字節(jié)
- sdata = tml/16+tmh*16;
- if(sdata>29)
- //直流電機,當(dāng)溫度數(shù)值超過30度時啟動
- {
- moto=1;
- Delay1ms(3000);
- moto=0;
- }
- tem=tml/16+tmh*16;
- xiaoshu1 = (tml&0x0f)*10/16; //小數(shù)第一位
- xiaoshu2 = (tml&0x0f)*100/16%10;//小數(shù)第二位
- 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; //設(shè)置為工作方式1
- TMOD=0X20; //設(shè)置計數(shù)器工作方式2
- PCON=0X80; //波特率加倍
- TH1=0XF3; //計數(shù)器初始值設(shè)置,注意波特率是4800的
- TL1=0XF3;
- ES=1; //打開接收中斷
- EA=1; //打開總中斷
- TR1=1; //打開計數(shù)器
- }
- void send(uchar *p) //串口發(fā)送
- {
- while(*p != '\0')
- {
- SBUF = *p;
- while(!TI);
- TI = 0; //如果發(fā)送完畢,硬件會置位TI
- p++; //TI清零
- }
- }
- void zhuanhuan(int i)
- {
- switch(i){ //溫度數(shù)據(jù)的十位
- 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){ //溫度數(shù)據(jù)的十位
- 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;
- }
- }
- /**********************
- * 函數(shù)功能:將溫度光照數(shù)據(jù)轉(zhuǎn)化為字符串類型,并發(fā)送出去
- *
- ***********************/
- 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) //初始化數(shù)模SPI
- {
- CLK = 0;
- CS = 1;
- DIN = 1;
- CLK = 1;
- CS = 0;
- }
- void SPI_Write(uchar dat) //使用SPI寫入數(shù)據(jù)
- {
- uchar i;
- CLK = 0;
- for(i=0; i<8; i++)
- {
- DIN = dat >> 7; //放置最高位
- dat <<= 1;
- CLK = 0; //上升沿放置數(shù)據(jù)
- CLK = 1;
- }
- }
- uint SPI_Read(void) //使用SPI讀取數(shù)據(jù)
- {
- uint i, dat=0;
- CLK = 0;
- for(i=0; i<12; i++) //接收12位數(shù)據(jù)
- {
- dat <<= 1;
- CLK = 1;
- CLK = 0;
- dat |= DSPORT;
- }
- return dat;
- }
- uint Read_AD_Data(uchar cmd) //讀取數(shù)摸數(shù)據(jù)
- {
- uchar i;
- uint AD_Value;
- CLK = 0;
- CS = 0;
- SPI_Write(cmd);
- for(i=6; i>0; i--); //延時等待轉(zhuǎn)換結(jié)果
- CLK = 1; //發(fā)送一個時鐘周期,清除BUSY
- _nop_();
- _nop_();
- CLK = 0;
- _nop_();
- _nop_();
- AD_Value=SPI_Read();
- CS = 1;
- return AD_Value;
- }
- void datapros() //讀取光照值,設(shè)置讀取間隔
- {
- static u8 i;
-
- if(i==5)
- {
- i=0;
- sun = Read_AD_Data(0xA4); // AIN2 光敏電阻
- }
- i++;
-
- }
- /*************************
- * 函數(shù)功能:將光照值按位放于字符數(shù)組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;
-
- }
- /*******************************************************************************
- * 函 數(shù) 名 : LcdWriteCom
- * 函數(shù)功能 : 向LCD寫入一個字節(jié)的命令
- * 輸 入 : com
- * 輸 出 : 無
- *******************************************************************************/
- #ifndef LCD1602_4PINS //當(dāng)沒有定義這個LCD1602_4PINS時
- void LcdWriteCom(uchar com) //寫入命令
- {
- LCD1602_E = 0; //使能
- LCD1602_RS = 0; //選擇發(fā)送命令
- LCD1602_RW = 0; //選擇寫入
-
- LCD1602_DATAPINS = com; //放入命令
- Lcd1602_Delay1ms(1); //等待數(shù)據(jù)穩(wěn)定
- 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; //發(fā)送低四位
- Lcd1602_Delay1ms(1);
- LCD1602_E = 1; //寫入時序
- Lcd1602_Delay1ms(5);
- LCD1602_E = 0;
- }
- #endif
- /*******************************************************************************
- * 函 數(shù) 名 : LcdWriteData
- * 函數(shù)功能 : 向LCD寫入一個字節(jié)的數(shù)據(jù)
- * 輸 入 : dat
- * 輸 出 : 無
- *******************************************************************************/
- #ifndef LCD1602_4PINS
- void LcdWriteData(uchar dat) //寫入數(shù)據(jù)
- {
- LCD1602_E = 0; //使能清零
- LCD1602_RS = 1; //選擇輸入數(shù)據(jù)
- LCD1602_RW = 0; //選擇寫入
- LCD1602_DATAPINS = dat; //寫入數(shù)據(jù)
- Lcd1602_Delay1ms(1);
- LCD1602_E = 1; //寫入時序
- Lcd1602_Delay1ms(5); //保持時間
- LCD1602_E = 0;
- }
- #else
- void LcdWriteData(uchar dat) //寫入數(shù)據(jù)
- {
- LCD1602_E = 0; //使能清零
- LCD1602_RS = 1; //選擇寫入數(shù)據(jù)
- 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
- /*******************************************************************************
- * 函 數(shù) 名 : LcdInit()
- * 函數(shù)功能 : 初始化LCD屏
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- #ifndef LCD1602_4PINS
- void LcdInit() //LCD初始化子程序
- {
- LcdWriteCom(0x38); //開顯示
- LcdWriteCom(0x0c); //開顯示不顯示光標
- LcdWriteCom(0x06); //寫一個指針加1
- LcdWriteCom(0x01); //清屏
- LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點
- }
- #else
- void LcdInit() //LCD初始化子程序
- {
- LcdWriteCom(0x32); //將8位總線轉(zhuǎn)為4位總線
- LcdWriteCom(0x28); //在四位線下的初始化
- LcdWriteCom(0x0c); //開顯示不顯示光標
- LcdWriteCom(0x06); //寫一個指針加1
- LcdWriteCom(0x01); //清屏
- LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點
- }
- #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"); //設(shè)置為多路鏈接
- Delay1ms(100);
- send("AT+CIPSERVER=1,8080\r\n"); //配置為服務(wù)器,8080端口
- Delay1ms(100);
- send("AT+CIPSEND=0,11\r\n"); //發(fā)送數(shù)據(jù),并且數(shù)據(jù)長度為2個字節(jié)
- Delay1ms(100);
- chuansong(); //將溫度數(shù)據(jù)發(fā)送出去
-
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
WIFI.zip
(3.76 KB, 下載次數(shù): 264)
2018-4-26 18:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|