找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5733|回复: 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, 下载次数: 94)



评分

参与人数 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 单片机教程网

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