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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機的智能定時插座程序+電路設計

[復制鏈接]
跳轉到指定樓層
樓主


基于單片機52的智能定時插座設計.zip (4.97 MB, 下載次數: 82)

元件    數量    型號
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天操天天射天天舔 | 成人依人 | 日韩欧美三级 | 国产成人a亚洲精品 | 91在线精品播放 | 亚洲精品一区二区三区蜜桃久 | 91精品国产91久久久久久密臀 | 国产一区二区欧美 | 99久久久久久久久 | 欧美在线二区 | 久久亚洲精品国产精品紫薇 | 久久久美女 | 中文字幕久久精品 | 久久精品国产99国产精品亚洲 | 日韩av电影在线观看 | 日日夜夜草 | 精品99久久久久久 | 在线一级片 | 精品一区二区三区在线观看 | 国产成人精品在线 | 久久久久久国产 | 操操操日日日 | 国产日产精品一区二区三区四区 | 国产精品视屏 | 99国产精品久久久 | 国产精品一区一区 | 中文字幕二区三区 | 人人玩人人干 | 日韩国产中文字幕 | 亚洲一区精品在线 | 日本精品一区二区 | 国产福利91精品 | 色妞av| 久久精品国产v日韩v亚洲 | 国产精品国产三级国产aⅴ中文 | 久久综合影院 | 欧美一级片中文字幕 | 在线欧美亚洲 | 一级毛片免费视频观看 | 亚洲一区自拍 | www亚洲一区 |