久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4162|回復: 3
打印 上一主題 下一主題
收起左側

基于51單片機的智能家居程序+電路設計

  [復制鏈接]
跳轉到指定樓層
樓主
智能家居基于51單片機控制, 同時外接DS1302DS18B20以及LCD液晶屏等,對智能家居智進行簡易的控制。
該設計運用到的芯片:STC89C58+DS18B20+DHT11+DS1302+LCD12864+紅外人體感應器+無線遙控
功能:
1.數字可調萬年歷
2.顯示空氣中溫度和濕度
3.對環境溫度和濕度可以自動控制
4.測量水的溫度
5.無線控制
6.防盜報警
7.低功耗模式
8.開機圖片
9.EEPROM數據保存
原理圖設計:


單片機源程序如下:
  1. /***************************************************************/
  2. /*                  智能家居控制系統
  3.                       設計:劉東宇
  4.                                
  5.                                            2013.04                        
  6. 芯片:STC89C58+DS18B20+DHT11+DS1302+LCD12864+紅外人體感應器+無線遙控
  7. 功能:1.數字可調萬年歷
  8.       2.顯示空氣中溫度和濕度
  9.           3.對環境溫度和濕度可以自動控制
  10.           4.測量水的溫度
  11.           5.無線控制
  12.           6.防盜報警
  13.           7.低功耗模式
  14.           8.開機圖片
  15.           9.EEPROM數據保存                                                                */
  16. /***************************************************************/

  17. #include<reg52.h>
  18. #include<absacc.h>
  19. #include<intrins.h>
  20. #include"LCD12864.h"
  21. #include"DS18B20.h"
  22. #include"DS1302.h"
  23. #include"delay_ms.h"
  24. #include"key.h"
  25. #include"DHT11.h"
  26. #include"start_logo.h"
  27. #include"picture.h"
  28. #include"Flash_ROM.h"
  29. /********************函數申明********************/
  30. void init();                                        //初始化程序
  31. void sleep_sign_init();                                //睡眠(報警)模式初始化
  32. void init_time_DHT11_DS18B20();                    //初始化定時器T0和T1
  33. void open_logo();                           //開機圖片
  34. void kay_scan();                                            //kay_scan 按鍵掃描程序
  35. void display_time();                                    //display_time時間掃描(LCD12864顯示)
  36. void alarm();                                                //溫濕度超值判斷
  37. void sleep_sign();                          //睡眠(報警)模式和正常模式切換函數
  38. void sos_display();                         //當聲光報警時LCD12864顯示“報警!”  
  39. /************位變量定義****************/
  40. sbit lcd_lig=P2^4;                          //LCD12864背光控制
  41. sbit relay1=P1^0;                          //繼電器1
  42. sbit relay2=P1^1;                          //繼電器2
  43. sbit voi_lig_sigo=P1^2;                  //聲光報警控制位
  44. sbit key_sigo=P1^6;                          //睡眠(報警)模式進入按鍵
  45. /************變量定義****************/
  46. unsigned char code shu5[]={"0123456789"};
  47. unsigned char code shu6[]={"年月日:"};
  48. unsigned int k,T;
  49. bit Interrupt_flag=1;                              //該標志位可以有效防止報警觸發后影響其他程序
  50. bit sos=0;                                    //LCD12864顯示報警標志位

  51. void main()
  52. {   
  53.     init();                                                  //初始化程序
  54.         lcd_lig=0;                                  //開LCD背光
  55.         open_logo();                                  //開機LOGO
  56.         sleep_sign_init();                      //睡眠(報警)模式初始化
  57.         init_lcd12864();                          //初始化LCD12864       
  58.     init_time_DHT11_DS18B20();          //初始化定時器T0和T1
  59.         DS18B20_caution();            //DS18B20溫度報警設置
  60.         while(1)
  61.         {       
  62.                    kay_scan();                                  //kay_scan 按鍵掃描程序       
  63.                  display_time();                          //display_time 時間顯示掃描(LCD12864顯示)
  64.                 alarm();                              //溫濕度超值判斷
  65.                 sleep_sign();             //睡眠(報警)模式和正常模式切換函數
  66.                 sos_display();                          //當聲光報警時LCD12864顯示“報警!”
  67.         }
  68. }

  69. /************************************************/
  70. /****************程序初始化**********************/
  71. /************************************************/
  72. void init()
  73. {
  74.   IAP_ReadCode(0x8000,&set_up_sd,1);                                  //讀濕度閥值
  75.   IAP_ReadCode(0x800f,&set_up_wd,1);                                  //讀溫度閥值

  76.   relay1=1;                        //繼電器1(濕度控制)
  77.   relay2=1;                        //繼電器2(溫度控制)

  78.   IP=0X0A;                                  //中斷優先級設定,將定時器T0和T1設置為高級

  79.   sd_shi=0;
  80.   sd_ge=0;
  81.   wd_shi1=0;
  82.   wd_ge1=0;
  83.   dsq_0=0;                         //定時器T0
  84.    
  85. /***********DS1302初始化****************/
  86.    ds_io=0;
  87.    ds_rst=0;
  88.    ds_sclk=0;                    //DS1302初始化  
  89.    ds_xieshu(0x8e,0x00);    //控制
  90. }

  91. /*****************************************************/
  92. /**************睡眠(報警)模式初始化*****************/
  93. /*****************************************************/
  94. void sleep_sign_init()                  //睡眠(報警)模式初始化
  95. {
  96.    voi_lig_sigo=1;                          //初始化聲光報警控制位
  97.    key2=1;                                          //初始化按鍵key2(睡眠報警模式進入鍵)
  98.    lcd_lig=0;                                  //LCD12864背光控制位

  99.    TCON=0X55;                       //INT0設置為下降沿觸發,INT0設置為下降沿觸發
  100.    EX0=1;                               //開外部中斷INT0
  101.    EX1=0;                                           //關外部中斷INT1
  102.    EA=1;                                           //開總中斷
  103. }

  104. /**************************************/
  105. /********初始化計時器T0和T1************/
  106. /**************************************/
  107. void init_time_DHT11_DS18B20()         //初始化定時器T0和T1
  108. {
  109.            TMOD=0X11;                                         //定時器T0和T1工作于方式1

  110.         TH0=(65535-50000)/256;                 //給定時器T0裝初值
  111.         TL0=(65535-50000)%256;
  112.         TR0=1;                                                 //開定時器T0計數
  113.         ET0=1;                                                 //開定時器T0中斷

  114.         TH1=(65535-50000)/256;                  //給定時器T1裝初值
  115.         TL1=(65535-50000)%256;
  116.         TR1=1;                                                  //開定時器T1計數
  117.         ET1=1;                                                  //開定時器T1中斷
  118. }

  119. /************************************************/
  120. /****************  開機圖片  ********************/
  121. /************************************************/
  122. void open_logo()
  123. {
  124.      display_bmp_logo(bmp_1);                        //寫入圖片1
  125.          delay(10000);
  126.          display_bmp_logo(bmp_2);                        //寫入圖片2
  127.          delay(10000);
  128.          display_bmp_logo(bmp_3);                        //寫入圖片3
  129.          delay(10000);
  130.          display_bmp_logo(bmp_4);                        //寫入圖片4
  131.          delay(10000);
  132.          display_bmp_logo(bmp_5);                        //寫入圖片5
  133.          delay(8000);
  134.          display_bmp_logo(bmp_6);                        //寫入圖片6
  135.          delay(8000);         
  136.          display_bmp_logo(bmp_7);                        //寫入圖片7
  137.          delay(8000);         
  138. }

  139. /************************************************/
  140. /****************溫濕度報警檢測******************/
  141. /************************************************/
  142. void alarm()                                            //溫濕度超值判斷
  143. {
  144.                 if(sign_sd>=set_up_sd)                    //濕度判斷
  145.                     relay1=0;                        //繼電器1(降濕度控制)
  146.             else
  147.                     relay1=1;                       
  148.                 if(sign_wd>=set_up_wd)                    //溫度判斷
  149.                     relay2=0;                        //繼電器2(降溫度控制)
  150.                 else
  151.                     relay2=1;       
  152. }

  153. /***************************************************/
  154. /*********************按鍵掃描程序******************/
  155. /***************************************************/
  156. void kay_scan()                                     //kay_scan按鍵掃描程序
  157. {
  158.              if(key1==0)                             
  159.            {
  160.              delay(20);                                  //按鍵消抖
  161.                  if(key1==0)
  162.                 {
  163.                     TR0=0;                                  //關溫度和濕度掃描
  164.                     TR1=0;                                  //關水溫掃描
  165.                        
  166.                     i=0;
  167.                     i++;
  168.                         miao=BCD_Decimal(ds_dushu(0x81));                //將現在顯示的數值賦給要進行調整的變量
  169.                         fen=BCD_Decimal(ds_dushu(0x83));                //這樣在調時間的時候就不會出現從0開始調整
  170.                         shi=BCD_Decimal(ds_dushu(0x85));                //這樣就可以在原來的數值上進行調整
  171.                         xq=BCD_Decimal(ds_dushu(0x8b));
  172.                         ri=BCD_Decimal(ds_dushu(0x87));
  173.                         yue=BCD_Decimal(ds_dushu(0x89));
  174.                         nian=BCD_Decimal(ds_dushu(0x8d));
  175.                         shidu=set_up_sd;                                    //將濕度當前值賦給要調節的值
  176.                         wendu=set_up_wd;                                          //將溫度當前值賦給要調節的值
  177.                         if(i>=9)                                                                //可以直接將9改成1
  178.                           i=1;
  179.                         delay(20);
  180.                     while(key1==0);                                                         //松手檢測
  181.                         delay(20);
  182.                         while(key1==0);
  183.                         while(i)                                                                 //當i大于0時進入按鍵掃描死循環,當i=0時跳出該循環
  184.                     key();                                                     //掃描按鍵
  185.                 }               
  186.           }
  187. }

  188. /*****************************************************/
  189. /**************LCD12864 display時間掃描***************/
  190. /*****************************************************/
  191. void display_time()                               //display_time時間掃描(LCD12864顯示)
  192. {
  193.            qushu_time(ds_dushu(0X81));        //秒
  194.            delay(1);
  195.            zhiling(0x88+6);
  196.            delay(1);
  197.            shuju(shu5[shi]);
  198.            delay(1);
  199.            shuju(shu5[ge]);
  200.            delay(1);
  201.            shuju(' ');
  202.            shuju(' ');
  203.            delay(1);
  204.        
  205.            qushu_time(ds_dushu(0X83));         //分
  206.            delay(1);
  207.            zhiling(0x88+4);
  208.            delay(1);
  209.            shuju(shu5[shi]);
  210.            delay(1);
  211.            shuju(shu5[ge]);
  212.            delay(1);
  213.            shuju(':');
  214.            shuju(' ');
  215.            delay(1);

  216.            qushu_time(ds_dushu(0X85));          //時
  217.            delay(1);
  218.            zhiling(0x88);
  219.            delay(1);
  220.            shuju(0xca);
  221.            shuju(0xb1);
  222.            delay(1);
  223.            shuju(0xbc);
  224.            shuju(0xe4);
  225.            delay(1);
  226.            shuju(shu5[shi]);
  227.            delay(1);
  228.            shuju(shu5[ge]);
  229.            delay(1);
  230.            shuju(':');
  231.            shuju(' ');
  232.            delay(1);

  233.            qushu_time(ds_dushu(0X8b));         //星期
  234.            delay(1);
  235.            zhiling(0x90);
  236.            delay(1);
  237.            shuju(0xd0);
  238.            shuju(0xc7);
  239.            delay(1);
  240.            shuju(0xc6);
  241.            shuju(0xda);
  242.            delay(1);
  243.            shuju(shu5[ge]);
  244.            shuju(' ');
  245.            delay(1);                     

  246.            qushu_time(ds_dushu(0X87));         // 日
  247.            delay(1);
  248.            zhiling(0x80+5);
  249.            delay(1);
  250.            shuju(shu5[shi]);
  251.            delay(1);
  252.            shuju(shu5[ge]);
  253.            delay(1);
  254.            shuju(0xc8);                                 //日       
  255.            shuju(0xd5);                                 //日
  256.            delay(1);       
  257.            shuju(' ');                                 //       
  258.            shuju(' ');                                 //
  259.            delay(1);       

  260.            qushu_time(ds_dushu(0X89));         //月
  261.            delay(1);
  262.            zhiling(0x80+3);
  263.            delay(1);
  264.            shuju(shu5[shi]);
  265.            delay(10);
  266.            shuju(shu5[ge]);
  267.            delay(1);
  268.            shuju(0xd4);                                 //月       
  269.            shuju(0xc2);                                 //月
  270.            delay(1);
  271.           
  272.            qushu_time(ds_dushu(0X8d));        //年
  273.            delay(1);
  274.            zhiling(0x80);
  275.            delay(1);
  276.            shuju('2');                                 //2
  277.            shuju('0');                                 //0
  278.            delay(1);
  279.            shuju(shu5[shi]);
  280.            delay(1);
  281.            shuju(shu5[ge]);
  282.            delay(1);
  283.            shuju(0xc4);                                 //年
  284.            shuju(0xea);                                 //年
  285.            delay(1);
  286. }

  287. /*****************************************************/
  288. /*******進入低功耗模式(報警模式)的按鍵檢測**********/
  289. /*****************************************************/
  290. void sleep_sign()
  291. {
  292.    if(Interrupt_flag)
  293.          {
  294.        if(!key_sigo)
  295.            {
  296.                 delay(5);
  297.                 if(!key_sigo)
  298.                  {                          
  299.                    lcd_lig=1;
  300.                    key2=1;                                   //初始化按鍵key2(睡眠報警模式進入鍵)
  301.                    voi_lig_sigo=1;                   //初始化聲光報警控制位
  302.                    relay1=1;                   //繼電器1(濕度控制)
  303.            relay2=1;                   //繼電器2(溫度控制)       
  304.                    zhiling(0x08);               //LCD12864進入睡眠模式
  305.                    P0=0XFF;                                      //初始化所有IO口,防止干擾出現
  306.                    P1=0XFF;
  307.                    P2=0XFF;
  308.                    P3=0XFF;
  309.                    delay(10);
  310.                    EX1=1;                                      //打開人體感應報警中斷
  311.                    PCON=0X02;                       //51單片機進入掉電模
  312.                  }
  313.            }
  314.          }
  315. }

  316. /************************************************/
  317. /*******當聲光報警時LCD12864顯示“報警!”**********/
  318. /************************************************/
  319. void sos_display()                                                //當聲光報警時LCD12864顯示“報警!”
  320. {
  321.     while(sos)                                                        //判斷是否報警
  322.         {
  323.           display_bmp_logo(bmp_8);                        //寫入圖片8
  324.           if(!sos)
  325.           init_lcd12864();                                //初始化LCD12864       
  326.         }
  327. }

  328. /***************************************************************/
  329. /*kay按鍵中斷,進入報警(休眠)模式和退出該模式(也是喚醒中斷)*/
  330. /***************************************************************/
  331. void sleep_int0() interrupt 0        //kay按鍵中斷,進入報警(休眠)模式和退出該模式(也是喚醒中斷)
  332. {
  333.         Interrupt_flag=1;
  334.                 voi_lig_sigo=1;                             //關閉報警
  335.               zhiling(0x0c);                         //將LCD12864從睡眠模式喚醒
  336.                 lcd_lig=0;                                 //打開LCD12864背光               
  337.                 EX1=0;                                                  //關閉人體感應報警中斷
  338.                 TR0=1;                                         //開溫度和濕度掃描
  339.                 TR1=1;                                         //開水溫掃描
  340.                 sos=0;                                                 //LCD12864取消顯示“報警!”
  341. }

  342. /*****************************************************/
  343. /****人體感應模式中斷(報警中斷,也是喚醒中斷)*******/
  344. /*****************************************************/
  345. void voi_lig_int1() interrupt 2             //人體感應模式中斷(報警中斷,也是喚醒中斷)
  346. {
  347.         Interrupt_flag=0;
  348.                voi_lig_sigo=0;                             //開起報警
  349.                 zhiling(0x0c);                         //將LCD12864從睡眠模式喚醒
  350.                 lcd_lig=0;;                                 //打開LCD12864背光
  351.                 EX1=0;                                                 //關閉人體感應報警中斷
  352.                 TR0=0;                                         //開溫度和濕度掃描
  353.                 TR1=0;                                         //開水溫掃描
  354.                 sos=1;                                                 //LCD12864顯示“報警!”
  355. }

  356. /**************************************/
  357. /********計時器T0中斷函數DHT11*********/
  358. /**************************************/
  359. void time0_DHT11() interrupt 1          //定時器T0中斷,DHT11數據讀取程序
  360. {
  361.         TH0=(65535-50000)/256;
  362.         TL0=(65535-50000)%256;
  363.           dsq_0++;
  364.         if(dsq_0==20)
  365.         {
  366.        TR1=0;                                           //關定時器T1
  367.            ET1=0;          

  368.            dsq_0=0;
  369.            w_s=return_wendu_shidu();
  370.            qushu_DHT11(w_s);                  //讀取溫度濕度
  371.            delay(1);

  372.            TR1=1;                                           //開定時器T1
  373.            ET1=1;
  374.         }
  375. }

  376. /**************************************/
  377. /********計時器T1中斷函數DS18B20*******/
  378. /**************************************/
  379. void time1_DS18B20() interrupt 3  //定時器T1中斷函數DS18B20,DHT11數據顯示程序
  380. {                                                              //T1中斷函數(中斷里面程序的運行時間要在50ms以內,此處中斷程序運行為8.753ms)
  381.         TH0=(65535-50000)/256;
  382.         TL0=(65535-50000)%256;
  383.         k++;
  384.         if(k==20)
  385.         {
  386.            TR0=0;                                                  //關定時器T0
  387.            ET0=0;
  388.           
  389.                 k=0;
  390.                 T=return_wendu_DS18B20();          //讀取溫度
  391.             qushu_DS18B20(T);                          //分離溫度數值
  392.             
  393.           /*****************************************/
  394.           /*  display水的溫度*/
  395.           /******************************************/  
  396.             delay(10);
  397.                 zhiling(0x90+3);
  398.                 delay(1);
  399.                 shuju(0xcb);                                 //水
  400.             shuju(0xae);                                 //
  401.             delay(1);
  402.                 shuju(0xce);                                 //溫
  403.             shuju(0xc2);                                 //
  404.             delay(1);
  405.                 shuju(shu5[wd_shi]);           //溫度十位
  406.                 delay(1);
  407.                 shuju(shu5[wd_ge]);               //溫度個位
  408.                 delay(1);
  409.                 shuju('.');                               //小數點
  410.                 delay(1);
  411.                 shuju(shu5[wd_xiao1]);           //溫度小數0.1位
  412.                 delay(1);
  413.                 shuju(0xa1);                   //顯示℃(本來為溫度小數0.01位 )
  414.                 shuju(0xe6);                   //顯示℃(本來為溫度小數0.01位 )

  415.           /*****************************************/
  416.           /*  display環境的溫度和濕度,注:本來下面的
  417.              這段display應該是放在定時器T0中斷函數中
  418.                  但是那樣會對顯示產生印象,所以選擇同時寫入,
  419.                  也介于LCD12864屏幕的特點,第二行的地址和第
  420.                  四行地址是連在一起的*/
  421.           /******************************************/
  422.             zhiling(0x98);
  423.                 delay(1);                 
  424.                 shuju(0xca);                                 //濕
  425.             shuju(0xaa);                                 //
  426.             delay(1);
  427.                 shuju(0xb6);                                 //度
  428.             shuju(0xc8);                                 //
  429.             delay(1);
  430.             shuju(shu5[sd_shi]);              //濕度十位
  431.             delay(1);
  432.             shuju(shu5[sd_ge]);                  //濕度個位
  433.             delay(1);
  434.             shuju(0xa3);                                 //%
  435.             shuju(0xa5);                                 //
  436.             delay(1);
  437.                 shuju(0xce);                                 //溫
  438.             shuju(0xc2);                                 //
  439.             delay(1);
  440.                 shuju(0xb6);                                 //度
  441.             shuju(0xc8);                                 //
  442.             delay(1);
  443.             shuju(shu5[wd_shi1]);               //溫度十位
  444.             delay(1);
  445.             shuju(shu5[wd_ge1]);               //溫度個位
  446.             delay(1);
  447.             shuju(0xa1);                       //顯示℃
  448.             shuju(0xe6);                       //顯示℃
  449.                
  450.                 TR0=1;                                               //開定時器T0
  451.             ET0=1;       
  452.          }               
  453. }
