标题:
51单片机连接ESP8266 WIFI模块程序
[打印本页]
作者:
一电一充
时间:
2022-5-10 16:20
标题:
51单片机连接ESP8266 WIFI模块程序
1.png
(10.58 KB, 下载次数: 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放大功率后驱动BUZZER
sbit SCK = P3^6; // SCK上升沿移位
sbit RCK = P3^5; // RCK上升沿串行输出寄存器锁存
sbit SER = P3^4; // SER引脚送字节数据进去
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朝手机发送多少字节
u8 flag = 0;//串口接收数据标志位,当8266初始化完后被改写
u8 Buffer[40] = {0}; //从串口接收的数据
u8 i = 0;//Buffer的index
// 点阵列选值,数组每个元素的值选中其中一列
code u8 gLineCode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
code u8 gZhu[] = {0x73,0xD6,0x58,0xFF,0x58,0x54,0x52,0x12}; // 汉字 朱
/*
**********************************************************************
* 函数原型声明
**********************************************************************
*/
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;//开启串口接收数据
while (1)
{
switch (Buffer[9]) //根据手机输入的键值不同,执行不同的内容
{
case '1':
P2 = 0x0;//点亮所有灯
break;
case '2':
P2 = 0xff;//熄灭所有灯
break;
case '3':
M1 = 1;//马达转
break;
case '4':
M1 = 0;//马达停
break;
case '5':
BuzzerOnOff();//蜂鸣器叫
break;
case '6':
//蜂鸣器静
break;
case '7':
MatrixDisplay(gZhu);//点阵亮
break;
case '8':
//点阵灭
break;
case '9'://发送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);//确定发送数据长度(5个字节)
delay1ms(10);
UartSendBytes(temps);//发送温度数据
Buffer[9] = 'x';
P2 = 0x55;
break;
default:
break;
}
}
}
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
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--);
}
/*********************************************************************
* 函 数 名 : Hc595SendByte
* 函数功能 : 通过74HC595串行移位发送一个字节出去
* 参数列表 : dat - 待发送的字节数据
* 函数输出 : 无
*********************************************************************/
void Hc595SendByte(u8 dat)
{
u8 i = 0, j = 0;
SCK = 0; // 将SCK置为初始状态
RCK = 0; // 将RCK置为初始状态
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指令
}
/*********************************************************************
* 函 数 名 : MatrixDisplay
* 函数功能 : 循环刷新显示字模到点阵上
* 参数列表 : zimo - 待显示的字模数组
* 函数输出 : 无
*********************************************************************/
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]); // 发送段选数据
Hc595SendByte(0x00); // 消隐
}
j++;//gai
if(j==200)//gai
{
break;
}
}
}
/********************************************************************
* 名称 : UartIsr()
* 功能 : 串口中断处理程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void UartIsr(void) interrupt 4
{
EA = 0;
if (RI == 1) //当硬件接收到一个数据时,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;
}
/*********************************************************************
* 函 数 名 : BuzzerOnOff
* 函数功能 : 给蜂鸣器开关各一段时间
* 参数列表 : 无
* 函数输出 : 无
*********************************************************************/
void BuzzerOnOff(void)
{
gBuz = 1;
delay1ms(1);
gBuz = 0;
delay1ms(1);
}
/*********************************************************************
* 函 数 名 : UartSendBytes
* 函数功能 : 通过串口往外发送数据
* 参数列表 : uchar *c,要发的数据
* 函数输出 : 无
*********************************************************************/
void UartSendBytes(u8 *c)//串口发送数据
{
EA = 0;
while(*c != '\0')
{
SBUF = *c;
while(!TI);
TI = 0;
c++;
}
EA = 1;
}
/*********************************************************************
* 函 数 名 : TempDisplayTest
* 函数功能 : 通过串口往外发送数据
* 参数列表 : 无
* 函数输出 : 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; // 用来存储转换后以摄氏度为单位的温度值
Ds18b20TempConvertCmd(); // 先写入转换命令
Ds18b20TempReadCmd(); // 然后等待转换完后发送读取温度命令
tml = Ds18b20ReadByte(); // 读取温度值共16位,先读低字节
tmh = Ds18b20ReadByte(); // 再读高字节
temp = tml | (tmh << 8); // 默认是12位分辨率,前面4个S位是符号位
// 正温度时符号位为0,下面代码计算没有考虑负温度情况,因为我们实验是在
// 室温下做的,如果要考虑到负温度的情况,代码中要先判断S位,若S位为1则
// 必须点去掉S的1再计算,计算后的值加负号即可。
t = temp * 0.0625;
tDisp = (u16)(t * 100); // 为方便显示将温度值乘以100后强转为u16
return tDisp;
}
复制代码
Keil代码下载,仅供参考:
25.1.ESP8266 Wifi Test.rar
(20.28 KB, 下载次数: 78)
2022-5-10 16:18 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1