久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6542|回復: 2
打印 上一主題 下一主題
收起左側

用stc單片機控制8266WIFI模塊 并啟動BH1750等多個傳感器 回傳數據到服務器

  [復制鏈接]
跳轉到指定樓層
樓主
/*--------------發送溫度濕度傳感器數據--------*/
/*--------------發送煙霧傳感器AD數據--------*/
/*--------------發送電壓傳感器AD數據--------*/
/*--------------發送照度傳感器數據--------*/
/*--------------發送振動傳感器數據--------*/
控制8266WIFI模塊  讀取多個傳感器數據 并通過網絡進行上傳


單片機源程序如下:
  1. #include "STC12C5A.h"         //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義                        
  2. #include"delay.h"
  3. #include <stdio.h>
  4. #include <intrins.h>
  5. #include "ADC.c"
  6. #include "BH1750.c"
  7. #include "Define.h"

  8. unsigned int ibz;//接收到了多少個字節
  9. unsigned char Srece_ok=0;
  10. unsigned char Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};
  11. unsigned char Sensor_Check;                  //校驗和
  12. unsigned char Sensor_AnswerFlag;  //收到起始標志位
  13. unsigned char Sensor_ErrorFlag;   //讀取傳感器錯誤標志
  14. unsigned int  Sys_CNT;
  15. unsigned int  Tmp;
  16. unsigned char *String;
  17. unsigned char buf[10];//接收數據
  18. unsigned char zdjc;
  19. //字符串定義
  20. #define S_Temp "Temp:"
  21. #define S_RH   "RH:"
  22. #define S_CRCT "Check: True"
  23. #define S_CRCF "Check: Wrong"
  24. #define S_Data "Data: "
  25. #define S_NotS "Sensor Not Connected"
  26. //sfr AUXR   = 0x8E;
  27. sbit Sensor_SDA = P0^0;
  28. /*------------------------------------------------
  29.                    函數聲明
  30. ------------------------------------------------*/
  31. void SendByte(unsigned char dat);
  32. void SendStr(unsigned char *s);
  33. /*------------------------------------------------
  34.                     串口初始化
  35. ------------------------------------------------*/
  36. void IOINIT(void)                                                          //I/O強上拉模式;
  37. {
  38. //        P0M1 = 0x00;            P0M0 = 0xff;       P0=0; //點陣列(Y)(L:OFF; H,H+:ON,ON+;)
  39.         P1M1 = B(00000011); P1M0 = B(00000011);P1=1; //(P1@(高阻,IN)&P16@(高阻,IN);TouchKey) ... P14@(傳統IO,Beep,IN) P13@(強推,OUT)呼吸燈 ... P11@(高阻,IN)AD2;P10@(高阻,IN)AD1;      
  40. //        P2M1 = B(00000000); P2M0 = B(11111111);P2=0; //點陣行(X0(Left))(L:OFF; H,H+:ON,ON+;)  
  41. //        P3M1 = B(00000000); P3M0 = B(11111111);P3=0; //點陣行(X1(Right))(L:OFF; H,H+:ON,ON+;)               
  42.         P1ASF =B(00000011);                          //將P10,P11的IO設置為模擬輸入功能;     
  43. }


  44.   void InitUART(void)
  45. {
  46.     TMOD = 0x20;
  47.     SCON = 0x50;
  48.     TH1 = 0xDC;
  49.     TL1 = TH1;
  50.     PCON = 0x00;
  51.     EA = 1;         //總中斷
  52.     ES = 1;         //允許串口中斷
  53.         EX0=1;    //允許外部中斷0
  54.         IT0=1;   // 外部中斷0 下降沿觸發
  55.     TR1 = 1;
  56. }
  57.   
  58. /*------------------------------------------------
  59.                     發送一個字節
  60. ------------------------------------------------*/
  61. void SendByte(unsigned char dat)
  62. {
  63. SBUF = dat;
  64. while(!TI);
  65.       TI = 0;
  66. }
  67. void Delay_N10us(unsigned char t)
  68. {          unsigned char a;
  69.     while(t--)
  70.    {
  71.     for(a=26;a>0;a--);
  72.    }
  73. }
  74.         
  75. void DelayMs(unsigned int t)
  76. {   
  77. while(t--)
  78. {
  79.     unsigned char a,b;
  80.     for(b=18;b>0;b--)
  81.      for(a=152;a>0;a--);
  82.     _nop_();  //if Keil,require use intrins.h
  83. }
  84. }

  85. /********************************************\
  86. |* 功能: 串口發送子函數                                 *|
  87. \********************************************/
  88. void UART_PutString(unsigned char *buf)
  89.   {
  90.         while(*buf)
  91.       SendByte(*buf++);
  92.   }
  93. void UART_PutStringAndNum(unsigned char *buf ,unsigned int num)
  94.   {
  95.         unsigned char a[3],i;
  96.         a[3] = '0'+num%10;
  97.         a[2] = '.';
  98.         a[1] = '0'+num/10%10;
  99.         a[0] = '0'+num/100%10;
  100.         while(*buf)
  101.       SendByte(*buf++);
  102.         SendByte(' ');
  103.          for(i=0;i<4;i++)
  104.         {
  105.                 SendByte(a[i]);
  106.         }
  107.   }
  108. void UART_PutStringAnd_Data(unsigned char *buf ,unsigned char *bufdata)
  109.   {
  110.         unsigned char a[2],i,j;
  111.         while(*buf)
  112.       SendByte(*buf++);
  113.         SendByte(' ');
  114.         for(i=0;i<5;i++)
  115.         {
  116.                 a[0] = bufdata[i]/16;
  117.                 a[1] = bufdata[i]%16;
  118.                 for(j=0;j<2;j++)
  119.                 {
  120.                   if(a[j]>9)
  121.                   {
  122.                     a[j] = (a[j]-10)+'A';
  123.                   }
  124.                   else
  125.                   {
  126.                     a[j] = a[j]+'0';
  127.                   }
  128.                   SendByte(a[j]);
  129.                 }
  130.                 //SendByte(' ');
  131.         }
  132.   }
  133. /********************************************\
  134. |* 功能: 串口發送傳感器數據函數                         *|
  135. \********************************************/
  136. void UARTSend_Nbyte(void)
  137.   {
  138.            if(Sensor_AnswerFlag == 1)
  139.            {
  140.               Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3];
  141.                   //校驗成功
  142.                   if(Sensor_Check ==Sensor_Data[4])        
  143.                   {
  144.                      String = S_RH;//"RH=";           
  145.                  Tmp = Sensor_Data[0]*256+Sensor_Data[1];         
  146.                  UART_PutStringAndNum(String,Tmp);
  147.                             SendByte(' ');
  148.                  
  149.                          String = S_Temp;// "Temp=";           
  150.                         Tmp = Sensor_Data[2]*256+Sensor_Data[3];           
  151.                  UART_PutStringAndNum(String,Tmp);
  152.                             SendByte(' ');

  153.                      String = S_CRCT;//"Check=True";
  154.                      UART_PutString(String);
  155.                   }else        //校驗失敗 送上讀到數據
  156.                   {
  157.              String = S_Data;//"Data: ";
  158.                      UART_PutStringAnd_Data(String,Sensor_Data);
  159.                          SendByte(' ');        
  160.                          String = S_CRCF;//"Check: Wrong";
  161.                      UART_PutString(String);
  162.                   }
  163.                 }// 傳感器未連接
  164.                 else
  165.                 {
  166.                    String = S_NotS; //"Sensor Not Connected";
  167.                     UART_PutString(String);
  168.                 }            
  169.             SendByte(0x0A);

  170.   }  
  171. void Clear_Data (void)
  172.   {
  173.         int i;
  174.         for(i=0;i<5;i++)
  175.         {
  176.            Sensor_Data[i] = 0x00;
  177.          }//接收數據清零
  178.   }


  179. /********************************************\
  180. |* 功能: 讀傳感器發送的單個字節                *|
  181. \********************************************/
  182. unsigned char Read_SensorData(void)
  183.   {
  184.         unsigned char i,cnt;
  185.         unsigned char buffer,tmp;
  186.         buffer = 0;
  187.         for(i=0;i<8;i++)
  188.         {
  189.                 cnt=0;
  190.                 while(!Sensor_SDA)        //檢測上次低電平是否結束
  191.                 {
  192.                   if(++cnt >= 300)
  193.                    {
  194.                           break;
  195.                    }
  196.                 }
  197.                 //延時Min=26us Max50us 跳過數據"0" 的高電平
  198.                 Delay_N10us(2);         //延時30us   
  199.                
  200.                 //判斷傳感器發送數據位
  201.                 tmp =0;
  202.                 if(Sensor_SDA)         
  203.                 {
  204.                   tmp = 1;
  205.                 }  
  206.                 cnt =0;
  207.                 while(Sensor_SDA)                //等待高電平 結束
  208.                 {
  209.                            if(++cnt >= 200)
  210.                         {
  211.                           break;
  212.                         }
  213.                 }
  214.                 buffer <<=1;
  215.                 buffer |= tmp;        
  216.         }
  217.         return buffer;
  218.   }

  219. /********************************************\
  220. |* 功能: 讀傳感器                              *|
  221. \********************************************/
  222. unsigned char Read_Sensor(void)
  223.   {
  224.         unsigned char i;
  225.         //主機拉低(Min=800US Max=20Ms)
  226.     Sensor_SDA = 0;
  227.         DelayMs(2);  //延時2Ms
  228.          
  229.         //釋放總線 延時(Min=30us Max=50us)
  230.         Sensor_SDA = 1;         
  231.         Delay_N10us(1);//延時30us
  232.         //主機設為輸入 判斷傳感器響應信號
  233.         Sensor_SDA = 1;
  234.                
  235.         Sensor_AnswerFlag = 0;  // 傳感器響應標志         

  236.         //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行         
  237.         if(Sensor_SDA ==0)
  238.         {
  239.            Sensor_AnswerFlag = 1;//收到起始信號
  240.            Sys_CNT = 0;
  241.            //判斷從機是否發出 80us 的低電平響應信號是否結束         
  242.            while((!Sensor_SDA))
  243.            {
  244.              if(++Sys_CNT>300) //防止進入死循環
  245.                  {
  246.                    Sensor_ErrorFlag = 1;
  247.                    return 0;
  248.                   }
  249.             }
  250.             Sys_CNT = 0;
  251.             //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
  252.             while((Sensor_SDA))
  253.             {
  254.                if(++Sys_CNT>300) //防止進入死循環
  255.                    {
  256.                      Sensor_ErrorFlag = 1;
  257.                      return 0;
  258.                    }
  259.             }                  
  260.             // 數據接收        傳感器共發送40位數據
  261.             // 即5個字節 高位先送  5個字節分別為濕度高位 濕度低位 溫度高位 溫度低位 校驗和
  262.             // 校驗和為:濕度高位+濕度低位+溫度高位+溫度低位
  263.             for(i=0;i<5;i++)
  264.             {
  265.               Sensor_Data[i] = Read_SensorData();
  266.             }
  267.           }
  268.           else
  269.           {
  270.             Sensor_AnswerFlag = 0;          // 未收到傳感器響應        
  271.           }
  272.           return 1;
  273.   }   
  274.   
  275.   
  276. void conversion(uint temp_data)  //  數據轉換出 個,十,百,千,萬
  277. {  
  278.     Sensor_Data[0]=temp_data/10000+0x30 ;
  279.     temp_data=temp_data%10000;   //取余運算
  280.         Sensor_Data[1]=temp_data/1000+0x30 ;
  281.     temp_data=temp_data%1000;    //取余運算
  282.     Sensor_Data[2]=temp_data/100+0x30   ;
  283.     temp_data=temp_data%100;     //取余運算
  284.     Sensor_Data[3]=temp_data/10+0x30    ;
  285.     temp_data=temp_data%10;      //取余運算
  286.     Sensor_Data[4]=temp_data+0x30;         
  287. }                           
  288. /*------------------------------------------------
  289.                     主函數
  290. ------------------------------------------------*/
  291. void main (void)
  292. {

  293. unsigned int i,b;
  294. unsigned char temp[7];
  295. AUXR = AUXR|0x40;  // T1, 1T Mode
  296. IOINIT();         //初始化IO口
  297. InitADC();                          //初始化AD轉換
  298. Init_BH1750();                //初始化光照傳感器
  299. zdjc=0;                                //振動檢測位置0;


  300. InitUART();                        //串口初始化
  301. DelayMs(8000);
  302. SendStr("AT+CIPMUX=0");
  303.   SendByte(0x0d);
  304.   SendByte(0x0a);
  305. DelayMs(2000);
  306. while (1)                       
  307.     {
  308. b=getlx();
  309. SendStr("AT+CIPSTART=*TCP*,*192.168.2.107*,8080");
  310. SendByte(0x0d);
  311. SendByte(0x0a);
  312. DelayMs(1000);
  313. /*--------------發送溫度濕度傳感器數據--------*/
  314. SendStr("AT+CIPSEND=61");
  315. SendByte(0x0d);
  316. SendByte(0x0a);
  317. DelayMs(1000);
  318. Clear_Data();
  319. Read_Sensor();
  320. UARTSend_Nbyte();
  321. /*--------------發送煙霧傳感器AD數據--------*/
  322. i=GetADCResult(0);
  323. sprintf(temp," MQ=%04d",i);
  324. SendStr(temp);
  325. /*--------------發送電壓傳感器AD數據--------*/
  326. i=GetADCResult(1);
  327. sprintf(temp," AC=%04d",i);
  328. SendStr(temp);
  329. /*--------------發送照度傳感器數據--------*/
  330. conversion(b);
  331. SendStr(" LX=");
  332. SendStr(Sensor_Data);
  333. /*--------------發送振動傳感器數據--------*/
  334. if(zdjc==1)
  335. {SendStr(" YZD");zdjc=0;}
  336. else{SendStr(" NZD");}
  337. SendByte(0x0d);
  338. SendByte(0x0a);
  339. DelayMs(1000);




  340. // if(Srece_ok==1)   
  341. //  {
  342. //ES=0;
  343. //sprintf(temp,"AT+CIPSEND=%d",ibz);
  344. //SendStr(temp);
  345. //SendByte(0x0d);
  346. //SendByte(0x0a);
  347. // DelayMs(5000);
  348. //
  349. //        for(i=0;i<ibz;i++)
  350. //                {  
  351. //                SendByte(buf[b]);
  352. //                b++;
  353. //                }
  354. //        SendByte(0x0d);
  355. //        SendByte(0x0a);
  356. //                Srece_ok=0;
  357. //                ibz=0;
  358. //                b=0;
  359. //                ES=1;
  360. //   }
  361.   }
  362. }


  363. /*------------------------------------------------
  364.                     發送一個字符串
  365. ……………………

  366. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


所有資料51hei提供下載:
傳感器WIFI傳輸.rar (78.75 KB, 下載次數: 96)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏12 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:245000 發表于 2018-1-15 08:21 來自手機 | 只看該作者
感謝分享,很有參考價值
回復

使用道具 舉報

板凳
ID:671956 發表于 2022-1-17 09:45 | 只看該作者
這樣的分享才是真分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国户精品久久久久久久久久久不卡 | 中文av电影| 91福利在线观看视频 | 欧州一区二区三区 | 黄色一级毛片 | 中文字幕高清 | 欧美日韩一区二区视频在线观看 | 成人av免费网站 | 久久看看 | 中文字幕精品一区二区三区精品 | 国产在线观看一区二区 | 9色视频在线 | 二区在线视频 | 日韩一级黄色毛片 | 91美女在线观看 | 欧美日韩三级 | 91超碰在线观看 | 亚洲 欧美 日韩在线 | 成人h动漫亚洲一区二区 | 黄色免费在线观看网址 | 日韩在线播放一区 | 国产999在线观看 | 亚洲欧美综合 | 欧美精品久久久 | 欧美一区二区三 | 一区二区精品 | 久久久久久久国产 | 中文字幕亚洲精品在线观看 | 久久性色 | 日韩第一区| 国产一级黄色网 | 91精品国产综合久久婷婷香蕉 | 欧美视频在线播放 | 免费视频久久久久 | 精品久久九| 全免费a级毛片免费看视频免 | 欧美一级在线观看 | 成人在线h| 91国产精品| 亚洲性人人天天夜夜摸 | 夜夜爆操 |