仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
所用到的知識(shí)點(diǎn): 1、8位共陰極數(shù)碼管 2、4x4矩陣鍵盤 3、液晶顯示屏LCD1602 4、大型液晶顯示屏 LCD12864 5、實(shí)時(shí)時(shí)鐘芯片 DS1302 6、數(shù)模轉(zhuǎn)換芯片 ADC0832 7、利用I2C進(jìn)行的數(shù)模轉(zhuǎn)換芯片 PCF8591 8、溫度傳感器 DS18B20 9、壓力傳感器 MAX4115 10、光敏電阻 LDR 11、電機(jī)驅(qū)動(dòng)電路 12、三態(tài)輸出移位緩存器 74HC595 13、外部中斷及定時(shí)器 14、雙機(jī)通訊 15、片機(jī)與上位機(jī)通訊 COMPIM
使用說明: 1、用戶輸入正確的密碼,打開門禁之后,LED屏進(jìn)入歡迎界面, 居室內(nèi)各電器自動(dòng)啟動(dòng); 2、密碼鍵盤支持刪除、清空、提示功能; 3、上方的LED屏實(shí)時(shí)顯示萬年歷,包括年月日,周,時(shí)分秒; 4、下方的LED屏實(shí)時(shí)顯示各傳感器檢測(cè)到的狀態(tài), 第一行依次顯示當(dāng)前的溫度、煙霧濃度、光照強(qiáng)度; 5、當(dāng)溫度高于40時(shí),將會(huì)自動(dòng)打開風(fēng)扇, 而當(dāng)溫度高于50度時(shí),將會(huì)自動(dòng)報(bào)警; 6、當(dāng)居室內(nèi)光照強(qiáng)度太低時(shí),自動(dòng)打開照明系統(tǒng), 當(dāng)居室內(nèi)光照強(qiáng)度太高時(shí),自動(dòng)關(guān)上窗簾; 7、當(dāng)室內(nèi)煙霧濃度,超過20,自動(dòng)鳴笛報(bào)警,警報(bào)燈閃爍; 8、用戶也可以手動(dòng)打開或者關(guān)上窗簾; 9、家居系統(tǒng)里裝有體重秤,可以隨時(shí)測(cè)量體重; 10、網(wǎng)絡(luò)模塊將最新的溫度、光照強(qiáng)度、煙霧濃度發(fā)送到上位機(jī);
一、首先,進(jìn)入系統(tǒng)會(huì)顯示歡迎界面,并輸入密碼; 密碼輸入錯(cuò)誤:會(huì)顯示“請(qǐng)重新輸入” 密碼輸入正確,會(huì)顯示“”歡迎”
二、密碼輸入正確之后 上面的LED顯示當(dāng)前的時(shí)間。下面的LED實(shí)時(shí)顯示各傳感器檢測(cè)到的狀態(tài),第一行依次顯示當(dāng)前的溫度、煙霧濃度、光照強(qiáng)度;如果是溫度、光照強(qiáng)度,第二行會(huì)顯示“worming”+數(shù)字,超過這個(gè)數(shù)字會(huì)自動(dòng)報(bào)警;如果是光照強(qiáng)度。第二行會(huì)顯示“NOMNAL”,”TOO HIGH”,”TOO LOW”,分別表示正常,太高,太低。
三、溫度傳感器模塊,及煙霧檢測(cè)模塊 超過40度時(shí),風(fēng)扇慢慢打開。 超過50度時(shí),自動(dòng)報(bào)警。 煙霧濃度超過20時(shí),自動(dòng)報(bào)警。
四、光照強(qiáng)度檢測(cè)裝置 光照太低時(shí),自動(dòng)打開照明系統(tǒng) 光照太高時(shí)。自動(dòng)關(guān)上窗簾 另外,窗簾也可以手動(dòng)打開、關(guān)閉。
五、體重秤模塊 檢測(cè)到當(dāng)前溫度,并顯示出來。 六、上位機(jī) 因?yàn)閱纹瑱C(jī)有了雙機(jī)通信,甲機(jī)已經(jīng)接受了乙機(jī)的數(shù)據(jù),沒有辦法再接收上位機(jī)發(fā)送的數(shù)據(jù),所以上位機(jī)只做了接收功能。 單片機(jī)每秒一次,把當(dāng)前的溫度,煙霧、光強(qiáng)數(shù)據(jù)發(fā)送到上位機(jī)。
單片機(jī)源程序如下:
- #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(); //調(diào)用初始化顯示函數(shù)
- 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(); //初始化時(shí)調(diào)用溫度讀取函數(shù) 防止開機(jī)85°C
-
- guangqiang=getGuangqiang(); //讀取光照值
- yanwu=getYanwu(); //讀取天然氣值*/
-
-
- PW1 = 1;
- PW2 = 1;
-
- Puts_to_SerialPort("溫度 煙霧 光強(qiáng)\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--); //延時(shí)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);
- }
- }
- /*************定時(shí)器0初始化程序***************/
- void time_init()
- {
- TMOD=0X21; //定時(shí)器0、工作方式1 ,T2工作方式2
- TH0=(65536-1000)/256;
- TL0=(65536-1000)%256;
- EA=1; //開總中斷
- ET0=1; //開定時(shí)器0中斷
- TR0=0; //允許定時(shí)器0定時(shí)
- 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);
- //電機(jī)逆時(shí)針轉(zhuǎn)動(dòng),模擬窗簾打開
- PW1 = 1;
- PW2 = 0;
- delay_ms(1000);
- //電機(jī)停止轉(zhuǎn)動(dòng),窗簾打開完成
- PW1 = 1;
- PW2 = 1;
- }
- if(KEY2==0){
- delay(10);
- while(!KEY2);
- //電機(jī)順時(shí)針轉(zhuǎn)動(dòng),模擬窗簾關(guān)閉
- PW1 = 0;
- PW2 = 1;
- delay_ms(1000);
- //電機(jī)停止轉(zhuǎn)動(dòng),窗簾關(guān)閉完成
- PW1 = 1;
- PW2 = 1;
- }
- KEY1=1;
- KEY2=1;
- }
- void Serial_INT() interrupt 4
- {
- if(RI)
- {
- RI=0;
- if(SBUF==1)
- {
- flag=1;
- }
- }
- }
-
復(fù)制代碼
Keil5代碼與Proteus8.8仿真下載:
智能家居.zip
(553.03 KB, 下載次數(shù): 253)
2022-5-14 15:21 上傳
點(diǎn)擊文件名下載附件
|