找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3601|回复: 2
收起左侧

以ARDUINO为核心的微电脑时控开关程序和Proteus仿真(v1)

[复制链接]
ID:218023 发表于 2019-6-14 20:18 | 显示全部楼层 |阅读模式
上一帖:
http://www.51hei.com/bbs/dpj-162303-1.html

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. #include <EEPROM.h>
  2. #include <LiquidCrystal.h>
  3. #include <DS1302.h>
  4. LiquidCrystal lcd(2,3,4,5,6,7); //LCD定义
  5. DS1302 rtc(A3,A2,A1); //DS1302定义

  6. typedef unsigned char uchar;

  7. //数据存储位置
  8. #define switch_on_hour 0x00
  9. #define switch_on_min 0x01
  10. #define switch_off_hour 0x02
  11. #define switch_off_min 0x03

  12. //按键
  13. #define t_set 8
  14. #define io_set 9
  15. #define up 10
  16. #define down 11

  17. uchar switch_on_hour_tmp,switch_on_min_tmp,
  18. switch_off_hour_tmp,switch_off_min_tmp;Time t;  //定义数据存储位置临时区

  19. #define relay A0

  20. //开/关字符
  21. const uchar switch_on_char[]={
  22.   B01000,
  23.   B01100,
  24.   B01000,
  25.   B01000,
  26.   B01000,
  27.   B01000,
  28.   B01000,
  29.   B00000
  30. };
  31. const uchar switch_off_char[]={
  32.   B01000,
  33.   B01000,
  34.   B00100,
  35.   B00010,
  36.   B00000,
  37.   B01000,
  38.   B01000,
  39.   B00000
  40. };

  41. void timeset()
  42. {
  43.   uchar hour_tmp,min_tmp,sec_tmp;
  44.   t=rtc.getTime();
  45.   hour_tmp=t.hour;
  46.   min_tmp=t.min;
  47.   sec_tmp=t.sec;
  48.   lcd.clear();
  49.   while(1){
  50.     lcd.setCursor(0,0);
  51.     lcd.print("Time Hour");
  52.     lcd.setCursor(0,1);
  53.     lcd.print(hour_tmp%100/10,DEC);
  54.     lcd.print(hour_tmp%10,DEC);
  55.     if(digitalRead(up)==0){
  56.       delayMicroseconds(10); //消抖
  57.       if(digitalRead(up)==0){
  58.         while(!digitalRead(up));
  59.         ++hour_tmp;
  60.       }
  61.     }
  62.     if(digitalRead(down)==0){
  63.       delayMicroseconds(10); //消抖
  64.       if(digitalRead(down)==0){
  65.         while(!digitalRead(down));
  66.         --hour_tmp;
  67.       }
  68.     }
  69.     if(hour_tmp==255)hour_tmp=23;
  70.     if(hour_tmp==24)hour_tmp=0;
  71.     if(digitalRead(t_set)==0){
  72.       delayMicroseconds(10); //消抖
  73.       if(digitalRead(t_set)==0){
  74.         while(!digitalRead(t_set));
  75.         while(1){
  76.           lcd.setCursor(0,0);
  77.           lcd.print("Time Minute");
  78.           lcd.setCursor(0,1);
  79.           lcd.print(min_tmp%100/10,DEC);
  80.           lcd.print(min_tmp%10,DEC);
  81.           if(digitalRead(up)==0){
  82.             delayMicroseconds(10); //消抖
  83.             if(digitalRead(up)==0){
  84.               while(!digitalRead(up));
  85.               ++min_tmp;
  86.             }
  87.           }
  88.           if(digitalRead(down)==0){
  89.             delayMicroseconds(10); //消抖
  90.             if(digitalRead(down)==0){
  91.               while(!digitalRead(down));
  92.               --min_tmp;
  93.             }
  94.           }
  95.           if(min_tmp==255)min_tmp=59;
  96.           if(min_tmp==60)min_tmp=0;
  97.           if(digitalRead(t_set)==0){
  98.             delayMicroseconds(10); //消抖
  99.             if(digitalRead(t_set)==0){
  100.               while(!digitalRead(t_set));
  101.               while(1){
  102.                 lcd.setCursor(0,0);
  103.                 lcd.print("Time Second");
  104.                 lcd.setCursor(0,1);
  105.                 lcd.print(sec_tmp%100/10,DEC);
  106.                 lcd.print(sec_tmp%10,DEC);
  107.                 if(digitalRead(up)==0){
  108.                   delayMicroseconds(10); //消抖
  109.                   if(digitalRead(up)==0){
  110.                     while(!digitalRead(up));
  111.                     ++sec_tmp;
  112.                   }
  113.                 }
  114.                 if(digitalRead(down)==0){
  115.                   delayMicroseconds(10); //消抖
  116.                   if(digitalRead(down)==0){
  117.                     while(!digitalRead(down));
  118.                     --sec_tmp;
  119.                   }
  120.                 }
  121.                 if(sec_tmp==255)sec_tmp=59;
  122.                 if(sec_tmp==60)sec_tmp=0;
  123.                 if(digitalRead(t_set)==0){
  124.                   delayMicroseconds(10); //消抖
  125.                   if(digitalRead(t_set)==0){
  126.                     while(!digitalRead(t_set));
  127.                     rtc.setTime(hour_tmp,min_tmp,sec_tmp);
  128.                     lcd.clear();
  129.                     return;
  130.                   }
  131.                 }
  132.               }
  133.             }
  134.           }
  135.         }
  136.       }
  137.     }
  138.   }
  139. }


  140. void ioset()
  141. {
  142.   onset();
  143.   offset();
  144. }
  145. void onset()
  146. {
  147.   uchar hour_tmp,min_tmp;
  148.   hour_tmp=EEPROM.read(switch_on_hour);
  149.   min_tmp=EEPROM.read(switch_on_min);
  150.   lcd.clear();
  151.   while(1){
  152.     lcd.setCursor(0,0);
  153.     lcd.print("SwitchOn Hour");
  154.     lcd.setCursor(0,1);
  155.     lcd.print(hour_tmp%100/10,DEC);
  156.     lcd.print(hour_tmp%10,DEC);
  157.     if(digitalRead(up)==0){
  158.       delayMicroseconds(10); //消抖
  159.       if(digitalRead(up)==0){
  160.         while(!digitalRead(up));
  161.         ++hour_tmp;
  162.       }
  163.     }
  164.     if(digitalRead(down)==0){
  165.       delayMicroseconds(10); //消抖
  166.       if(digitalRead(down)==0){
  167.         while(!digitalRead(down));
  168.         --hour_tmp;
  169.       }
  170.     }
  171.     if(hour_tmp==255)hour_tmp=23;
  172.     if(hour_tmp==24)hour_tmp=0;
  173.     if(digitalRead(io_set)==0){
  174.       delayMicroseconds(10); //消抖
  175.       if(digitalRead(io_set)==0){
  176.         while(!digitalRead(io_set));
  177.         while(1){
  178.           lcd.setCursor(0,0);
  179.           lcd.print("SwitchOn Minute");
  180.           lcd.setCursor(0,1);
  181.           lcd.print(min_tmp%100/10,DEC);
  182.           lcd.print(min_tmp%10,DEC);
  183.           if(digitalRead(up)==0){
  184.             delayMicroseconds(10); //消抖
  185.             if(digitalRead(up)==0){
  186.               while(!digitalRead(up));
  187.               ++min_tmp;
  188.             }
  189.           }
  190.           if(digitalRead(down)==0){
  191.             delayMicroseconds(10); //消抖
  192.             if(digitalRead(down)==0){
  193.               while(!digitalRead(down));
  194.               --min_tmp;
  195.             }
  196.           }
  197.           if(min_tmp==255)min_tmp=59;
  198.           if(min_tmp==60)min_tmp=0;
  199.           if(digitalRead(io_set)==0){
  200.             delayMicroseconds(10); //消抖
  201.             if(digitalRead(io_set)==0){
  202.               while(!digitalRead(io_set));
  203.               EEPROM.write(switch_on_hour,hour_tmp);
  204.               EEPROM.write(switch_on_min,min_tmp);
  205.               lcd.clear();
  206.               return;
  207.             }
  208.           }
  209.         }
  210.       }
  211.     }
  212.   }
  213. }
  214. void offset()
  215. {
  216.   uchar hour_tmp,min_tmp;
  217.   hour_tmp=EEPROM.read(switch_off_hour);
  218.   min_tmp=EEPROM.read(switch_off_min);
  219.   lcd.clear();
  220.   while(1){
  221.     lcd.setCursor(0,0);
  222.     lcd.print("SwitchOff Hour");
  223.     lcd.setCursor(0,1);
  224.     lcd.print(hour_tmp%100/10,DEC);
  225.     lcd.print(hour_tmp%10,DEC);
  226.     if(digitalRead(up)==0){
  227.       delayMicroseconds(10); //消抖
  228.       if(digitalRead(up)==0){
  229.         while(!digitalRead(up));
  230.         ++hour_tmp;
  231.       }
  232.     }
  233.     if(digitalRead(down)==0){
  234.       delayMicroseconds(10); //消抖
  235.       if(digitalRead(down)==0){
  236.         while(!digitalRead(down));
  237.         --hour_tmp;
  238.       }
  239.     }
  240.     if(hour_tmp==255)hour_tmp=23;
  241.     if(hour_tmp==24)hour_tmp=0;
  242.     if(digitalRead(io_set)==0){
  243.       delayMicroseconds(10); //消抖
  244.       if(digitalRead(io_set)==0){
  245.         while(!digitalRead(io_set));
  246.         while(1){
  247.           lcd.setCursor(0,0);
  248.           lcd.print("SwitchOff Minute");
  249.           lcd.setCursor(0,1);
  250.           lcd.print(min_tmp%100/10,DEC);
  251.           lcd.print(min_tmp%10,DEC);
  252.           if(digitalRead(up)==0){
  253.             delayMicroseconds(10); //消抖
  254.             if(digitalRead(up)==0){
  255.               while(!digitalRead(up));
  256.               ++min_tmp;
  257.             }
  258.           }
  259.           if(digitalRead(down)==0){
  260.             delayMicroseconds(10); //消抖
  261.             if(digitalRead(down)==0){
  262.               while(!digitalRead(down));
  263.               --min_tmp;
  264.             }
  265.           }
  266.           if(min_tmp==255)min_tmp=59;
  267.           if(min_tmp==60)min_tmp=0;
  268.           if(digitalRead(io_set)==0){
  269.             delayMicroseconds(10); //消抖
  270.             if(digitalRead(io_set)==0){
  271.               while(!digitalRead(io_set));
  272.               EEPROM.write(switch_off_hour,hour_tmp);
  273.               EEPROM.write(switch_off_min,min_tmp);
  274.               lcd.clear();
  275.               return;
  276.             }
  277.           }
  278.         }
  279.       }
  280.     }
  281.   }
  282. }

  283. void setup() //初始化并显示字符
  284. {
  285.   rtc.halt(false);
  286.   rtc.writeProtect(false);
  287.   lcd.begin(16,2);
  288.   lcd.createChar(0,switch_on_char);
  289.   lcd.createChar(1,switch_off_char);
  290.   pinMode(t_set,INPUT_PULLUP);
  291.   pinMode(io_set,INPUT_PULLUP);
  292.   pinMode(up,INPUT_PULLUP);
  293.   pinMode(down,INPUT_PULLUP);
  294.   pinMode(relay,OUTPUT);
  295.   digitalWrite(relay,HIGH);
  296.   lcd.setCursor(0,0);
  297.   lcd.print("The With");
  298.   lcd.setCursor(0,1);
  299.   lcd.print("Commands");
  300.   delay(2000);
  301.   lcd.clear();
  302.   lcd.print("Enjoy");
  303.   lcd.setCursor(0,1);
  304.   lcd.print("Program Life");
  305.   delay(2000);
  306.   lcd.clear();
  307. }

  308. void loop()
  309. {
  310.   t=rtc.getTime();
  311.   lcd.setCursor(4,0);
  312.   lcd.print(rtc.getTimeStr());
  313.   switch_on_hour_tmp=EEPROM.read(switch_on_hour);
  314.   switch_on_min_tmp=EEPROM.read(switch_on_min);
  315.   switch_off_hour_tmp=EEPROM.read(switch_off_hour);
  316.   switch_off_min_tmp=EEPROM.read(switch_off_min);
  317.   lcd.setCursor(1,1);
  318.   lcd.write((uchar)0);
  319.   lcd.print(":");
  320.   lcd.print(switch_on_hour_tmp%100/10,DEC);
  321.   lcd.print(switch_on_hour_tmp%10,DEC);
  322.   lcd.print(":");
  323.   lcd.print(switch_on_min_tmp%100/10,DEC);
  324.   lcd.print(switch_on_min_tmp%10,DEC);
  325.   lcd.write((uchar)1);
  326.   lcd.print(":");
  327.   lcd.print(switch_off_hour_tmp%100/10,DEC);
  328.   lcd.print(switch_off_hour_tmp%10,DEC);
  329.   lcd.print(":");
  330.   lcd.print(switch_off_min_tmp%100/10,DEC);
  331.   lcd.print(switch_off_min_tmp%10,DEC);
  332.   if(digitalRead(t_set)==0){
  333.     delayMicroseconds(10); //消抖
  334.     if(digitalRead(t_set)==0){
  335.       while(!digitalRead(t_set));
  336.       timeset();
  337.     }
  338.   }
  339.   if(digitalRead(io_set)==0){
  340.     delayMicroseconds(10); //消抖
  341.     if(digitalRead(io_set)==0){
  342.       while(!digitalRead(io_set));
  343.       ioset();
  344.     }
  345.   }
  346.   if(t.hour==switch_on_hour_tmp){
  347.     if(t.min==switch_on_min_tmp){
  348.       digitalWrite(relay,LOW);
  349.     }
  350.   }
  351.   if(t.hour==switch_off_hour_tmp){
  352.     if(t.min==switch_off_min_tmp){
  353.       digitalWrite(relay,HIGH);
  354.     }
  355.   }
  356. }
复制代码

所有资料51hei提供下载:
TimeSwitch.zip (64.44 KB, 下载次数: 28)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:218023 发表于 2019-6-15 15:03 | 显示全部楼层
回复

使用道具 举报

ID:570410 发表于 2020-2-20 16:46 | 显示全部楼层
"DS1302.h "从哪里能下载?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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