標(biāo)題: 基于51單片機(jī)紅外遙控定時(shí)開(kāi)關(guān)智能家電插座源碼設(shè)計(jì) [打印本頁(yè)]

作者: luyang12138    時(shí)間: 2018-5-1 20:43
標(biāo)題: 基于51單片機(jī)紅外遙控定時(shí)開(kāi)關(guān)智能家電插座源碼設(shè)計(jì)
本設(shè)計(jì)主要是解決普通家電的智能化控制,主要描述一個(gè)遙控定時(shí)插座的設(shè)計(jì)與制作。該定時(shí)插座可以彌補(bǔ)現(xiàn)實(shí)生活中普通插座功能的不足,能夠通過(guò)外設(shè)按鍵或遙控器設(shè)置插座的供電時(shí)間,使外接電器可以按照一定規(guī)律工作,既可以達(dá)到智能控制的目的,又在很大程度上起到節(jié)能的作用。

本系統(tǒng)由STC8C52單片機(jī)電路+時(shí)鐘DS1302電路+LCD1602液晶顯示電路+按鍵電路+繼電器控制電路+蜂鳴器報(bào)警電路+紅外傳感器電路+電源電路組成。
1、DS1302時(shí)鐘芯片,準(zhǔn)確計(jì)時(shí),自帶3V紐扣電池,當(dāng)系統(tǒng)掉電后,紐扣電池供電給時(shí)鐘芯片繼續(xù)工作,再次上電無(wú)需重新設(shè)置時(shí)間。
2、LCD1602液晶可以顯示時(shí)、分、秒、星期、年、月、日。
3、可以設(shè)置5個(gè)開(kāi)關(guān)開(kāi)的時(shí)間和5個(gè)開(kāi)關(guān)關(guān)的時(shí)間,每一個(gè)時(shí)間都可以單獨(dú)設(shè)置成是否工作有效(Y/N),設(shè)定的時(shí)間并具有掉電保存功能,保存在STC單片機(jī)的內(nèi)部,上電無(wú)需重新設(shè)置。
4、繼電器吸合指示燈亮實(shí)現(xiàn)開(kāi)關(guān)開(kāi),繼電器斷開(kāi)指示燈滅實(shí)現(xiàn)開(kāi)關(guān)關(guān),繼電器可以外接其他的家用電器。
5、具有自動(dòng)模式和手動(dòng)模式,手動(dòng)模式下按加、減鍵就可以實(shí)現(xiàn)開(kāi)關(guān)的開(kāi)和關(guān)。
6、開(kāi)機(jī)默認(rèn)是自動(dòng)模式,當(dāng)現(xiàn)在的時(shí)間和設(shè)置開(kāi)的時(shí)間一致時(shí),繼電器工作打開(kāi)開(kāi)關(guān),當(dāng)現(xiàn)在的時(shí)候和設(shè)置關(guān)的時(shí)間一致時(shí)繼電器斷開(kāi)關(guān)閉開(kāi)關(guān)。
7、開(kāi)關(guān)的開(kāi)和關(guān)蜂鳴器的提示聲不同,當(dāng)開(kāi)關(guān)開(kāi)時(shí),蜂鳴器會(huì)發(fā)出滴滴的提示聲,開(kāi)關(guān)關(guān)時(shí),蜂鳴器會(huì)長(zhǎng)鳴一聲。
8、具有紅外遙控功能,可以用紅外遙控器完成整個(gè)產(chǎn)品的操作!皘<<”標(biāo)識(shí)手動(dòng)或切換,“>>|”表示設(shè)置或換頁(yè),“—”表示手動(dòng)情況關(guān)閉或設(shè)置值--,“+”表示手動(dòng)情況打開(kāi)或設(shè)置值++。

