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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

懶人專用智能房間控制器設計(單片機源碼+藍牙APP+原理圖PCB)

  [復制鏈接]
跳轉到指定樓層
樓主
作者:落葉風的作品
先看下硬件設計,使用的是單片機STC12C5A60S2,共有8路輸入,其中4路是隔離的,低電平為開,輸出也是8路,4個繼電器,4個可控硅,為了簡化可控硅的控制電路,采用5V的隔離電源隔開,有6個開關,開關1-5分別對應的4個可控硅及1個繼電器輸出,開關6是用于顯示翻頁及設置用,短按為翻頁,長按為進入當前頁的設置,再短按為改變設置項目,再長按為保存設置,開關5當處于設置時,就為調整參數,如不處于設置狀態時,為繼電器1控制。繼電器2設置有一組定時開關功能,是采用觸發方式的。顯示用0.96寸的OLED顯示器,溫度濕度用DHT11模塊。帶有無線遙控功能,控制開關1-4,由于是測試板,所以輸入輸出元件沒有裝齊,只裝部份進行測試,但單片機及手機軟件并沒偷工減料,所想到的都寫上去了,但由于沒實際環境中使用過,可能有BUG。

必須為開源者落葉風大神點贊,這技術絕對牛哄哄。

電路原理圖如下:


制作出來的pcb實物圖如下:


手機軟件方面,是第一次寫手機軟件,自己有用中文編程軟件易語言寫過小軟件,所以看了幾天易安卓的教程,就寫這手機軟件,由于還不熟悉這編程軟件,特別是它的數組操作搞不清楚,所以手機軟件源代碼上基本上是變量以文本型為主,軟件的基本功能齊全,有顯示控制窗口口、設置窗口及定時設置窗,能直接操作控制單片機的開關及參數的修改。
當手機軟件正常開啟后,會把手機當前時間發送個授時命令給單片機,根據單片機設置情況,進行授時操作。

OLED顯示屏用來顯示一些數據,和進行相關設置顯示。

藍牙轉串口模塊,是HC-06從機藍牙模塊,已用命令把它的波特率改為19200。采用引線引出來,方便測試。


315無線模塊


