標題: 51單片機連接ESP8266 WIFI模塊程序 [打印本頁]

作者: 一電一充    時間: 2022-5-10 16:20
標題: 51單片機連接ESP8266 WIFI模塊程序


單片機源程序如下:
  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放大功率后驅(qū)動BUZZER
  20. sbit SCK = P3^6;                         // SCK上升沿移位
  21. sbit RCK = P3^5;                        // RCK上升沿串行輸出寄存器鎖存
  22. sbit SER = P3^4;                         // SER引腳送字節(jié)數(shù)據(jù)進去

  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朝手機發(fā)送多少字節(jié)

  26. u8 flag = 0;//串口接收數(shù)據(jù)標志位,當8266初始化完后被改寫
  27. u8 Buffer[40] = {0};      //從串口接收的數(shù)據(jù)
  28. u8 i = 0;//Buffer的index

  29. // 點陣列選值,數(shù)組每個元素的值選中其中一列
  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. *                         函數(shù)原型聲明
  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;//開啟串口接收數(shù)據(jù)
  60.         while (1)
  61.         {        
  62.                 switch (Buffer[9])      //根據(jù)手機輸入的鍵值不同,執(zhí)行不同的內(nèi)容
  63.                 {
  64.                         case '1':
  65.                                 P2 = 0x0;//點亮所有燈
  66.                                 break;
  67.                         case '2':
  68.                                 P2 = 0xff;//熄滅所有燈
  69.                                 break;
  70.                         case '3':
  71.                                 M1 = 1;//馬達轉(zhuǎn)
  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'://發(fā)送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);//確定發(fā)送數(shù)據(jù)長度(5個字節(jié))
  98.                                 delay1ms(10);
  99.                                 UartSendBytes(temps);//發(fā)送溫度數(shù)據(jù)
  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 (延時一毫秒的個數(shù))
  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. * 函 數(shù) 名       : Hc595SendByte
  124. * 函數(shù)功能                 : 通過74HC595串行移位發(fā)送一個字節(jié)出去
  125. * 參數(shù)列表       : dat - 待發(fā)送的字節(jié)數(shù)據(jù)
  126. * 函數(shù)輸出             : 無
  127. *********************************************************************/
  128. void Hc595SendByte(u8 dat)
  129. {
  130.         u8 i = 0, j = 0;

  131.         SCK = 0;                                // 將SCK置為初始狀態(tài)
  132.         RCK = 0;                                // 將RCK置為初始狀態(tài)

  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. * 函 數(shù) 名       : MatrixDisplay
  148. * 函數(shù)功能                 : 循環(huán)刷新顯示字模到點陣上
  149. * 參數(shù)列表       : zimo - 待顯示的字模數(shù)組
  150. * 函數(shù)輸出             : 無
  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]);                // 發(fā)送段選數(shù)據(jù)
  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)                           //當硬件接收到一個數(shù)據(jù)時,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. * 函 數(shù) 名       : BuzzerOnOff
  214. * 函數(shù)功能                 : 給蜂鳴器開關各一段時間
  215. * 參數(shù)列表       : 無
  216. * 函數(shù)輸出             : 無
  217. *********************************************************************/
  218. void BuzzerOnOff(void)
  219. {
  220.         gBuz = 1;
  221.         delay1ms(1);
  222.         gBuz = 0;
  223.         delay1ms(1);
  224. }


  225. /*********************************************************************
  226. * 函 數(shù) 名       : UartSendBytes
  227. * 函數(shù)功能                 : 通過串口往外發(fā)送數(shù)據(jù)
  228. * 參數(shù)列表       : uchar *c,要發(fā)的數(shù)據(jù)
  229. * 函數(shù)輸出             : 無
  230. *********************************************************************/
  231. void UartSendBytes(u8 *c)//串口發(fā)送數(shù)據(jù)
  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. * 函 數(shù) 名       : TempDisplayTest
  246. * 函數(shù)功能                 : 通過串口往外發(fā)送數(shù)據(jù)
  247. * 參數(shù)列表       : 無
  248. * 函數(shù)輸出             : 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;                                        // 用來存儲轉(zhuǎn)換后以攝氏度為單位的溫度值

  256.         Ds18b20TempConvertCmd();                // 先寫入轉(zhuǎn)換命令
  257.         Ds18b20TempReadCmd();                        // 然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
  258.         tml = Ds18b20ReadByte();                // 讀取溫度值共16位,先讀低字節(jié)
  259.         tmh = Ds18b20ReadByte();                // 再讀高字節(jié)

  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后強轉(zhuǎn)為u16
  267.         return tDisp;
  268. }
復制代碼

Keil代碼下載,僅供參考:
25.1.ESP8266 Wifi Test.rar (20.28 KB, 下載次數(shù): 78)







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1