找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 5444|回復(fù): 9
收起左側(cè)

51單片機(jī)智能家居系統(tǒng)設(shè)計(jì) 含程序源碼Proteus仿真原理圖

  [復(fù)制鏈接]
ID:776699 發(fā)表于 2022-5-14 15:09 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
8%5)X(8@1_4ZIU~I5MJ@4PT.jpg
所用到的知識(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ì)顯示“”歡迎”
ZTWS}`I7N7B%)9XZT3NSQ2Y.png
二、密碼輸入正確之后
       上面的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”,分別表示正常,太高,太低。
@7HW~5JX1AL1_`]8Q[PS8J9.png
三、溫度傳感器模塊,及煙霧檢測(cè)模塊
       超過40度時(shí),風(fēng)扇慢慢打開。
       超過50度時(shí),自動(dòng)報(bào)警。
       煙霧濃度超過20時(shí),自動(dòng)報(bào)警。
28F9665233BF4362A778B973466FA17C.jpg 531D9C963403411BBD8335E8CA6B13D4.jpg F88021AB8C764FFABFCC6CE3455D27AA.jpg
四、光照強(qiáng)度檢測(cè)裝置
       光照太低時(shí),自動(dòng)打開照明系統(tǒng)
       光照太高時(shí)。自動(dòng)關(guān)上窗簾
       另外,窗簾也可以手動(dòng)打開、關(guān)閉。
10DF3BA0FCCB457BB4392A64156EB8F8.jpg     20C47A29A3A7494B84ACFEFC061CFDB2.jpg
五、體重秤模塊
       檢測(cè)到當(dāng)前溫度,并顯示出來。
8KZ4Y2Y_PAMZX]HD3~12`PJ.png
六、上位機(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ī)。
I%W4E928_6GR0M`FYLIS0{O.jpg

單片機(jī)源程序如下:
  1. #include "main.h"
  2. #include "ADC0832.h"
  3. #include "DS18B20.h"
  4. #include "LCD1602.h"
  5. #include "74HC595.h"
  6. #include "PCF8591.h"

  7. void main()
  8. {
  9.         time_init();
  10.         fan=0;
  11.         Pcf8591SendByte(0);      //使用通道0
  12.         wendu=get_wendu();
  13.         Init1602();                          //調(diào)用初始化顯示函數(shù)
  14.         LCD_Write_String(0,4,"WELCOME TO");
  15.         LCD_Write_String(1,2,"My Smart Home");

  16.         while(1)
  17.         {
  18.                 if(flag==1)
  19.                         break;
  20.         };
  21.         TR0=1;
  22.         wendu=get_wendu();                  //初始化時(shí)調(diào)用溫度讀取函數(shù) 防止開機(jī)85°C
  23.        
  24.         guangqiang=getGuangqiang();                                //讀取光照值
  25.         yanwu=getYanwu();                                //讀取天然氣值*/
  26.        
  27.        
  28.         PW1        = 1;
  29.         PW2 = 1;       
  30.        
  31.         Puts_to_SerialPort("溫度        煙霧        光強(qiáng)\r\n");
  32.         while(1)
  33.         {
  34.                 tizhong = Pcf8591ReadByte()/2;
  35.                 SendTo595(table[tizhong/10]+(table[tizhong%10]<<4));
  36.                 delay1ms(1);
  37.                 times++;
  38.                 if(times==300)
  39.                 {
  40.                         times=0;
  41.                 }
  42.                 if(times<=100)
  43.                 {
  44.                         if(times==1)
  45.                                         write_com(0x01);//清屏
  46.                         LCD_Write_String(0,0,"WenDu:");  
  47.                         LCD_Write_Char(0,10,wendu/10,2) ;
  48.                         write_data('.');
  49.                         LCD_Write_Char(0,13,wendu%10,1) ;
  50.                        
  51.                         LCD_Write_String(1,0,"Worming:");
  52.                         LCD_Write_Char(1,10,set_wdHH,2) ;
  53.                 }
  54.                 else if(times>100&×<=200)
  55.                 {
  56.                         if(times==101)
  57.                                         write_com(0x01);//清屏
  58.                         LCD_Write_String(0,0,"YanWu:");
  59.                         LCD_Write_Char(0,11,yanwu,2) ;
  60.                         LCD_Write_String(1,0,"Worming:");
  61.                         LCD_Write_Char(1,10,set_yanwu,2) ;
  62.                 }
  63.                 else if(times>200)
  64.                 {
  65.                         if(times==201)
  66.                                         write_com(0x01);//清屏
  67.                         LCD_Write_String(0,0,"GuangZhao:");  
  68.                         LCD_Write_Char(0,11,guangqiang,2) ;
  69.                         if(guangqiang>=set_lightL&&guangqiang<=set_lightH)
  70.                                         LCD_Write_String(1,5,"NORMAL");
  71.                         else if(guangqiang<=set_lightL)
  72.                                         LCD_Write_String(1,5,"TOO LOW");
  73.                         else
  74.                                         LCD_Write_String(1,5,"TOO HIGH");
  75.                 }
  76.         }
  77. }
  78. void delay(uchar i)
  79. {
  80.          for(i;i>0;i--);
  81. }


  82. void delay_ms(uint cnt)
  83. {
  84.         unsigned int x;
  85.         for( ; cnt>0; cnt--)
  86.         {
  87.                 for(x=500; x>0; x--);
  88.         }
  89. }

  90. void delay1ms(int n)
  91. {
  92.          unsigned char i;
  93.          for(i=124*n;i>0;i--);  //延時(shí)124*8+10=1002us
  94. }

  95. void Putc_to_SerialPort(uchar c)
  96. {  
  97.         SBUF=c;  
  98.         while(TI==0);  
  99.         TI=0;
  100. }
  101. void Puts_to_SerialPort(uchar *s)
  102. {  
  103.         while(*s!='\0')  
  104.         {   
  105.                 Putc_to_SerialPort(*s);   
  106.                 s++;   
  107.                 WDdelay(5);  
  108.         }
  109. }
  110. /*************定時(shí)器0初始化程序***************/
  111. void time_init()          
  112. {

  113.         TMOD=0X21; //定時(shí)器0、工作方式1 ,T2工作方式2
  114.         TH0=(65536-1000)/256;
  115.         TL0=(65536-1000)%256;
  116.         EA=1; //開總中斷
  117.         ET0=1; //開定時(shí)器0中斷
  118.         TR0=0; //允許定時(shí)器0定時(shí)
  119.         SCON=0x50;                //串口模式1,允許接收
  120.         PCON=0x00;                //波特率不倍增
  121.         TH1=0xfd;
  122.         TL1=0xfd;
  123.         TI=RI=0;
  124.         TR1=1;
  125.         ES=1;
  126.        
  127.         EX0=1;
  128.         IT0=1;
  129.         IP=0x02;
  130. }
  131. void check()
  132. {
  133.         if(wendu/10>=set_wdH)
  134.                 fan=1;
  135.         else
  136.                 fan=0;       
  137.         if(guangqiang<=set_lightL)
  138.                 DENG=0;
  139.         else
  140.                 DENG=1;
  141.        
  142.         if(yanwu>=set_yanwu||wendu/10>=set_wdHH&&wendu/10<=60)
  143.         {
  144.                 speaker=0;
  145.                 BaoJing=!BaoJing;
  146.         }
  147.         else
  148.                 speaker=BaoJing=1;

  149.         if(guangqiang>=set_lightH&&is_cl==1)
  150.         {
  151.                 PW1=1;
  152.                 PW2=0;
  153.                 delay_ms(1000);
  154.                 PW1=1;
  155.                 PW2=1;
  156.                 is_cl=0;
  157.         }
  158.         if(guangqiang<=set_lightH)
  159.                 is_cl=1;
  160. }
  161. void time0_inter() interrupt 1
  162. {       

  163.         TH0 = (65536-1000)/256;
  164.         TL0 = (65536-1000)%256;     // 50ms         12M
  165.        
  166.        
  167.        
  168.         count++;
  169.         if(count>80)
  170.         {
  171.                 count = 0;
  172.                 ctimes++;
  173.                 wendu=get_wendu();          
  174.                 guangqiang=getGuangqiang();                               
  175.                 yanwu=getYanwu();                               
  176.                 check();       
  177.                 tizhong = Pcf8591ReadByte()/2;
  178.         }
  179.         if(ctimes==15)
  180.         {
  181.                 ctimes=0;
  182.                 Putc_to_SerialPort(' ');
  183.                 Putc_to_SerialPort(wendu/100+'0');
  184.                 Putc_to_SerialPort(wendu/10%10+'0');
  185.                 Puts_to_SerialPort("         ");
  186.                 Putc_to_SerialPort(yanwu/10+'0');
  187.                 Putc_to_SerialPort(yanwu%10+'0');
  188.                 Puts_to_SerialPort("         ");
  189.                 Putc_to_SerialPort(guangqiang/10+'0');
  190.                 Putc_to_SerialPort(guangqiang%10+'0');
  191.                 Puts_to_SerialPort("\r\n");
  192.         }
  193.        
  194. }

  195. void inter_0() interrupt 0
  196. {
  197.         PW1        = 1;
  198.         PW2 = 1;       
  199.         if(KEY1==0){
  200.                 delay(10);
  201.                 while(!KEY1);
  202.                 //電機(jī)逆時(shí)針轉(zhuǎn)動(dòng),模擬窗簾打開
  203.                 PW1        = 1;
  204.                 PW2 = 0;
  205.                 delay_ms(1000);
  206.                 //電機(jī)停止轉(zhuǎn)動(dòng),窗簾打開完成
  207.                 PW1        = 1;
  208.                 PW2 = 1;       
  209.         }
  210.         if(KEY2==0){
  211.                 delay(10);
  212.                 while(!KEY2);
  213.                 //電機(jī)順時(shí)針轉(zhuǎn)動(dòng),模擬窗簾關(guān)閉
  214.                 PW1        = 0;
  215.                 PW2 = 1;
  216.                 delay_ms(1000);
  217.                 //電機(jī)停止轉(zhuǎn)動(dòng),窗簾關(guān)閉完成
  218.                 PW1        = 1;
  219.                 PW2 = 1;               
  220.         }
  221.         KEY1=1;
  222.         KEY2=1;
  223. }


  224. void Serial_INT() interrupt        4
  225. {
  226.         if(RI)
  227.         {
  228.                 RI=0;
  229.                 if(SBUF==1)
  230.                 {
  231.                         flag=1;
  232.                 }

  233.         }
  234. }       
  235.        
復(fù)制代碼

Keil5代碼與Proteus8.8仿真下載:
智能家居.zip (553.03 KB, 下載次數(shù): 253)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:309376 發(fā)表于 2022-5-20 17:30 | 顯示全部樓層
學(xué)習(xí)一下,感覺有用
回復(fù)

使用道具 舉報(bào)

ID:944426 發(fā)表于 2022-5-22 21:08 來自觸屏版 | 顯示全部樓層
樓主 仿真圖是不是少了些東西
回復(fù)

使用道具 舉報(bào)

ID:368810 發(fā)表于 2022-5-23 09:59 | 顯示全部樓層
labview上位機(jī)不在壓縮包里嗎
回復(fù)

使用道具 舉報(bào)

ID:1087378 發(fā)表于 2024-4-9 20:12 | 顯示全部樓層
仿真圖根本沒效果哇
回復(fù)

使用道具 舉報(bào)

ID:262 發(fā)表于 2024-4-9 21:57 | 顯示全部樓層
Pr1mo 發(fā)表于 2024-4-9 20:12
仿真圖根本沒效果哇

打開仿真后需要重新選擇你的hex文件所在的本地目錄,然后運(yùn)行 輸入密a0867128,對(duì)應(yīng)源碼中的uint mima[8]={10,0,8,6,7,1,2,8}; 你看我弄的視頻和仿真
51hei.gif

智能家居.7z

147.37 KB, 下載次數(shù): 14, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

ID:88256 發(fā)表于 2024-4-9 22:00 | 顯示全部樓層
Pr1mo 發(fā)表于 2024-4-9 20:12
仿真圖根本沒效果哇

不是沒有效果,而是單片機(jī)的程序來源需要重新設(shè)定。
回復(fù)

使用道具 舉報(bào)

ID:965040 發(fā)表于 2024-4-10 10:51 | 顯示全部樓層
兩個(gè)壓縮包都下載了,評(píng)論區(qū)的時(shí)間顯示正常,密碼輸入正常,別的沒效果啊
回復(fù)

使用道具 舉報(bào)

ID:160725 發(fā)表于 2024-7-6 15:29 | 顯示全部樓層
這個(gè)算是有難度的資料,初學(xué)者升級(jí)版
回復(fù)

使用道具 舉報(bào)

ID:908758 發(fā)表于 2024-8-20 10:35 | 顯示全部樓層
heicad 發(fā)表于 2024-4-9 21:57
打開仿真后需要重新選擇你的hex文件所在的本地目錄,然后運(yùn)行 輸入密a0867128,對(duì)應(yīng)源碼中的uint mima[8]={ ...

大佬除了這個(gè)密碼鎖功能,其他功能如何實(shí)現(xiàn)了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表