|
/*--------------發送溫度濕度傳感器數據--------*/
/*--------------發送煙霧傳感器AD數據--------*/
/*--------------發送電壓傳感器AD數據--------*/
/*--------------發送照度傳感器數據--------*/
/*--------------發送振動傳感器數據--------*/
控制8266WIFI模塊 讀取多個傳感器數據 并通過網絡進行上傳
單片機源程序如下:
- #include "STC12C5A.h" //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
- #include"delay.h"
- #include <stdio.h>
- #include <intrins.h>
- #include "ADC.c"
- #include "BH1750.c"
- #include "Define.h"
- unsigned int ibz;//接收到了多少個字節
- unsigned char Srece_ok=0;
- unsigned char Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};
- unsigned char Sensor_Check; //校驗和
- unsigned char Sensor_AnswerFlag; //收到起始標志位
- unsigned char Sensor_ErrorFlag; //讀取傳感器錯誤標志
- unsigned int Sys_CNT;
- unsigned int Tmp;
- unsigned char *String;
- unsigned char buf[10];//接收數據
- unsigned char zdjc;
- //字符串定義
- #define S_Temp "Temp:"
- #define S_RH "RH:"
- #define S_CRCT "Check: True"
- #define S_CRCF "Check: Wrong"
- #define S_Data "Data: "
- #define S_NotS "Sensor Not Connected"
- //sfr AUXR = 0x8E;
- sbit Sensor_SDA = P0^0;
- /*------------------------------------------------
- 函數聲明
- ------------------------------------------------*/
- void SendByte(unsigned char dat);
- void SendStr(unsigned char *s);
- /*------------------------------------------------
- 串口初始化
- ------------------------------------------------*/
- void IOINIT(void) //I/O強上拉模式;
- {
- // P0M1 = 0x00; P0M0 = 0xff; P0=0; //點陣列(Y)(L:OFF; H,H+:ON,ON+;)
- 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;
- // P2M1 = B(00000000); P2M0 = B(11111111);P2=0; //點陣行(X0(Left))(L:OFF; H,H+:ON,ON+;)
- // P3M1 = B(00000000); P3M0 = B(11111111);P3=0; //點陣行(X1(Right))(L:OFF; H,H+:ON,ON+;)
- P1ASF =B(00000011); //將P10,P11的IO設置為模擬輸入功能;
- }
- void InitUART(void)
- {
- TMOD = 0x20;
- SCON = 0x50;
- TH1 = 0xDC;
- TL1 = TH1;
- PCON = 0x00;
- EA = 1; //總中斷
- ES = 1; //允許串口中斷
- EX0=1; //允許外部中斷0
- IT0=1; // 外部中斷0 下降沿觸發
- TR1 = 1;
- }
-
- /*------------------------------------------------
- 發送一個字節
- ------------------------------------------------*/
- void SendByte(unsigned char dat)
- {
- SBUF = dat;
- while(!TI);
- TI = 0;
- }
- void Delay_N10us(unsigned char t)
- { unsigned char a;
- while(t--)
- {
- for(a=26;a>0;a--);
- }
- }
-
- void DelayMs(unsigned int t)
- {
- while(t--)
- {
- unsigned char a,b;
- for(b=18;b>0;b--)
- for(a=152;a>0;a--);
- _nop_(); //if Keil,require use intrins.h
- }
- }
- /********************************************\
- |* 功能: 串口發送子函數 *|
- \********************************************/
- void UART_PutString(unsigned char *buf)
- {
- while(*buf)
- SendByte(*buf++);
- }
- void UART_PutStringAndNum(unsigned char *buf ,unsigned int num)
- {
- unsigned char a[3],i;
- a[3] = '0'+num%10;
- a[2] = '.';
- a[1] = '0'+num/10%10;
- a[0] = '0'+num/100%10;
- while(*buf)
- SendByte(*buf++);
- SendByte(' ');
- for(i=0;i<4;i++)
- {
- SendByte(a[i]);
- }
- }
- void UART_PutStringAnd_Data(unsigned char *buf ,unsigned char *bufdata)
- {
- unsigned char a[2],i,j;
- while(*buf)
- SendByte(*buf++);
- SendByte(' ');
- for(i=0;i<5;i++)
- {
- a[0] = bufdata[i]/16;
- a[1] = bufdata[i]%16;
- for(j=0;j<2;j++)
- {
- if(a[j]>9)
- {
- a[j] = (a[j]-10)+'A';
- }
- else
- {
- a[j] = a[j]+'0';
- }
- SendByte(a[j]);
- }
- //SendByte(' ');
- }
- }
- /********************************************\
- |* 功能: 串口發送傳感器數據函數 *|
- \********************************************/
- void UARTSend_Nbyte(void)
- {
- if(Sensor_AnswerFlag == 1)
- {
- Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3];
- //校驗成功
- if(Sensor_Check ==Sensor_Data[4])
- {
- String = S_RH;//"RH=";
- Tmp = Sensor_Data[0]*256+Sensor_Data[1];
- UART_PutStringAndNum(String,Tmp);
- SendByte(' ');
-
- String = S_Temp;// "Temp=";
- Tmp = Sensor_Data[2]*256+Sensor_Data[3];
- UART_PutStringAndNum(String,Tmp);
- SendByte(' ');
- String = S_CRCT;//"Check=True";
- UART_PutString(String);
- }else //校驗失敗 送上讀到數據
- {
- String = S_Data;//"Data: ";
- UART_PutStringAnd_Data(String,Sensor_Data);
- SendByte(' ');
- String = S_CRCF;//"Check: Wrong";
- UART_PutString(String);
- }
- }// 傳感器未連接
- else
- {
- String = S_NotS; //"Sensor Not Connected";
- UART_PutString(String);
- }
- SendByte(0x0A);
- }
- void Clear_Data (void)
- {
- int i;
- for(i=0;i<5;i++)
- {
- Sensor_Data[i] = 0x00;
- }//接收數據清零
- }
- /********************************************\
- |* 功能: 讀傳感器發送的單個字節 *|
- \********************************************/
- unsigned char Read_SensorData(void)
- {
- unsigned char i,cnt;
- unsigned char buffer,tmp;
- buffer = 0;
- for(i=0;i<8;i++)
- {
- cnt=0;
- while(!Sensor_SDA) //檢測上次低電平是否結束
- {
- if(++cnt >= 300)
- {
- break;
- }
- }
- //延時Min=26us Max50us 跳過數據"0" 的高電平
- Delay_N10us(2); //延時30us
-
- //判斷傳感器發送數據位
- tmp =0;
- if(Sensor_SDA)
- {
- tmp = 1;
- }
- cnt =0;
- while(Sensor_SDA) //等待高電平 結束
- {
- if(++cnt >= 200)
- {
- break;
- }
- }
- buffer <<=1;
- buffer |= tmp;
- }
- return buffer;
- }
- /********************************************\
- |* 功能: 讀傳感器 *|
- \********************************************/
- unsigned char Read_Sensor(void)
- {
- unsigned char i;
- //主機拉低(Min=800US Max=20Ms)
- Sensor_SDA = 0;
- DelayMs(2); //延時2Ms
-
- //釋放總線 延時(Min=30us Max=50us)
- Sensor_SDA = 1;
- Delay_N10us(1);//延時30us
- //主機設為輸入 判斷傳感器響應信號
- Sensor_SDA = 1;
-
- Sensor_AnswerFlag = 0; // 傳感器響應標志
- //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行
- if(Sensor_SDA ==0)
- {
- Sensor_AnswerFlag = 1;//收到起始信號
- Sys_CNT = 0;
- //判斷從機是否發出 80us 的低電平響應信號是否結束
- while((!Sensor_SDA))
- {
- if(++Sys_CNT>300) //防止進入死循環
- {
- Sensor_ErrorFlag = 1;
- return 0;
- }
- }
- Sys_CNT = 0;
- //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
- while((Sensor_SDA))
- {
- if(++Sys_CNT>300) //防止進入死循環
- {
- Sensor_ErrorFlag = 1;
- return 0;
- }
- }
- // 數據接收 傳感器共發送40位數據
- // 即5個字節 高位先送 5個字節分別為濕度高位 濕度低位 溫度高位 溫度低位 校驗和
- // 校驗和為:濕度高位+濕度低位+溫度高位+溫度低位
- for(i=0;i<5;i++)
- {
- Sensor_Data[i] = Read_SensorData();
- }
- }
- else
- {
- Sensor_AnswerFlag = 0; // 未收到傳感器響應
- }
- return 1;
- }
-
-
- void conversion(uint temp_data) // 數據轉換出 個,十,百,千,萬
- {
- Sensor_Data[0]=temp_data/10000+0x30 ;
- temp_data=temp_data%10000; //取余運算
- Sensor_Data[1]=temp_data/1000+0x30 ;
- temp_data=temp_data%1000; //取余運算
- Sensor_Data[2]=temp_data/100+0x30 ;
- temp_data=temp_data%100; //取余運算
- Sensor_Data[3]=temp_data/10+0x30 ;
- temp_data=temp_data%10; //取余運算
- Sensor_Data[4]=temp_data+0x30;
- }
- /*------------------------------------------------
- 主函數
- ------------------------------------------------*/
- void main (void)
- {
- unsigned int i,b;
- unsigned char temp[7];
- AUXR = AUXR|0x40; // T1, 1T Mode
- IOINIT(); //初始化IO口
- InitADC(); //初始化AD轉換
- Init_BH1750(); //初始化光照傳感器
- zdjc=0; //振動檢測位置0;
- InitUART(); //串口初始化
- DelayMs(8000);
- SendStr("AT+CIPMUX=0");
- SendByte(0x0d);
- SendByte(0x0a);
- DelayMs(2000);
- while (1)
- {
- b=getlx();
- SendStr("AT+CIPSTART=*TCP*,*192.168.2.107*,8080");
- SendByte(0x0d);
- SendByte(0x0a);
- DelayMs(1000);
- /*--------------發送溫度濕度傳感器數據--------*/
- SendStr("AT+CIPSEND=61");
- SendByte(0x0d);
- SendByte(0x0a);
- DelayMs(1000);
- Clear_Data();
- Read_Sensor();
- UARTSend_Nbyte();
- /*--------------發送煙霧傳感器AD數據--------*/
- i=GetADCResult(0);
- sprintf(temp," MQ=%04d",i);
- SendStr(temp);
- /*--------------發送電壓傳感器AD數據--------*/
- i=GetADCResult(1);
- sprintf(temp," AC=%04d",i);
- SendStr(temp);
- /*--------------發送照度傳感器數據--------*/
- conversion(b);
- SendStr(" LX=");
- SendStr(Sensor_Data);
- /*--------------發送振動傳感器數據--------*/
- if(zdjc==1)
- {SendStr(" YZD");zdjc=0;}
- else{SendStr(" NZD");}
- SendByte(0x0d);
- SendByte(0x0a);
- DelayMs(1000);
- // if(Srece_ok==1)
- // {
- //ES=0;
- //sprintf(temp,"AT+CIPSEND=%d",ibz);
- //SendStr(temp);
- //SendByte(0x0d);
- //SendByte(0x0a);
- // DelayMs(5000);
- //
- // for(i=0;i<ibz;i++)
- // {
- // SendByte(buf[b]);
- // b++;
- // }
- // SendByte(0x0d);
- // SendByte(0x0a);
- // Srece_ok=0;
- // ibz=0;
- // b=0;
- // ES=1;
- // }
- }
- }
- /*------------------------------------------------
- 發送一個字符串
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (53.28 KB, 下載次數: 142)
下載附件
2017-6-10 18:03 上傳
所有資料51hei提供下載:
傳感器WIFI傳輸.rar
(78.75 KB, 下載次數: 96)
2017-6-10 17:49 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|