找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2884|回复: 7
打印 上一主题 下一主题
收起左侧

51单片机智能家居系统设计 含程序源码Proteus仿真原理图

  [复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

所用到的知识点:
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、网络模块将最新的温度、光照强度、烟雾浓度发送到上位机;


一、首先,进入系统会显示欢迎界面,并输入密码;
      密码输入错误:会显示“请重新输入”
      密码输入正确,会显示“”欢迎”

二、密码输入正确之后
       上面的LED显示当前的时间。下面的LED实时显示各传感器检测到的状态,第一行依次显示当前的温度、烟雾浓度、光照强度;如果是温度、光照强度,第二行会显示“worming”+数字,超过这个数字会自动报警;如果是光照强度。第二行会显示“NOMNAL”,”TOO HIGH”,”TOO LOW”,分别表示正常,太高,太低。

三、温度传感器模块,及烟雾检测模块
       超过40度时,风扇慢慢打开。
       超过50度时,自动报警。
       烟雾浓度超过20时,自动报警。

四、光照强度检测装置
       光照太低时,自动打开照明系统
       光照太高时。自动关上窗帘
       另外,窗帘也可以手动打开、关闭。
   
五、体重秤模块
       检测到当前温度,并显示出来。

六、上位机
       因为单片机有了双机通信,甲机已经接受了乙机的数据,没有办法再接收上位机发送的数据,所以上位机只做了接收功能。
       单片机每秒一次,把当前的温度,烟雾、光强数据发送到上位机。


单片机源程序如下:
  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();                          //调用初始化显示函数
  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();                  //初始化时调用温度读取函数 防止开机85°C
  23.        
  24.         guangqiang=getGuangqiang();                                //读取光照值
  25.         yanwu=getYanwu();                                //读取天然气值*/
  26.        
  27.        
  28.         PW1        = 1;
  29.         PW2 = 1;       
  30.        
  31.         Puts_to_SerialPort("温度        烟雾        光强\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--);  //延时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. /*************定时器0初始化程序***************/
  111. void time_init()          
  112. {

  113.         TMOD=0X21; //定时器0、工作方式1 ,T2工作方式2
  114.         TH0=(65536-1000)/256;
  115.         TL0=(65536-1000)%256;
  116.         EA=1; //开总中断
  117.         ET0=1; //开定时器0中断
  118.         TR0=0; //允许定时器0定时
  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.                 //电机逆时针转动,模拟窗帘打开
  203.                 PW1        = 1;
  204.                 PW2 = 0;
  205.                 delay_ms(1000);
  206.                 //电机停止转动,窗帘打开完成
  207.                 PW1        = 1;
  208.                 PW2 = 1;       
  209.         }
  210.         if(KEY2==0){
  211.                 delay(10);
  212.                 while(!KEY2);
  213.                 //电机顺时针转动,模拟窗帘关闭
  214.                 PW1        = 0;
  215.                 PW2 = 1;
  216.                 delay_ms(1000);
  217.                 //电机停止转动,窗帘关闭完成
  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.        
复制代码

Keil5代码与Proteus8.8仿真下载:
智能家居.zip (553.03 KB, 下载次数: 212)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:309376 发表于 2022-5-20 17:30 | 只看该作者
学习一下,感觉有用
回复

使用道具 举报

板凳
ID:944426 发表于 2022-5-22 21:08 来自手机 | 只看该作者
楼主 仿真图是不是少了些东西
回复

使用道具 举报

地板
ID:368810 发表于 2022-5-23 09:59 | 只看该作者
labview上位机不在压缩包里吗
回复

使用道具 举报

5#
ID:1087378 发表于 2024-4-9 20:12 | 只看该作者
仿真图根本没效果哇
回复

使用道具 举报

6#
ID:262 发表于 2024-4-9 21:57 | 只看该作者
Pr1mo 发表于 2024-4-9 20:12
仿真图根本没效果哇

打开仿真后需要重新选择你的hex文件所在的本地目录,然后运行 输入密a0867128,对应源码中的uint mima[8]={10,0,8,6,7,1,2,8}; 你看我弄的视频和仿真

51hei.gif (214.15 KB, 下载次数: 11)

51hei.gif

智能家居.7z

147.37 KB, 下载次数: 5, 下载积分: 黑币 -5

回复

使用道具 举报

7#
ID:88256 发表于 2024-4-9 22:00 | 只看该作者
Pr1mo 发表于 2024-4-9 20:12
仿真图根本没效果哇

不是没有效果,而是单片机的程序来源需要重新设定。
回复

使用道具 举报

8#
ID:965040 发表于 2024-4-10 10:51 | 只看该作者
两个压缩包都下载了,评论区的时间显示正常,密码输入正常,别的没效果啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表