找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8006|回复: 5
打印 上一主题 下一主题
收起左侧

基于51单片机红外遥控定时开关智能家电插座源码设计

  [复制链接]
跳转到指定楼层
楼主
ID:212345 发表于 2018-5-1 20:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本设计主要是解决普通家电的智能化控制,主要描述一个遥控定时插座的设计与制作。该定时插座可以弥补现实生活中普通插座功能的不足,能够通过外设按键或遥控器设置插座的供电时间,使外接电器可以按照一定规律工作,既可以达到智能控制的目的,又在很大程度上起到节能的作用。

本系统由STC8C52单片机电路+时钟DS1302电路+LCD1602液晶显示电路+按键电路+继电器控制电路+蜂鸣器报警电路+红外传感器电路+电源电路组成。
1、DS1302时钟芯片,准确计时,自带3V纽扣电池,当系统掉电后,纽扣电池供电给时钟芯片继续工作,再次上电无需重新设置时间。
2、LCD1602液晶可以显示时、分、秒、星期、年、月、日。
3、可以设置5个开关开的时间和5个开关关的时间,每一个时间都可以单独设置成是否工作有效(Y/N),设定的时间并具有掉电保存功能,保存在STC单片机的内部,上电无需重新设置。
4、继电器吸合指示灯亮实现开关开,继电器断开指示灯灭实现开关关,继电器可以外接其他的家用电器。
5、具有自动模式和手动模式,手动模式下按加、减键就可以实现开关的开和关。
6、开机默认是自动模式,当现在的时间和设置开的时间一致时,继电器工作打开开关,当现在的时候和设置关的时间一致时继电器断开关闭开关。
7、开关的开和关蜂鸣器的提示声不同,当开关开时,蜂鸣器会发出滴滴的提示声,开关关时,蜂鸣器会长鸣一声。
8、具有红外遥控功能,可以用红外遥控器完成整个产品的操作。“|<<”标识手动或切换,“>>|”表示设置或换页,“—”表示手动情况关闭或设置值--,“+”表示手动情况打开或设置值++。

