找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2569|回复: 0
收起左侧

51单片机连接ESP8266 WIFI模块程序

[复制链接]
ID:947647 发表于 2022-5-10 16:20 | 显示全部楼层 |阅读模式
1.png

单片机源程序如下:
  1. /*
  2. **********************************************************************
  3. *                         头文件包含
  4. **********************************************************************
  5. */
  6. #include "ds18b20.h"

  7. /*
  8. **********************************************************************
  9. *                         本地宏定义
  10. **********************************************************************
  11. */

  12. #define MATRIX_PORT                P0                // 点阵LED负极端口


  13. /*
  14. **********************************************************************
  15. *                         本地全局变量
  16. **********************************************************************
  17. */
  18. sbit M1 = P1^0;         // M1接在P1.0

  19. sbit gBuz = P1^5;                        // P1.5通过ULN2003放大功率后驱动BUZZER
  20. sbit SCK = P3^6;                         // SCK上升沿移位
  21. sbit RCK = P3^5;                        // RCK上升沿串行输出寄存器锁存
  22. sbit SER = P3^4;                         // SER引脚送字节数据进去

  23. code u8 init_1_8266[] ="AT+CIPMUX=1\r\n";//设置8266为多连接模式(建立TCP server的前提)
  24. code u8 init_2_8266[] ="AT+CIPSERVER=1\r\n";//建立 TCP server
  25. code u8 init_3_8266[] ="AT+CIPSEND=0,5\r\n";//8266朝手机发送多少字节

  26. u8 flag = 0;//串口接收数据标志位,当8266初始化完后被改写
  27. u8 Buffer[40] = {0};      //从串口接收的数据
  28. u8 i = 0;//Buffer的index

  29. // 点阵列选值,数组每个元素的值选中其中一列
  30. code u8 gLineCode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  31. code u8 gZhu[] = {0x73,0xD6,0x58,0xFF,0x58,0x54,0x52,0x12};                // 汉字 朱
  32.    
  33. /*
  34. **********************************************************************
  35. *                         函数原型声明
  36. **********************************************************************
  37. */
  38. void delay1ms(u16 i);
  39. void Hc595SendByte(u8 dat);
  40. void MatrixDisplay(u8 *zimo);
  41. void UartInit(void);
  42. void BuzzerOnOff(void);
  43. void UartSendBytes(u8 *c);
  44. u16 TempDisplayTest(void);


  45. void main()
  46. {
  47.         u16 temp = 0;
  48.         u8 temps[6] = {0};

  49.         temps[2] = '.';
  50.            M1 = 0;
  51.         UartInit();//串口初始化
  52.         delay1ms(1000);
  53.        
  54.         UartSendBytes(init_1_8266);//设置8266为多连接模式(建立TCP server的前提)
  55.         delay1ms(1000);
  56.         UartSendBytes(init_2_8266);//建立 TCP server
  57.         delay1ms(1000);
  58.         P2 = 0x55;//表示可以wifi连接8266了
  59.         flag = 1;//开启串口接收数据
  60.         while (1)
  61.         {        
  62.                 switch (Buffer[9])      //根据手机输入的键值不同,执行不同的内容
  63.                 {
  64.                         case '1':
  65.                                 P2 = 0x0;//点亮所有灯
  66.                                 break;
  67.                         case '2':
  68.                                 P2 = 0xff;//熄灭所有灯
  69.                                 break;
  70.                         case '3':
  71.                                 M1 = 1;//马达转
  72.                                 break;
  73.                         case '4':
  74.                                 M1 = 0;//马达停
  75.                                 break;
  76.                         case '5':
  77.                                 BuzzerOnOff();//蜂鸣器叫
  78.                         break;
  79.                         case '6':
  80.                                 //蜂鸣器静
  81.                                 break;
  82.                         case '7':
  83.                                 MatrixDisplay(gZhu);//点阵亮
  84.                                 break;
  85.                         case '8':
  86.                                 //点阵灭
  87.                                 break;
  88.                         case '9'://发送18b20温度
  89.                                 temp = TempDisplayTest();
  90.                                 temps[0] = temp /1000 + '0';
  91.                                 temp %= 1000;
  92.                                 temps[1] = temp/100 + '0';
  93.                                 temp %= 100;
  94.                                 temps[3] = temp/10 + '0';
  95.                                 temp %= 10;
  96.                                 temps[4] = temp + '0';
  97.                                 UartSendBytes(init_3_8266);//确定发送数据长度(5个字节)
  98.                                 delay1ms(10);
  99.                                 UartSendBytes(temps);//发送温度数据
  100.                                 Buffer[9] = 'x';
  101.                                 P2 = 0x55;
  102.                                 break;
  103.                         default:
  104.                                 break;
  105.                 }
  106.         }
  107. }


  108. /********************************************************************
  109. * 名称 : Delay_1ms()
  110. * 功能 : 延时子程序,延时时间为 1ms * x
  111. * 输入 : x (延时一毫秒的个数)
  112. * 输出 : 无
  113. ***********************************************************************/
  114. void delay1ms(u16 i)   //误差 0us
  115. {
  116.     u8 a,b,c;

  117.         for(;i>0;i--)
  118.             for(c=1;c>0;c--)
  119.                 for(b=142;b>0;b--)
  120.                     for(a=2;a>0;a--);
  121. }

  122. /*********************************************************************
  123. * 函 数 名       : Hc595SendByte
  124. * 函数功能                 : 通过74HC595串行移位发送一个字节出去
  125. * 参数列表       : dat - 待发送的字节数据
  126. * 函数输出             : 无
  127. *********************************************************************/
  128. void Hc595SendByte(u8 dat)
  129. {
  130.         u8 i = 0, j = 0;

  131.         SCK = 0;                                // 将SCK置为初始状态
  132.         RCK = 0;                                // 将RCK置为初始状态

  133.         for (i=0; i<8; i++)
  134.         {
  135.                 SER = dat & (0x01);
  136.                 dat >>= 1;

  137.                 SCK = 1;
  138.                 j++;                                  // 延时代码,等同于nop指令
  139.                 j++;                                // 延时代码,等同于nop指令
  140.                 SCK = 0;       
  141.         }

  142.         RCK = 1;
  143.         j++;                                        // 延时代码,等同于nop指令
  144.         j++;                                        // 延时代码,等同于nop指令
  145. }

  146. /*********************************************************************
  147. * 函 数 名       : MatrixDisplay
  148. * 函数功能                 : 循环刷新显示字模到点阵上
  149. * 参数列表       : zimo - 待显示的字模数组
  150. * 函数输出             : 无
  151. *********************************************************************/
  152. void MatrixDisplay(u8 *zimo)
  153. {
  154.         u8 i = 0;
  155.         u8 j = 0;//gai
  156.         while(1)
  157.         {
  158.                 for(i=0;i<8;i++)
  159.                 {
  160.                         MATRIX_PORT = gLineCode[i];                                  // 位选
  161.                         Hc595SendByte(zimo[i]);                // 发送段选数据
  162.                         Hc595SendByte(0x00);                  // 消隐
  163.                 }
  164.                 j++;//gai
  165.                 if(j==200)//gai
  166.                 {
  167.                         break;
  168.                 }       
  169.         }
  170. }



  171. /********************************************************************
  172. * 名称 : UartIsr()
  173. * 功能 : 串口中断处理程序
  174. * 输入 : 无
  175. * 输出 : 无
  176. ***********************************************************************/
  177. void UartIsr(void) interrupt 4
  178. {
  179.         EA = 0;
  180.         if (RI == 1)                           //当硬件接收到一个数据时,RI会置位
  181.         {
  182.                 RI = 0;
  183.                 if(flag == 1)                //初始化完8266后,此处才为真
  184.                 {
  185.                         Buffer[i] = SBUF;//将接收到的字符放入Buffer
  186.                         i++;
  187.                         if(SBUF == 0x0a)//遇到换行就回到Buffer的头部开始存
  188.                         {
  189.                                 i = 0;
  190.                         }
  191.                 }          
  192.         }
  193.         EA = 1;
  194. }


  195. /********************************************************************
  196. * 名称 : UartInit()
  197. * 功能 : 串口初始化,注意波特率是2400
  198. * 输入 : 无
  199. * 输出 : 无
  200. ***********************************************************************/
  201. void UartInit(void)
  202. {
  203.     TMOD = 0x20;
  204.     SCON = 0x50;
  205.     TH1 = 0xF3;
  206.     TL1 = TH1;
  207.     PCON = 0x00;
  208.     EA = 1;
  209.     ES = 1;
  210.     TR1 = 1;               
  211. }

  212. /*********************************************************************
  213. * 函 数 名       : BuzzerOnOff
  214. * 函数功能                 : 给蜂鸣器开关各一段时间
  215. * 参数列表       : 无
  216. * 函数输出             : 无
  217. *********************************************************************/
  218. void BuzzerOnOff(void)
  219. {
  220.         gBuz = 1;
  221.         delay1ms(1);
  222.         gBuz = 0;
  223.         delay1ms(1);
  224. }


  225. /*********************************************************************
  226. * 函 数 名       : UartSendBytes
  227. * 函数功能                 : 通过串口往外发送数据
  228. * 参数列表       : uchar *c,要发的数据
  229. * 函数输出             : 无
  230. *********************************************************************/
  231. void UartSendBytes(u8 *c)//串口发送数据
  232. {
  233.         EA = 0;
  234.         while(*c != '\0')
  235.         {
  236.                 SBUF = *c;
  237.                 while(!TI);
  238.                 TI = 0;
  239.                    c++;
  240.        
  241.         }
  242.         EA = 1;
  243. }

  244. /*********************************************************************
  245. * 函 数 名       : TempDisplayTest
  246. * 函数功能                 : 通过串口往外发送数据
  247. * 参数列表       : 无
  248. * 函数输出             : u16 tDisp,最终的温度值
  249. *********************************************************************/
  250. u16 TempDisplayTest(void)
  251. {
  252.         u16 temp = 0;                                         // 用来暂存12位的AD值
  253.         u8 tmh = 0, tml = 0;                        // 用来暂存2个8位的AD值
  254.         u16 tDisp = 0;                                        // 用来存储乘以100倍后的温度值
  255.         double t = 0;                                        // 用来存储转换后以摄氏度为单位的温度值

  256.         Ds18b20TempConvertCmd();                // 先写入转换命令
  257.         Ds18b20TempReadCmd();                        // 然后等待转换完后发送读取温度命令
  258.         tml = Ds18b20ReadByte();                // 读取温度值共16位,先读低字节
  259.         tmh = Ds18b20ReadByte();                // 再读高字节

  260.         temp = tml | (tmh << 8);                // 默认是12位分辨率,前面4个S位是符号位
  261.        
  262.         // 正温度时符号位为0,下面代码计算没有考虑负温度情况,因为我们实验是在
  263.         // 室温下做的,如果要考虑到负温度的情况,代码中要先判断S位,若S位为1则
  264.         // 必须点去掉S的1再计算,计算后的值加负号即可。
  265.         t = temp * 0.0625;
  266.         tDisp = (u16)(t * 100);                        // 为方便显示将温度值乘以100后强转为u16
  267.         return tDisp;
  268. }
复制代码

Keil代码下载,仅供参考:
25.1.ESP8266 Wifi Test.rar (20.28 KB, 下载次数: 75)

评分

参与人数 1黑币 +10 收起 理由
admin + 10 共享资料的黑币奖励!

查看全部评分

本帖被以下淘专辑推荐:

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表