找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机的智能定时插座程序+电路设计

[复制链接]
跳转到指定楼层
楼主


基于单片机52的智能定时插座设计.zip (4.97 MB, 下载次数: 80)

元件    数量    型号
51单片机    1    at89s52
液晶显示屏    1    LED1602
上拉排阻    2    10k(8个脚)
陶瓷电容    4    20pf
电容    1    10uf
晶振    1    12MHZ
晶振    1    32MHZ
按键    6   
温度传感器    1    DS18B20
时钟芯片    1    DS1302
电阻    10    220R
电阻    10    10K
可调电阻    1    103
红外接收一体头    1    1R1308
三极管    3    8550
LED    10    可分不同颜色
二极管    2   
继电器    2    DC 5V
红外遥控器    1   

单片机源程序如下:
  1. #include<reg52.h>
  2. #include "ds1302.h"
  3. #include "main.h"
  4. #include "ir1308.h"
  5. bit readtime_f,key_f = 0,irok;
  6. bit readtemp_f = 0,key_fun_f = 0;
  7. sbit timing_led01 = P3^1; //设置定时1指示灯
  8. sbit timing_led02 = P3^3; //设置定时2指示灯
  9. sbit time_led = P3^0;     //调整时间指示灯
  10. unsigned char key_value,key_select,key_fun = 0,cnt,timing_01=0,timing_02=0;
  11. unsigned int key_count = 0;
  12. SYSTEMTIME timer,timer1,timer2;        //定义两个结构体变量,timer为存当前时间、timer1为存设置定时1时间、timer2为存设置定时2时间
  13. unsigned char ir_mcsj[33];//用于存放33个脉冲的时间长度值

  14. void timer0_init()
  15. {
  16.         TMOD = 0x21;//定时器0工作方式1,定时器1工作方式2
  17.         TH0 = 0X3C;        //50ms
  18.         TL0 = 0XB0;
  19.         EA = 1;
  20.         ET0 = 1;
  21.         TR0 = 1;
  22.         
  23.         TH1 = 0X00;
  24.         TL1 = 0X00;
  25.         ET1 = 1;
  26.         TR1 = 1;
  27.         IT0 = 1;
  28.         EX0 = 1;
  29. }

  30. void timer0_isr() interrupt 1
  31. {
  32.         static unsigned char counter = 0,counter1 = 0;
  33.         TH0 = 0X3C;           //50ms
  34.         TL0 = 0XB0;
  35.         counter ++;
  36.         key_f = 1;
  37.         if(counter==10)
  38.         {
  39.                 counter = 0;
  40.                 led = ~led;
  41.                 readtime_f = 1;
  42.                 counter1 ++;
  43.                 if(counter1==2)
  44.                 {
  45.                         counter1 = 0;
  46.                         readtemp_f = 1;
  47.                 }
  48.         }
  49. }
  50. void t1(void) interrupt 3
  51. {
  52.         cnt++;
  53. }

  54. void int0 (void) interrupt 0//外部中断0服务函数
  55. {        
  56.         static unsigned char i;
  57.         static bit flag;
  58.         if(flag)
  59.         {
  60.                 if(cnt<63&&cnt>=33)
  61.                         i=0;
  62.                 ir_mcsj[i] = cnt;
  63.                 cnt = 0;
  64.                 i++;
  65.                 if(i==33)
  66.                 {
  67.                         irok = 1;
  68.                         i = 0;
  69.                 }        
  70.         }
  71.         else
  72.         {
  73.                 cnt = 0;
  74.                 flag = 1;
  75.         }
  76. }

  77. void main()
  78. {
  79.         unsigned char readtemp;
  80.         lcd_initial();           
  81.         timer0_init();
  82.         ds1302_init();
  83.         while(1)//主循环
  84.         {
  85.                 if(readtemp_f&&!key_fun_f)//读取温度
  86.                 {
  87.                         readtemp_f = 0;
  88.                         readtemp = read_temperature();
  89.                         LCD_Write_Char(13,1,readtemp/10+'0');  //显示温度值
  90.                         LCD_Write_Char(14,1,readtemp%10+'0');
  91.                 }
  92.                 if(readtime_f&&!key_fun_f)//读取时间
  93.                 {
  94.                         readtime_f = 0;
  95.                         Ds1302_Read_Time(&timer);
  96.                         timer_alarm(&timer,&timer1);
  97.                         timer_alarm2(&timer,&timer2);
  98.                         LCD_Write_Char(3,1,timer.Hour/10 + '0');  //显示时
  99.                         LCD_Write_Char(4,1,timer.Hour%10 + '0');
  100.                         LCD_Write_Char(6,1,timer.Minute/10 + '0');//显示秒
  101.                         LCD_Write_Char(7,1,timer.Minute%10 + '0');
  102.                         LCD_Write_Char(9,1,timer.Second/10 + '0');//显示秒
  103.                         LCD_Write_Char(10,1,timer.Second%10 + '0');
  104.                         LCD_Write_Char(3,0,timer.Year/10 + '0');  //显示年
  105.                         LCD_Write_Char(4,0,timer.Year%10 + '0');
  106.                         LCD_Write_Char(6,0,timer.Month/10 + '0'); //显示月
  107.                         LCD_Write_Char(7,0,timer.Month%10 + '0');
  108.                         LCD_Write_Char(9,0,timer.Day/10+ '0');          //显示日
  109.                         LCD_Write_Char(10,0,timer.Day%10 + '0');
  110.                         LCD_Write_Char(14,0,timer.Week%10 + '0'); //显示周
  111.                 }
  112.                 if(irok)//判断是否接收好了红外处理
  113.                 {
  114.                         IR1308();        
  115.                 }
  116.                 if(key_f)
  117.                 {
  118.                         key_f = 0;
  119.                         key_value = key();
  120. /***********************************选择键************************************/
  121.                         if(key_value==0x01)
  122.                         {
  123.                                         key_select ++;
  124.                                         if(key_select>0x07)
  125.                                         {
  126.                                                 key_select = 0x00;
  127.                                                 WRDcomm(0x0c);
  128.                                         }
  129.                                 
  130.                                         else
  131.                                         {
  132.                                                 WRDcomm(0x0d);
  133.                                                 switch(key_select)
  134.                                                 {
  135.                                                         case 0x01:LCD_Write_Char(3,0,timer.Year/10 + '0');break;
  136.                                                         case 0x02:LCD_Write_Char(6,0,timer.Month/10 + '0');break;
  137.                                                         case 0x03:LCD_Write_Char(9,0,timer.Day/10 + '0');break;
  138.                                                         case 0x04:LCD_Write_Char(13,0,':');break;
  139.                                                         case 0x05:LCD_Write_Char(3,1,timer.Hour/10 + '0');break;
  140.                                                         case 0x06:LCD_Write_Char(6,1,timer.Minute/10 + '0');break;
  141.                                                         case 0x07:LCD_Write_Char(9,1,timer.Second/10 + '0');break;
  142.                                                         default:break;
  143.                                                 }
  144.                                         }
  145.                         }
  146. /*********************************加值键***********************************/
  147.                         else if(key_value==0x02)
  148.                         {
  149.                                 if(key_select==0x01)//修改年
  150.                                 {
  151.                                         timer.Year ++;
  152.                                         if(timer.Year==100)
  153.                                         timer.Year = 0;
  154.                                         LCD_Write_Char(4,0,timer.Year%10 + '0');
  155.                                         LCD_Write_Char(3,0,timer.Year/10 + '0');
  156.                                 }
  157.                                 else if(key_select==0x02)//修改月
  158.                                 {
  159.                                         timer.Month ++;
  160.                                         if(timer.Month==13)
  161.                                         timer.Month = 1;
  162.                                         LCD_Write_Char(7,0,timer.Month % 10 + '0');        
  163.                                         LCD_Write_Char(6,0,timer.Month / 10 + '0');
  164.                                 }
  165.                                 else if(key_select==0x03)//修改日
  166.                                 {
  167.                                         timer.Day ++;
  168.                                         if(timer.Day==32)
  169.                                         timer.Day = 1;
  170.                                         LCD_Write_Char(10,0,timer.Day % 10 + '0');        
  171.                                         LCD_Write_Char(9,0,timer.Day / 10 + '0');
  172.                                        
  173.                                 }                                                  
  174.                                 else if(key_select==0x04)//修改星期
  175.                                 {
  176.                                         timer.Week ++;
  177.                                         if(timer.Week==8)
  178.                                         timer.Week = 1;
  179.                                         LCD_Write_Char(14,0,timer.Week % 10 + '0');        
  180.                                         LCD_Write_Char(13,0,':');
  181.                                        
  182.                                 }
  183.                                 else if(key_select==0x05)//修改时
  184.                                 {
  185.                                         timer.Hour ++;
  186.                                         if(timer.Hour==24)
  187.                                         timer.Hour = 0;
  188.                                         LCD_Write_Char(4,1,timer.Hour % 10 + '0');        
  189.                                         LCD_Write_Char(3,1,timer.Hour / 10 + '0');
  190.                                        
  191.                                 }
  192.                                 else if(key_select==0x06)//修改分
  193.                                 {
  194.                                         timer.Minute ++;
  195.                                         if(timer.Minute==60)
  196.                                         timer.Minute = 0;
  197.                                         LCD_Write_Char(7,1,timer.Minute % 10 + '0');        
  198.                                         LCD_Write_Char(6,1,timer.Minute / 10 + '0');
  199.                                        
  200.                                 }
  201.                                 else if(key_select==0x07)//修改秒
  202.                                 {
  203.                                         timer.Second ++;
  204.                                         if(timer.Second==60)
  205.                                         timer.Second = 0;
  206.                                         LCD_Write_Char(10,1,timer.Second % 10 + '0');        
  207.                                         LCD_Write_Char(9,1,timer.Second / 10 + '0');
  208.                                    }
  209.                         }

  210. /*******************************减值键**********************************/
  211.                         else if(key_value==0x04)
  212.                         {
  213.                                 if(key_select==0x01)//修改年
  214.                                 {
  215.                                         timer.Year --;
  216.                                         if(timer.Year==-1)
  217.                                         timer.Year = 99;
  218.                                         LCD_Write_Char(4,0,timer.Year%10 + '0');
  219.                                         LCD_Write_Char(3,0,timer.Year/10 + '0');
  220.                                 }
  221.                                 else if(key_select==0x02)//修改月
  222.                                 {
  223.                                         timer.Month --;
  224.                                         if(timer.Month==0)
  225.                                         timer.Month = 12;
  226.                                         LCD_Write_Char(7,0,timer.Month % 10 + '0');        
  227.                                         LCD_Write_Char(6,0,timer.Month / 10 + '0');
  228.                                 }
  229.                                 else if(key_select==0x03)//修改日
  230.                                 {
  231.                                         timer.Day --;
  232.                                         if(timer.Day==0)
  233.                                         timer.Day = 31;
  234.                                         LCD_Write_Char(10,0,timer.Day % 10 + '0');        
  235.                                         LCD_Write_Char(9,0,timer.Day / 10 + '0');
  236.                                        
  237.                                 }                                                  
  238.                                 else if(key_select==0x04)//修改星期
  239.                                 {
  240.                                         timer.Week --;
  241.                                         if(timer.Week==0)
  242.                                         timer.Week = 7;
  243.                                         LCD_Write_Char(14,0,timer.Week % 10 + '0');        
  244.                                         LCD_Write_Char(13,0,':');
  245.                                        
  246.                                 }
  247.                                 else if(key_select==0x05)//修改时
  248.                                 {
  249.                                         timer.Hour --;
  250.                                         if(timer.Hour==-1)
  251.                                         timer.Hour = 23;
  252.                                         LCD_Write_Char(4,1,timer.Hour % 10 + '0');        
  253.                                         LCD_Write_Char(3,1,timer.Hour / 10 + '0');
  254.                                        
  255.                                 }
  256.                                 else if(key_select==0x06)//修改分
  257.                                 {
  258.                                         timer.Minute --;
  259.                                         if(timer.Minute==-1)
  260.                                         timer.Minute = 59;
  261.                                         LCD_Write_Char(7,1,timer.Minute % 10 + '0');        
  262.                                         LCD_Write_Char(6,1,timer.Minute / 10 + '0');
  263.                                        
  264.                                 }
  265.                                 else if(key_select==0x07)//修改秒
  266.                                 {
  267.                                         timer.Second --;
  268.                                         if(timer.Second==-1)
  269.                                         timer.Second = 59;
  270.                                         LCD_Write_Char(10,1,timer.Second % 10 + '0');        
  271.                                         LCD_Write_Char(9,1,timer.Second / 10 + '0');
  272.                                    }
  273.                         }
  274. /*******************************功能键****************************************/
  275.                         else if(key_value==0x80)
  276.                         {
  277.                                 key_fun ++ ;
  278.                                 if(key_fun == 0x01)
  279.                                 {
  280.                                         time_led = 0;
  281.                                         key_fun_f = 1;
  282.                                 }
  283.                                 else if(key_fun==0x02)
  284.                                 {
  285.                                         time_led = 1;
  286.                                         key_fun_f = 0;
  287.                                         WRDcomm(0x0c);
  288.                                         key_select = 0x00;
  289.                                         Ds1302_Write_Time(ds1302_sec_add,timer.Second);
  290.                                         Ds1302_Write_Time(ds1302_min_add,timer.Minute);
  291.                                         Ds1302_Write_Time(ds1302_hr_add,timer.Hour);
  292.                                         Ds1302_Write_Time(ds1302_day_add,timer.Week);
  293.                                         Ds1302_Write_Time(ds1302_date_add,timer.Day);
  294.                                         Ds1302_Write_Time(ds1302_month_add,timer.Month);
  295.                                         Ds1302_Write_Time(ds1302_year_add,timer.Year);
  296.                                 }
  297.                                 else if(key_fun==0x03)
  298.                                 {
  299.                                         timing_led01 = 0;
  300.                                         key_fun_f = 1;
  301.                                         timing_01 ++;
  302.                                         if(timing_01>=3)
  303.                                         {
  304.                                                 timing_01=0;
  305.                                                 LCD_Write_Char(3,1,timer1.Hour/10 + '0');  //显示时
  306.                                                 LCD_Write_Char(4,1,timer1.Hour%10 + '0');
  307.                                                 LCD_Write_Char(6,1,timer1.Minute/10 + '0');//显示秒
  308.                                                 LCD_Write_Char(7,1,timer1.Minute%10 + '0');
  309.                                                 LCD_Write_Char(9,1,timer1.Second/10 + '0');//显示秒
  310.                                                 LCD_Write_Char(10,1,timer1.Second%10 + '0');
  311.                                                 LCD_Write_Char(3,0,timer1.Year/10 + '0');  //显示年
  312.                                                 LCD_Write_Char(4,0,timer1.Year%10 + '0');
  313.                                                 LCD_Write_Char(6,0,timer1.Month/10 + '0'); //显示月
  314.                                                 LCD_Write_Char(7,0,timer1.Month%10 + '0');
  315.                                                 LCD_Write_Char(9,0,timer1.Day/10+ '0');           //显示日
  316.                                                 LCD_Write_Char(10,0,timer1.Day%10 + '0');
  317.                                                 LCD_Write_Char(14,0,timer1.Week%10 + '0'); //显示周?
  318.                                         }
  319.                                 }
  320.                                 else if(key_fun==0x04)
  321.                                 {
  322.                                         timing_led01 = 1;
  323.                                         key_fun_f = 0;
  324.                                         WRDcomm(0x0c);
  325.                                         timer1.Second = timer.Second;
  326.                                         timer1.Minute = timer.Minute;
  327.                                         timer1.Hour = timer.Hour;
  328.                                         timer1.Week = timer.Week;
  329.                                         timer1.Day = timer.Day;
  330.                                         timer1.Month = timer.Month;
  331.                                         timer1.Year = timer.Year;
  332.                                         clock_led01 = 0;
  333.                                 }

  334.                                 else if(key_fun==0x05)
  335.                                 {
  336.                                         timing_led02 = 0;
  337.                                         key_fun_f = 1;
  338.                                         timing_02 ++;
  339.                                         if(timing_02>=3)
  340.                                         {
  341.                                                 timing_02=0;
  342.                                                 LCD_Write_Char(3,1,timer2.Hour/10 + '0');  //显示时
  343.                                                 LCD_Write_Char(4,1,timer2.Hour%10 + '0');
  344.                                                 LCD_Write_Char(6,1,timer2.Minute/10 + '0');//显示秒
  345.                                                 LCD_Write_Char(7,1,timer2.Minute%10 + '0');
  346.                                                 LCD_Write_Char(9,1,timer2.Second/10 + '0');//显示秒
  347.                                                 LCD_Write_Char(10,1,timer2.Second%10 + '0');
  348.                                                 LCD_Write_Char(3,0,timer2.Year/10 + '0');  //显示年
  349.                                                 LCD_Write_Char(4,0,timer2.Year%10 + '0');
  350.                                                 LCD_Write_Char(6,0,timer2.Month/10 + '0'); //显示月
  351.                                                 LCD_Write_Char(7,0,timer2.Month%10 + '0');
  352.                                                 LCD_Write_Char(9,0,timer2.Day/10+ '0');          //显示日
  353.                                                 LCD_Write_Char(10,0,timer2.Day%10 + '0');
  354.                                                 LCD_Write_Char(14,0,timer2.Week%10 + '0'); //显示周?
  355.                                         }
  356.                                 }
  357.                                 else if(key_fun==0x06)
  358.                                 {
  359.                                         timing_led02 = 1;
  360.                                         key_fun_f = 0;
  361.                                         key_fun = 0x00;
  362.                                         WRDcomm(0x0c);
  363.                                         timer2.Second = timer.Second;
  364.                                         timer2.Minute = timer.Minute;
  365.                                         timer2.Hour = timer.Hour;
  366.                                         timer2.Week = timer.Week;
  367.                                         timer2.Day = timer.Day;
  368.                                         timer2.Month = timer.Month;
  369.                                         timer2.Year = timer.Year;
  370.                                         clock_led02 = 0;
  371.                                 }
  372.                         }
  373. /******************************复位键*********************************************/
  374.                         else if(key_value==0x08)
  375.                         {
  376.                                  Timing_01 = 1;
  377.                                  Timing_02 = 1;
  378.                                 clock_led01 = 1;
  379.                                 clock_led02 = 1;
  380.                                 timer1.Second = 0;
  381.                                 timer1.Minute = 0;
  382.                                 timer1.Hour = 0;
  383.                                 timer1.Week = 0;
  384.                                 timer1.Day = 0;
  385.                                 timer1.Month = 0;
  386.                                 timer1.Year = 0;
  387.                                 timer2.Second = 0;
  388.                                 timer2.Minute = 0;
  389.                                 timer2.Hour = 0;
  390.                                 timer2.Week = 0;
  391.                                 timer2.Day = 0;
  392.                                 timer2.Month = 0;
  393.                                 timer2.Year = 0;               
  394.                         }
  395.                 }
  396.         }
  397. }
复制代码

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

使用道具 举报

沙发
ID:71535 发表于 2020-1-2 18:50 | 只看该作者

多谢楼主分享,学习一下
回复

使用道具 举报

板凳
ID:584814 发表于 2020-1-9 17:05 | 只看该作者
怎么个智能法呢 ?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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