|
此設(shè)計(jì)無法進(jìn)行仿真,因?yàn)閕sis里面的庫文件有限制32單片機(jī)和甲醛無法仿真,所以此設(shè)計(jì)沒有辦法進(jìn)行仿真,
大家需要注意的是 ,仿真和實(shí)物還是有很大差別的,因?yàn)榉抡胬锩骐娮瑁娙莼蛘呤瞧渌男酒?br />
其他器件代替都會(huì)導(dǎo)致程序不一樣,既然實(shí)物都做出來了,說明肯定會(huì)沒有問題。有的師傅可能會(huì)問,
為什么沒有仿真,你是如何做出來的。其實(shí)做東西不一定需要仿真,廠家都會(huì)提供芯片手冊(cè),我們只需
要按照芯片手冊(cè)進(jìn)行編寫程序就可以了。芯片手冊(cè)里面會(huì)寫的很詳細(xì)
測量環(huán)境 溫濕度 甲醛 程序附件包括
主程序流程圖
51hei.png (10.51 KB, 下載次數(shù): 57)
下載附件
2023-4-20 17:43 上傳
DHT11溫濕度電路講解
51hei截圖20230420105852.jpg (90.09 KB, 下載次數(shù): 61)
下載附件
2023-4-20 10:58 上傳
此設(shè)計(jì)是stm32單片機(jī),單片機(jī)上電后引腳為高組態(tài),所以我們不可以使用8550,因?yàn)?550 是低電平導(dǎo)通,8050 是高電平導(dǎo)通,當(dāng)我們想讓蜂鳴器進(jìn)行報(bào)警的時(shí)候,我們給三極管一個(gè)高電平 ,就實(shí)現(xiàn)了蜂鳴器報(bào)警。三極管本身具有的作用是放大電流(放大200倍)加1k電阻是為了進(jìn)行限流。
51hei.png (1.54 KB, 下載次數(shù): 41)
下載附件
2023-4-20 17:39 上傳
51hei.png (2.09 KB, 下載次數(shù): 44)
下載附件
2023-4-20 17:40 上傳
電源有很多種方式,以上面一種為連接方式,如果大家遇到其他的連接方式,都是一樣的
Swich 是電源開關(guān),pow是電源輸入端
供電電壓為DC5v dc是代表直流,
焊接如圖所示:
板子正面:
51hei.png (53.89 KB, 下載次數(shù): 55)
下載附件
2023-4-20 17:40 上傳
板子背面:
51hei.png (180.93 KB, 下載次數(shù): 44)
下載附件
2023-4-20 17:41 上傳
電路中10k(或者是5K)為上拉電阻,因?yàn)槠胀▎纹瑱C(jī)上拉能力不夠,如果線路較長,就會(huì)有很大的寄生電容,從而變成RC充放電...慢到一定程度數(shù)據(jù)就會(huì)出錯(cuò)的
上拉電阻,當(dāng)沒數(shù)據(jù)時(shí),該信號(hào)線被拉成高電平
2 原理圖講解 ,3溫濕度甲醛程序
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "timer.h"
- #include "usart1.h"
- #include "usart3.h"
- #include "LCD1602.h"
- #include "string.h"
- #include "stdio.h"
- #include "dht11.h"
- #include "stmflash.h"
- #define WriteFlashAddress ((u32)0x08010000)//讀寫起始地址
- u16 CH20_MAX_val = 100;//甲醛報(bào)警值
- u16 CH2O_mgvalue = 0;//甲醛
- void Change_data_handle(void);
- void SHOW_AND_BAOJING_Handle(void);
- u8 KEY_SCAN(void); //按鍵函數(shù)
- u8 SHOW_BUF[16],SEND_BUF[16];
- u8 key,Temperature,HUM;
- u16 Temperature_MAX=40,HUM_MAX=70;//溫濕度上限初始值
- u16 write_buf[4];
- ///////串口相關(guān)
- extern char RxCounter,Usart1RecBuf[64];//串口1接收數(shù)據(jù)緩存
- extern char bUsart1RecFlag; //串口1收到數(shù)據(jù)標(biāo)志位
- void save_data()//存儲(chǔ)數(shù)據(jù)
- {
- write_buf[0]=1111;
- write_buf[1]=Temperature_MAX;
- write_buf[2]=HUM_MAX;
- write_buf[3]=CH20_MAX_val;
- STMFLASH_Write(WriteFlashAddress,write_buf,4);
- }
- void read_data()//讀取數(shù)據(jù)
- {
- static u16 chcek = 0;
- STMFLASH_Read(WriteFlashAddress,write_buf,4);
- chcek = write_buf[0];
- if(chcek != 1111)//單片機(jī)第一次使用時(shí),chcek不等于1111,以下則是保存一下數(shù)據(jù),再進(jìn)行讀取
- {
- save_data();
- delay_ms(100);
- STMFLASH_Read(WriteFlashAddress,write_buf,4);
- }
- Temperature_MAX = write_buf[1]%100;//溫度上限值
- HUM_MAX = write_buf[2]%100;//濕度上限值
- CH20_MAX_val = write_buf[3]%1000;//PM上限值
- }
- void Get_CH2O(void)//獲取甲醛
- {
- char i = 0;
- if(Usart1RecBuf[i+5] == Usart1RecBuf[i]+Usart1RecBuf[i+1]+Usart1RecBuf[i+2]+Usart1RecBuf[i+3]+Usart1RecBuf[i+4])//校驗(yàn)
- {
- CH2O_mgvalue = Usart1RecBuf[1]*256 + Usart1RecBuf[2];//計(jì)算甲醛
- bUsart1RecFlag = 0;
- }
- RxCounter = 0;
- }
- int main(void)
- {
- u16 test,test_adc;
-
- delay_init(); //延時(shí)函數(shù)初始化
- NVIC_Configuration(); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
- KEY_IO_Init();
- Usart1_Init(9600);//串口3初始化,波特率9600
- TIM2_Int_Init(1000,72-1); //定時(shí)器初始化,定時(shí)1MS
- read_data();//開機(jī)讀取一次存儲(chǔ)值
- delay_ms(300);
- DHT11_Init(); //DHT11初始化
- BEEP_DISENABLE(); //蜂鳴器初始化
- LCD_Init(); // 1602初始化
- while(1)
- {
- DHT11_Read_Data(&Temperature,&HUM);//讀取溫濕度值
- Get_CH2O();//獲取甲醛值
- SHOW_AND_BAOJING_Handle();
- Change_data_handle();//按鍵調(diào)節(jié)
- delay_ms(100);
- }
- }
- extern u8 FLICKER;
- void SHOW_AND_BAOJING_Handle(void)
- {
- unsigned char show_buf[16];//顯示緩存區(qū)
-
- if(Temperature >= Temperature_MAX)//溫度超限
- {
- if(FLICKER)//超標(biāo)顯示閃爍
- {
- LCD_Write_String(0,0," ");
- }
- else
- {
- sprintf(show_buf,"TEMP:%02dC",(u16)Temperature);//轉(zhuǎn)換顯示格式為TEMP:00C
- LCD_Write_String(0,0,show_buf);//顯示
- }
- }
- else
- {
- sprintf(show_buf,"TEMP:%02dC",(u16)Temperature);//轉(zhuǎn)換顯示格式為TEMP:00C
- LCD_Write_String(0,0,show_buf);//顯示
- }
- if(HUM >= HUM_MAX)//濕度超限
- {
- if(FLICKER)//超標(biāo)顯示閃爍
- {
- LCD_Write_String(9,0," ");
- }
- else
- {
- sprintf(show_buf,"HUM:%02d%%",(u16)HUM);//轉(zhuǎn)換顯示格式為HUM:00%
- LCD_Write_String(9,0,show_buf);//顯示
- }
- }
- else
- {
- sprintf(show_buf,"HUM:%02d%%",(u16)HUM);//轉(zhuǎn)換顯示格式為HUM:00%
- LCD_Write_String(9,0,show_buf);
- }
- if(CH2O_mgvalue >= CH20_MAX_val && FLICKER)//甲醛超限
- {
- LCD_Write_String(0,1," ");
- }
- else
- {
- LCD_Write_Char(0,1,'C');
- LCD_Write_Char(1,1,'H');
- LCD_Write_Char(2,1,'2');
- LCD_Write_Char(3,1,'O');
- LCD_Write_Char(4,1,':');
- LCD_Write_Char(5,1,CH2O_mgvalue/100+'0');
- LCD_Write_Char(6,1,'.');
- LCD_Write_Char(7,1,CH2O_mgvalue%100/10+'0');
- LCD_Write_Char(8,1,CH2O_mgvalue%10+'0');
- LCD_Write_Char(9,1,'m');
- LCD_Write_Char(10,1,'g');
- LCD_Write_Char(11,1,'/');
- LCD_Write_Char(12,1,'m');
- LCD_Write_Char(13,1,'3');
- }
- if(Temperature >= Temperature_MAX || HUM >= HUM_MAX|| CH2O_mgvalue >= CH20_MAX_val)//溫度濕度甲醛超限
- {
- BEEP_ENABLE(); //蜂鳴器報(bào)警
- }
- else
- {
- BEEP_DISENABLE();
- }
- }
- u8 KEY_SCAN(void)
- {
- u8 res = 0;
- if(!KEY1)
- {
- delay_ms(10);
- if(!KEY1)
- {
- while(!KEY1);//卡死
- res = 1;
- }
- }
- if(!KEY2)
- {
- delay_ms(10);
- if(!KEY2)
- {
- while(!KEY2);//卡死
- res = 2;
- }
- }
- if(!KEY3)
- {
- delay_ms(10);
- if(!KEY3)
- {
- while(!KEY3);//卡死
- res = 3;
- }
- }
- return res;
- }
- void Change_data_handle(void)
- {
- u8 key;
- static u8 MODE = 0;
- key = KEY_SCAN();//讀取按鍵值
- if(key == 1)//按鍵1按下
- {
- MODE++;
- LCD_Clear();//清屏
- delay_ms(100);
- }
- while(MODE)
- {
- key = KEY_SCAN();
- switch(MODE)
- {
- case 1: //設(shè)置溫度
- //顯示
- LCD_Write_String(0,0,"Set the TEMP ");
- LCD_Write_String(0,1,"max:");
- LCD_Write_Char(8,1,0xdf);
- LCD_Write_Char(9,1,'C');
- if(key == 2 && Temperature_MAX < 99) Temperature_MAX++;//按鍵2按下,值加1
- if(key == 3 && Temperature_MAX > 0) Temperature_MAX--;//按鍵3按下,值減1
- LCD1602_write_long(6,1,Temperature_MAX,2);//顯示值
- //存儲(chǔ)值
- save_data();
-
- delay_ms(10);
- break;
- case 2: //設(shè)置濕度
- //顯示
- LCD_Write_String(0,0,"Set the HUM ");
- LCD_Write_String(0,1,"max:");
- LCD_Write_String(8,1,"%");
- if(key == 2 && HUM_MAX < 99) HUM_MAX += 1;//按鍵2按下,值加1
- if(key == 3 && HUM_MAX > 0) HUM_MAX -= 1;//按鍵3按下,值減1
- LCD1602_write_long(6,1,HUM_MAX,2);
- //存儲(chǔ)值
- save_data();
- delay_ms(10);
- break;
- case 3: //設(shè)置甲醛
- //顯示
- LCD_Write_String(0,0,"Set the CH2O ");
- LCD_Write_String(0,1,"max:");
- LCD_Write_String(9,1,"mg/m3");
- if(key == 2 && CH20_MAX_val < 999) CH20_MAX_val += 1;//按鍵2按下,值加1
- if(key == 3 && CH20_MAX_val > 0) CH20_MAX_val -= 1;//按鍵3按下,值減1
- LCD_Write_Char(5,1,CH20_MAX_val/100+'0');
- LCD_Write_Char(6,1,'.');
- LCD_Write_Char(7,1,CH20_MAX_val%100/10+'0');
- LCD_Write_Char(8,1,CH20_MAX_val%10+'0');
- save_data();//存儲(chǔ)值
-
- delay_ms(10);
- break;
- default: break;
- }
- if(key == 1)
- {
- MODE++;
- LCD_Clear();
- if(MODE == 4)//按下次數(shù)等于4退出設(shè)置
- {
- MODE = 0;
- }
- }
- }
-
- }
復(fù)制代碼
Keil代碼下載(僅供參考):
溫濕度甲醛Keil工程.7z
(206.92 KB, 下載次數(shù): 31)
2023-4-20 17:51 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
程序流程圖與部分電路講解.7z
(2.78 MB, 下載次數(shù): 22)
2023-4-20 17:51 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|