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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4729|回復: 1
收起左側

基于51單片機的智能家居系統程序設計

  [復制鏈接]
ID:761907 發表于 2020-5-26 20:37 | 顯示全部樓層 |閱讀模式
這是我的設計,全原創。附件是完整程序
內容:
本課題基于單片機技術, 研究一典型的智能家居系統設計. 系統擬采用控制器,監控器和控制終端的框架結構, 主要設計對家居中的時間、溫度、濕度和光照等信息的檢測, 以及照明系統, 窗簾和家用電器的自動控制. 具體設計要求如下:
1)溫度以及室外濕度,PM2.5的自動監測與顯示.
2)照明系統的自動控制與手動控制, 如離開家時關閉所有照明.
3)窗簾與窗戶的自動控制與手動控制,如睡眠時自動關閉窗簾, 當室外濕度和PM2.5超出預警值時自動關閉窗戶.
      4)實現窗簾窗戶以及家用電器的遠程控制.

電路原理圖如下:

原理圖

原理圖


單片機源程序如下:
  1. #include <REGX52.H>
  2. #include "LCd1602.h"
  3. #include "dht11.c"
  4. #include "eeprom52.h"        
  5. #include "hong_wai.h"

  6. sbit key1=P2^3;
  7. sbit key2=P3^1;
  8. sbit key3=P3^3;
  9. sbit key4=P3^4;
  10. sbit key5=P3^5;
  11. sbit key6=P3^6;
  12. sbit key7=P3^7;
  13. sbit LED=P2^4;
  14. sbit RSD=P2^2;
  15. sbit light=P2^1;



  16. bit key1_flag=0;
  17. bit key2_flag=0;
  18. bit key3_flag=0;
  19. bit key4_flag=0;
  20. bit key5_flag=0;
  21. bit key6_flag=0;
  22. bit key7_flag=0;

  23. uchar sec=0;
  24. uchar sec1=0;
  25. uchar rh_h=0;
  26. uchar ms=0;
  27. uchar state=0;


  28. bit mode =0;  //mode 是控制電機的 自動手動標志位
  29. bit mode1=0;  //mode1是控制燈的 自動手動標志位
  30. bit s0;
  31. bit star_stop=1;



  32. uchar UART_Upload[9];  // Upload上傳  accord主動
  33. uint pm_rateH,pm_rateL,pm_particle,pm_density,pm_URV;//低脈沖率高位。低脈沖率低位, 比率,顆粒,濃度  PM_URV  pm上限值
  34. uchar  accord=0;

  35. uchar fz[]=                                   //正轉數據
  36. {
  37.         0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09
  38. };


  39. uchar zz[]=                                   //反轉數據
  40. {
  41.         0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01
  42. };

  43. uchar loop=0;

  44. uint DJ_dat=0;

  45. void memory()
  46. {        ///pm_URV
  47.    SectorErase(0x2000);
  48.    byte_write(0x2000,rh_h);
  49.    byte_write(0x2001,pm_URV/256);
  50.    byte_write(0x2002,pm_URV%256);
  51. }
  52. void read_memory()
  53. {
  54.    rh_h=byte_read(0x2000);
  55.    pm_URV=byte_read(0x2001)*256+byte_read(0x2002);
  56.    if(rh_h>99||pm_URV>9999)         
  57.     {
  58.           rh_h=30;
  59.           pm_URV=500;
  60.         }
  61. }
  62. void display_dispose()
  63. {
  64.         if(state==0)         // U8RH_data_H  U8T_data_H
  65.          {
  66.                    LCD1602_write(0,0x80);
  67.                    LCD1602_writebyte("R:");
  68.                    LCD1602_write(1,0x30+U8RH_data_H/10);
  69.                    LCD1602_write(1,0x30+U8RH_data_H%10);
  70.                    LCD1602_writebyte("% ");
  71.                
  72.                    LCD1602_writebyte("T:");
  73.                    LCD1602_write(1,0x30+U8T_data_H/10);
  74.                    LCD1602_write(1,0x30+U8T_data_H%10);
  75.                    LCD1602_write(1,0xdf);
  76.                    LCD1602_writebyte("C ");
  77.                    if(mode1) LCD1602_writebyte("A ");
  78.                    else          LCD1602_writebyte("M ");

  79.                    if(mode) LCD1602_writebyte("A ");
  80.                    else         LCD1602_writebyte("M ");



  81.                
  82.                    LCD1602_write(0,0xC0);
  83.                    LCD1602_writebyte("P:");           //pm_density
  84.                    LCD1602_write(1,0x30+pm_density/1000%10);
  85.                    LCD1602_write(1,0x30+pm_density/100%10);
  86.                    LCD1602_write(1,0x30+pm_density/10%10);
  87.                    LCD1602_writebyte(".");
  88.                    LCD1602_write(1,0x30+pm_density%10);
  89.                    LCD1602_writebyte("ug/m3 ");        
  90.                    if(LED==0) LCD1602_writebyte("K ");
  91.                    else           LCD1602_writebyte("G ");

  92.                    if(star_stop==0) LCD1602_writebyte("K ");
  93.                    else                 LCD1602_writebyte("G ");

  94.                      
  95.          }
  96.         else
  97.          {
  98.                    LCD1602_write(0,0x80);
  99.                    LCD1602_writebyte("RH_H:");
  100.                    if(state==1&&s0)   LCD1602_writebyte("  ");
  101.                    else
  102.                     {
  103.                            LCD1602_write(1,0x30+rh_h/10);
  104.                            LCD1602_write(1,0x30+rh_h%10);                          
  105.                         }
  106.                    LCD1602_writebyte("%              ");

  107.                    LCD1602_write(0,0xC0);
  108.                    LCD1602_writebyte("PM2.5:");           //pm_density
  109.                    if(state==2&&s0)   LCD1602_writebyte("     ");
  110.                    else
  111.                     {
  112.                            LCD1602_write(1,0x30+pm_URV/1000%10);
  113.                            LCD1602_write(1,0x30+pm_URV/100%10);
  114.                            LCD1602_write(1,0x30+pm_URV/10%10);
  115.                            LCD1602_writebyte(".");
  116.                            LCD1602_write(1,0x30+pm_URV%10);                  
  117.                         }
  118.                    LCD1602_writebyte("ug/m3 ");            
  119.          }                                 
  120. }
  121. void key()
  122. {
  123.    if(!key1||ircode[2]==0x0c)
  124.     {  ircode[2]=0;
  125.           if(key1_flag)
  126.            {
  127.              key1_flag=0;
  128.                  state=(state+1)%3;
  129.            }
  130.         }
  131.         else
  132.          {
  133.            if(ircode[2]!=0x0c) key1_flag=1;
  134.          }

  135.          
  136.    if(!key2||ircode[2]==0x18)
  137.     {  ircode[2]=0;
  138.           if(key2_flag)
  139.            {
  140.              key2_flag=0;
  141.                  if(state==1)
  142.                   {
  143.                     if(rh_h<99) rh_h++;        
  144.                      memory();
  145.                   }
  146.                   else if(state==2)         
  147.                    {
  148.                     if(pm_URV<9999) pm_URV++;        
  149.                      memory();
  150.                    }
  151.            }

  152.            if(sec==0)
  153.             {
  154.                          if(state==1)
  155.                           {
  156.                             if(rh_h<99) rh_h++;        
  157.                              memory();
  158.                           }
  159.                           else if(state==2)         
  160.                            {
  161.                             if(pm_URV<9999) pm_URV++;        
  162.                              memory();
  163.                            }
  164.                 }

  165.         }
  166.         else
  167.          {
  168.            if(ircode[2]!=0x18)
  169.             {
  170.                          key2_flag=1;
  171.                      sec=2;
  172.                 }
  173.          }
  174.          

  175.         

  176.    if(!key3||ircode[2]==0x5E)
  177.     {  ircode[2]=0;
  178.           if(key3_flag)
  179.            {
  180.              key3_flag=0;
  181.                  if(state==1)
  182.                   {
  183.                     if(rh_h>0) rh_h--;        
  184.                      memory();
  185.                   }
  186.                   else if(state==2)         
  187.                    {
  188.                     if(pm_URV>0) pm_URV--;        
  189.                      memory();
  190.                    }
  191.            }
  192.            if(sec1==0)
  193.             {
  194.                          if(state==1)
  195.                           {
  196.                             if(rh_h>0) rh_h--;        
  197.                              memory();
  198.                           }
  199.                           else if(state==2)         
  200.                            {
  201.                             if(pm_URV>0) pm_URV--;        
  202.                              memory();
  203.                            }
  204.                 }
  205.         }
  206.         else
  207.          {
  208.            if(ircode[2]!=0x5E)
  209.             {
  210.                    key3_flag=1;
  211.                    sec1=2;
  212.                 }
  213.          }





  214.    if(!key4||ircode[2]==0x08)
  215.     { ircode[2]=0;
  216.           if(key4_flag)
  217.            {
  218.              key4_flag=0;
  219.                  mode1=~mode1;
  220.                  LED=1;
  221.            }
  222.         }
  223.         else  
  224.          {
  225.            if(ircode[2]!=0x08)
  226.             {
  227.                  key4_flag=1;
  228.                 }
  229.          }


  230.    if(!key5||ircode[2]==0x1C)
  231.     { ircode[2]=0;
  232.           if(key5_flag)
  233.            {
  234.              key5_flag=0;
  235.                  mode=~mode;
  236.            }
  237.         }
  238.         else  
  239.          {
  240.            if(ircode[2]!=0x1C)
  241.             {
  242.                  key5_flag=1;
  243.                 }
  244.          }


  245.          

  246.    if(!key6||ircode[2]==0x5A)
  247.     { ircode[2]=0;
  248.           if(key6_flag)
  249.            {
  250.              key6_flag=0;
  251.                  if(mode1==0)
  252.                   {
  253.                     LED=~LED;
  254.                   }
  255.            }
  256.         }
  257.         else  
  258.          {
  259.            if(ircode[2]!=0x5A)
  260.             {
  261.                   key6_flag=1;
  262.                 }
  263.          }




  264.    if(!key7||ircode[2]==0x42)
  265.     {  ircode[2]=0;
  266.           if(key7_flag)
  267.            {
  268.              key7_flag=0;
  269.                  if(mode==0)
  270.                   {
  271.                     star_stop=~star_stop;
  272.                   }
  273.            }
  274.         }
  275.         else  
  276.          {
  277.            if(ircode[2]!=0x42)
  278.             {
  279.                   key7_flag=1;
  280.                 }
  281.          }
  282.         
  283.          
  284. }

  285. void interrupt_int()
  286. {
  287.           EX0=1;                   //打開外部中斷0
  288.           IT0=1;                   //設置為邊沿觸發
  289.          
  290.           TMOD=0x12;           //設置定時器0工作模式2  8位自動重裝 256
  291.           TH0=0;
  292.           TL0=0;               //裝入初值
  293.           ET0=1;                   //打開定時器中斷

  294.           TH1=0x3C;
  295.           TL1=0xb0;               //裝入初值
  296.           ET1=1;                   //打開定時器中斷

  297.           EA=1;                           //打開總中斷開關
  298.           TR0=1;                   //打開定時器,開始計時
  299.           TR1=1;
  300. }

  301. void UART_Init(void)
  302. {
  303. T2CON = 0x34;
  304. RCAP2H = 0xFF;
  305. RCAP2L = 0xDC;
  306. TH2 = 0xFF;
  307. TL2 = 0xDC;
  308. TR2 = 1;      
  309. SCON = 0x50;
  310. ES = 1;  
  311. }

  312. void mode_dispose()         //mode 是控制電機的   mode1是控制燈的自動手動標志
  313. {
  314.    if(mode1)          //mode1==0  手動   mode1==1  自動   
  315.     {
  316.      if(light)
  317.           {
  318.                    if(RSD)
  319.                     {
  320.                           LED=0;
  321.                         }
  322.                         else  LED=1;            
  323.           }
  324.           else           LED=1;

  325.         }  

  326.    if(mode)          //mode1==0  手動   mode1==1  自動   
  327.     {
  328.            if(light==0)
  329.             {
  330.                   if((rh_h<U8RH_data_H)||(pm_URV<pm_density)) star_stop=0;
  331.                   else          star_stop=1;
  332.                 }
  333.                 else  star_stop=1;
  334.         }  

  335.             if(DJ_dat==0) loop=0;
  336.          while(DJ_dat<520&&star_stop==0)
  337.                         {
  338.                                 P1=P1&0xf0|zz[loop];                                                        
  339.                                 loop=(loop+1)%8;

  340.                                 if(loop==0) DJ_dat++;
  341.                                 LCD1602_delay(100);                                       
  342.                         }                              

  343.                while(DJ_dat!=0&&star_stop==1)
  344.                         {
  345.                                 P1=P1&0xf0|fz[loop];
  346.                                 loop=(loop+1)%8;
  347.                         
  348.                                 if(loop==0) DJ_dat--;
  349.                                 LCD1602_delay(100);
  350.                         }
  351.            
  352.                               P1=0x00;
  353.          
  354.    


  355. }


  356. void main()
  357. {
  358.    LCD1602_cls();
  359.    interrupt_int();        
  360.    UART_Init();        
  361.    read_memory();        
  362.    while(1)
  363.     {
  364.           mode_dispose();
  365.           display_dispose();
  366.         
  367.         }
  368. }





  369. void int0() interrupt 0
  370. {
  371.   if(starflag)
  372.     {
  373.              if(irtime>32)  //引導碼時間除以0.256,是31.多毫秒
  374.                   {
  375.                          bitnum=0; //此時確定接收到引導碼,清零變量,接收數據
  376.                   }
  377.                  irdata[bitnum]=irtime;        //將數據接收送入irdata
  378.                  irtime=0;                //每接收一位數據,清零一次,使下次接受的數據準確
  379.                  bitnum++;                //數組變量增加
  380.                  if(bitnum==33)        //當變量增加到33時,說明一幀數據接收完畢
  381.                   {
  382.                     bitnum=0;        //清零數組變量
  383.                         irreceok=1;        //接收完一幀數據標志位
  384.                         
  385.                   }
  386.     }
  387.   else
  388.     {
  389.           starflag=1;        //為接收一幀數據的第一位做準備
  390.           irtime=0;                //清零定時變量
  391.         }



  392.   
  393. }

  394. void time0() interrupt 1
  395. {
  396. irtime++;  //因為是模式2,那么變量每加一一次,就是定時了256um,也就是0.256毫秒
  397. }
  398. void time1() interrupt 3
  399. {
  400.           TH1=0x3C;
  401.           TL1=0xb0;            
  402.           ms++;         
  403.           key();           
  404.           ir_ok();
  405.           if(ms%10==0)        s0=~s0;
  406.           if(ms>=20)
  407.            { RH();
  408.              ms=0;
  409.                  if(sec!=0)sec--;
  410.                  if(sec1!=0)sec1--;
  411.            }
  412. }


  413. void uart () interrupt 4
  414. {
  415.         uchar temp_pM;
  416.         if(RI==1)
  417.         {
  418.                 RI=0;
  419.                 UART_Upload[accord]=SBUF; //串口接收一個數據
  420.                 accord++;
  421.                 if(UART_Upload[0]!=0xff)  //判斷接收到的第一個數據為oxff  數據錯誤 數組指針清零
  422.                 {
  423.                         accord=0;
  424.                 }
  425.                 if(UART_Upload[1]!=0x18)//判斷接收到的第2個為0x18  數據錯誤 數組指針清零
  426.                 {
  427.                         accord=0;
  428.                 }
  429.                 if(accord>8)                 //九個數據為一組
  430.                 {
  431.                         accord=0; //接收完一組數據的標志,置0 校驗         
  432.                 }               
  433.                 if(accord==0)                //接收一組數據后進行一次校驗和
  434.                 {                                         //校驗7為數據位的和取反加一等于校驗值
  435.                         if((UART_Upload[0]==0xff)&&(UART_Upload[1]=0x18)&&(UART_Upload[2]==0x00))//判斷前三位數據是否正確 是進行校驗
  436.                         {        
  437.                                 temp_pM=~(UART_Upload[1]+UART_Upload[2]+UART_Upload[3]+UART_Upload[4]+UART_Upload[5]+UART_Upload[6]+UART_Upload[7])+1;        //校驗和
  438.                                   if(temp_pM=UART_Upload[8])
  439.                                 {
  440.                                         pm_rateH=UART_Upload[3];
  441.                                         pm_rateL=UART_Upload[4];
  442.                                         pm_density=(UART_Upload[3]*100+UART_Upload[4])*1.014705; //濃度數據處理          數據擴大了十倍
  443.                                         /*我們繪出一個檢驗報告,比如在345ug/m3的情況下,zph01輸出占空比34%。我們理論認為在0-34%對應的0-345ug/m3。他們是 線性比例關系*/                        
  444.                                 }
  445.                         }
  446.         
  447.                 }

  448.         }
  449. }