源程序(C語(yǔ)言含詳細(xì)備注)單片機(jī)源程序如下:
  1. #include <reg52.h>                 //調(diào)用單片機(jī)頭文件
  2. #define uchar unsigned char  //無(wú)符號(hào)字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無(wú)符號(hào)整型 宏定義        變量范圍0~65535

  4. bit flag_200ms ;          //200ms標(biāo)志
  5. bit flag_100ms ;          //100ms標(biāo)志
  6. sbit beep = P3^7;          //蜂鳴器定義
  7. bit flag_beep_en;          //蜂鳴器使能標(biāo)志
  8. uint clock_value;     //用作鬧鐘用的

  9. uchar menu_1,menu_2;  //菜單選項(xiàng)

  10. sbit relay = P2^0;//繼電器
  11. bit flag_moshi;

  12. sbit IR=P3^2;  //紅外接口標(biāo)志

  13. uchar key_time,flag_value;      //用做連加的中間變量
  14. bit key_500ms  ;

  15. void Ircordpro(void);//紅外碼值處理函數(shù)
  16. unsigned char  irtime;//紅外用全局變量
  17. bit irpro_ok,irok;
  18. unsigned char IRcord[4];
  19. unsigned char irdata[33];

  20. //#include "key.h"
  21. #include "ds1302.h"
  22. #include "lcd1602.h"

  23. bit open1,open2,open3,open4,open5,open6,open7,open8,open9,open10,open11,open12;
  24. uchar fen1=0x30,shi1=0x06;          //第1個(gè)開(kāi)關(guān)的時(shí)間                 開(kāi)
  25. uchar fen2=0x30,shi2=0x07;          //第2個(gè)開(kāi)關(guān)的時(shí)間                 閉
  26. uchar fen3=0x10,shi3=0x08;          //第3個(gè)開(kāi)關(guān)的時(shí)間                       
  27. uchar fen4=0x20,shi4=0x08;          //第4個(gè)開(kāi)關(guān)的時(shí)間                 
  28. uchar fen5=0x00,shi5=0x09;          //第5個(gè)開(kāi)關(guān)的時(shí)間         
  29. uchar fen6=0x10,shi6=0x09;          //第6個(gè)開(kāi)關(guān)的時(shí)間          
  30. uchar fen7=0x50,shi7=0x09;          //第7個(gè)開(kāi)關(guān)的時(shí)間               
  31. uchar fen8=0x00,shi8=0x10;          //第8個(gè)開(kāi)關(guān)的時(shí)間                  
  32. uchar fen9=0x40,shi9=0x10;          //第9個(gè)開(kāi)關(guān)的時(shí)間                  
  33. uchar fen10=0x50,shi10=0x10;          //第10個(gè)開(kāi)關(guān)的時(shí)間   

  34. /******************1ms 延時(shí)函數(shù)*******************/
  35. void delay_1ms(uint q)
  36. {
  37.         uint i,j;
  38.         for(i=0;i<q;i++)
  39.                 for(j=0;j<120;j++);
  40. }

  41. /*************定時(shí)器0初始化程序***************/
  42. void init_1602_ds1302()
  43. {
  44.         write_sfm2_ds1302(2,3,nian);       
  45.         write_sfm2_ds1302(2,6,yue);       
  46.         write_sfm2_ds1302(2,9,ri);       
  47.         write_sfm2_ds1302(1,2,shi);       
  48.         write_sfm2_ds1302(1,5,fen);       
  49.         write_sfm2_ds1302(1,8,miao);
  50.         write_sfm1(1,14,week);               
  51. }                                                                          


  52. /*************開(kāi)關(guān)函數(shù)***************/
  53. void menu_dis()
  54. {
  55.        
  56.         if(miao == 0)
  57.         {
  58.                 if(((fen == fen1) && (shi == shi1) && (open1 == 1)) ||       
  59.                    ((fen == fen3) && (shi == shi3) && (open3 == 1)) ||
  60.                    ((fen == fen5) && (shi == shi5) && (open5 == 1)) ||
  61.                    ((fen == fen7) && (shi == shi7) && (open7 == 1)) ||
  62.                    ((fen == fen9) && (shi == shi9) && (open9 == 1)))
  63.                    {                         //打開(kāi)開(kāi)關(guān)
  64.                                    relay = 0;
  65.                                 for(i=0;i<4;i++)
  66.                                 {
  67.                                            beep = ~beep;
  68.                                         delay_1ms(200);
  69.                                 }
  70.                                 beep = 1;
  71.                    }

  72.                 if(((fen == fen2) && (shi == shi2) && (open2 == 1)) ||       
  73.                    ((fen == fen4) && (shi == shi4) && (open4 == 1)) ||
  74.                    ((fen == fen6) && (shi == shi6) && (open6 == 1)) ||
  75.                    ((fen == fen8) && (shi == shi8) && (open8 == 1)) ||
  76.                    ((fen == fen10) && (shi == shi10) && (open10 == 1)))
  77.                    {                         //關(guān)閉開(kāi)關(guān)
  78.                                    relay = 1;
  79.                                 beep = 0;
  80.                                 delay_1ms(1000);
  81.                                 beep = 1;
  82.                    }
  83.         }
  84. }


  85. /********************獨(dú)立按鍵程序*****************/
  86. uchar key_can;         //按鍵值

  87. void key()         //獨(dú)立按鍵程序
  88. {
  89.         static uchar key_new;

  90.         if((P3 & 0x78) != 0x78)                //按鍵按下,
  91.         {
  92.                 delay_1ms(1);                     //按鍵消抖動(dòng)
  93.                 if(((P3 & 0x78) != 0x78) && (key_new == 1))
  94.                 {                                                //確認(rèn)是按鍵按下
  95.                         key_new = 0;
  96.                         switch(P3 & 0x78)
  97.                         {
  98.                                 case 0x70:  key_can = 4;  break;         //得到按鍵值
  99.                                 case 0x68:  key_can = 3;  break;         //得到按鍵值
  100.                                 case 0x58:  key_can = 2;  break;         //得到按鍵值
  101.                                 case 0x38:  key_can = 1;  break;         //得到按鍵值
  102.                         }
  103.                 }
  104.         }
  105.         else
  106.                 key_new = 1;       
  107. }


  108. /**********************設(shè)置函數(shù)************************/
  109. void key_with()
  110. {
  111.         if(menu_1 == 0)
  112.         {
  113.                 if(key_can == 2)  
  114.                 {
  115.                         flag_moshi = !flag_moshi;
  116.                         if(flag_moshi == 0)                 //自動(dòng)模式
  117.                                 write_string(2,13,"   ");       
  118.                         if(flag_moshi == 1)                 //手動(dòng)模式
  119.                                 write_string(2,13,"sd ");       
  120.                 }
  121.                 if(flag_moshi == 1)
  122.                 {
  123.                         if(key_can == 3)
  124.                                 relay  = 0;          //開(kāi)
  125.                         if(key_can == 4)
  126.                                 relay = 1;    //關(guān)
  127.                 }                       
  128.         }
  129.         if(key_can == 1)        //設(shè)置鍵
  130.         {
  131.                 menu_1++;
  132.                 if(menu_1 == 1)          //設(shè)置時(shí)間
  133.                 {
  134.                         menu_2 = 1;
  135.                         write_string(1,0,"    :  :    W:  ");                       
  136.                         write_string(2,0," 20  -  -       ");       
  137.                 }
  138.                 menu_2 = 1;
  139.                 if(menu_1 > 6)    //回到正常顯示
  140.                 {
  141.                         menu_1 = 0;
  142.                         write_guanbiao(1,2,0);          //關(guān)閉光標(biāo)
  143.                         init_1602_dis_csf();      //初始化液晶顯示               
  144.                 }
  145.         }
  146.         if(key_can == 2)        //選擇鍵
  147.         {
  148.                 flag_200ms = 1;
  149.                 if(menu_1 == 1)                  //設(shè)置時(shí)間
  150.                 {
  151.                         menu_2 ++;
  152.                         if(menu_2 > 7)
  153.                                 menu_2 = 1;
  154.                 }
  155.                 if(menu_1 != 1)                 //設(shè)置
  156.                 {
  157.                         menu_2 ++;
  158.                         if(menu_2 > 6)
  159.                                 menu_2 = 1;                               
  160.                 }
  161.         }
  162.         if(menu_1 == 1)
  163.         {
  164.                 if(menu_2 == 1)                  //設(shè)置時(shí)
  165.                 {
  166.                         if(key_can == 3)        //加
  167.                                 set_ds1302time(1,&shi,0x24);
  168.                         if(key_can == 4)        //減
  169.                                 set_ds1302time(0,&shi,0x24);       
  170.                 }
  171.                 if(menu_2 == 2)                  //設(shè)置分
  172.                 {
  173.                         if(key_can == 3)        //加
  174.                                 set_ds1302time(1,&fen,0x60);
  175.                         if(key_can == 4)        //減          
  176.                                 set_ds1302time(0,&fen,0x60);
  177.                 }
  178.                 if(menu_2 == 3)                  //設(shè)置秒
  179.                 {
  180.                         if(key_can == 3)        //加
  181.                                 set_ds1302time(1,&miao,0x60);
  182.                         if(key_can == 4)        //減          
  183.                                 set_ds1302time(0,&miao,0x60);
  184.                 }
  185.                 if(menu_2 == 4)                  //設(shè)置星期
  186.                 {
  187.                         if(key_can == 3)        //加
  188.                                 set_ds1302time(1,&week,8);
  189.                         if(key_can == 4)        //減          
  190.                                 set_ds1302time(0,&week,8);
  191.                 }
  192.                 if(menu_2 == 5)                  //設(shè)置年
  193.                 {
  194.                         if(key_can == 3)        //加
  195.                                 set_ds1302time(1,&nian,0x9A);                       
  196.                         if(key_can == 4)        //減          
  197.                                 set_ds1302time(0,&nian,0x9A);       
  198.                 }
  199.                 if(menu_2 == 6)                  //設(shè)置月
  200.                 {
  201.                         if(key_can == 3)        //加
  202.                                 set_ds1302time(1,&yue,0x13);                       
  203.                         if(key_can == 4)        //減          
  204.                                 set_ds1302time(0,&yue,0x13);       
  205.                 }
  206.                 if(menu_2 == 7)                  //設(shè)置日
  207.                 {
  208.                         if(key_can == 3)        //加
  209.                                 set_ds1302time(1,&ri,0x32);                       
  210.                         if(key_can == 4)        //減          
  211.                                 set_ds1302time(0,&ri,0x32);       
  212.                 }
  213.                 write_time();           //把時(shí)間寫(xiě)進(jìn)去1302RAM

  214.                 write_sfm2_ds1302(1,2,shi);           //顯示時(shí)  1302RAM顯示出來(lái)
  215.                 write_sfm2_ds1302(1,5,fen);           //顯示分
  216.                 write_sfm2_ds1302(1,8,miao);           //顯示秒
  217.                 write_sfm1(1,14,week);           //顯示星期                                       
  218.                 write_sfm2_ds1302(2,3,nian);           //顯示年
  219.                 write_sfm2_ds1302(2,6,yue);           //顯示月
  220.                 write_sfm2_ds1302(2,9,ri);           //顯示日
  221.                 switch(menu_2)           // 光標(biāo)顯示
  222.                 {
  223.                         case 1:  write_guanbiao(1,2,1);  break;
  224.                         case 2:  write_guanbiao(1,5,1);  break;
  225.                         case 3:  write_guanbiao(1,8,1);  break;
  226.                         case 4:  write_guanbiao(1,14,1); break;
  227.                         case 5:  write_guanbiao(2,3,1);  break;
  228.                         case 6:  write_guanbiao(2,6,1);  break;
  229.                         case 7:  write_guanbiao(2,9,1);  break;
  230.                 }

  231.         }       
  232. /***************設(shè)置1開(kāi)關(guān)時(shí)間*********************/
  233.         if(menu_1 == 2)
  234.         {       
  235. /////////////////////           第1個(gè)開(kāi)關(guān)時(shí)間 kai時(shí)間
  236.                 if(menu_2 == 1)                  //設(shè)置開(kāi)關(guān)時(shí)
  237.                 {
  238.                         if(key_can == 3)        //加       
  239.                                 set_ds1302time(1,&shi1,0x24);               
  240.                         if(key_can == 4)        //減          
  241.                                 set_ds1302time(0,&shi1,0x24);               
  242.                 }
  243.                 if(menu_2 == 2)                  //設(shè)
  244.                 {
  245.                         if(key_can == 3)        //加
  246.                                 set_ds1302time(1,&fen1,0x60);               
  247.                         if(key_can == 4)        //減          
  248.                                 set_ds1302time(0,&fen1,0x60);               
  249.                 }       
  250.                 if(menu_2 == 3)                  //設(shè)
  251.                 {
  252.                         if(key_can == 3)
  253.                                 open1 = ~open1;               
  254.                         if(key_can == 4)                  
  255.                                 open1 = ~open1;               
  256.                 }       
  257.        
  258. /////////////////////           第2個(gè)開(kāi)關(guān)時(shí)間        閉時(shí)間
  259.                 if(menu_2 == 4)                  //設(shè)置開(kāi)關(guān)分
  260.                 {
  261.                         if(key_can == 3)        //加        第2個(gè)開(kāi)關(guān)時(shí)間
  262.                                 set_ds1302time(1,&shi2,0x24);               
  263.                         if(key_can == 4)        //減          
  264.                                 set_ds1302time(0,&shi2,0x24);               
  265.                 }
  266.                 if(menu_2 == 5)                  //設(shè)
  267.                 {
  268.                         if(key_can == 3)        //加
  269.                                 set_ds1302time(1,&fen2,0x60);               
  270.                         if(key_can == 4)        //減          
  271.                                 set_ds1302time(0,&fen2,0x60);               
  272.                 }
  273.                 if(menu_2 == 6)                  //設(shè)
  274.                 {
  275.                         if(key_can == 3)
  276.                                 open2 = ~open2;               
  277.                         if(key_can == 4)                  
  278.                                 open2 = ~open2;               
  279.                 }       
  280.                 write_string(1,0,"OPEN1 00:00 Y   ");                       
  281.                 write_string(2,0," OFF1 00:00 N     ");       
  282.                 write_sfm2_ds1302(1,6,shi1);           //顯示時(shí)
  283.                 write_sfm2_ds1302(1,9,fen1);           //顯示分
  284.                 write_sfm2_ds1302(2,6,shi2);           //顯示時(shí)
  285.                 write_sfm2_ds1302(2,9,fen2);           //顯示分
  286.                 if(open1 == 1)
  287.                         write_string(1,11," Y ");
  288.                 else
  289.                         write_string(1,11," N ");
  290.                 if(open2 == 1)
  291.                         write_string(2,11," Y ");
  292.                 else
  293.                         write_string(2,11," N ");
  294.         }       
  295. /***************設(shè)置2開(kāi)關(guān)時(shí)間*********************/
  296.         if(menu_1 == 3)
  297.         {       
  298. /////////////////////           第1個(gè)開(kāi)關(guān)時(shí)間
  299.                 if(menu_2 == 1)                  //設(shè)置開(kāi)關(guān)時(shí)
  300.                 {
  301.                         if(key_can == 3)        //加       
  302.                                 set_ds1302time(1,&shi3,0x24);               
  303.                         if(key_can == 4)        //減          
  304.                                 set_ds1302time(0,&shi3,0x24);               
  305.                 }
  306.                 if(menu_2 == 2)                  //設(shè)
  307.                 {
  308.                         if(key_can == 3)        //加
  309.                                 set_ds1302time(1,&fen3,0x60);               
  310.                         if(key_can == 4)        //減          
  311.                                 set_ds1302time(0,&fen3,0x60);               
  312.                 }       
  313.                 if(menu_2 == 3)                  //設(shè)
  314.                 {
  315.                         if(key_can == 3)
  316.                                 open3 = ~open3;               
  317.                         if(key_can == 4)                  
  318.                                 open3 = ~open3;               
  319.                 }       

  320. /////////////////////           第2個(gè)開(kāi)關(guān)時(shí)間       
  321.                 if(menu_2 == 4)                  //設(shè)置開(kāi)關(guān)分
  322.                 {
  323.                         if(key_can == 3)        //加        第2個(gè)開(kāi)關(guān)時(shí)間
  324.                                 set_ds1302time(1,&shi4,0x24);               
  325.                         if(key_can == 4)        //減          
  326.                                 set_ds1302time(0,&shi4,0x24);               
  327.                 }
  328.                 if(menu_2 == 5)                  //設(shè)
  329.                 {
  330.                         if(key_can == 3)        //加
  331.                                 set_ds1302time(1,&fen4,0x60);               
  332.                         if(key_can == 4)        //減          
  333.                                 set_ds1302time(0,&fen4,0x60);               
  334.                 }
  335.                 if(menu_2 == 6)                  //設(shè)
  336.                 {
  337.                         if(key_can == 3)
  338.                                 open4 = ~open4;               
  339.                         if(key_can == 4)                  
  340.                                 open4 = ~open4;               
  341.                 }       
  342.                 write_string(1,0,"OPEN2 00:00    ");                       
  343.                 write_string(2,0," OFF2 00:00      ");       
  344.                 write_sfm2_ds1302(1,6,shi3);           //顯示時(shí)
  345.                 write_sfm2_ds1302(1,9,fen3);           //顯示分
  346.                 write_sfm2_ds1302(2,6,shi4);           //顯示時(shí)
  347.                 write_sfm2_ds1302(2,9,fen4);           //顯示分
  348.                 if(open3 == 1)
  349.                         write_string(1,11," Y ");
  350.                 else
  351.                         write_string(1,11," N ");
  352.                 if(open4 == 1)
  353.                         write_string(2,11," Y ");
  354.                 else
  355.                         write_string(2,11," N ");
  356.         }       

  357. /***************設(shè)置3開(kāi)關(guān)時(shí)間*********************/
  358.         if(menu_1 == 4)
  359.         {       
  360. /////////////////////           第1個(gè)開(kāi)關(guān)時(shí)間
  361.                 if(menu_2 == 1)                  //設(shè)置開(kāi)關(guān)時(shí)
  362.                 {
  363.                         if(key_can == 3)        //加       
  364.                                 set_ds1302time(1,&shi5,0x24);               
  365.                         if(key_can == 4)        //減          
  366.                                 set_ds1302time(0,&shi5,0x24);               
  367.                 }
  368.                 if(menu_2 == 2)                  //設(shè)
  369.                 {
  370.                         if(key_can == 3)        //加
  371.                                 set_ds1302time(1,&fen5,0x60);               
  372.                         if(key_can == 4)        //減          
  373.                                 set_ds1302time(0,&fen5,0x60);               
  374.                 }       
  375.                 if(menu_2 == 3)                  //設(shè)
  376.                 {
  377.                         if(key_can == 3)
  378.                                 open5 = ~open5;               
  379.                         if(key_can == 4)                  
  380.                                 open5 = ~open5;               
  381.                 }       

  382. /////////////////////           第2個(gè)開(kāi)關(guān)時(shí)間       
  383.                 if(menu_2 == 4)                  //設(shè)置開(kāi)關(guān)分
  384.                 {
  385.                         if(key_can == 3)        //加        第2個(gè)開(kāi)關(guān)時(shí)間
  386.                                 set_ds1302time(1,&shi6,0x24);               
  387.                         if(key_can == 4)        //減          
  388.                                 set_ds1302time(0,&shi6,0x24);               
  389.                 }
  390.                 if(menu_2 == 5)                  //設(shè)
  391.                 {
  392.                         if(key_can == 3)        //加
  393.                                 set_ds1302time(1,&fen6,0x60);               
  394.                         if(key_can == 4)        //減          
  395.                                 set_ds1302time(0,&fen6,0x60);               
  396.                 }
  397.                 if(menu_2 == 6)                  //設(shè)
  398.                 {
  399.                         if(key_can == 3)
  400.                                 open6 = ~open6;               
  401.                         if(key_can == 4)                  
  402.                                 open6 = ~open6;               
  403.                 }       
  404.                 write_string(1,0,"OPEN3 00:00    ");                       
  405.                 write_string(2,0," OFF3 00:00      ");       
  406.                 write_sfm2_ds1302(1,6,shi5);           //顯示時(shí)
  407.                 write_sfm2_ds1302(1,9,fen5);           //顯示分
  408.                 write_sfm2_ds1302(2,6,shi6);           //顯示時(shí)
  409.                 write_sfm2_ds1302(2,9,fen6);           //顯示分
  410.                 if(open5 == 1)
  411.                         write_string(1,11," Y ");
  412.                 else
  413.                         write_string(1,11," N ");
  414.                 if(open6 == 1)
  415.                         write_string(2,11," Y ");
  416.                 else
  417.                         write_string(2,11," N ");
  418.         }       

  419. /***************設(shè)置4開(kāi)關(guān)時(shí)間*********************/
  420.         if(menu_1 == 5)
  421.         {       
  422. /////////////////////           第4個(gè)開(kāi)關(guān)時(shí)間
  423.                 if(menu_2 == 1)                  //設(shè)置開(kāi)關(guān)時(shí)
  424.                 {
  425.                         if(key_can == 3)        //加       
  426.                                 set_ds1302time(1,&shi7,0x24);               
  427.                         if(key_can == 4)        //減          
  428.                                 set_ds1302time(0,&shi7,0x24);               
  429.                 }
  430.                 if(menu_2 == 2)                  //設(shè)
  431.                 {
  432.                         if(key_can == 3)        //加
  433.                                 set_ds1302time(1,&fen7,0x60);               
  434.                         if(key_can == 4)        //減          
  435.                                 set_ds1302time(0,&fen7,0x60);               
  436.                 }
  437.                 if(menu_2 == 3)                  //設(shè)
  438.                 {
  439.                         if(key_can == 3)
  440.                                 open7 = ~open7;               
  441.                         if(key_can == 4)                  
  442.                                 open7 = ~open7;               
  443.                 }       
  444.        
  445. /////////////////////           第4個(gè)開(kāi)關(guān)時(shí)間       
  446.                 if(menu_2 == 4)                  //設(shè)置開(kāi)關(guān)分
  447.                 {
  448.                         if(key_can == 3)        //加       
  449.                                 set_ds1302time(1,&shi8,0x24);               
  450.                         if(key_can == 4)        //減          
  451.                                 set_ds1302time(0,&shi8,0x24);               
  452.                 }
  453.                 if(menu_2 == 5)                  //設(shè)
  454.                 {
  455.                         if(key_can == 3)        //加
  456.                                 set_ds1302time(1,&fen8,0x60);               
  457.                         if(key_can == 4)        //減          
  458.                                 set_ds1302time(0,&fen8,0x60);               
  459.                 }
  460.                 if(menu_2 == 6)                  //設(shè)
  461.                 {
  462.                         if(key_can == 3)
  463.                                 open8 = ~open8;               
  464.                         if(key_can == 4)                  
  465.                                 open8 = ~open8;               
  466.                 }       
  467.                 write_string(1,0,"OPEN4 00:00    ");                       
  468.                 write_string(2,0," OFF4 00:00      ");       
  469.                 write_sfm2_ds1302(1,6,shi7);           //顯示時(shí)
  470.                 write_sfm2_ds1302(1,9,fen7);           //顯示時(shí)
  471.                 write_sfm2_ds1302(2,6,shi8);           //顯示時(shí)
  472.                 write_sfm2_ds1302(2,9,fen8);           //顯示分
  473.                 if(open7 == 1)
  474.                         write_string(1,11," Y ");
  475.                 else
  476.                         write_string(1,11," N ");
  477.                 if(open8 == 1)
  478.                         write_string(2,11," Y ");
  479.                 else
  480.                         write_string(2,11," N ");
  481.         }       

  482. /***************設(shè)置5開(kāi)關(guān)時(shí)間*********************/
  483.         if(menu_1 == 6)
  484.         {       
  485. /////////////////////           第5個(gè)開(kāi)關(guān)時(shí)間
  486.                 if(menu_2 == 1)                  //設(shè)置開(kāi)關(guān)時(shí)
  487.                 {
  488.                         if(key_can == 3)        //加       
  489.                                 set_ds1302time(1,&shi9,0x24);               
  490.                         if(key_can == 4)        //減          
  491.                                 set_ds1302time(0,&shi9,0x24);               
  492.                 }
  493.                 if(menu_2 == 2)                  //設(shè)
  494.                 {
  495.                         if(key_can == 3)        //加
  496.                                 set_ds1302time(1,&fen9,0x60);               
  497.                         if(key_can == 4)        //減          
  498.                                 set_ds1302time(0,&fen9,0x60);               
  499.                 }
  500.                 if(menu_2 == 3)                  //設(shè)
  501.                 {
  502.                         if(key_can == 3)
  503.                                 open9 = ~open9;               
  504.                         if(key_can == 4)                  
  505.                                 open9 = ~open9;               
  506.                 }       
  507.        
  508. /////////////////////           第5個(gè)開(kāi)關(guān)時(shí)間       
  509.                 if(menu_2 == 4)                  //設(shè)置開(kāi)關(guān)分
  510.                 {
  511.                         if(key_can == 3)        //加       
  512.                                 set_ds1302time(1,&shi10,0x24);               
  513.                         if(key_can == 4)        //減          
  514.                                 set_ds1302time(0,&shi10,0x24);               
  515.                 }
  516.                 if(menu_2 == 5)                  //設(shè)
  517.                 {
  518.                         if(key_can == 3)        //加
  519.                                 set_ds1302time(1,&fen10,0x60);               
  520.                         if(key_can == 4)        //減          
  521.                                 set_ds1302time(0,&fen10,0x60);               
  522.                 }
  523.                 if(menu_2 == 6)                  //設(shè)
  524.                 {
  525.                         if(key_can == 3)
  526.                                 open10 = ~open10;               
  527.                         if(key_can == 4)                  
  528.                                 open10 = ~open10;               
  529.                 }       

  530.                 write_string(1,0,"OPEN5 00:00    ");                       
  531.                 write_string(2,0," OFF5 00:00    ");       
  532.                 write_sfm2_ds1302(1,6,shi9);           //顯示時(shí)
  533.                 write_sfm2_ds1302(1,9,fen9);           //顯示時(shí)
  534.                 write_sfm2_ds1302(2,6,shi10);           //顯示時(shí)
  535.                 write_sfm2_ds1302(2,9,fen10);           //顯示分
  536.                 if(open9 == 1)
  537.                         write_string(1,11," Y ");
  538.                 else
  539.                         write_string(1,11," N ");
  540.                 if(open10 == 1)
  541.                         write_string(2,11," Y ");
  542.                 else
  543.                         write_string(2,11," N ");
  544.         }
  545.         if((menu_1 >= 2))
  546.         {
  547.                   switch(menu_2)           // 光標(biāo)顯示
  548.                 {
  549.                         case 1:  write_guanbiao(1,6,1);  break;
  550.                         case 2:  write_guanbiao(1,9,1);  break;
  551.                         case 3:  write_guanbiao(1,12,1);  break;
  552.                         case 4:  write_guanbiao(2,6,1);  break;
  553.                         case 5:  write_guanbiao(2,9,1);  break;
  554.                         case 6:  write_guanbiao(2,12,1);  break;
  555.                 }       
  556.         }

  557. }

  558. /***********紅外遙控程序**************/
  559. void hongwai_dis()
  560. {
  561. //        unsigned char tab[3];
  562.     if(irok)                        //如果接收好了進(jìn)行紅外處理
  563.           {   
  564.                 Ircordpro();
  565.                 irok=0;
  566.                 if(irpro_ok)                   //如果處理好后進(jìn)行工作處理,如按對(duì)應(yīng)的按鍵后顯示對(duì)應(yīng)的數(shù)字等
  567.                 {
  568.                         beep = 0;                                    //蜂鳴器叫一聲
  569.                         delay_1ms(50);
  570.                         beep = 1;  
  571.                         switch(IRcord[2])
  572.                         {
  573.                                 case 0x40:  key_can = 1; break;  //得到按鍵值
  574.                                 case 0x44:  key_can = 2; break;   //得到按鍵值
  575.                                 case 0x15:  key_can = 3; break;   //得到按鍵值
  576.                                 case 0x07:  key_can = 4; break;   //得到按鍵值
  577.                                 case 0x43:  key_can = 5;
  578.                                                         menu_1 = 0;
  579.                                                         write_guanbiao(1,2,0);          //關(guān)閉光標(biāo)
  580.                                                         init_1602_dis_csf();      //初始化液晶顯示               
  581.                                                          break;   //得到按鍵值
  582.                         }       
  583.        
  584. //                        tab[0]=IRcord[2]/100+'0';
  585. //                        tab[1]=IRcord[2]/10%10+'0';
  586. //                        tab[2]=IRcord[2]%10+'0';
  587. //                        write_string(2,12,tab);       
  588.                         irpro_ok=0;//處理完成標(biāo)志
  589.                 }         
  590.           }
  591. }

  592. /***********外部中斷0初始化程序****************/
  593. void init_int0()          //外部中斷0初始化程序
  594. {
  595.         EX0=1;                          //允許外部中斷0中斷
  596.         EA=1;                           //開(kāi)總中斷
  597.         IT0 = 1;                   //外部中斷0負(fù)跳變中斷
  598. }


  599. /*************定時(shí)器0初始化程序***************/
  600. void init_time0();


  601. /*****************主函數(shù)********************/
  602. void main()
  603. {       
  604.         beep = 0;                                    //開(kāi)機(jī)蜂鳴器叫一聲
  605.         delay_1ms(200);
  606.         P0 = P1 = P2 = P3 = 0xff;   //初始化IO口
  607.         init_int0();
  608.         init_time0();                 //初始化定時(shí)器
  609.         init_ds1302();                 //ds1302初始化
  610.         init_1602();                 //lcd1602初始化
  611.         write_string(1,0,"    :  :    W:  ");                       
  612.         write_string(2,0," 20  -  -       ");
  613.         while(1)
  614.         {
  615.                 key();                         //按鍵程序         
  616.                 hongwai_dis();

  617.                 if(key_can < 10)
  618.                 {
  619.                         beep = 0;
  620.                         delay_1ms(50);
  621.                         beep = 1;                       

  622.                         key_with();       
  623.                 }
  624.                 key_can = 11;

  625.                 if(flag_200ms == 1)
  626.                 {       
  627.                         flag_200ms = 0;
  628.                         if(menu_1 == 0)
  629.                         {
  630.                                 read_time();                  //讀時(shí)間
  631.                                 init_1602_ds1302();   //顯示時(shí)鐘
  632.                         }
  633.                         if(flag_moshi == 0)   //自動(dòng)模式
  634.                         if(menu_1 == 0)
  635.                                 menu_dis();           //開(kāi)關(guān)函數(shù)
  636.                 }
  637.                 delay_1ms(1);
  638.         }
  639. }

  640. /*************定時(shí)器0初始化程序***************/
  641. void init_time0()          
  642. {
  643.   TMOD=0x02;//定時(shí)器0工作方式2,TH0是重裝值,TL0是初值
  644.   TH0=0x00; //重載值
  645.   TL0=0x00; //初始化值
  646.   ET0=1;    //開(kāi)中斷
  647.   TR0=1;   
  648. }


  649. void time0() interrupt 1
  650. {
  651.         static unsigned int num;                         
  652.   irtime++;  //用于計(jì)數(shù)2個(gè)下降沿之間的時(shí)間
  653.   num++;
  654.   if(num>=600)
  655.   {flag_200ms=1;}
  656. }


  657. /*****************紅外解碼程序********************/
  658. void int0() interrupt 0
  659. {
  660.         static unsigned char  i;             //接收紅外信號(hào)處理
  661.         static bit startflag;                //是否開(kāi)始處理標(biāo)志位
  662.        
  663.         if(startflag)                        
  664.         {
  665.                 if(irtime<63&&irtime>=33)//引導(dǎo)碼 TC9012的頭碼,9ms+4.5ms
  666.                         i=0;
  667.                 irdata[i]=irtime;//存儲(chǔ)每個(gè)電平的持續(xù)時(shí)間,用于以后判斷是0還是1
  668.                 irtime=0;
  669.                 i++;
  670.                 if(i==33)
  671.                 {
  672.                         irok=1;
  673.                         i=0;
  674.                 }
  675.         }
  676.         else
  677.         {
  678.                 irtime=0;
  679.                 startflag=1;
  680.         }
  681. }

  682. /*------------------------------------------------
  683.                 紅外碼值處理
  684. ------------------------------------------------*/
  685. void Ircordpro(void)//紅外碼值處理函數(shù)
  686. {
  687.   unsigned char i, j, k;
  688.   unsigned char cord,value;

  689.   k=1;
  690.   for(i=0;i<4;i++)      //處理4個(gè)字節(jié)
  691.      {
  692.       for(j=1;j<=8;j++) //處理1個(gè)字節(jié)8位
  693.          {
  694.           cord=irdata[k];
  695.           if(cord>7)//大于某值為1,這個(gè)和晶振有絕對(duì)關(guān)系,這里使用12M計(jì)算,此值可以有一定誤差
  696.              value|=0x80;
  697.           if(j<8)
  698.                     {
  699.                          value>>=1;
  700.                         }
  701.            k++;
  702.          }
  703.      IRcord[i]=value;// 四個(gè)字節(jié)每個(gè)字節(jié)依次放在數(shù)組里
  704.      value=0;     
  705.      }
  706.          irpro_ok=1;//處理完畢標(biāo)志位置1
  707. ……………………

  708. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
源程序.zip (85.75 KB, 下載次數(shù): 197)



作者: 51yueli    時(shí)間: 2018-5-25 13:52
先謝謝樓主的開(kāi)源共享,然后參考過(guò)了再來(lái)回復(fù)
作者: 泡泡1    時(shí)間: 2018-6-2 00:38
有沒(méi)有嗯仿真圖
作者: hby123    時(shí)間: 2018-12-1 09:37
有原理圖嗎
作者: 話(huà)多怪你    時(shí)間: 2021-5-11 13:58
有沒(méi)有仿真圖
作者: 6781    時(shí)間: 2021-6-15 11:08
有沒(méi)有原理圖




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1