仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
8%5)X(8@1_4ZIU~I5MJ@4PT.jpg (52.91 KB, 下載次數: 64)
下載附件
2022-5-14 15:11 上傳
所用到的知識點: 1、8位共陰極數碼管 2、4x4矩陣鍵盤 3、液晶顯示屏LCD1602 4、大型液晶顯示屏 LCD12864 5、實時時鐘芯片 DS1302 6、數模轉換芯片 ADC0832 7、利用I2C進行的數模轉換芯片 PCF8591 8、溫度傳感器 DS18B20 9、壓力傳感器 MAX4115 10、光敏電阻 LDR 11、電機驅動電路 12、三態輸出移位緩存器 74HC595 13、外部中斷及定時器 14、雙機通訊 15、片機與上位機通訊 COMPIM
使用說明: 1、用戶輸入正確的密碼,打開門禁之后,LED屏進入歡迎界面, 居室內各電器自動啟動; 2、密碼鍵盤支持刪除、清空、提示功能; 3、上方的LED屏實時顯示萬年歷,包括年月日,周,時分秒; 4、下方的LED屏實時顯示各傳感器檢測到的狀態, 第一行依次顯示當前的溫度、煙霧濃度、光照強度; 5、當溫度高于40時,將會自動打開風扇, 而當溫度高于50度時,將會自動報警; 6、當居室內光照強度太低時,自動打開照明系統, 當居室內光照強度太高時,自動關上窗簾; 7、當室內煙霧濃度,超過20,自動鳴笛報警,警報燈閃爍; 8、用戶也可以手動打開或者關上窗簾; 9、家居系統里裝有體重秤,可以隨時測量體重; 10、網絡模塊將最新的溫度、光照強度、煙霧濃度發送到上位機;
一、首先,進入系統會顯示歡迎界面,并輸入密碼; 密碼輸入錯誤:會顯示“請重新輸入” 密碼輸入正確,會顯示“”歡迎”
ZTWS}`I7N7B%)9XZT3NSQ2Y.png (11.39 KB, 下載次數: 52)
下載附件
2022-5-14 15:13 上傳
二、密碼輸入正確之后 上面的LED顯示當前的時間。下面的LED實時顯示各傳感器檢測到的狀態,第一行依次顯示當前的溫度、煙霧濃度、光照強度;如果是溫度、光照強度,第二行會顯示“worming”+數字,超過這個數字會自動報警;如果是光照強度。第二行會顯示“NOMNAL”,”TOO HIGH”,”TOO LOW”,分別表示正常,太高,太低。
@7HW~5JX1AL1_`]8Q[PS8J9.png (11.9 KB, 下載次數: 48)
下載附件
2022-5-14 15:14 上傳
三、溫度傳感器模塊,及煙霧檢測模塊 超過40度時,風扇慢慢打開。 超過50度時,自動報警。 煙霧濃度超過20時,自動報警。
28F9665233BF4362A778B973466FA17C.jpg (63.59 KB, 下載次數: 44)
下載附件
2022-5-14 15:14 上傳
531D9C963403411BBD8335E8CA6B13D4.jpg (45.61 KB, 下載次數: 54)
下載附件
2022-5-14 15:14 上傳
F88021AB8C764FFABFCC6CE3455D27AA.jpg (57.17 KB, 下載次數: 48)
下載附件
2022-5-14 15:15 上傳
四、光照強度檢測裝置 光照太低時,自動打開照明系統 光照太高時。自動關上窗簾 另外,窗簾也可以手動打開、關閉。
10DF3BA0FCCB457BB4392A64156EB8F8.jpg (52.78 KB, 下載次數: 66)
下載附件
2022-5-14 15:16 上傳
20C47A29A3A7494B84ACFEFC061CFDB2.jpg (76.64 KB, 下載次數: 41)
下載附件
2022-5-14 15:16 上傳
五、體重秤模塊 檢測到當前溫度,并顯示出來。
8KZ4Y2Y_PAMZX]HD3~12`PJ.png (13.17 KB, 下載次數: 40)
下載附件
2022-5-14 15:17 上傳
六、上位機 因為單片機有了雙機通信,甲機已經接受了乙機的數據,沒有辦法再接收上位機發送的數據,所以上位機只做了接收功能。 單片機每秒一次,把當前的溫度,煙霧、光強數據發送到上位機。
I%W4E928_6GR0M`FYLIS0{O.jpg (39.72 KB, 下載次數: 48)
下載附件
2022-5-14 15:18 上傳
單片機源程序如下:
- #include "main.h"
- #include "ADC0832.h"
- #include "DS18B20.h"
- #include "LCD1602.h"
- #include "74HC595.h"
- #include "PCF8591.h"
- void main()
- {
- time_init();
- fan=0;
- Pcf8591SendByte(0); //使用通道0
- wendu=get_wendu();
- Init1602(); //調用初始化顯示函數
- LCD_Write_String(0,4,"WELCOME TO");
- LCD_Write_String(1,2,"My Smart Home");
- while(1)
- {
- if(flag==1)
- break;
- };
- TR0=1;
- wendu=get_wendu(); //初始化時調用溫度讀取函數 防止開機85°C
-
- guangqiang=getGuangqiang(); //讀取光照值
- yanwu=getYanwu(); //讀取天然氣值*/
-
-
- PW1 = 1;
- PW2 = 1;
-
- Puts_to_SerialPort("溫度 煙霧 光強\r\n");
- while(1)
- {
- tizhong = Pcf8591ReadByte()/2;
- SendTo595(table[tizhong/10]+(table[tizhong%10]<<4));
- delay1ms(1);
- times++;
- if(times==300)
- {
- times=0;
- }
- if(times<=100)
- {
- if(times==1)
- write_com(0x01);//清屏
- LCD_Write_String(0,0,"WenDu:");
- LCD_Write_Char(0,10,wendu/10,2) ;
- write_data('.');
- LCD_Write_Char(0,13,wendu%10,1) ;
-
- LCD_Write_String(1,0,"Worming:");
- LCD_Write_Char(1,10,set_wdHH,2) ;
- }
- else if(times>100&×<=200)
- {
- if(times==101)
- write_com(0x01);//清屏
- LCD_Write_String(0,0,"YanWu:");
- LCD_Write_Char(0,11,yanwu,2) ;
- LCD_Write_String(1,0,"Worming:");
- LCD_Write_Char(1,10,set_yanwu,2) ;
- }
- else if(times>200)
- {
- if(times==201)
- write_com(0x01);//清屏
- LCD_Write_String(0,0,"GuangZhao:");
- LCD_Write_Char(0,11,guangqiang,2) ;
- if(guangqiang>=set_lightL&&guangqiang<=set_lightH)
- LCD_Write_String(1,5,"NORMAL");
- else if(guangqiang<=set_lightL)
- LCD_Write_String(1,5,"TOO LOW");
- else
- LCD_Write_String(1,5,"TOO HIGH");
- }
- }
- }
- void delay(uchar i)
- {
- for(i;i>0;i--);
- }
- void delay_ms(uint cnt)
- {
- unsigned int x;
- for( ; cnt>0; cnt--)
- {
- for(x=500; x>0; x--);
- }
- }
- void delay1ms(int n)
- {
- unsigned char i;
- for(i=124*n;i>0;i--); //延時124*8+10=1002us
- }
- void Putc_to_SerialPort(uchar c)
- {
- SBUF=c;
- while(TI==0);
- TI=0;
- }
- void Puts_to_SerialPort(uchar *s)
- {
- while(*s!='\0')
- {
- Putc_to_SerialPort(*s);
- s++;
- WDdelay(5);
- }
- }
- /*************定時器0初始化程序***************/
- void time_init()
- {
- TMOD=0X21; //定時器0、工作方式1 ,T2工作方式2
- TH0=(65536-1000)/256;
- TL0=(65536-1000)%256;
- EA=1; //開總中斷
- ET0=1; //開定時器0中斷
- TR0=0; //允許定時器0定時
- SCON=0x50; //串口模式1,允許接收
- PCON=0x00; //波特率不倍增
- TH1=0xfd;
- TL1=0xfd;
- TI=RI=0;
- TR1=1;
- ES=1;
-
- EX0=1;
- IT0=1;
- IP=0x02;
- }
- void check()
- {
- if(wendu/10>=set_wdH)
- fan=1;
- else
- fan=0;
- if(guangqiang<=set_lightL)
- DENG=0;
- else
- DENG=1;
-
- if(yanwu>=set_yanwu||wendu/10>=set_wdHH&&wendu/10<=60)
- {
- speaker=0;
- BaoJing=!BaoJing;
- }
- else
- speaker=BaoJing=1;
- if(guangqiang>=set_lightH&&is_cl==1)
- {
- PW1=1;
- PW2=0;
- delay_ms(1000);
- PW1=1;
- PW2=1;
- is_cl=0;
- }
- if(guangqiang<=set_lightH)
- is_cl=1;
- }
- void time0_inter() interrupt 1
- {
- TH0 = (65536-1000)/256;
- TL0 = (65536-1000)%256; // 50ms 12M
-
-
-
- count++;
- if(count>80)
- {
- count = 0;
- ctimes++;
- wendu=get_wendu();
- guangqiang=getGuangqiang();
- yanwu=getYanwu();
- check();
- tizhong = Pcf8591ReadByte()/2;
- }
- if(ctimes==15)
- {
- ctimes=0;
- Putc_to_SerialPort(' ');
- Putc_to_SerialPort(wendu/100+'0');
- Putc_to_SerialPort(wendu/10%10+'0');
- Puts_to_SerialPort(" ");
- Putc_to_SerialPort(yanwu/10+'0');
- Putc_to_SerialPort(yanwu%10+'0');
- Puts_to_SerialPort(" ");
- Putc_to_SerialPort(guangqiang/10+'0');
- Putc_to_SerialPort(guangqiang%10+'0');
- Puts_to_SerialPort("\r\n");
- }
-
- }
- void inter_0() interrupt 0
- {
- PW1 = 1;
- PW2 = 1;
- if(KEY1==0){
- delay(10);
- while(!KEY1);
- //電機逆時針轉動,模擬窗簾打開
- PW1 = 1;
- PW2 = 0;
- delay_ms(1000);
- //電機停止轉動,窗簾打開完成
- PW1 = 1;
- PW2 = 1;
- }
- if(KEY2==0){
- delay(10);
- while(!KEY2);
- //電機順時針轉動,模擬窗簾關閉
- PW1 = 0;
- PW2 = 1;
- delay_ms(1000);
- //電機停止轉動,窗簾關閉完成
- PW1 = 1;
- PW2 = 1;
- }
- KEY1=1;
- KEY2=1;
- }
- void Serial_INT() interrupt 4
- {
- if(RI)
- {
- RI=0;
- if(SBUF==1)
- {
- flag=1;
- }
- }
- }
-
復制代碼
Keil5代碼與Proteus8.8仿真下載:
智能家居.zip
(553.03 KB, 下載次數: 253)
2022-5-14 15:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|