復制代碼

全部程序51hei下載地址:
xtr.c.zip (35.08 KB, 下載次數: 143)



評分

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

查看全部評分

回復

使用道具 舉報

ID:832960 發表于 2020-10-22 23:24 | 顯示全部樓層
這個代碼的子程序不全,大佬能不能發個完整的代碼給我謝謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产伦精品一区二区三区精品视频 | 亚洲人成人一区二区在线观看 | 91九色porny首页最多播放 | 久久久久国产 | 免费黄色片在线观看 | 中文字幕在线观看一区 | 欧美男人亚洲天堂 | 天堂综合网久久 | 日日夜夜操天天干 | 日韩精品成人 | 日本xx视频免费观看 | 国产精品久久久久久亚洲调教 | 在线男人天堂 | 精品久久久久久久久久久下田 | 成人影院一区二区三区 | 美女在线国产 | 中文字幕一区二区三区精彩视频 | 亚洲视频精品在线 | 99精品国产一区二区青青牛奶 | 91伊人网 | 91在线视频播放 | 亚洲日本视频 | av大片在线 | 日本免费一区二区三区 | 91精品久久久久久久久久小网站 | 国产乱码精品1区2区3区 | 日本不卡一区二区三区在线观看 | 激情欧美一区二区三区中文字幕 | 久久99蜜桃综合影院免费观看 | 国产一区二区三区四区五区加勒比 | 日韩久草 | 欧美精品区 | 欧美日韩中文字幕在线 | 男女羞羞视频在线 | 亚洲成网站 | 精品国产乱码久久久久久果冻传媒 | 日韩中出 | 国产 欧美 日韩 一区 | 久视频在线观看 | 亚洲精品自拍视频 | 国产精品一区二区三区四区五区 |