|
該項目主要是對山體環境進行監控,監控環境中的溫濕度,火災發生時火焰監測,以及燃燒所產生的煙霧進行監測報警,將所有監測到的數據以及火災報警通過5110顯示屏進行顯示。
所用到的硬件及傳感器:
1.STC12最小系統板
2.火焰監測模塊
3.MQ-2煙霧報警器
4.DHT11
5.諾基亞5110顯示屏
功能如下:
1.DHT11溫濕度采集
2.火焰傳感器的火焰監測(模塊輸入的高低電平)
3.51單片機ADC采集MQ-2的AD輸出
4.5110顯示溫濕度,煙霧傳感器的AD值,火焰傳感器是否進行報警顯示
STC12單片機最小系統原理圖如下:
2021-09-05_160858.png (110.53 KB, 下載次數: 84)
下載附件
2021-9-5 16:16 上傳
首先是DHT11的驅動程序,其采用的是單線通信,單片機驅動程序如下:
- #include <STC12C5A60S2.H>
- #include "dht11.h"
- #include "intrins.h"
- #define ulong unsigned long
- #define uchar unsigned char
- #define uint unsigned int
- unsigned char status;
- unsigned char DHT11T_Data_H, DHT11T_Data_L, DHT11RH_Data_H, DHT11RH_Data_L,CheckData_temp;//存放五字節數據
- /*可在其他的文件引用溫濕度值,實際是溫度的整數的10倍如dht11讀回的溫度是26,則wendu = 260, 濕度同理*/
- void Delay_ms(uint ms)
- {
- unsigned char i, j;
- while(ms)
- {
- _nop_();
- i = 11;
- j = 190;
- do
- {
- while (--j);
- } while (--i);
- ms--;
- }
- }
- void Delay_us(uint us) //2us
- {
- while(us)
- {
- _nop_();
- us--;
- }
- }
- unsigned char start_DHT11(unsigned int *temperature, unsigned int *RH)
- {
- unsigned char TData_H_temp,TData_L_temp,RHData_H_temp,RHData_L_temp,checktemp;
- unsigned char presence,flag = 0;
- unsigned int count;
-
- DHT11_OUTPUT;
- DHT11_L; //拉低18ms以上
- Delay_ms(20);
- DHT11_H;
-
- DHT11_INPUT;
- Delay_us(30);
- presence=DHT11_IN;
-
- if(!presence)
- {
- count=2;
- while((!DHT11_IN)&&count++);//等待低電平
- count=2;
- while((DHT11_IN)&&count++);//等待高電平
-
- RHData_H_temp = DHT11_ReadChar();
- RHData_L_temp = DHT11_ReadChar();
- TData_H_temp = DHT11_ReadChar();
- TData_L_temp = DHT11_ReadChar();
- CheckData_temp = DHT11_ReadChar();
-
- DHT11_OUTPUT;
- DHT11_H;
-
- checktemp = RHData_H_temp + RHData_L_temp + TData_H_temp + TData_L_temp;
-
- if ((checktemp == CheckData_temp) && (CheckData_temp != 0))
- {
- DHT11RH_Data_H = RHData_H_temp;
- DHT11RH_Data_L = RHData_L_temp;
- DHT11T_Data_H = TData_H_temp;
- DHT11T_Data_L = TData_L_temp;
- *temperature = TData_H_temp;
- *RH = RHData_H_temp;
- flag=1;
- }
- }
- return flag;
- }
- uchar DHT11_ReadChar(void)
- {
- unsigned char dat;
- unsigned int count; //計數防止死等
- unsigned char i;
- for(i=0;i<8;i++)
- {
- count=2;
- DHT11_INPUT;
- while((!DHT11_IN)&&count++); //等待50us低電平結束
- Delay_us(40); //40us
- dat <<= 1; //50us低電平+28us高電平表示'0'
- if(DHT11_IN) //50us低電平+70us高電平表示'1'
- dat |= 1;
- count=2;
- while((DHT11_IN)&&count++);
- if(count==1)break; //超時則跳出for循環
- }
- return dat;
- }
復制代碼 然后是5110的驅動程序,通信方式采用的是SPI:
- #include "LCD_5110_Font.h"
- #include "LCD_5110.h"
- #include "delay.h"
- /*******************************************************************************
- * 函 數 名 : LCD_write_byte
- * 函數功能 : 使用SPI接口寫數據到LCD
- * 輸 入 : 寫數據/命令選擇;
- * 輸 出 : 無
- *******************************************************************************/
- void LCD_write_byte(unsigned char dt, unsigned char command)
- {
- unsigned char i;
- LCD_5110_CSN = 0;// 片選
- LCD_5110_dc=command;
- for(i=0; i<8; i++)
- {
- if(dt&0x80)
- LCD_5110_sdin=1;
- else
- LCD_5110_sdin=0;
- dt=dt<<1;
- LCD_5110_sclk=0;
- Delay1us(1);
- LCD_5110_sclk=1;
- }
- LCD_5110_dc=1;
- Delay1us(1);
- LCD_5110_CSN = 1;
- Delay1us(1);
- LCD_5110_sdin=1;
- }
- /*******************************************************************************
- * 函 數 名 : LCD_init
- * 函數功能 : LCD初始化函數
- * 輸 入 : 無
- * 輸 出 : 無
- * 說 明 : 如果5110,顯示全黑或者,模糊,可以調節初始化程序中,//設定液晶偏置電壓
- *******************************************************************************/
- void LCD_init(void)
- {
- P0M0 = 0x04;
- LCD_5110_res=0;
- Delay1ms(2);
- LCD_5110_res=1;
- LCD_write_byte(0x21,0); //初始化Lcd,功能設定使用擴充指令
- // LCD_write_byte(0xA5,0); //設定液晶偏置電壓
- // LCD_write_byte(0x20,0); //使用基本指令
- // LCD_write_byte(0x0C,0); //設定顯示模式,正常顯示
- LCD_write_byte(0xC5,0); //設定液晶偏置電壓
- LCD_write_byte(0x06, 0); // 溫度校正
- LCD_write_byte(0xC5, 0); // 1:48
- LCD_write_byte(0x20,0); //使用基本指令
- LCD_write_byte(0x0C,0); //設定顯示模式,正常顯示
- LCD_clear(); //清屏
- LCD5110_Light = 1; //
- }
- /*******************************************************************************
- * 函 數 名 : LCD_set_XY
- * 函數功能 : 設置LCD坐標函數
- * 輸 入 : 0-83 Y:0-5
- * 輸 出 : 無
- *******************************************************************************/
- void LCD_set_XY(unsigned char X, unsigned char Y)
- {
- LCD_write_byte(0x40 | Y, 0);// column
- LCD_write_byte(0x80 | X, 0);// row
- }
- /*******************************************************************************
- * 函 數 名 : LCD_clear
- * 函數功能 : LCD清屏函數
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void LCD_clear(void)
- {
- unsigned char t;
- unsigned char k;
- LCD_set_XY(0,0);
- for(t=0; t<6; t++)
- {
- for(k=0; k<84; k++)
- {
- LCD_write_byte(0x00,1);
- }
- }
- }
- /*******************************************************************************
- * 函 數 名 : LCD_write_Zifu
- * 函數功能 : 顯示8(寬)*16(高)點陣列數字字母符號等半角類
- * 輸 入 : c:顯示的字符 row:列 page:頁
- * 輸 出 : 無
- *******************************************************************************/
- //void LCD_write_Zifu(unsigned char row, unsigned char page,unsigned char c)
- //{
- // unsigned char i;
- // c = c-32;
- // LCD_set_XY(row*8, page);// 列,頁
- // for(i=0; i<8; i++)
- // {
- // LCD_write_byte(Zifu[c*16+i],1);
- // }
- // LCD_set_XY(row*8, page+1);// 列,頁
- // for(i=8; i<16; i++)
- // {
- // LCD_write_byte(Zifu[c*16+i],1);
- // }
- //}
- /*******************************************************************************
- * 函 數 名 : LCD_write_hanzi
- * 函數功能 : 顯示16(寬)*16(高)點陣列漢字等半角類
- * 輸 入 : c:顯示的字符 row:列 page:頁
- * 輸 出 : 無
- *******************************************************************************/
- void LCD_write_hanzi(unsigned char row, unsigned char page,unsigned char c)
- {
- unsigned char i;
- LCD_set_XY(row*8, page); // 列,頁
- for(i=0; i<16; i++)
- {
- LCD_write_byte(hanzi[c*32+i],1);
- }
- LCD_set_XY(row*8, page+1); // 列,頁
- for(i=16; i<32; i++)
- {
- LCD_write_byte(hanzi[c*32+i],1);
- }
- }
- /*******************************************************************************
- * 函 數 名 : Init_LCD5110
- * 函數功能 : 應用型初始化
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Init_LCD5110(void)
- {
- unsigned char k;
- LCD_5110_res=0;
- for(k=0; k<250; k++);
- LCD_5110_res=1;
- //如果5110,顯示全黑或者,模糊,可以調節初始化程序中,//設定液晶偏置電壓
- LCD_init(); //初始化LCD模塊
- LCD_clear(); //清屏幕
- LCD5110_Light = 1;
- }
- /*******************************************************************************
- * 函 數 名 : Test_LCD
- * 函數功能 : 5110液晶測試程序
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Test_LCD(void)
- {
- unsigned char k;
- LCD_5110_res=0;
- for(k=0; k<250; k++);
- LCD_5110_res=1;
- LCD_init(); //初始化LCD模塊
- LCD_clear(); //清屏幕
- LCD_write_hanzi(1,0,0); //山
- LCD_write_hanzi(3,0,1); //體
- LCD_write_hanzi(5,0,2); //檢
- LCD_write_hanzi(7,0,3); //測
- LCD_ShowString(0, 2, "R: %", 16);
- LCD_ShowString(42, 2, "T: C", 16);
- LCD_ShowString(0, 4, "M: ", 16);
- //LCD_write_hanzi(9,0,4); //檢
- // LCD_write_hanzi(4,2,5); //測
- // LCD_write_hanzi(6,2,6); //預
- //
- // LCD_write_hanzi(6,2,7); //預
- // LCD_write_hanzi(6,2,8); //預
- // LCD_write_hanzi(6,2,9); //預
- //// LCD_ShowString(0,4,"CUIT",16);
- // LCD_write_hanzi(4,4,10); //張
- // LCD_write_hanzi(6,4,11); //媛
- // LCD_write_hanzi(8,4,11); //媛
- }
- //在指定位置顯示一個字符,包括部分字符
- //mode:0,反白顯示;1,正常顯示
- //size:選擇字體 16/12
- void LCD_ShowChar(unsigned char x,unsigned char y,unsigned char chr, unsigned char font_size)
- {
- unsigned char c=0,i=0;
- c=chr-' ';//得到偏移后的值
- if(x>Max_Column-1) {
- x=0;
- y=y+2;
- }
- if(font_size ==16)
- {
- LCD_set_XY(x,y);
- if((chr<='9')&&(chr >= '0'))
- {
- for(i=0; i<6; i++)
- LCD_write_byte(F8X16[c*16+i],LCD_DATA);
- LCD_set_XY(x,y+1);
- for(i=0; i<6; i++)
- LCD_write_byte(F8X16[c*16+i+8],LCD_DATA);
- }
- else
- {
- for(i=0; i<8; i++)
- LCD_write_byte(F8X16[c*16+i],LCD_DATA);
- LCD_set_XY(x,y+1);
- for(i=0; i<8; i++)
- LCD_write_byte(F8X16[c*16+i+8],LCD_DATA);
- }
- }
- else {
- LCD_set_XY(x,y);
- for(i=0; i<6; i++) {
- LCD_write_byte(F6x8[c][i],LCD_DATA);
- }
- }
- }
- //顯示一個字符號串
- void LCD_ShowString(unsigned char x,unsigned char y,unsigned char *chr, unsigned char font_size)
- {
- unsigned char j=0;
- while (chr[j]!='\0')
- {
- LCD_ShowChar(x,y,chr[j], font_size);
- if(font_size == 16)
- {
- if((chr[j] >= '0')&&(chr[j] <= '9'))
- {
- x+=5;
- } else
- x+=8;
- if(x>72) {
- x=0;
- y+=2;
- }
- }
- else
- {
- x+=6;
- if(x>78) {
- x=0;
- y+=1;
- }
- }
- j++;
- }
- }
- //m^n函數
- unsigned long oled_pow(unsigned char m,unsigned char n)
- {
- unsigned long result=1;
- while(n--)result*=m;
- return result;
- }
- //顯示2個數字
- //x,y :起點坐標
- //len :數字的位數
- //size:字體大小
- //mode:模式 0,填充模式;1,疊加模式
- //num:數值(0~4294967295);
- void LCD_ShowNum(unsigned char x,unsigned char y,unsigned long num,unsigned char len)
- {
- /* unsigned char t,temp;
- unsigned char enshow=0;
- for(t=0; t<len; t++)
- {
- temp=(num/oled_pow(10,len-t-1))%10;
- if(enshow==0&&t<(len-1))
- {
- if(temp==0)
- {
- // LCD_ShowChar(x+(size/2)*t,y,' ');
- LCD_ShowChar(x+6*t,y,'0', 6);
- continue;
- } else enshow=1;
- }
- // LCD_ShowChar(x+(size/2)*t,y,temp+'0');
- LCD_ShowChar(x+6*t,y,temp+'0', 6);
- }
- */
- ////////////////////
- unsigned char t,temp;
- unsigned char enshow=0;
- for(t=0; t<len; t++)
- {
- temp=(num/oled_pow(10,len-t-1))%10;
- if(enshow==0&&t<(len-1))
- {
- if(temp==0)
- {
- LCD_ShowChar(x+6*t,y,' ',6);
- continue;
- } else enshow=1;
- }
- LCD_ShowChar(x+6*t,y,temp+'0',6);
- }
- }
- void LCD_ugm3(unsigned char x,unsigned char y)
- {
- unsigned i;
- LCD_set_XY(x,y);
- for(i = 0; i < 13; i++)
- {
- LCD_write_byte(ugm3[0][i],LCD_DATA);
- }
- LCD_set_XY(x,y+1);
- for(i = 0; i < 13; i++)
- {
- LCD_write_byte(ugm3[1][i],LCD_DATA);
- }
- }
- void System_runing(unsigned char x,unsigned char y)
- {
- static bit temp = 0;
- temp = ~temp;
- LCD_set_XY(x,y);
- if(temp)
- LCD_write_byte(0x80, LCD_DATA);
- else
- LCD_write_byte(0x00, LCD_DATA);
- }
- void Show_Back(void)
- {
- LCD_clear(); //清屏
- LCD_ShowString(0, 1, "T: ", 1);
- LCD_ShowString(18, 1, "C ", 1);
- LCD_ShowString(27, 1, "CH2O: ", 1);
- LCD_ShowString(0, 3, "R: ", 1);
- LCD_ShowString(6, 3, ": ", 1);
- LCD_ShowString(18, 3, "% ", 1);
- LCD_ShowString(27, 3, "PM2.5: ", 1);
- LCD_ShowString(47, 3, "5: ", 1);
- LCD_ugm3(70,0);
- LCD_ugm3(70,2);
- }
復制代碼 MQ-2煙霧傳感器模塊的驅動代碼主要是通過12單片機自帶的ADC采集讀取模塊所輸出的AD值進而判斷是否有煙霧生成
- /********************* 做一次ADC轉換 *******************/
- uint adc10_start(uchar channel) //channel = 0~7
- {
- uint adc;
- uchar i;
- ADC_RES = 0;
- ADC_RESL = 0;
- ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;
- i = 250;
- do{
- if(ADC_CONTR & ADC_FLAG)
- {
- ADC_CONTR &= ~ADC_FLAG;
- adc = (uint)ADC_RES;
- adc = (adc << 2) | (ADC_RESL & 3);
- return adc;
- }
- }while(--i); //超時檢測
- return 1024;
- }
復制代碼 火焰傳感器監測比較簡單,即通過讀取模塊輸出的高低電平進行判斷即可知道模塊是否監測到火光。
主函數如下,主要顯示所采集的傳感器數據,然后對火焰傳感器的是否監測到火警進行判斷,顯示當前是安全還是火警
- /********************* 主函數 *************************/
- void main(void)
- {
- uchar i;
- uint j; //煙霧濃度緩存
- char show_temp[20] = {0}; //液晶顯示緩存
- unsigned int Temp1, RH1; //溫度、濕度緩存
- Uart1_Init(); //串口初始化
- LCD_init(); //lcd初始化
- Test_LCD(); //開機界面
- //Show_Back();
- //PrintString("****** STC12C5A60S2系列ADC程序 2011-02-27 ******\r\n"); //上電后串口發送一條提示信息
- P1ASF = 0xff; //12C5A60AD/S2系列模擬輸入(AD)選擇
- ADC_CONTR = ADC_360T | ADC_ON;
-
- while(1)
- {
- start_DHT11(&Temp1, &RH1); //讀取DHT11溫濕度值
- j = adc10_start(1); //讀取煙霧濃度值
- sprintf(show_temp, "%d",j);
- LCD_ShowString(13, 4, show_temp, 16); //顯示煙霧濃度
- sprintf(show_temp, "%d",RH1);
- LCD_ShowString(12, 2, show_temp, 16); //顯示濕度
- sprintf(show_temp, "%d",Temp1);
- LCD_ShowString(55, 2, show_temp, 16); //顯示溫度
- if (beep == 0) //火焰報警
- {
- LCD_ShowString(48, 4, "Fire", 16);
- }
- else
- {
- LCD_ShowString(48, 4, "Safe", 16);
- }
- // start_DHT11(&Temp1, &RH1);
- // sprintf(show_temp, "%02d",Temp1);
- // UART1_SendString(show_temp);
- // UART1_SendString("\r\n");
- // sprintf(show_temp, "%02d",RH1);
- //UART1_SendData(j);
- UART1_SendData(j/1000 + '0');
- UART1_SendData(j%1000/100 + '0');
- UART1_SendData(j%100/10 + '0');
- UART1_SendData(j%10 + '0');
- UART1_SendString("\r\n");
- delay_dms(250);
- }
- }
復制代碼
此項目還可以進行物聯網改造實現遠程對環境進行監測,若后續有條件會進一步開發(采用4g或者NB-IOT模塊,在手機安卓端做監測APP實現遠程監控)
51hei.png (8.28 KB, 下載次數: 79)
下載附件
2021-9-5 16:39 上傳
上圖Keil代碼工程下載:
程序.zip
(118.6 KB, 下載次數: 56)
2021-9-5 16:27 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|