|
先說這次的實(shí)驗(yàn):這次實(shí)驗(yàn)歷經(jīng)了差不多兩個(gè)周,所獲不少。最后實(shí)現(xiàn)了,還是有點(diǎn)小激動(dòng)的,這同時(shí)也是我的課程設(shè)計(jì)。這次的設(shè)計(jì)主要是通過讀取DHT11和HCSR04的數(shù)值,(Proteus的傳感器貌似這兩款好用一點(diǎn))把讀取的DHT11和HCSR04數(shù)值通過轉(zhuǎn)化在lcd1602中顯示出來,還有就是可以設(shè)置通過按鍵設(shè)置DHT11的溫濕度閾值。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
2020-06-21_093836.png (59.59 KB, 下載次數(shù): 63)
下載附件
2020-6-22 11:22 上傳
運(yùn)行結(jié)果圖:
2020-06-21_093852.png (59.85 KB, 下載次數(shù): 53)
下載附件
2020-6-22 11:22 上傳
按下K1,K2為加1設(shè)置,K3為減1設(shè)置
2020-06-21_093933.png (58.66 KB, 下載次數(shù): 74)
下載附件
2020-6-22 11:22 上傳
調(diào)整濕度最小值要為88%
濕度低于88%;警報(bào)響,紅燈亮
2020-06-21_093949.png (60.64 KB, 下載次數(shù): 78)
下載附件
2020-6-22 11:22 上傳
在調(diào)DHT11使它正常,同時(shí)也跳一下超聲波,看數(shù)據(jù)傳輸是否正常
2020-06-21_094009.png (59.88 KB, 下載次數(shù): 69)
下載附件
2020-6-22 11:22 上傳
2020-06-21_094118.png (61.31 KB, 下載次數(shù): 66)
下載附件
2020-6-22 11:22 上傳
當(dāng)超過閾值時(shí)警報(bào),紅燈亮起,綠燈滅。下面是主要代碼:
主要代碼:
- #include <stm32f4xx.h>
- #include "delay.h"
- #include "DHT11.h"
- #include "LCD1602.h"
- #include "SOUN.h"
- #include "KEY_ExitInit.h"
- #include "LED_INIT.h"
- #include "HCSR04.h"
- unsigned char move = 0x82;
- unsigned char RH,RL,TH,TL;
- unsigned char h0 = 0X38,h1 = 0X36;
- unsigned char t0 = 0X32,t1 = 0X38;
- unsigned char DATA[4];//存溫濕度數(shù)據(jù)
- unsigned char Leg[4];//存超聲波
- unsigned char R[7] = "SD:";
- unsigned char H[7] = "WD:";
- unsigned char L[7] = "Legth:";
- unsigned char r[2] = "%";
- unsigned char h[2] = "C";
- ////////////////////////// 讀DHT11數(shù)據(jù)及數(shù)據(jù)轉(zhuǎn)換 ///////////////////////////////////////
- int DHT11_ReadDATA(void)
- {
- int i;
- unsigned char RHTH[5]={0};
- DHT11_Start();//開始信號(hào)
- for(i=0;i<5;i++)
- {
- RHTH[i] = DHT11_ReadByte();//循環(huán)讀5次一字節(jié) 剛好40bit
- }
- if(RHTH[0]+RHTH[1]+RHTH[2]+RHTH[3] == RHTH[4])
- {
- RH = RHTH[0];
- RL = RHTH[1];
- TH = RHTH[2];
- TL = RHTH[3];
- DATA[0]='0'+(RH/10);//數(shù)據(jù)顯示處理
- DATA[1]='0'+(RH%10);
- DATA[2]='0'+(TH/10);
- DATA[3]='0'+(TH%10);
- return 0;
- }
- else
- {
-
- return -1;
- }
- }
- ///////////////////////////// END //////////////////////////////////////////
- //////////////////////////// 獲取超聲波數(shù)據(jù)及轉(zhuǎn)換////////////////////////
- void HCSR04_data(void)
- {
- int a = 0;
- a = HCSR04_GetLength();
- Leg[0]='0'+(a/10);
- Leg[1]='0'+(a%10);
- a = a*100;
- Leg[2] = '0'+(a%100)/10;
- Leg[3] = '0'; // '0'+(a%1000) 只顯示到第三位,所以第四位寫入0
- }
- /////////////////////////// END ///////////////////////////////////////////
- //////////////////////////// 顯示設(shè)定的閾值 ////////////////////////////////
- void LCD_Config(void)
- {
- LCD_WRITE_StrDATA(1,1,"H:");
- LCD_WRITE_char(1,3,h0);
- LCD_WRITE_char(1,4,h1);
- LCD_WRITE_StrDATA(2,1,"T:");
- LCD_WRITE_char(2,3,t0);
- LCD_WRITE_char(2,4,t1);
- delay_ms(9);
- }
- /////////////////////////// END ///////////////////////////////////////
- //////////////////////////// 顯示溫濕度和超聲波數(shù)值,及超過閾值后警報(bào) ///////////////////////////////////
- void LCD_Show(void)
- {
- while(1)
- {
- HCSR04_data();
- delay_ms(30);
- if(DHT11_ReadDATA() == 0)//讀取溫濕度成功
- {
- delay_ms(80);
- LCD_WRITE_CMD( 0x0C );
- DHT11_ReadDATA(); //接受數(shù)據(jù)
- LCD_WRITE_StrDATA(1,1,R);
- LCD_WRITE_StrDATA(2,1,H);
- LCD_WRITE_char(1,4,DATA[0]);
- LCD_WRITE_char(1,5,DATA[1]);
- LCD_WRITE_StrDATA(1,6,r);
- LCD_WRITE_StrDATA(1,9,L);
-
- LCD_WRITE_char(2,4,DATA[2]);
- LCD_WRITE_char(2,5,DATA[3]);
- LCD_WRITE_char(2,6,0XDF);
- LCD_WRITE_StrDATA(2,7,h);
-
- LCD_WRITE_char(2,9,Leg[0]);
- LCD_WRITE_char(2,10,Leg[1]);
- LCD_WRITE_char(2,11,0xA5);
- LCD_WRITE_char(2,12,Leg[2]);
- LCD_WRITE_char(2,13,Leg[3]);
- LCD_WRITE_StrDATA(2,14,"cm");
- }
- if(RH > ((h0-0x30)*10+(h1-0x30))|| TH < ((t0-0x30)*10+(t1-0x30)) )//正常
- {
- GPIO_SetBits(GPIOC,GPIO_Pin_7);
- GPIO_ResetBits(GPIOC,GPIO_Pin_6);
- GPIO_SetBits(GPIOB,GPIO_Pin_7);
-
- }
- if(RH <= ((h0-0x30)*10+(h1-0x30))|| TH >= ((t0-0x30)*10+(t1-0x30)) ) //警報(bào)
- {
- GPIO_SetBits(GPIOC,GPIO_Pin_6);
- GPIO_ResetBits(GPIOC,GPIO_Pin_7);
- GPIO_ResetBits(GPIOB,GPIO_Pin_7);
- }
-
- }
- }
- /////////////////////////// END ///////////////////////////////////
- /////////////////////// 中斷服務(wù)函數(shù) ,第一個(gè)按鍵切換顯示+光標(biāo)移動(dòng)////////////////////////////////////////
- void EXTI0_IRQHandler(void)
- {
- static int Flag = 1;
- switch (Flag)
- {
- case 1:
- LCD_WRITE_CMD( 0x01 ); //清楚顯示
- LCD_WRITE_CMD( 0x0f ); //開啟光標(biāo)、顯示、閃爍
- LCD_Config(); //切換顯示
- LCD_WRITE_CMD( move );
- delay_ms(5);break;
- case 2:
- LCD_WRITE_CMD( 0x0f );
- move ++; //光標(biāo)移動(dòng)
- LCD_WRITE_CMD( move );
- delay_ms(5);break;
- case 3:
- LCD_WRITE_CMD( 0x0f );
- move += 0x3f;
- LCD_WRITE_CMD( move );
- delay_ms(5);break;
- case 4:
- LCD_WRITE_CMD( 0x0f );
- move ++;
- LCD_WRITE_CMD( move );
- delay_ms(5);break;
- case 5:
- move = 0x82; //光標(biāo)復(fù)位
- LCD_WRITE_CMD( 0x01 );
- LCD_WRITE_CMD( 0x0C );
- LCD_Show();
- Flag = 0;
- delay_ms(5);break;
- }
- Flag ++;
- EXTI_ClearITPendingBit(EXTI_Line0);
- }
- ///////////////////////// 中斷0 END ///////////////////////////////////
- ///////////////////////// 中斷 1 閾值加1 ///////////////////////////
- void EXTI1_IRQHandler(void)
- {
- if(move == 0x82) //判斷光標(biāo)位置
- {
- if((h0-0x30) >= 9)
- {
- h0 = 0x30;
- }
- else
- {
- h0 ++;
- }
- }
- if(move == 0x83) //判斷光標(biāo)位置
- {
- if((h1-0x30) >= 9)
- {
- h1 = 0x30;
- }
- else
- {
- h1 ++;
- }
- }
- if(move == 0xc2) //判斷光標(biāo)位置
- {
- if((t0-0x30) >= 9)
- {
- t0 = 0x30;
- }
- else
- {
- t0 ++;
- }
- }
- if(move == 0xc3) //判斷光標(biāo)位置
- {
- if((t1-0x30) >= 9)
- {
- t1 = 0x30;
- }
- else
- {
- t1 ++;
- }
- }
- LCD_WRITE_CMD( 0x0c ); //為了看清楚,關(guān)閉光標(biāo)的閃爍功能
- LCD_Config(); //顯示
- delay_ms(5);
- EXTI_ClearITPendingBit(EXTI_Line1);
- }
- ////////////////////////////// 中斷1 END ///////////////////////////////////////
- ///////////////////////////// 中斷 2 閾值加1 ////////////////////////////////
- void EXTI2_IRQHandler(void)
- {
- if(move == 0x82)
- {
- if((h0-0x30) == 0)
- {
- h0 = 0x39;
- }
- else
- {
- h0 --;
- }
- }
- if(move == 0x83)
- {
- if((h1-0x30) == 0)
- {
- h1 = 0x39;
- }
- else
- {
- h1 --;
- }
- }
- if(move == 0xc2)
- {
- if((t0-0x30) == 0)
- {
- t0 = 0x39;
- }
- else
- {
- t0 --;
- }
- }
- if(move == 0xc3)
- {
- if((t1-0x30) == 0)
- {
- t1 = 0x39;
- }
- else
- {
- t1 --;
- }
- }
- LCD_WRITE_CMD( 0x0c );
- LCD_Config();
- delay_ms(5);
- EXTI_ClearITPendingBit(EXTI_Line2);
- }
- ///////////////////////////// 中斷 2 END //////////////////////////////////////
- int main()
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- Systick_init();//滴答定時(shí)器的初始化---精準(zhǔn)延時(shí)
- LED_INIT(); //警報(bào)燈
- SOUN_INIT(); //蜂鳴器
-
- KEY_ExitInit(); //中斷gpio口初始化
- LCD_INIT(); //LCD1602初始化
-
- HCSR04_GPIO(); //超聲波gpio口初始化
- HCSR04_TIM2_Config(); //定時(shí)器2設(shè)置
- TIM2_IRQHandler(); //定時(shí)器中斷函數(shù)
-
- LCD_Show(); //lcd1602顯示
- return 0;
- }
復(fù)制代碼
結(jié)束;
這次的實(shí)驗(yàn)也有不足的地方,代碼也有待優(yōu)化,有一些瑕疵,借此拋磚引玉,希望大家能提出建議!
全部資料51hei下載地址:
keil 5工程 + Proteus工程.7z
(98.08 KB, 下載次數(shù): 295)
2020-6-22 16:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|