標題:
51單片機連接ESP8266 WIFI模塊程序
[打印本頁]
作者:
一電一充
時間:
2022-5-10 16:20
標題:
51單片機連接ESP8266 WIFI模塊程序
1.png
(10.58 KB, 下載次數(shù): 56)
下載附件
2022-5-10 16:25 上傳
單片機源程序如下:
/*
**********************************************************************
* 頭文件包含
**********************************************************************
*/
#include "ds18b20.h"
/*
**********************************************************************
* 本地宏定義
**********************************************************************
*/
#define MATRIX_PORT P0 // 點陣LED負極端口
/*
**********************************************************************
* 本地全局變量
**********************************************************************
*/
sbit M1 = P1^0; // M1接在P1.0
sbit gBuz = P1^5; // P1.5通過ULN2003放大功率后驅(qū)動BUZZER
sbit SCK = P3^6; // SCK上升沿移位
sbit RCK = P3^5; // RCK上升沿串行輸出寄存器鎖存
sbit SER = P3^4; // SER引腳送字節(jié)數(shù)據(jù)進去
code u8 init_1_8266[] ="AT+CIPMUX=1\r\n";//設置8266為多連接模式(建立TCP server的前提)
code u8 init_2_8266[] ="AT+CIPSERVER=1\r\n";//建立 TCP server
code u8 init_3_8266[] ="AT+CIPSEND=0,5\r\n";//8266朝手機發(fā)送多少字節(jié)
u8 flag = 0;//串口接收數(shù)據(jù)標志位,當8266初始化完后被改寫
u8 Buffer[40] = {0}; //從串口接收的數(shù)據(jù)
u8 i = 0;//Buffer的index
// 點陣列選值,數(shù)組每個元素的值選中其中一列
code u8 gLineCode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
code u8 gZhu[] = {0x73,0xD6,0x58,0xFF,0x58,0x54,0x52,0x12}; // 漢字 朱
/*
**********************************************************************
* 函數(shù)原型聲明
**********************************************************************
*/
void delay1ms(u16 i);
void Hc595SendByte(u8 dat);
void MatrixDisplay(u8 *zimo);
void UartInit(void);
void BuzzerOnOff(void);
void UartSendBytes(u8 *c);
u16 TempDisplayTest(void);
void main()
{
u16 temp = 0;
u8 temps[6] = {0};
temps[2] = '.';
M1 = 0;
UartInit();//串口初始化
delay1ms(1000);
UartSendBytes(init_1_8266);//設置8266為多連接模式(建立TCP server的前提)
delay1ms(1000);
UartSendBytes(init_2_8266);//建立 TCP server
delay1ms(1000);
P2 = 0x55;//表示可以wifi連接8266了
flag = 1;//開啟串口接收數(shù)據(jù)
while (1)
{
switch (Buffer[9]) //根據(jù)手機輸入的鍵值不同,執(zhí)行不同的內(nèi)容
{
case '1':
P2 = 0x0;//點亮所有燈
break;
case '2':
P2 = 0xff;//熄滅所有燈
break;
case '3':
M1 = 1;//馬達轉(zhuǎn)
break;
case '4':
M1 = 0;//馬達停
break;
case '5':
BuzzerOnOff();//蜂鳴器叫
break;
case '6':
//蜂鳴器靜
break;
case '7':
MatrixDisplay(gZhu);//點陣亮
break;
case '8':
//點陣滅
break;
case '9'://發(fā)送18b20溫度
temp = TempDisplayTest();
temps[0] = temp /1000 + '0';
temp %= 1000;
temps[1] = temp/100 + '0';
temp %= 100;
temps[3] = temp/10 + '0';
temp %= 10;
temps[4] = temp + '0';
UartSendBytes(init_3_8266);//確定發(fā)送數(shù)據(jù)長度(5個字節(jié))
delay1ms(10);
UartSendBytes(temps);//發(fā)送溫度數(shù)據(jù)
Buffer[9] = 'x';
P2 = 0x55;
break;
default:
break;
}
}
}
/********************************************************************
* 名稱 : Delay_1ms()
* 功能 : 延時子程序,延時時間為 1ms * x
* 輸入 : x (延時一毫秒的個數(shù))
* 輸出 : 無
***********************************************************************/
void delay1ms(u16 i) //誤差 0us
{
u8 a,b,c;
for(;i>0;i--)
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
/*********************************************************************
* 函 數(shù) 名 : Hc595SendByte
* 函數(shù)功能 : 通過74HC595串行移位發(fā)送一個字節(jié)出去
* 參數(shù)列表 : dat - 待發(fā)送的字節(jié)數(shù)據(jù)
* 函數(shù)輸出 : 無
*********************************************************************/
void Hc595SendByte(u8 dat)
{
u8 i = 0, j = 0;
SCK = 0; // 將SCK置為初始狀態(tài)
RCK = 0; // 將RCK置為初始狀態(tài)
for (i=0; i<8; i++)
{
SER = dat & (0x01);
dat >>= 1;
SCK = 1;
j++; // 延時代碼,等同于nop指令
j++; // 延時代碼,等同于nop指令
SCK = 0;
}
RCK = 1;
j++; // 延時代碼,等同于nop指令
j++; // 延時代碼,等同于nop指令
}
/*********************************************************************
* 函 數(shù) 名 : MatrixDisplay
* 函數(shù)功能 : 循環(huán)刷新顯示字模到點陣上
* 參數(shù)列表 : zimo - 待顯示的字模數(shù)組
* 函數(shù)輸出 : 無
*********************************************************************/
void MatrixDisplay(u8 *zimo)
{
u8 i = 0;
u8 j = 0;//gai
while(1)
{
for(i=0;i<8;i++)
{
MATRIX_PORT = gLineCode[i]; // 位選
Hc595SendByte(zimo[i]); // 發(fā)送段選數(shù)據(jù)
Hc595SendByte(0x00); // 消隱
}
j++;//gai
if(j==200)//gai
{
break;
}
}
}
/********************************************************************
* 名稱 : UartIsr()
* 功能 : 串口中斷處理程序
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void UartIsr(void) interrupt 4
{
EA = 0;
if (RI == 1) //當硬件接收到一個數(shù)據(jù)時,RI會置位
{
RI = 0;
if(flag == 1) //初始化完8266后,此處才為真
{
Buffer[i] = SBUF;//將接收到的字符放入Buffer
i++;
if(SBUF == 0x0a)//遇到換行就回到Buffer的頭部開始存
{
i = 0;
}
}
}
EA = 1;
}
/********************************************************************
* 名稱 : UartInit()
* 功能 : 串口初始化,注意波特率是2400
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void UartInit(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xF3;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
/*********************************************************************
* 函 數(shù) 名 : BuzzerOnOff
* 函數(shù)功能 : 給蜂鳴器開關各一段時間
* 參數(shù)列表 : 無
* 函數(shù)輸出 : 無
*********************************************************************/
void BuzzerOnOff(void)
{
gBuz = 1;
delay1ms(1);
gBuz = 0;
delay1ms(1);
}
/*********************************************************************
* 函 數(shù) 名 : UartSendBytes
* 函數(shù)功能 : 通過串口往外發(fā)送數(shù)據(jù)
* 參數(shù)列表 : uchar *c,要發(fā)的數(shù)據(jù)
* 函數(shù)輸出 : 無
*********************************************************************/
void UartSendBytes(u8 *c)//串口發(fā)送數(shù)據(jù)
{
EA = 0;
while(*c != '\0')
{
SBUF = *c;
while(!TI);
TI = 0;
c++;
}
EA = 1;
}
/*********************************************************************
* 函 數(shù) 名 : TempDisplayTest
* 函數(shù)功能 : 通過串口往外發(fā)送數(shù)據(jù)
* 參數(shù)列表 : 無
* 函數(shù)輸出 : u16 tDisp,最終的溫度值
*********************************************************************/
u16 TempDisplayTest(void)
{
u16 temp = 0; // 用來暫存12位的AD值
u8 tmh = 0, tml = 0; // 用來暫存2個8位的AD值
u16 tDisp = 0; // 用來存儲乘以100倍后的溫度值
double t = 0; // 用來存儲轉(zhuǎn)換后以攝氏度為單位的溫度值
Ds18b20TempConvertCmd(); // 先寫入轉(zhuǎn)換命令
Ds18b20TempReadCmd(); // 然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
tml = Ds18b20ReadByte(); // 讀取溫度值共16位,先讀低字節(jié)
tmh = Ds18b20ReadByte(); // 再讀高字節(jié)
temp = tml | (tmh << 8); // 默認是12位分辨率,前面4個S位是符號位
// 正溫度時符號位為0,下面代碼計算沒有考慮負溫度情況,因為我們實驗是在
// 室溫下做的,如果要考慮到負溫度的情況,代碼中要先判斷S位,若S位為1則
// 必須點去掉S的1再計算,計算后的值加負號即可。
t = temp * 0.0625;
tDisp = (u16)(t * 100); // 為方便顯示將溫度值乘以100后強轉(zhuǎn)為u16
return tDisp;
}
復制代碼
Keil代碼下載,僅供參考:
25.1.ESP8266 Wifi Test.rar
(20.28 KB, 下載次數(shù): 78)
2022-5-10 16:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1