單片機源程序如下:
  1. //藍牙房間控制器
  2. //編寫時間為2015-6-2
  3. //時鐘用22.1M,cpu用STC12C5A60

  4. #include <STC12C5A60S2.h>
  5. #include <intrins.h>
  6. unsigned char oldkey,keyval,pagevol,bbtemp;
  7. unsigned int keyjixu ,jisu,tempxidu;
  8. bit BBkongvol,readtimekong,time05s,dingkong,timeauto,rscRSkong;
  9. unsigned char t_sec,t_min,t_hour,t_1224ji;
  10. unsigned char timetao,settao,RSzhuantai2,recRSjisu;
  11. unsigned char dingon_hour,dingon_min,dingoff_hour,dingoff_min;
  12. unsigned char recRSvol[6];
  13. extern void OLED_Init(void);
  14. extern void OLED_Clear(void);
  15. extern void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char no);
  16. extern void OLED_ShowString(unsigned char x,unsigned char y, unsigned char *p);
  17. extern void OLED_ShowChar(unsigned char x,unsigned char y,unsigned char chr);
  18. extern void OLED_32X16(unsigned char x,unsigned char y,unsigned char c);
  19. //外部引用DS1302子程序
  20. extern void write_time(unsigned char temp1,temp2);
  21. extern unsigned char read_time(unsigned char hangmu);
  22. extern void DS1302ini();
  23. sbit KEY1=P1^0;
  24. sbit KEY2=P1^1;
  25. sbit KEY3=P1^4;
  26. sbit KEY4=P1^5;
  27. sbit KEY5=P1^6;
  28. sbit KEY6=P1^7;
  29. sbit BB=P4^7;
  30. sbit OUT1=P2^7;
  31. sbit OUT2=P2^6;
  32. sbit OUT3=P2^5;
  33. sbit OUT4=P2^4;
  34. sbit OUT5=P2^3;
  35. sbit OUT6=P2^2;
  36. sbit OUT7=P2^1;
  37. sbit OUT8=P2^0;
  38. sbit DHT11DA=P3^6;
  39. void delay(unsigned int t) //長延時程序,延時t毫秒,STC 1T單片機11.0592M晶振I值為648,22.1I值為1298,12MI值為705。
  40. {
  41.          unsigned int i;
  42.          while(t--)
  43.            {
  44.                 for(i=1298;i>0;i--);
  45.            }
  46. }
  47.   
  48. void delay10us() //延時10us,STC 1T單片機11.0592M晶振J值為23,22。1MJ值為51。
  49. {

  50.    unsigned char j;
  51.    for(j=51;j>0;j--);
  52. }

  53. //======================EEPROW偏程==============================
  54. //寫字節時,可以將原有數據中的1改為0,無法將0改為1,只能使用擦除命令將0改為1
  55. //應注意,擦除命令會將整個扇區擦除
  56. //由于擦除會將整個扇區擦除,為了方便寫,所以這里用第二扇區存第一屏的狀態,
  57. //第三扇區存定時1的5個時間,每個時間有啟用、開時間、關時間、星期(8b)
  58. //第四扇區存定時6-10,第5扇區存溫度值,
  59. // 第二扇區地址0x0200-0x03ff,0x0400-0x05ff,0x0600-0x07ff,0x0800-0x09ff.
  60. void IAPIDLE()
  61. {
  62.     IAP_CMD = 0;      //關閉令,保護
  63.     IAP_CONTR = 0;    //關EEPROM,保護
  64.     IAP_TRIG = 0;
  65.     IAP_ADDRL = 0; //設置讀取地址的低字節,地址改變才需要設置
  66.     IAP_ADDRH = 0X80; //設置讀取地址的高字節,地址改變才需要設置
  67. }
  68. unsigned char readEEP(unsigned int adddata)
  69. {        //讀取
  70.         unsigned char eerdata;
  71.         IAP_CONTR=0X83;//設置等待時間,1MHz以下取7,2M以下取6,3M取5,6M取4,12M取3,20M取2,24M取1,30M取0,前導1表示許檔IAP
  72.         IAP_CMD = 1;      //讀取值1,寫取2,擦除取3,擦除時按所在字節整個扇區攛除
  73.         IAP_ADDRL = adddata;    //設置讀取地址的低字節,地址改變才需要設置
  74.     IAP_ADDRH = adddata>>8; //設置讀取地址的高字節,地址改變才需要設置
  75.         IAP_TRIG = 0x5A;  //先送5A
  76.     IAP_TRIG = 0xA5;  //先送5A再送A5立即觸發
  77.         _nop_();
  78.         eerdata=IAP_DATA;
  79.         IAPIDLE();
  80.         return eerdata;
  81. }
  82. void writeEEP(unsigned int adddata, unsigned char eerdata)
  83. {//寫入
  84.   IAP_CONTR=0X83;//設置等待時間,
  85.   IAP_CMD = 2;      //讀取值1,寫取2,擦除取3,擦除時按所在字節整個扇區攛除
  86.   IAP_ADDRL = adddata;    //設置讀取地址的低字節,地址改變才需要設置
  87.   IAP_ADDRH = adddata>>8; //設置讀取地址的高字節,地址改變才需要設置
  88.   IAP_DATA=        eerdata;//傳入數據
  89.   IAP_TRIG = 0x5A;  //先送5A
  90.   IAP_TRIG = 0xA5;  //先送5A再送A5立即觸發
  91.   _nop_();
  92.   IAPIDLE();
  93. }
  94. void eraseEEP(unsigned int adddata)
  95. { //擦除
  96.    IAP_CONTR=0X83;//設置等待時間,
  97.   IAP_CMD = 3;      //讀取值1,寫取2,擦除取3,擦除時按所在字節整個扇區攛除
  98.   IAP_ADDRL = adddata;    //設置讀取地址的低字節,地址改變才需要設置
  99.   IAP_ADDRH = adddata>>8; //設置讀取地址的高字節,地址改變才需要設置
  100.   IAP_TRIG = 0x5A;  //先送5A
  101.   IAP_TRIG = 0xA5;  //先送5A再送A5立即觸發
  102.   _nop_();
  103.   IAPIDLE();
  104. }
  105. void writeDAT()
  106. {
  107.         eraseEEP(0x0200);
  108. writeEEP(0x0200, dingkong);//定時狀態
  109. writeEEP(0x0201, dingon_hour); // 開時
  110. writeEEP(0x0202, dingon_min);//開分
  111. writeEEP(0x0203, dingoff_hour);//關時
  112. writeEEP(0x0204, dingoff_min);//關分
  113. writeEEP(0x0205, BBkongvol);//按鍵不發聲
  114. writeEEP(0x0206, timeauto);//自動校時
  115. }
  116. void timedisp()   //時間提取。這里只讀時分秒及星期,時采用24小時制。
  117. {
  118.   unsigned char        i,j,times,timeg;
  119.           i =read_time(0x84);//讀時,這里還要判斷是24小時制還是12小時制。
  120.      if(i>=0x80)
  121.                                   {           //12小時
  122.                                              //只是小時的數值是最后5位為小時值,所以時的取法先置高3位為0,再除法及求余法。
  123.                                          
  124.                                          times=(i&0x1f)/16;//取高4位的數值給十分。
  125.                                      timeg=i%16;//取低4位數值,把高4位置0。
  126.                                      t_hour=times*10+timeg;
  127.                                          j=i<<2;
  128.                                          if(j>=0x80)
  129.                                          {
  130.                        t_1224ji=1;//12小時制,0為24小時制。
  131.                        if(t_hour!=12){t_hour=t_hour+12;}//轉為24小時,方便計算。
  132.                                          }
  133.                                          else
  134.                                          {
  135.                                          t_1224ji=1;        //2為上午。
  136.                      if(t_hour==12)t_hour=0;//轉為24小時,方便計算。
  137.                                          }
  138.                                   }
  139.                                   else
  140.                                   {                //24小時
  141.                                          times=i/16;//取高4位的數值給十分。
  142.                                     timeg=i%16;//取低4位數值,把高4位置0。
  143.                                         t_hour=times*10+timeg;
  144.                                         t_1224ji=0;//24小時制

  145.                                   }

  146.   i=read_time(0x82);//讀分
  147.   times=i/16;
  148.   timeg=i%16;
  149.   t_min=times*10+timeg;
  150.   i =read_time(0x80);//讀秒
  151.   times=i/16;
  152.   timeg=i%16;
  153.   t_sec=times*10+timeg;//算出當前秒數。

  154. }
  155. void disppage0(bit xaxin)
  156. {//當為0時,全屏更新,為1只刷新部份
  157.         unsigned int kaka;
  158.         
  159.         if(xaxin==0)
  160.         {
  161.         OLED_Clear();
  162. //        藍牙房間控制
  163.         OLED_ShowCHinese(16,0,0);
  164.         OLED_ShowCHinese(32,0,1);
  165.         OLED_ShowCHinese(48,0,2);
  166.         OLED_ShowCHinese(64,0,3);
  167.         OLED_ShowCHinese(80,0,4);
  168.         OLED_ShowCHinese(96,0,5);
  169.         }
  170. //18:55:23 36C 75%
  171.         if(timetao==1&&time05s!=0)
  172.         {
  173.                 OLED_ShowChar(0,2,13);
  174.         OLED_ShowChar(8,2,13);
  175.         }
  176.         else
  177.         {
  178.   OLED_ShowChar(0,2,t_hour/10);
  179.         OLED_ShowChar(8,2,t_hour%10);
  180.         }
  181.         if(time05s!=0&&timetao==0)
  182.         {
  183.         OLED_ShowChar(16,2,13);
  184.                 OLED_ShowChar(40,2,13);
  185.         }
  186.         else
  187.         {
  188.                 OLED_ShowChar(16,2,10);
  189.                 OLED_ShowChar(40,2,10);
  190.         }
  191.         if(timetao==2&&time05s!=0)
  192.         {
  193.                 OLED_ShowChar(24,2,13);
  194.           OLED_ShowChar(32,2,13);
  195.         }
  196.         else
  197.         {
  198.         OLED_ShowChar(24,2,t_min/10);
  199.         OLED_ShowChar(32,2,t_min%10);
  200.         }
  201.         if(timetao==3&&time05s!=0)
  202.         {
  203.                 OLED_ShowChar(48,2,13);
  204.          OLED_ShowChar(56,2,13);
  205.         }
  206.         else
  207.         {
  208.         OLED_ShowChar(48,2,t_sec/10);
  209.         OLED_ShowChar(56,2,t_sec%10);
  210.         }
  211.         kaka=tempxidu%256;
  212.         OLED_ShowChar(72,2,kaka/10);
  213.         OLED_ShowChar(80,2,kaka%10);
  214.         OLED_ShowChar(88,2,11);
  215.         kaka=tempxidu/256;
  216.         OLED_ShowChar(104,2,kaka/10);
  217.         OLED_ShowChar(112,2,kaka%10);
  218.         OLED_ShowChar(120,2,12);
  219. //開關狀態        
  220. //讀P0值,低電平為開,
  221.         if((P0&0x01)==0)
  222.         {        
  223.          OLED_ShowCHinese(0,4,7);
  224.         }
  225.         else
  226.         {
  227.                 OLED_ShowCHinese(0,4,15);
  228.         }
  229.         if((P0&0x02)==0)
  230.         {
  231. OLED_ShowCHinese(16,4,8);
  232.         }
  233.         else
  234.         {
  235.                 OLED_ShowCHinese(16,4,16);
  236.         }
  237.         if((P0&0x04)==0)
  238.         {
  239. OLED_ShowCHinese(32,4,9);
  240.         }
  241.         else
  242.         {
  243.                 OLED_ShowCHinese(32,4,17);
  244.         }
  245.         if((P0&0x08)==0)
  246.         {
  247. OLED_ShowCHinese(48,4,10);
  248.         }
  249.         else
  250.         {
  251.                  OLED_ShowCHinese(48,4,18);
  252.         }
  253.         if((P0&0x10)==0)
  254.         {
  255. OLED_ShowCHinese(64,4,11);
  256.         }
  257.         else
  258.         {
  259.                 OLED_ShowCHinese(64,4,19);
  260.         }
  261.         if((P0&0x20)==0)
  262.         {
  263.                 OLED_ShowCHinese(80,4,12);
  264.         }
  265.         else
  266.         {
  267. OLED_ShowCHinese(80,4,20);
  268.         }
  269.         if((P0&0x40)==0)
  270.         {
  271. OLED_ShowCHinese(96,4,13);
  272.         }
  273.         else
  274.         {
  275.                  OLED_ShowCHinese(96,4,21);
  276.         }
  277.         if((P0&0x80)==0)
  278.         {
  279. OLED_ShowCHinese(112,4,14);
  280.         }
  281.         else
  282.         {
  283.                 OLED_ShowCHinese(112,4,22);
  284.         }
  285. //燈及插座工作狀態
  286. if(OUT1==0)
  287. {//低電平為開
  288. OLED_ShowCHinese(0,6,27);
  289. }
  290. else
  291. {
  292.          OLED_ShowCHinese(0,6,23);
  293. }
  294. if(OUT2==0)
  295. {//低電平為開
  296. OLED_ShowCHinese(16,6,28);
  297. }
  298. else
  299. {
  300.          OLED_ShowCHinese(16,6,24);
  301. }
  302. if(OUT3==0)
  303. {//低電平為開
  304. OLED_ShowCHinese(32,6,29);
  305. }
  306. else
  307. {
  308.          OLED_ShowCHinese(32,6,25);
  309. }
  310. if(OUT4==0)
  311. {//低電平為開
  312. OLED_ShowCHinese(48,6,30);
  313. }
  314. else
  315. {
  316.          OLED_ShowCHinese(48,6,26);
  317. }
  318. if(OUT5==0)
  319. {//低電平為開
  320. OLED_ShowCHinese(64,6,35);
  321. }
  322. else
  323. {
  324.          OLED_ShowCHinese(64,6,31);
  325. }
  326. if(OUT6==0)
  327. {//低電平為開
  328. OLED_ShowCHinese(80,6,36);
  329. }
  330. else
  331. {
  332.          OLED_ShowCHinese(80,6,32);
  333. }
  334. if(OUT7==0)
  335. {//低電平為開
  336.   OLED_ShowCHinese(96,6,37);
  337. }
  338. else
  339. {
  340.          OLED_ShowCHinese(96,6,33);
  341. }
  342. if(OUT8==0)
  343. {//低電平為開
  344. OLED_ShowCHinese(112,6,38);
  345. }
  346. else
  347. {
  348.          OLED_ShowCHinese(112,6,34);
  349. }
  350. }
  351. void disppage1(bit xaxin)
  352. {//當為0時,全屏更新,為1只刷新部份
  353.         if(xaxin==0)
  354.         {
  355.         OLED_Clear();
  356.         //插座2定時設置
  357.         OLED_ShowCHinese(0,0,41);
  358.         OLED_ShowCHinese(16,0,42);
  359.         OLED_ShowChar(32,0,2);
  360.         OLED_ShowCHinese(40,0,43);
  361.         OLED_ShowCHinese(56,0,44);
  362.         OLED_ShowCHinese(72,0,45);
  363.         OLED_ShowCHinese(88,0,46);
  364.    }
  365.         //選中  22:10-23:55
  366.          if(settao==1&&time05s!=0)
  367.          {
  368.           OLED_ShowCHinese(0,2,6);
  369.          }
  370.          else
  371.          {
  372.                  if(dingkong==0)
  373.                  {//當為0時不定時
  374.                  OLED_ShowCHinese(0,2,40);
  375.                  }
  376.                  else
  377.                  {
  378.                          OLED_ShowCHinese(0,2,39);
  379.                  }
  380.          }
  381.           if(settao==2&&time05s!=0)
  382.                 {
  383.            OLED_ShowChar(16,2,13);
  384.            OLED_ShowChar(24,2,13);
  385.                 }
  386.                 else
  387.                 {
  388.                  OLED_ShowChar(16,2,dingon_hour/10);
  389.            OLED_ShowChar(24,2,dingon_hour%10);
  390.                 }
  391.         OLED_ShowChar(32,2,10);
  392.         if(settao==3&&time05s!=0)
  393.         {
  394.   OLED_ShowChar(40,2,13);
  395.         OLED_ShowChar(48,2,13);
  396.         }
  397.   else
  398.   {        
  399.         OLED_ShowChar(40,2,dingon_min/10);
  400.         OLED_ShowChar(48,2,dingon_min%10);
  401.   }
  402.         OLED_ShowChar(56,2,14);
  403.         if(settao==4&&time05s!=0)
  404.         {
  405.   OLED_ShowChar(64,2,13);
  406.         OLED_ShowChar(72,2,13);
  407.         }
  408.   else
  409.   {        
  410.         OLED_ShowChar(64,2,dingoff_hour/10);
  411.         OLED_ShowChar(72,2,dingoff_hour%10);
  412.         }
  413.         OLED_ShowChar(80,2,10);
  414.         if(settao==5&&time05s!=0)
  415.         {
  416.   OLED_ShowChar(88,2,13);
  417.         OLED_ShowChar(96,2,13);
  418.         }
  419.   else
  420.   {        
  421.         OLED_ShowChar(88,2,dingoff_min/10);
  422.         OLED_ShowChar(96,2,dingoff_min%10);
  423.         }
  424.         
  425. //不選中 按鍵發聲
  426. if(settao==6&&time05s!=0)
  427.         {         
  428. OLED_ShowCHinese(0,4,6);
  429.         }
  430.         else
  431.         {
  432.                 if(BBkongvol==0)
  433.                 {
  434.                 OLED_ShowCHinese(0,4,40);
  435.                 }
  436.                 else
  437.                 {
  438.                         OLED_ShowCHinese(0,4,39);
  439.                 }
  440.         }
  441.          if(xaxin==0)
  442.          {
  443.         OLED_ShowCHinese(16,4,47);
  444. OLED_ShowCHinese(32,4,48);
  445. OLED_ShowCHinese(48,4,52);
  446. OLED_ShowCHinese(64,4,53);
  447. //OLED_ShowCHinese(80,4,53);
  448.          }
  449. //不選中 自動效時
  450. if(settao==7&&time05s!=0)
  451.         {         
  452. OLED_ShowCHinese(0,6,6);
  453.         }
  454.         else
  455.         {
  456.                 if(timeauto==0)
  457.                 {
  458.                 OLED_ShowCHinese(0,6,40);
  459.                 }
  460.                 else
  461.                 {
  462.                         OLED_ShowCHinese(0,6,39);
  463.                 }
  464.         }
  465.          if(xaxin==0)
  466.          {
  467.         OLED_ShowCHinese(16,6,49);
  468. OLED_ShowCHinese(32,6,50);
  469. OLED_ShowCHinese(48,6,54);
  470. OLED_ShowCHinese(64,6,55);
  471.          }
  472. }

  473. //***********************鍵盤掃描子程序。******************
  474. //*********************************************************
  475. unsigned char keyboard()//鍵盤掃描
  476. {
  477.       unsigned char keyboardj;
  478.      keyboardj=0;
  479.     if(KEY1==0)
  480.           {
  481.         delay(10);
  482.                   if(KEY1==0)
  483.                   {
  484.                           keyboardj=1;
  485.                   }
  486.       }
  487.     if(KEY2==0)
  488.            {
  489.         delay(10);
  490.                   if(KEY2==0)
  491.                   {
  492.                           keyboardj=2;
  493.                   }
  494.       }
  495.          if(KEY3==0)
  496.            {
  497.         delay(10);
  498.                   if(KEY3==0)
  499.                   {
  500.                           keyboardj=3;
  501.                   }
  502.       }
  503.            if(KEY4==0)
  504.           {
  505.         delay(10);
  506.                   if(KEY4==0)
  507.                   {
  508.                           keyboardj=4;
  509.                   }
  510.       }
  511.     if(KEY5==0)
  512.            {
  513.         delay(10);
  514.                   if(KEY5==0)
  515.                   {
  516.                           keyboardj=5;
  517.                   }
  518.       }
  519.          if(KEY6==0)
  520.            {
  521.         delay(10);
  522.                   if(KEY6==0)
  523.                   {
  524.                           keyboardj=6;
  525.                   }
  526.       }
  527.    return  keyboardj;
  528. }
  529. //************鍵盤控制子程序***************
  530. //K2短按為開電源,關機顯----,正常顯鉻鐵實際溫度,長按為調鉻鐵溫度,最后個C閃,表示調溫,再長按為存儲并退出調溫。
  531. //K3K1分別為向上向下,短按為慢速增加減少,長按為快速。調節范圍為200-480度。
  532. //******************************************
  533. void keydisphong()//主要功能是
  534. {
  535.    unsigned char keyyy;
  536.    keyyy=keyboard();
  537.   if (keyyy!=oldkey)
  538.         {
  539.                 if(keyyy==0)//
  540.       {        
  541.                                 if(keyjixu>0)
  542.                                 {
  543.                                         if(keyjixu<80)
  544.                                         {
  545.                                                 
  546.                                                 if(oldkey==6)
  547.                                                 {
  548.                                                         keyval=6;
  549.                                                 }
  550.                                                 if(oldkey==5)
  551.                                                 {
  552.                                                         keyval=5;
  553.                                                 }
  554.                                         }
  555.                                         else
  556.                                         {
  557.                                                 //keyval=11;
  558.                                                 keyjixu=0;
  559.                                         }
  560.                                 }
  561.                                 else
  562.                                 {
  563.                                         keyval=0;
  564.                                   keyjixu=0;
  565.                                 }
  566.                         }
  567.                 if(keyyy==1)
  568.                 {
  569.                         if(OUT1==0)
  570.                         {
  571.                                 OUT1=1;
  572.                         }
  573.                         else
  574.                         {
  575.                                 OUT1=0;
  576.                         }
  577.                         
  578.                 }
  579.                 if(keyyy==2)
  580.                 {
  581.                         if(OUT2==0)
  582.                         {
  583.                                 OUT2=1;
  584.                         }
  585.                         else
  586.                         {
  587.                                 OUT2=0;
  588.                         }
  589.                 }
  590.                 if(keyyy==3)
  591.                 {
  592.                         if(OUT3==0)
  593.                         {
  594.                                 OUT3=1;
  595.                         }
  596.                         else
  597.                         {
  598.                                 OUT3=0;
  599.                         }
  600.                 }
  601.                 if(keyyy==4)
  602.                 {
  603.                         if(OUT4==0)
  604.                         {
  605.                                 OUT4=1;
  606.                         }
  607.                         else
  608.                         {
  609.                                 OUT4=0;
  610.                         }
  611.                 }
  612.                 if(keyyy!=0)
  613.                 {        
  614.                         //刷新
  615.                         if(pagevol==0&&keyval!=6)disppage0(1);
  616.                         if(BBkongvol==1)
  617.                         {//當BB可以發聲,就
  618.                           BB=1;//發響聲。
  619.                     bbtemp=15;//
  620.                         }
  621.                 }
  622.         }
  623.   oldkey=keyyy;
  624.    if(keyyy==5)//
  625.       {
  626.                                 keyjixu++;
  627.                                 if(keyjixu>=80)
  628.                                 {
  629.                                         if((keyjixu%6)==0)
  630.                                         {
  631.                                         keyval=15;
  632.                                         }
  633.                                 }
  634.                         }        
  635.         if(keyyy==6)//
  636.       {
  637.                                 keyjixu++;
  638.                                 if(keyjixu==80)keyval=16;
  639.                         }
  640.                  
  641.          //鍵盤處理完成。
  642. //以下為功能子程序        
  643. if(keyval==5)
  644.                 {
  645.                  keyval=0;//這步必須的,清鍵值。
  646.                         keyjixu=0;//清計數值,這兩步是必要的。        
  647.     if(timetao==0&&settao==0)
  648.                         {
  649.                         //當不處于調整時,就控電器5
  650.                         if(OUT5==0)
  651.                         {
  652.                                 OUT5=1;
  653.                         }
  654.                         else
  655.                         {
  656.                                 OUT5=0;
  657.                         }
  658.                  }
  659.                  else
  660.                  {
  661.                         if(pagevol==0)
  662.                         {
  663.                                 if(timetao==1)
  664.                                 {//調時
  665.                                         t_hour++;
  666.                                         if(t_hour>23)t_hour=0;
  667.                                         OLED_ShowChar(0,2,t_hour/10);
  668.                 OLED_ShowChar(8,2,t_hour%10);
  669.                                 }
  670.                                 if(timetao==2)
  671.                                 {//調分
  672.                                         t_min++;
  673.                                         if(t_min>59)t_min=0;
  674.                                         OLED_ShowChar(24,2,t_min/10);
  675.                 OLED_ShowChar(32,2,t_min%10);
  676.                                 }
  677.                                 if(timetao==3)
  678.                                 {//調秒
  679.                                         t_sec++;
  680.                                         if(t_sec>59)t_sec=0;
  681.                                         OLED_ShowChar(48,2,t_sec/10);
  682.                 OLED_ShowChar(56,2,t_sec%10);
  683.                                 }
  684.                                 
  685.                         }
  686.                         else
  687.                         {
  688.                                 if(settao==1)
  689.                                 {//調定時
  690.                                         if(dingkong==0)
  691.                                         {
  692.                                                 dingkong=1;
  693.                                         }
  694.                                         else
  695.                                         {
  696.                                                 dingkong=0;
  697.                                         }
  698.                                 }
  699.                                 if(settao==2)
  700.                                 {//調開時
  701.                                         dingon_hour++;
  702.                                         if(dingon_hour>23)dingon_hour=0;
  703.                                         OLED_ShowChar(16,2,dingon_hour/10);
  704.                OLED_ShowChar(24,2,dingon_hour%10);
  705.                                 }
  706.                                 if(settao==3)
  707.                                 {//調開分
  708.                                         dingon_min++;
  709.                                         if(dingon_min>59)dingon_min=0;
  710.                                         OLED_ShowChar(40,2,dingon_min/10);
  711.                 OLED_ShowChar(48,2,dingon_min%10);
  712.                                 }
  713.                                 if(settao==4)
  714.                                 {//調關時
  715.                                         dingoff_hour++;
  716.                                         if(dingoff_hour>23)dingoff_hour=0;
  717.                                         OLED_ShowChar(64,2,dingoff_hour/10);
  718.                OLED_ShowChar(72,2,dingoff_hour%10);
  719.                                 }
  720.                                 if(settao==5)
  721.                                 {//調關分
  722.                                         dingoff_min++;
  723.                                         if(dingoff_min>59)dingoff_min=0;
  724.                                         OLED_ShowChar(88,2,dingoff_min/10);
  725.                 OLED_ShowChar(96,2,dingoff_min%10);
  726.                                 }
  727.                                 if(settao==6)
  728.                                 {//調發聲
  729.                                         if(BBkongvol==0)
  730.                                         {
  731.                                                 BBkongvol=1;
  732.                                         }
  733.                                         else
  734.                                         {
  735.                                                 BBkongvol=0;
  736.                                         }
  737.                                 }
  738.                                 if(settao==7)
  739.                                 {//調自動校時
  740.                                         if(timeauto==0)
  741.                                         {
  742.                                                 timeauto=1;
  743.                                         }
  744.                                         else
  745.                                         {
  746.                                                 timeauto=0;
  747.                                         }
  748.                                 }
  749.                         }
  750.                         
  751.                  }
  752.                 }                        
  753.                 if(keyval==6)
  754.                 {
  755.                  keyval=0;//這步必須的,清鍵值。
  756.                         keyjixu=0;//清計數值,這兩步是必要的。
  757.                         if(timetao==0&&settao==0)
  758.                         {
  759.                         if(pagevol==0)
  760.                         {
  761.                                 pagevol=1;
  762.                                 disppage1(0);
  763.                         }
  764.                         else
  765.                         {
  766.                                 pagevol=0;
  767.                                 disppage0(0);
  768.                         }
  769.                  }
  770.                  else
  771.                  {
  772.                          if(pagevol==0)
  773.                          {
  774.                                  timetao++;
  775.                                  if(timetao==4)
  776.                                  {
  777.                                          timetao=1;
  778.                                          
  779.                                  }
  780.                    }
  781.                          else
  782.                          {
  783.                                  settao++;
  784.                                  if(settao==8)
  785.                                  {
  786.                                          settao=1;
  787.                                        
  788.                                  }
  789.                          }
  790.                  }
  791.                 }        
  792.                         if(keyval==15)
  793.                 {
  794.                  keyval=0;//這步必須的,清鍵值。
  795.                         //keyjixu=0;//清計數值,這兩步是必要的。
  796.                         if(pagevol==0)
  797.                         {
  798.                                 if(timetao==1)
  799.                                 {//調時
  800.                                         t_hour++;
  801.                                         if(t_hour>23)t_hour=0;
  802.                                         OLED_ShowChar(0,2,t_hour/10);
  803.                 OLED_ShowChar(8,2,t_hour%10);
  804.                                 }
  805.                                 if(timetao==2)
  806.                                 {//調分
  807.                                         t_min++;
  808.                                         if(t_min>59)t_min=0;
  809.                                         OLED_ShowChar(24,2,t_min/10);
  810.                 OLED_ShowChar(32,2,t_min%10);
  811.                                 }
  812.                                 if(timetao==3)
  813.                                 {//調秒
  814.                                         t_sec++;
  815.                                         if(t_sec>59)t_sec=0;
  816.                                         OLED_ShowChar(48,2,t_sec/10);
  817.                 OLED_ShowChar(56,2,t_sec%10);
  818.                                 }
  819.                                 
  820.                         }
  821.                         else
  822.                         {
  823.                                 if(settao==2)
  824.                                 {//調開時
  825.                                         dingon_hour++;
  826.                                         if(dingon_hour>23)dingon_hour=0;
  827.                                         OLED_ShowChar(16,2,dingon_hour/10);
  828.                OLED_ShowChar(24,2,dingon_hour%10);
  829.                                 }
  830.                                 if(settao==3)
  831.                                 {//調開分
  832.                                         dingon_min++;
  833.                                         if(dingon_min>59)dingon_min=0;
  834.                                         OLED_ShowChar(40,2,dingon_min/10);
  835.                 OLED_ShowChar(48,2,dingon_min%10);
  836.                                 }
  837.                                 if(settao==4)
  838.                                 {//調關時
  839.                                         dingoff_hour++;
  840.                                         if(dingoff_hour>23)dingoff_hour=0;
  841.                                         OLED_ShowChar(64,2,dingoff_hour/10);
  842.                OLED_ShowChar(72,2,dingoff_hour%10);
  843.                                 }
  844.                                 if(settao==5)
  845.                                 {//調關分
  846.                                         dingoff_min++;
  847.                                         if(dingoff_min>59)dingoff_min=0;
  848.                                         OLED_ShowChar(88,2,dingoff_min/10);
  849.                 OLED_ShowChar(96,2,dingoff_min%10);
  850.                                 }
  851.                                 
  852.                         }
  853.                 }
  854.                 if(keyval==16)
  855.                 {//長按進入設置及退出設置
  856.                  keyval=0;//這步必須的,清鍵值。
  857.                         //keyjixu=0;//清計數值,這兩步是必要的。
  858.                         if(pagevol==0)
  859.                         {
  860.                                 if(timetao==0)
  861.                                 {
  862.                            timetao=1;
  863.                                 }
  864.                                 else
  865.                                 {//保存數據
  866.                                         timetao=0;
  867.                                         write_time(0X84,(t_hour/10)*16+t_hour%10);//時
  868.                                         write_time(0X82,(t_min/10)*16+t_min%10);//寫分
  869.                                         write_time(0X80,(t_sec/10)*16+t_sec%10);//寫秒
  870.                                 }
  871.                         }
  872.                         else
  873.                         {
  874.                                 if(settao==0)
  875.                                 {
  876.                          settao=1;
  877.                                 }
  878.                                 else
  879.                                 {//保存數據
  880.                                         settao=0;
  881.                                         writeDAT();
  882.                                 }
  883.                         }
  884.                 }
  885.                
  886. }

  887. void dingtimekong()
  888. {//定時控制,采用觸發式。每0.5S比較一次
  889.         if(dingkong==1)
  890.         {
  891.            if(dingon_hour==t_hour&&dingon_min==t_min)OUT6=0;
  892.                  if(dingoff_hour==t_hour&&dingoff_min==t_min)OUT6=1;
  893.         }
  894. }

  895. unsigned char DHT11readbit()
  896. {
  897.   unsigned char i,temp,dataDHT,caoxi;
  898.   for(i=0;i<8;i++)           
  899.         {
  900.          //數據時序先低電平50us,再高電平,當26-28us為0、70us為1。        
  901.          caoxi=2;
  902.          while((!DHT11DA)&&caoxi++);//檢測50us低電平是否過去。
  903.          delay10us();delay10us();delay10us();//延時30us,再判斷,如還是高電平就數據為1,如低電平為0。         
  904.          temp=0;   //先置0
  905.          if(DHT11DA)temp=1;        //超過30us還是高電平的就置1。         
  906.          caoxi=2;
  907.          while((DHT11DA)&&caoxi++);//如還是高電平就等它為低電平,如超時就跳出循環.         
  908.          //超時則跳出for循環                  
  909.          if(caoxi==1)break;
  910.                    //合成數據
  911.           dataDHT<<=1;
  912.           dataDHT|=temp;           
  913.    }
  914.    return(dataDHT);
  915. }
  916. unsigned int DHT11read() //由于返回的溫度及濕度只有2個8b,所以用個16b的來存貯,前8位為濕度,后8位為溫度。
  917. {
  918.   unsigned char temp1,temp2,temp3,temp4,temp5,caoxi;
  919.   unsigned int DHTdata ;
  920.   //主機拉低大于18ms
  921.   DHT11DA=0;
  922.   delay(20);
  923.   DHT11DA=1;
  924.   //主機放開總線,由上拉電阻拉高 主機延時20us-40us.
  925.   delay10us();delay10us();delay10us();delay10us();
  926.   //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下讀數。
  927.   if(DHT11DA==0)
  928.     {
  929.           caoxi=2;//初始化超時值,對于22M晶振為175us,主要是防止DHT不動作引起程序進入死循環,超時就跳出來。
  930.           while((!DHT11DA)&&caoxi++);
  931.          //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
  932.           caoxi=2;
  933.           while((DHT11DA)&&caoxi++);         
  934.          //數據接收狀態                           
  935.           temp1=DHT11readbit();         
  936.           temp2=DHT11readbit();         
  937.           temp3=DHT11readbit();         
  938.           temp4=DHT11readbit();         
  939.           temp5=DHT11readbit();
  940.          //數據校驗
  941.           DHT11DA=1;
  942.           if(temp5=(temp1+temp2+temp3+temp4)) //如校對正確就組合數據,并返回。
  943.             {
  944.                  DHTdata=temp1*256+temp3;
  945.                 }
  946.                 else
  947.                 {
  948.                  DHTdata=0;//當數據不正確時,就送0值,當然這一步看情況來決定是否用它。
  949.                 }
  950.         }
  951.    return(DHTdata); //返回數據

  952. }
  953. void rs2232tx(unsigned char txdata)//串口2發送程序
  954. {         
  955. S2BUF=txdata;//把數據傳給串口寄存器SBUF。
  956. while(!(S2CON & 0x02));//檢測是否發完。
  957. //S2TI=0;//重置初值。
  958.         S2CON=S2CON & 0xfd;
  959. }
  960. void senddata()
  961. {//串口數據發送,命令格式EF,EE,P0(低7位開關狀態),P2(低7位輸出狀態),P0P2第8位(主要是防止與引導碼沖突),溫度,濕度,定時狀態,開時,開分,關時,關分,FF 不進行校驗數據。
  962.         //為方便手機編程,傳送的數據用BCD碼
  963.         unsigned char kkkkk,hhhh;
  964.         rs2232tx(0xef);
  965.         rs2232tx(0xee);
  966.         rs2232tx(P0&0x7f);
  967.         rs2232tx(P2&0x7f);
  968.         kkkkk=0;
  969.         if((P0&0x80)!=0)
  970.         {
  971.                 kkkkk=kkkkk+2;
  972.         }
  973.         if((P2&0x80)!=0)
  974.         {
  975.                 kkkkk=kkkkk+1;
  976.         }
  977.         rs2232tx(kkkkk);
  978.         kkkkk=tempxidu%256;
  979.         hhhh=(kkkkk/10)*16+kkkkk%10;
  980.         rs2232tx(hhhh);
  981.         kkkkk=tempxidu/256;
  982.         hhhh=(kkkkk/10)*16+kkkkk%10;
  983.         rs2232tx(hhhh);
  984.         rs2232tx(dingkong);
  985.         kkkkk=dingon_hour;
  986.         hhhh=(kkkkk/10)*16+kkkkk%10;
  987.         rs2232tx(hhhh);
  988.         kkkkk=dingon_min;
  989.         hhhh=(kkkkk/10)*16+kkkkk%10;
  990.         rs2232tx(hhhh);
  991.         kkkkk=dingoff_hour;
  992.         hhhh=(kkkkk/10)*16+kkkkk%10;
  993.         rs2232tx(hhhh);
  994.         kkkkk=dingoff_min;
  995.         hhhh=(kkkkk/10)*16+kkkkk%10;
  996.         rs2232tx(hhhh);
  997.         rs2232tx(0xff);
  998. }
  999. void rscRSkongji()
  1000. {//串口數據接收后處理子程序
  1001.         //開關控制 命令 01 受控值,00,00,00,00
  1002.         //校時控制 命令 02  時 分 秒 00 00
  1003.         //定時控制 命令 03 受控值 開時 開分 關時 關分
  1004.         if(rscRSkong==1)
  1005.         {//收到處理的數據
  1006.                
  1007.                 switch(recRSvol[0])
  1008.                 {
  1009.                         case 1:     
  1010.                                 if((recRSvol[1]&0x01)!=0)
  1011.                                 {//當手機開關1按下
  1012.                                         if(OUT1==0)
  1013.                                         {
  1014.                                         OUT1=1;
  1015.                                   }
  1016.                                         else
  1017.                                         {
  1018.                                                 OUT1=0;
  1019.                                         }
  1020.                                 }
  1021.                                 if((recRSvol[1]&0x02)!=0)
  1022.                                 {//當手機開關1按下
  1023.                                         if(OUT2==0)
  1024.                                         {
  1025.                                         OUT2=1;
  1026.                                   }
  1027.                                         else
  1028.                                         {
  1029.                                                 OUT2=0;
  1030.                                         }
  1031.                                 }
  1032.        if((recRSvol[1]&0x04)!=0)
  1033.                                 {//當手機開關1按下
  1034.                                         if(OUT3==0)
  1035.                                         {
  1036.                                         OUT3=1;
  1037.                                   }
  1038.                                         else
  1039.                                         {
  1040.                                                 OUT3=0;
  1041.                                         }
  1042.                                 }
  1043.        if((recRSvol[1]&0x08)!=0)
  1044.                                 {//當手機開關1按下
  1045.                                         if(OUT4==0)
  1046.                                         {
  1047.                                         OUT4=1;
  1048.                                   }
  1049.                                         else
  1050.                                         {
  1051.                                                 OUT4=0;
  1052.                                         }
  1053.                                 }
  1054.        if((recRSvol[1]&0x10)!=0)
  1055.                                 {//當手機開關1按下
  1056.                                         if(OUT5==0)
  1057.                                         {
  1058.                                         OUT5=1;
  1059.                                   }
  1060.                                         else
  1061.                                         {
  1062.                                                 OUT5=0;
  1063.                                         }
  1064.                                 }
  1065.        if((recRSvol[1]&0x20)!=0)
  1066.                                 {//當手機開關1按下
  1067.                                         if(OUT6==0)
  1068.                                         {
  1069.                                         OUT6=1;
  1070.                                   }
  1071.                                         else
  1072.                                         {
  1073.                                                 OUT6=0;
  1074.                                         }
  1075.                                 }
  1076.       if((recRSvol[1]&0x40)!=0)
  1077.                                 {//當手機開關1按下
  1078.                                         if(OUT7==0)
  1079.                                         {
  1080.                                         OUT7=1;
  1081.                                   }
  1082.                                         else
  1083.                                         {
  1084.                                                 OUT7=0;
  1085.                                         }
  1086.                                 }
  1087.        if((recRSvol[1]&0x80)!=0)
  1088.                                 {//當手機開關1按下
  1089.                                         if(OUT8==0)
  1090.                                         {
  1091.                                         OUT8=1;
  1092.                                   }
  1093.                                         else
  1094.                                         {
  1095.                                                 OUT8=0;
  1096.                                         }
  1097.                                 }                                
  1098.                                 break;
  1099.                         case 2:
  1100.                                 //手機自動校時,當手機建立連接時,如需自動校時,就啟用。這是在串口中斷程序內執行。
  1101.                                 if(timeauto==1)
  1102.                                 {
  1103.           write_time(0X84,(recRSvol[1]/10)*16+recRSvol[1]%10);//時
  1104.                                         write_time(0X82,(recRSvol[2]/10)*16+recRSvol[2]%10);//寫分
  1105.                                         write_time(0X80,(recRSvol[3]/10)*16+recRSvol[3]%10);//寫秒                                                
  1106.                                 }
  1107.                                 break;
  1108.                         case 3: //需BCD碼轉16進
  1109.                                  dingkong=recRSvol[1];
  1110.                            dingon_hour=(recRSvol[2]/16)*10+recRSvol[2]%16;
  1111.                            dingon_min=(recRSvol[3]/16)*10+recRSvol[3]%16;
  1112.                            dingoff_hour=(recRSvol[4]/16)*10+recRSvol[4]%16;
  1113.                            dingoff_min=(recRSvol[5]/16)*10+recRSvol[5]%16;
  1114.                             writeDAT();
  1115.                                 break;
  1116.                          default:   break;
  1117.                 }
  1118.                
  1119.                 rscRSkong=0;
  1120.         }
  1121.         
  1122. }
  1123. void sysintEEP()
  1124. {
  1125.         dingkong=readEEP(0x0200);//定時狀態
  1126.         dingon_hour=readEEP(0x0201); // 開時
  1127.         
  1128. ……………………

  1129. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


所有資料51hei提供下載:
藍牙手機控制的懶人專用智能房間控制器設計資料.rar (1.11 MB, 下載次數: 249)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:89072 發表于 2018-9-2 18:44 | 只看該作者
很實用,wifi模塊還沒搞明白,謝謝樓主
回復

使用道具 舉報

板凳
ID:104477 發表于 2018-9-8 19:29 來自手機 | 只看該作者
藍牙有源碼嗎
回復

使用道具 舉報

地板
ID:459616 發表于 2019-1-1 22:37 | 只看該作者
謝謝樓主,學習了
回復

使用道具 舉報

5#
ID:238191 發表于 2019-7-27 15:41 | 只看該作者

文件里有APP的
回復

使用道具 舉報

6#
ID:400515 發表于 2019-10-24 16:03 | 只看該作者
來學習了
回復

使用道具 舉報

7#
ID:440637 發表于 2019-11-13 17:07 | 只看該作者
有APP嗎?
回復

使用道具 舉報

8#
ID:250820 發表于 2020-3-4 21:56 | 只看該作者

謝謝樓主,學習了
回復

使用道具 舉報

9#
ID:517951 發表于 2020-11-15 16:29 | 只看該作者
不錯,值得學習。51hei有你更精彩!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av特级毛片 | 亚洲欧美一区二区三区国产精品 | 中文字幕在线视频一区二区三区 | 亚洲成av片人久久久 | 国产精品99久久久久久宅男 | 国产精品成人一区二区三区吃奶 | 91av视频 | 国产精品综合视频 | 午夜精品视频 | 一级在线观看 | 成年人免费在线视频 | 国产一区二区精品在线观看 | 亚洲国产精品成人综合久久久 | 亚洲欧美中文日韩在线v日本 | 91精品久久久 | 国产99视频精品免费播放照片 | 国产91丝袜在线18 | 国产在线观看一区 | 操操网站 | 国产精品久久久久久久 | 一区二区三区视频在线观看 | 91久操视频 | 欧美激情久久久 | 另类视频区| 激情av网站| 日韩视频中文字幕 | 成人午夜免费视频 | 9久久| 免费看a | 天天干天天操天天射 | 电影在线| 中文字幕日韩欧美 | 国产一级一片免费播放 | 欧美综合在线观看 | 日韩免费网站 | xxxxxx国产 | 亚洲成人免费电影 | 国产一区二区三区网站 | 国产精品久久久精品 | 欧美日韩一区精品 | 国产高清av免费观看 |