復制代碼

所有資料51hei提供下載:
原理圖.zip (36.87 KB, 下載次數: 73)
源程序.zip (134.66 KB, 下載次數: 68)






評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:570917 發表于 2020-6-11 20:00 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

板凳
ID:772623 發表于 2020-6-12 14:27 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

地板
ID:1145741 發表于 2025-4-23 19:17 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 羞羞涩涩在线观看 | 97精品超碰一区二区三区 | 精品在线 | 免费观看a级毛片在线播放 黄网站免费入口 | av福利网 | 日韩免费视频一区二区 | 一区二区三区在线免费观看 | 日韩精品一区二区三区免费视频 | 日本色高清| 日韩在线看片 | 国产美女在线免费观看 | 一区二区久久精品 | 中文字幕一区二区三区精彩视频 | 偷拍第一页 | 日本不卡免费新一二三区 | 91精品国产综合久久精品图片 | 亚洲一区二区中文字幕 | 国产一区二区三区久久久久久久久 | 一区二区在线 | 久久久久久高潮国产精品视 | 91国在线视频 | 岛国在线免费观看 | 成人高清在线 | 日韩精品一区二区不卡 | 日本免费视频在线观看 | 免费一级片 | 在线看av的网址 | 精品久久99| 99精品国产一区二区三区 | 人成久久 | av片免费 | 免费大黄视频 | 丁香婷婷久久久综合精品国产 | 91一区二区在线观看 | 欧美日韩在线一区二区 | 中文字幕日韩欧美一区二区三区 | www视频在线观看 | 久久久久国产一区二区三区 | 我我色综合 | 欧美久久久久久久久 | 国产精品久久久久久高潮 |