源程序(C语言含详细备注)单片机源程序如下:
  1. #include <reg52.h>                 //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  3. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535

  4. bit flag_200ms ;          //200ms标志
  5. bit flag_100ms ;          //100ms标志
  6. sbit beep = P3^7;          //蜂鸣器定义
  7. bit flag_beep_en;          //蜂鸣器使能标志
  8. uint clock_value;     //用作闹钟用的

  9. uchar menu_1,menu_2;  //菜单选项

  10. sbit relay = P2^0;//继电器
  11. bit flag_moshi;

  12. sbit IR=P3^2;  //红外接口标志

  13. uchar key_time,flag_value;      //用做连加的中间变量
  14. bit key_500ms  ;

  15. void Ircordpro(void);//红外码值处理函数
  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个开关的时间                 开
  25. uchar fen2=0x30,shi2=0x07;          //第2个开关的时间                 闭
  26. uchar fen3=0x10,shi3=0x08;          //第3个开关的时间                       
  27. uchar fen4=0x20,shi4=0x08;          //第4个开关的时间                 
  28. uchar fen5=0x00,shi5=0x09;          //第5个开关的时间         
  29. uchar fen6=0x10,shi6=0x09;          //第6个开关的时间          
  30. uchar fen7=0x50,shi7=0x09;          //第7个开关的时间               
  31. uchar fen8=0x00,shi8=0x10;          //第8个开关的时间                  
  32. uchar fen9=0x40,shi9=0x10;          //第9个开关的时间                  
  33. uchar fen10=0x50,shi10=0x10;          //第10个开关的时间   

  34. /******************1ms 延时函数*******************/
  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. /*************定时器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. /*************开关函数***************/
  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.                    {                         //打开开关
  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.                    {                         //关闭开关
  78.                                    relay = 1;
  79.                                 beep = 0;
  80.                                 delay_1ms(1000);
  81.                                 beep = 1;
  82.                    }
  83.         }
  84. }


  85. /********************独立按键程序*****************/
  86. uchar key_can;         //按键值

  87. void key()         //独立按键程序
  88. {
  89.         static uchar key_new;

  90.         if((P3 & 0x78) != 0x78)                //按键按下,
  91.         {
  92.                 delay_1ms(1);                     //按键消抖动
  93.                 if(((P3 & 0x78) != 0x78) && (key_new == 1))
  94.                 {                                                //确认是按键按下
  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. /**********************设置函数************************/
  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)                 //自动模式
  117.                                 write_string(2,13,"   ");       
  118.                         if(flag_moshi == 1)                 //手动模式
  119.                                 write_string(2,13,"sd ");       
  120.                 }
  121.                 if(flag_moshi == 1)
  122.                 {
  123.                         if(key_can == 3)
  124.                                 relay  = 0;          //开
  125.                         if(key_can == 4)
  126.                                 relay = 1;    //关
  127.                 }                       
  128.         }
  129.         if(key_can == 1)        //设置键
  130.         {
  131.                 menu_1++;
  132.                 if(menu_1 == 1)          //设置时间
  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);          //关闭光标
  143.                         init_1602_dis_csf();      //初始化液晶显示               
  144.                 }
  145.         }
  146.         if(key_can == 2)        //选择键
  147.         {
  148.                 flag_200ms = 1;
  149.                 if(menu_1 == 1)                  //设置时间
  150.                 {
  151.                         menu_2 ++;
  152.                         if(menu_2 > 7)
  153.                                 menu_2 = 1;
  154.                 }
  155.                 if(menu_1 != 1)                 //设置
  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)                  //设置时
  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)                  //设置分
  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)                  //设置秒
  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)                  //设置星期
  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)                  //设置年
  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)                  //设置月
  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)                  //设置日
  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();           //把时间写进去1302RAM

  214.                 write_sfm2_ds1302(1,2,shi);           //显示时  1302RAM显示出来
  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)           // 光标显示
  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. /***************设置1开关时间*********************/
  233.         if(menu_1 == 2)
  234.         {       
  235. /////////////////////           第1个开关时间 kai时间
  236.                 if(menu_2 == 1)                  //设置开关时
  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)                  //设
  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)                  //设
  251.                 {
  252.                         if(key_can == 3)
  253.                                 open1 = ~open1;               
  254.                         if(key_can == 4)                  
  255.                                 open1 = ~open1;               
  256.                 }       
  257.        
  258. /////////////////////           第2个开关时间        闭时间
  259.                 if(menu_2 == 4)                  //设置开关分
  260.                 {
  261.                         if(key_can == 3)        //加        第2个开关时间
  262.                                 set_ds1302time(1,&shi2,0x24);               
  263.                         if(key_can == 4)        //减          
  264.                                 set_ds1302time(0,&shi2,0x24);               
  265.                 }
  266.                 if(menu_2 == 5)                  //设
  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)                  //设
  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);           //显示时
  283.                 write_sfm2_ds1302(1,9,fen1);           //显示分
  284.                 write_sfm2_ds1302(2,6,shi2);           //显示时
  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. /***************设置2开关时间*********************/
  296.         if(menu_1 == 3)
  297.         {       
  298. /////////////////////           第1个开关时间
  299.                 if(menu_2 == 1)                  //设置开关时
  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)                  //设
  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)                  //设
  314.                 {
  315.                         if(key_can == 3)
  316.                                 open3 = ~open3;               
  317.                         if(key_can == 4)                  
  318.                                 open3 = ~open3;               
  319.                 }       

  320. /////////////////////           第2个开关时间       
  321.                 if(menu_2 == 4)                  //设置开关分
  322.                 {
  323.                         if(key_can == 3)        //加        第2个开关时间
  324.                                 set_ds1302time(1,&shi4,0x24);               
  325.                         if(key_can == 4)        //减          
  326.                                 set_ds1302time(0,&shi4,0x24);               
  327.                 }
  328.                 if(menu_2 == 5)                  //设
  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)                  //设
  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);           //显示时
  345.                 write_sfm2_ds1302(1,9,fen3);           //显示分
  346.                 write_sfm2_ds1302(2,6,shi4);           //显示时
  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. /***************设置3开关时间*********************/
  358.         if(menu_1 == 4)
  359.         {       
  360. /////////////////////           第1个开关时间
  361.                 if(menu_2 == 1)                  //设置开关时
  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)                  //设
  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)                  //设
  376.                 {
  377.                         if(key_can == 3)
  378.                                 open5 = ~open5;               
  379.                         if(key_can == 4)                  
  380.                                 open5 = ~open5;               
  381.                 }       

  382. /////////////////////           第2个开关时间       
  383.                 if(menu_2 == 4)                  //设置开关分
  384.                 {
  385.                         if(key_can == 3)        //加        第2个开关时间
  386.                                 set_ds1302time(1,&shi6,0x24);               
  387.                         if(key_can == 4)        //减          
  388.                                 set_ds1302time(0,&shi6,0x24);               
  389.                 }
  390.                 if(menu_2 == 5)                  //设
  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)                  //设
  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);           //显示时
  407.                 write_sfm2_ds1302(1,9,fen5);           //显示分
  408.                 write_sfm2_ds1302(2,6,shi6);           //显示时
  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. /***************设置4开关时间*********************/
  420.         if(menu_1 == 5)
  421.         {       
  422. /////////////////////           第4个开关时间
  423.                 if(menu_2 == 1)                  //设置开关时
  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)                  //设
  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)                  //设
  438.                 {
  439.                         if(key_can == 3)
  440.                                 open7 = ~open7;               
  441.                         if(key_can == 4)                  
  442.                                 open7 = ~open7;               
  443.                 }       
  444.        
  445. /////////////////////           第4个开关时间       
  446.                 if(menu_2 == 4)                  //设置开关分
  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)                  //设
  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)                  //设
  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);           //显示时
  470.                 write_sfm2_ds1302(1,9,fen7);           //显示时
  471.                 write_sfm2_ds1302(2,6,shi8);           //显示时
  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. /***************设置5开关时间*********************/
  483.         if(menu_1 == 6)
  484.         {       
  485. /////////////////////           第5个开关时间
  486.                 if(menu_2 == 1)                  //设置开关时
  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)                  //设
  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)                  //设
  501.                 {
  502.                         if(key_can == 3)
  503.                                 open9 = ~open9;               
  504.                         if(key_can == 4)                  
  505.                                 open9 = ~open9;               
  506.                 }       
  507.        
  508. /////////////////////           第5个开关时间       
  509.                 if(menu_2 == 4)                  //设置开关分
  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)                  //设
  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)                  //设
  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);           //显示时
  533.                 write_sfm2_ds1302(1,9,fen9);           //显示时
  534.                 write_sfm2_ds1302(2,6,shi10);           //显示时
  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)           // 光标显示
  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)                        //如果接收好了进行红外处理
  563.           {   
  564.                 Ircordpro();
  565.                 irok=0;
  566.                 if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
  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);          //关闭光标
  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;//处理完成标志
  589.                 }         
  590.           }
  591. }

  592. /***********外部中断0初始化程序****************/
  593. void init_int0()          //外部中断0初始化程序
  594. {
  595.         EX0=1;                          //允许外部中断0中断
  596.         EA=1;                           //开总中断
  597.         IT0 = 1;                   //外部中断0负跳变中断
  598. }


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


  601. /*****************主函数********************/
  602. void main()
  603. {       
  604.         beep = 0;                                    //开机蜂鸣器叫一声
  605.         delay_1ms(200);
  606.         P0 = P1 = P2 = P3 = 0xff;   //初始化IO口
  607.         init_int0();
  608.         init_time0();                 //初始化定时器
  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();                  //读时间
  631.                                 init_1602_ds1302();   //显示时钟
  632.                         }
  633.                         if(flag_moshi == 0)   //自动模式
  634.                         if(menu_1 == 0)
  635.                                 menu_dis();           //开关函数
  636.                 }
  637.                 delay_1ms(1);
  638.         }
  639. }

  640. /*************定时器0初始化程序***************/
  641. void init_time0()          
  642. {
  643.   TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  644.   TH0=0x00; //重载值
  645.   TL0=0x00; //初始化值
  646.   ET0=1;    //开中断
  647.   TR0=1;   
  648. }


  649. void time0() interrupt 1
  650. {
  651.         static unsigned int num;                         
  652.   irtime++;  //用于计数2个下降沿之间的时间
  653.   num++;
  654.   if(num>=600)
  655.   {flag_200ms=1;}
  656. }


  657. /*****************红外解码程序********************/
  658. void int0() interrupt 0
  659. {
  660.         static unsigned char  i;             //接收红外信号处理
  661.         static bit startflag;                //是否开始处理标志位
  662.        
  663.         if(startflag)                        
  664.         {
  665.                 if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
  666.                         i=0;
  667.                 irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是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)//红外码值处理函数
  686. {
  687.   unsigned char i, j, k;
  688.   unsigned char cord,value;

  689.   k=1;
  690.   for(i=0;i<4;i++)      //处理4个字节
  691.      {
  692.       for(j=1;j<=8;j++) //处理1个字节8位
  693.          {
  694.           cord=irdata[k];
  695.           if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
  696.              value|=0x80;
  697.           if(j<8)
  698.                     {
  699.                          value>>=1;
  700.                         }
  701.            k++;
  702.          }
  703.      IRcord[i]=value;// 四个字节每个字节依次放在数组里
  704.      value=0;     
  705.      }
  706.          irpro_ok=1;//处理完毕标志位置1
  707. ……………………

  708. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
源程序.zip (85.75 KB, 下载次数: 192)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:336455 发表于 2018-5-25 13:52 | 只看该作者
先谢谢楼主的开源共享,然后参考过了再来回复
回复

使用道具 举报

板凳
ID:259987 发表于 2018-6-2 00:38 | 只看该作者
有没有嗯仿真图
回复

使用道具 举报

地板
ID:435181 发表于 2018-12-1 09:37 | 只看该作者
有原理图吗
回复

使用道具 举报

5#
ID:919255 发表于 2021-5-11 13:58 | 只看该作者
有没有仿真图
回复

使用道具 举报

6#
ID:873085 发表于 2021-6-15 11:08 | 只看该作者
有没有原理图
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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