找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8|回复: 0
收起左侧

基于51单片机智能家居设计 无法显示

[复制链接]
ID:404202 发表于 2025-9-6 17:32 | 显示全部楼层 |阅读模式
该智能家居基于51单片机控制, 同时外接DS1302和DS18B20以及LCD液晶屏等,对智能家居智进行简易的控制。
该设计运用到的芯片:STC89C58+DS18B20+DHT11+DS1302+LCD12864+红外人体感应器+无线遥控
功能:
1.数字可调万年历
2.显示空气中温度和湿度
3.对环境温度和湿度可以自动控制
4.测量水的温度
5.无线控制
6.防盗报警
7.低功耗模式
8.开机图片
9.EEPROM数据保存

系统组成构造图

系统组成构造图
原理图设计:

原理设计图

原理设计图

仿真图

仿真图

  1. /***************************************************************/
  2. /*                  智能家居控制系统
  3.                       设计:刘东宇
  4. 芯片:STC89C58+DS18B20+DHT11+DS1302+LCD12864+红外人体感应器+无线遥控                                                        */
  5. /***************************************************************/

  6. #include<reg52.h>
  7. #include<absacc.h>
  8. #include<intrins.h>
  9. #include"LCD12864.h"
  10. #include"DS18B20.h"
  11. #include"DS1302.h"
  12. #include"delay_ms.h"
  13. #include"key.h"
  14. #include"DHT11.h"
  15. #include"start_logo.h"
  16. #include"picture.h"
  17. #include"Flash_ROM.h"
  18. /********************函数申明********************/
  19. void init();                                        //初始化程序
  20. void sleep_sign_init();                                //睡眠(报警)模式初始化
  21. void init_time_DHT11_DS18B20();                    //初始化定时器T0和T1
  22. void open_logo();                           //开机图片
  23. void kay_scan();                                            //kay_scan 按键扫描程序
  24. void display_time();                                    //display_time时间扫描(LCD12864显示)
  25. void alarm();                                                //温湿度超值判断
  26. void sleep_sign();                          //睡眠(报警)模式和正常模式切换函数
  27. void sos_display();                         //当声光报警时LCD12864显示“报警!”  
  28. /************位变量定义****************/
  29. sbit lcd_lig=P2^4;                          //LCD12864背光控制
  30. sbit relay1=P1^0;                          //继电器1
  31. sbit relay2=P1^1;                          //继电器2
  32. sbit voi_lig_sigo=P1^2;                  //声光报警控制位
  33. sbit key_sigo=P1^6;                          //睡眠(报警)模式进入按键
  34. /************变量定义****************/
  35. unsigned char code shu5[]={"0123456789"};
  36. unsigned char code shu6[]={"年月日:"};
  37. unsigned int k,T;
  38. bit Interrupt_flag=1;                              //该标志位可以有效防止报警触发后影响其他程序
  39. bit sos=0;                                    //LCD12864显示报警标志位

  40. void main()
  41. {   
  42.     init();                                                  //初始化程序
  43.         lcd_lig=0;                                  //开LCD背光
  44.         open_logo();                                  //开机LOGO
  45.         sleep_sign_init();                      //睡眠(报警)模式初始化
  46.         init_lcd12864();                          //初始化LCD12864        
  47.     init_time_DHT11_DS18B20();          //初始化定时器T0和T1
  48.         DS18B20_caution();            //DS18B20温度报警设置
  49.         while(1)
  50.         {        
  51.                    kay_scan();                                  //kay_scan 按键扫描程序        
  52.                  display_time();                          //display_time 时间显示扫描(LCD12864显示)
  53.                 alarm();                              //温湿度超值判断
  54.                 sleep_sign();             //睡眠(报警)模式和正常模式切换函数
  55.                 sos_display();                          //当声光报警时LCD12864显示“报警!”
  56.         }
  57. }

  58. /************************************************/
  59. /****************程序初始化**********************/
  60. /************************************************/
  61. void init()
  62. {
  63.   IAP_ReadCode(0x8000,&set_up_sd,1);                                  //读湿度阀值
  64.   IAP_ReadCode(0x800f,&set_up_wd,1);                                  //读温度阀值

  65.   relay1=1;                        //继电器1(湿度控制)
  66.   relay2=1;                        //继电器2(温度控制)

  67.   IP=0X0A;                                  //中断优先级设定,将定时器T0和T1设置为高级

  68.   sd_shi=0;
  69.   sd_ge=0;
  70.   wd_shi1=0;
  71.   wd_ge1=0;
  72.   dsq_0=0;                         //定时器T0
  73.    
  74. /***********DS1302初始化****************/
  75.    ds_io=0;
  76.    ds_rst=0;
  77.    ds_sclk=0;                    //DS1302初始化  
  78.    ds_xieshu(0x8e,0x00);    //控制
  79. }

  80. /*****************************************************/
  81. /**************睡眠(报警)模式初始化*****************/
  82. /*****************************************************/
  83. void sleep_sign_init()                  //睡眠(报警)模式初始化
  84. {
  85.    voi_lig_sigo=1;                          //初始化声光报警控制位
  86.    key2=1;                                          //初始化按键key2(睡眠报警模式进入键)
  87.    lcd_lig=0;                                  //LCD12864背光控制位

  88.    TCON=0X55;                       //INT0设置为下降沿触发,INT0设置为下降沿触发
  89.    EX0=1;                               //开外部中断INT0
  90.    EX1=0;                                           //关外部中断INT1
  91.    EA=1;                                           //开总中断
  92. }

  93. /**************************************/
  94. /********初始化计时器T0和T1************/
  95. /**************************************/
  96. void init_time_DHT11_DS18B20()         //初始化定时器T0和T1
  97. {
  98.            TMOD=0X11;                                         //定时器T0和T1工作于方式1

  99.         TH0=(65535-50000)/256;                 //给定时器T0装初值
  100.         TL0=(65535-50000)%256;
  101.         TR0=1;                                                 //开定时器T0计数
  102.         ET0=1;                                                 //开定时器T0中断

  103.         TH1=(65535-50000)/256;                  //给定时器T1装初值
  104.         TL1=(65535-50000)%256;
  105.         TR1=1;                                                  //开定时器T1计数
  106.         ET1=1;                                                  //开定时器T1中断
  107. }

  108. /************************************************/
  109. /****************  开机图片  ********************/
  110. /************************************************/
  111. void open_logo()
  112. {
  113.      display_bmp_logo(bmp_1);                        //写入图片1
  114.          delay(10000);
  115.          display_bmp_logo(bmp_2);                        //写入图片2
  116.          delay(10000);
  117.          display_bmp_logo(bmp_3);                        //写入图片3
  118.          delay(10000);
  119.          display_bmp_logo(bmp_4);                        //写入图片4
  120.          delay(10000);
  121.          display_bmp_logo(bmp_5);                        //写入图片5
  122.          delay(8000);
  123.          display_bmp_logo(bmp_6);                        //写入图片6
  124.          delay(8000);         
  125.          display_bmp_logo(bmp_7);                        //写入图片7
  126.          delay(8000);         
  127. }

  128. /************************************************/
  129. /****************温湿度报警检测******************/
  130. /************************************************/
  131. void alarm()                                            //温湿度超值判断
  132. {
  133.                 if(sign_sd>=set_up_sd)                    //湿度判断
  134.                     relay1=0;                        //继电器1(降湿度控制)
  135.             else
  136.                     relay1=1;                        
  137.                 if(sign_wd>=set_up_wd)                    //温度判断
  138.                     relay2=0;                        //继电器2(降温度控制)
  139.                 else
  140.                     relay2=1;        
  141. }

  142. /***************************************************/
  143. /*********************按键扫描程序******************/
  144. /***************************************************/
  145. void kay_scan()                                     //kay_scan按键扫描程序
  146. {
  147.              if(key1==0)                              
  148.            {
  149.              delay(20);                                  //按键消抖
  150.                  if(key1==0)
  151.                 {
  152.                     TR0=0;                                  //关温度和湿度扫描
  153.                     TR1=0;                                  //关水温扫描
  154.                         
  155.                     i=0;
  156.                     i++;
  157.                         miao=BCD_Decimal(ds_dushu(0x81));                //将现在显示的数值赋给要进行调整的变量
  158.                         fen=BCD_Decimal(ds_dushu(0x83));                //这样在调时间的时候就不会出现从0开始调整
  159.                         shi=BCD_Decimal(ds_dushu(0x85));                //这样就可以在原来的数值上进行调整
  160.                         xq=BCD_Decimal(ds_dushu(0x8b));
  161.                         ri=BCD_Decimal(ds_dushu(0x87));
  162.                         yue=BCD_Decimal(ds_dushu(0x89));
  163.                         nian=BCD_Decimal(ds_dushu(0x8d));
  164.                         shidu=set_up_sd;                                    //将湿度当前值赋给要调节的值
  165.                         wendu=set_up_wd;                                          //将温度当前值赋给要调节的值
  166.                         if(i>=9)                                                                //可以直接将9改成1
  167.                           i=1;
  168.                         delay(20);
  169.                     while(key1==0);                                                         //松手检测
  170.                         delay(20);
  171.                         while(key1==0);
  172.                         while(i)                                                                 //当i大于0时进入按键扫描死循环,当i=0时跳出该循环
  173.                     key();                                                     //扫描按键
  174.                 }               
  175.           }
  176. }

  177. /*****************************************************/
  178. /**************LCD12864 display时间扫描***************/
  179. /*****************************************************/
  180. void display_time()                               //display_time时间扫描(LCD12864显示)
  181. {
  182.            qushu_time(ds_dushu(0X81));        //秒
  183.            delay(1);
  184.            zhiling(0x88+6);
  185.            delay(1);
  186.            shuju(shu5[shi]);
  187.            delay(1);
  188.            shuju(shu5[ge]);
  189.            delay(1);
  190.            shuju(' ');
  191.            shuju(' ');
  192.            delay(1);
  193.         
  194.            qushu_time(ds_dushu(0X83));         //分
  195.            delay(1);
  196.            zhiling(0x88+4);
  197.            delay(1);
  198.            shuju(shu5[shi]);
  199.            delay(1);
  200.            shuju(shu5[ge]);
  201.            delay(1);
  202.            shuju(':');
  203.            shuju(' ');
  204.            delay(1);

  205.            qushu_time(ds_dushu(0X85));          //时
  206.            delay(1);
  207.            zhiling(0x88);
  208.            delay(1);
  209.            shuju(0xca);
  210.            shuju(0xb1);
  211.            delay(1);
  212.            shuju(0xbc);
  213.            shuju(0xe4);
  214.            delay(1);
  215.            shuju(shu5[shi]);
  216.            delay(1);
  217.            shuju(shu5[ge]);
  218.            delay(1);
  219.            shuju(':');
  220.            shuju(' ');
  221.            delay(1);

  222.            qushu_time(ds_dushu(0X8b));         //星期
  223.            delay(1);
  224.            zhiling(0x90);
  225.            delay(1);
  226.            shuju(0xd0);
  227.            shuju(0xc7);
  228.            delay(1);
  229.            shuju(0xc6);
  230.            shuju(0xda);
  231.            delay(1);
  232.            shuju(shu5[ge]);
  233.            shuju(' ');
  234.            delay(1);                     

  235.            qushu_time(ds_dushu(0X87));         // 日
  236.            delay(1);
  237.            zhiling(0x80+5);
  238.            delay(1);
  239.            shuju(shu5[shi]);
  240.            delay(1);
  241.            shuju(shu5[ge]);
  242.            delay(1);
  243.            shuju(0xc8);                                 //日        
  244.            shuju(0xd5);                                 //日
  245.            delay(1);        
  246.            shuju(' ');                                 //        
  247.            shuju(' ');                                 //
  248.            delay(1);        

  249.            qushu_time(ds_dushu(0X89));         //月
  250.            delay(1);
  251.            zhiling(0x80+3);
  252.            delay(1);
  253.            shuju(shu5[shi]);
  254.            delay(10);
  255.            shuju(shu5[ge]);
  256.            delay(1);
  257.            shuju(0xd4);                                 //月        
  258.            shuju(0xc2);                                 //月
  259.            delay(1);
  260.            
  261.            qushu_time(ds_dushu(0X8d));        //年
  262.            delay(1);
  263.            zhiling(0x80);
  264.            delay(1);
  265.            shuju('2');                                 //2
  266.            shuju('0');                                 //0
  267.            delay(1);
  268.            shuju(shu5[shi]);
  269.            delay(1);
  270.            shuju(shu5[ge]);
  271.            delay(1);
  272.            shuju(0xc4);                                 //年
  273.            shuju(0xea);                                 //年
  274.            delay(1);
  275. }

  276. /*****************************************************/
  277. /*******进入低功耗模式(报警模式)的按键检测**********/
  278. /*****************************************************/
  279. void sleep_sign()
  280. {
  281.    if(Interrupt_flag)
  282.          {
  283.        if(!key_sigo)
  284.            {
  285.                 delay(5);
  286.                 if(!key_sigo)
  287.                  {                           
  288.                    lcd_lig=1;
  289.                    key2=1;                                   //初始化按键key2(睡眠报警模式进入键)
  290.                    voi_lig_sigo=1;                   //初始化声光报警控制位
  291.                    relay1=1;                   //继电器1(湿度控制)
  292.            relay2=1;                   //继电器2(温度控制)        
  293.                    zhiling(0x08);               //LCD12864进入睡眠模式
  294.                    P0=0XFF;                                      //初始化所有IO口,防止干扰出现
  295.                    P1=0XFF;
  296.                    P2=0XFF;
  297.                    P3=0XFF;
  298.                    delay(10);
  299.                    EX1=1;                                      //打开人体感应报警中断
  300.                    PCON=0X02;                       //51单片机进入掉电模
  301.                  }
  302.            }
  303.          }
  304. }

  305. /************************************************/
  306. /*******当声光报警时LCD12864显示“报警!”**********/
  307. /************************************************/
  308. void sos_display()                                                //当声光报警时LCD12864显示“报警!”
  309. {
  310.     while(sos)                                                        //判断是否报警
  311.         {
  312.           display_bmp_logo(bmp_8);                        //写入图片8
  313.           if(!sos)
  314.           init_lcd12864();                                //初始化LCD12864        
  315.         }
  316. }

  317. /***************************************************************/
  318. /*kay按键中断,进入报警(休眠)模式和退出该模式(也是唤醒中断)*/
  319. /***************************************************************/
  320. void sleep_int0() interrupt 0        //kay按键中断,进入报警(休眠)模式和退出该模式(也是唤醒中断)
  321. {
  322.         Interrupt_flag=1;
  323.                 voi_lig_sigo=1;                             //关闭报警
  324.               zhiling(0x0c);                         //将LCD12864从睡眠模式唤醒
  325.                 lcd_lig=0;                                 //打开LCD12864背光               
  326.                 EX1=0;                                                  //关闭人体感应报警中断
  327.                 TR0=1;                                         //开温度和湿度扫描
  328.                 TR1=1;                                         //开水温扫描
  329.                 sos=0;                                                 //LCD12864取消显示“报警!”
  330. }

  331. /*****************************************************/
  332. /****人体感应模式中断(报警中断,也是唤醒中断)*******/
  333. /*****************************************************/
  334. void voi_lig_int1() interrupt 2             //人体感应模式中断(报警中断,也是唤醒中断)
  335. {
  336.         Interrupt_flag=0;
  337.                voi_lig_sigo=0;                             //开起报警
  338.                 zhiling(0x0c);                         //将LCD12864从睡眠模式唤醒
  339.                 lcd_lig=0;;                                 //打开LCD12864背光
  340.                 EX1=0;                                                 //关闭人体感应报警中断
  341.                 TR0=0;                                         //开温度和湿度扫描
  342.                 TR1=0;                                         //开水温扫描
  343.                 sos=1;                                                 //LCD12864显示“报警!”
  344. }

  345. /**************************************/
  346. /********计时器T0中断函数DHT11*********/
  347. /**************************************/
  348. void time0_DHT11() interrupt 1          //定时器T0中断,DHT11数据读取程序
  349. {
  350.         TH0=(65535-50000)/256;
  351.         TL0=(65535-50000)%256;
  352.           dsq_0++;
  353.         if(dsq_0==20)
  354.         {
  355.        TR1=0;                                           //关定时器T1
  356.            ET1=0;           

  357.            dsq_0=0;
  358.            w_s=return_wendu_shidu();
  359.            qushu_DHT11(w_s);                  //读取温度湿度
  360.            delay(1);

  361.            TR1=1;                                           //开定时器T1
  362.            ET1=1;
  363.         }
  364. }

  365. /**************************************/
  366. /********计时器T1中断函数DS18B20*******/
  367. /**************************************/
  368. void time1_DS18B20() interrupt 3  //定时器T1中断函数DS18B20,DHT11数据显示程序
  369. {                                                              //T1中断函数(中断里面程序的运行时间要在50ms以内,此处中断程序运行为8.753ms)
  370.         TH0=(65535-50000)/256;
  371.         TL0=(65535-50000)%256;
  372.         k++;
  373.         if(k==20)
  374.         {
  375.            TR0=0;                                                  //关定时器T0
  376.            ET0=0;
  377.            
  378.                 k=0;
  379.                 T=return_wendu_DS18B20();          //读取温度
  380.             qushu_DS18B20(T);                          //分离温度数值
  381.             
  382.           /*****************************************/
  383.           /*  display水的温度*/
  384.           /******************************************/  
  385.             delay(10);
  386.                 zhiling(0x90+3);
  387.                 delay(1);
  388.                 shuju(0xcb);                                 //水
  389.             shuju(0xae);                                 //
  390.             delay(1);
  391.                 shuju(0xce);                                 //温
  392.             shuju(0xc2);                                 //
  393.             delay(1);
  394.                 shuju(shu5[wd_shi]);           //温度十位
  395.                 delay(1);
  396.                 shuju(shu5[wd_ge]);               //温度个位
  397.                 delay(1);
  398.                 shuju('.');                               //小数点
  399.                 delay(1);
  400.                 shuju(shu5[wd_xiao1]);           //温度小数0.1位
  401.                 delay(1);
  402.                 shuju(0xa1);                   //显示℃(本来为温度小数0.01位 )
  403.                 shuju(0xe6);                   //显示℃(本来为温度小数0.01位 )

  404.           /*****************************************/
  405.           /*  display环境的温度和湿度,注:本来下面的
  406.              这段display应该是放在定时器T0中断函数中
  407.                  但是那样会对显示产生印象,所以选择同时写入,
  408.                  也介于LCD12864屏幕的特点,第二行的地址和第
  409.                  四行地址是连在一起的*/
  410.           /******************************************/
  411.             zhiling(0x98);
  412.                 delay(1);                  
  413.                 shuju(0xca);                                 //湿
  414.             shuju(0xaa);                                 //
  415.             delay(1);
  416.                 shuju(0xb6);                                 //度
  417.             shuju(0xc8);                                 //
  418.             delay(1);
  419.             shuju(shu5[sd_shi]);              //湿度十位
  420.             delay(1);
  421.             shuju(shu5[sd_ge]);                  //湿度个位
  422.             delay(1);
  423.             shuju(0xa3);                                 //%
  424.             shuju(0xa5);                                 //
  425.             delay(1);
  426.                 shuju(0xce);                                 //温
  427.             shuju(0xc2);                                 //
  428.             delay(1);
  429.                 shuju(0xb6);                                 //度
  430.             shuju(0xc8);                                 //
  431.             delay(1);
  432.             shuju(shu5[wd_shi1]);               //温度十位
  433.             delay(1);
  434.             shuju(shu5[wd_ge1]);               //温度个位
  435.             delay(1);
  436.             shuju(0xa1);                       //显示℃
  437.             shuju(0xe6);                       //显示℃
  438.                
  439.                 TR0=1;                                               //开定时器T0
  440.             ET0=1;        
  441.          }               
  442. }
复制代码

下载: 01.7z (152.26 KB, 下载次数: 0)

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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