wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6923|回復: 0
收起左側

51單片機智能窗簾控制系統源程序與Proteus仿真圖

[復制鏈接]
ID:651755 發表于 2021-5-23 13:18 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif
51hei.png 51hei.png

元件清單:
10UF電解電容    C2
47UF電解電容    C6
光敏電阻    R10
限位開關    K1, K2
微動開關    KEY1, KEY2, KEY3, KEY4, KEY5
步進電機    P1
DC-002電源插座    P2
LCD1602液晶    Q1
紅外一體接頭    Q5
10K色環電阻    R1, R4, R5, R6, R8, R9
10K電位器    R2
10k排阻    R3
雙擲開關    SW1
2Pi插針    U2
STC89C52單片機    U3
ADC0832模數轉換芯片    U4
ULN2003電機驅動芯片    U5
DS1302時鐘芯片    U6
12MHZ晶振    Y1
32.768KHZ晶振    Y2

單片機源程序如下:
  1. #include<reg52.h>                   //頭文件
  2. #include<LCD1602.h>
  3. #include<DS1302.h>
  4. #include<28BYJ48.h>
  5. #include<EEPROM.h>
  6. #include<ADC0832.h>
  7. #include<HW.h>

  8. #define uchar unsigned char//宏定義
  9. #define uint unsigned int

  10. /*******************引腳定義*********************/
  11. sbit key_mode = P1^0;         //設置鍵
  12. sbit key_jia  = P1^1;         //加值鍵
  13. sbit key_jian = P1^2;         //減值鍵
  14. sbit key_ok   = P1^3;         //確定鍵

  15. sbit sw1=P3^7;           //全開 限位開關
  16. sbit sw2=P3^6;           //全關 限位開關
  17. /*******************變量定義*********************/
  18. uchar light_up,light_down;//存儲光強上、下限值
  19. uchar set_f=0;                //設置選擇標記,=0非設置,=1設置年,=2設置月,=3設置日,=4設置時,=5設置分,=6設置秒
  20.                                         //              =7設置定時-時,=8設置定時-分,=9設置定時-開關,=10設置窗簾打開/關閉
  21.                                         //                                =11設置光強上限,=12設置光強下限,=13設置校準窗簾位置

  22. uchar num;                        //計數變量
  23. uchar ds[4];            //定時控制開時、分、控制關時、分

  24. uchar mode=0;                //模式標記。=0手動,=1定時,=2光控
  25. uchar light;        //存儲光強

  26. uint moto_num=0;  //記錄窗簾位置
  27. uchar moto_state=0;//窗簾狀態,=0已經關閉,=1處于運轉過程中,=2已經打開
  28. bit moto_f=0;           //標記當前控制狀態,=0控制關,=1控制開
  29. uchar code display_mode[3][3]={"SD\0","DS\0","GK\0"};//顯示模式
  30. /********************************************************
  31. 函數名稱:void delayms(uint ms)
  32. 函數作用:毫秒延時函數
  33. 參數說明:
  34. ********************************************************/
  35. void delayms(uint ms)
  36. {
  37.         unsigned char i=100,j;
  38.         for(;ms;ms--)
  39.         {
  40.                 while(--i)
  41.                 {
  42.                         j=10;
  43.                         while(--j);
  44.                 }
  45.         }
  46. }

  47. /********************************************************
  48. 函數名稱:void display(void)
  49. 函數作用:正常顯示日期、時間、光強等函數
  50. 參數說明:
  51. ********************************************************/
  52. void display(void)
  53. {
  54.         uint t[3];        

  55.         //顯示時間
  56.         LCD_disp_char(0,2,ASCII[time[2]/10]);//顯示時【0:表示第1列,2:表示第2行,所有關于顯示都一樣】
  57.         LCD_disp_char(1,2,ASCII[time[2]%10]);
  58.         LCD_disp_char(2,2,':');
  59.         LCD_disp_char(3,2,ASCII[time[1]/10]);//顯示分【3:表示第4列,2:表示第2行,所有關于顯示都一樣】
  60.         LCD_disp_char(4,2,ASCII[time[1]%10]);
  61.         LCD_disp_char(5,2,':');
  62.         LCD_disp_char(6,2,ASCII[time[0]/10]);//顯示秒
  63.         LCD_disp_char(7,2,ASCII[time[0]%10]);

  64.         //顯示日期
  65.         LCD_disp_char(0,1,ASCII[time[6]/10]);//顯示年
  66.         LCD_disp_char(1,1,ASCII[time[6]%10]);
  67.         LCD_disp_char(2,1,'/');
  68.         LCD_disp_char(3,1,ASCII[time[4]/10]);//顯示月
  69.         LCD_disp_char(4,1,ASCII[time[4]%10]);
  70.         LCD_disp_char(5,1,'/');
  71.         LCD_disp_char(6,1,ASCII[time[3]/10]);//顯示日
  72.         LCD_disp_char(7,1,ASCII[time[3]%10]);

  73.         //顯示模式
  74.         lcd1602_write_character(9,1,display_mode[mode]);
  75.        
  76.         //顯示光強
  77.         if(light>99)
  78.                 LCD_disp_char(12,1,ASCII[light/100]);
  79.         else
  80.                 LCD_disp_char(12,1,' ');
  81.         LCD_disp_char(13,1,ASCII[light%100/10]);
  82.         LCD_disp_char(14,1,ASCII[light%10]);
  83.         LCD_disp_char(15,1,'%');

  84.         //光強控制
  85.         if(mode==2)//光控模式
  86.         {         
  87.                 if((light>=light_up||light<light_down))//判斷實際光強是否【大于等于上限 或 小于下限值】、當前處于打開狀態
  88.                 {       
  89.                         moto_f=0;         //標記當前控制窗簾關閉  
  90.                         moto_state=1;//標記窗簾處于運轉過程中
  91.                 }
  92.                 else
  93.                         if((light<light_up&&light>=light_down))//判斷實際光強是否【大于等于下限值 并且 小于上限】、當前處于關閉狀態
  94.                         {
  95.                                 moto_f=1;         //標記當前控制窗簾打開  
  96.                                 moto_state=1;//標記窗簾處于運轉過程中
  97.                         }
  98.         }
  99.         else
  100.                 if(mode==1)//定時模式
  101.                 {
  102.                         t[0]=time[2]*60+time[1];//當前時間
  103.                         t[1]=ds[0]*60+ds[1];        //窗簾開啟時間點
  104.                         t[2]=ds[2]*60+ds[3];        //窗簾關閉時間點
  105.                        
  106.                         if(t[1]<t[2])                         //0時 --> t[1] --> t[2] --> 24時
  107.                         {
  108.                                 if(t[0]>=t[1]&&t[0]<=t[2])
  109.                                         moto_f=1;            //標記當前需要打開窗簾
  110.                                 else
  111.                                         moto_f=0;                //標記當前需要關閉窗簾
  112.                         }
  113.                         else                                        //0時 --> t[2] --> t[1] --> 24時
  114.                         {
  115.                                 if(t[0]>=t[1]||t[0]<=t[2])
  116.                                         moto_f=1;                //標記當前需要打開窗簾
  117.                                 else
  118.                                         moto_f=0;                //標記當前需要關閉窗簾
  119.                         }
  120.                         moto_state=1;          //標記窗簾處于運轉過程中
  121.                 }
  122.         if(moto_f==0&&moto_state!=0&&sw2!=0)//控制關閉窗簾
  123.         {
  124.                 if(moto_num==0)                          //控制次數減到0時,表示窗戶已經關閉完成
  125.                 {
  126.                         BYJ48=P2&0xf0;                  //關閉步進電機
  127.                         moto_state=0;                  //標記窗簾處于關閉狀態
  128.                         lcd1602_write_character(10,2,"ZT:OFF");
  129.                 }
  130.                 else
  131.                 {
  132.                         motor_z();                                  //步進電機正轉
  133.                         moto_num--;                                  //控制次數-1
  134.                         lcd1602_write_character(10,2,"-->OFF");
  135.                 }               
  136.         }
  137.         else                  
  138.                 if(moto_f==1&&moto_state!=2&&sw1!=0)//控制打開窗簾
  139.                 {
  140.                         if(moto_num>=192)          //控制次數加到128時,表示窗戶已經打開完成
  141.                         {
  142.                                 BYJ48=P2&0xf0;                  //關閉步進電機
  143.                                 moto_state=2;          //標記窗簾處于打開狀態
  144.                                 lcd1602_write_character(10,2,"ZT:ON ");
  145.                         }
  146.                         else
  147.                         {
  148.                                 motor_f();                          //步進電機反轉
  149.                                 moto_num++;                          //控制次數+1
  150.                                 lcd1602_write_character(10,2,"-->ON ");
  151.                         }               
  152.                 }
  153.                 else                                          //窗戶處于停止狀態
  154.                 {
  155.                         BYJ48=P2&0xf0;                  //關閉步進電機
  156.                         if(moto_state==0||sw2==0)
  157.                                 lcd1602_write_character(10,2,"ZT:OFF");
  158.                         else
  159.                                 if(moto_state==2||sw1==0)
  160.                                         lcd1602_write_character(10,2,"ZT:ON ");       
  161.                 }         
  162. }
  163. /********************************************************
  164. 函數名稱:void display2(void)
  165. 函數作用:顯示調整日期、時間函數
  166. 參數說明:
  167. ********************************************************/
  168. void display2()
  169. {
  170.         num++;

  171.         lcd1602_write_character(1,1,"Date:");
  172.         lcd1602_write_character(1,2,"Time:");
  173.        
  174.         if(num%2==0)        //偶數次顯示,奇數次不顯示。這樣就會有閃爍效果,可以清楚看到當前設置的是哪個值
  175.         {
  176.                 LCD_disp_char(6,1,ASCII[time[6]/10]); //顯示年
  177.                 LCD_disp_char(7,1,ASCII[time[6]%10]);
  178.                 LCD_disp_char(8,1,'/');  
  179.                 LCD_disp_char(9,1,ASCII[time[4]/10]); //顯示月
  180.                 LCD_disp_char(10,1,ASCII[time[4]%10]);          
  181.                 LCD_disp_char(11,1,'/');
  182.                 LCD_disp_char(12,1,ASCII[time[3]/10]);//顯示日
  183.                 LCD_disp_char(13,1,ASCII[time[3]%10]);
  184.        
  185.                 LCD_disp_char(6,2,ASCII[time[2]/10]); //顯示時
  186.                 LCD_disp_char(7,2,ASCII[time[2]%10]);
  187.                 LCD_disp_char(8,2,':');  
  188.                 LCD_disp_char(9,2,ASCII[time[1]/10]); //顯示分
  189.                 LCD_disp_char(10,2,ASCII[time[1]%10]);          
  190.                 LCD_disp_char(11,2,':');
  191.                 LCD_disp_char(12,2,ASCII[time[0]/10]);//顯示秒
  192.                 LCD_disp_char(13,2,ASCII[time[0]%10]);
  193.         }       
  194.         else                        //奇數次不顯示
  195.         {
  196.                 switch(set_f)//根據當前設置的內容,對應位置閃爍
  197.                 {
  198.                         case 1: lcd1602_write_character(6,1,"  "); break;
  199.                         case 2: lcd1602_write_character(9,1,"  "); break;
  200.                         case 3: lcd1602_write_character(12,1,"  "); break;
  201.                         case 4: lcd1602_write_character(6,2,"  "); break;
  202.                         case 5: lcd1602_write_character(9,2,"  "); break;
  203.                         case 6: lcd1602_write_character(12,2,"  "); break;
  204.                         default: break;
  205.                 }
  206.         }       
  207. }
  208. /********************************************************
  209. 函數名稱:void display3(void)
  210. 函數作用:顯示調整定時時間函數
  211. 參數說明:
  212. ********************************************************/
  213. void display3()
  214. {
  215.         num++;
  216.         lcd1602_write_character(0, 1, "Sets timer time:");
  217.         lcd1602_write_character(7, 2, "--");
  218.         if(num%2==0)        //偶數次顯示,奇數次不顯示。這樣就會有閃爍效果,可以清楚看到當前設置的是哪個值
  219.         {            
  220.                 LCD_disp_char(1, 2, ASCII[ds[0]/10]);  //顯示定時開-時
  221.                 LCD_disp_char(2, 2, ASCII[ds[0]%10]);   
  222.                 LCD_disp_char(3, 2, ':');
  223.                 LCD_disp_char(4, 2, ASCII[ds[1]/10]);  //顯示定時開-分
  224.                 LCD_disp_char(5, 2, ASCII[ds[1]%10]);

  225.                 LCD_disp_char(10, 2, ASCII[ds[2]/10]); //顯示定時關-時
  226.                 LCD_disp_char(11, 2, ASCII[ds[2]%10]);   
  227.                 LCD_disp_char(12, 2, ':');
  228.                 LCD_disp_char(13, 2, ASCII[ds[3]/10]); //顯示定時關-分
  229.                 LCD_disp_char(14, 2, ASCII[ds[3]%10]);
  230.         }
  231.         else                         //奇數次不顯示
  232.         {
  233.                 switch(set_f)//根據當前設置的內容,對應位置閃爍
  234.                 {
  235.                         case 7: lcd1602_write_character(1,2,"  "); break;
  236.                         case 8: lcd1602_write_character(4,2,"  "); break;
  237.                         case 9: lcd1602_write_character(10,2,"  "); break;
  238.                         case 10: lcd1602_write_character(13,2,"  "); break;
  239.                         default: break;
  240.                 }
  241.         }
  242. }
  243. /********************************************************
  244. 函數名稱:void display4(void)
  245. 函數作用:顯示調整光強控制函數
  246. 參數說明:
  247. ********************************************************/
  248. void display4(void)
  249. {
  250.         num++;

  251.         lcd1602_write_character(0, 1, "Light_Up  :");
  252.         lcd1602_write_character(0, 2, "Light_Down:");
  253.         LCD_disp_char(15,1,'%');
  254.         LCD_disp_char(15,2,'%');
  255.         if(num%2==0)        //偶數次顯示,奇數次不顯示。這樣就會有閃爍效果,可以清楚看到當前設置的是哪個值
  256.         {
  257.                 LCD_disp_char(12, 1, ASCII[light_up/100]);           //顯示光強上限值
  258.                 LCD_disp_char(13, 1, ASCII[light_up%100/10]);
  259.                 LCD_disp_char(14, 1, ASCII[light_up%10]);   
  260.        
  261.                 LCD_disp_char(12, 2, ASCII[light_down/100]);   //顯示光強下限值
  262.                 LCD_disp_char(13, 2, ASCII[light_down%100/10]);       
  263.                 LCD_disp_char(14, 2, ASCII[light_down%10]);
  264.         }
  265.         else                           //奇數次不顯示
  266.         {
  267.                 switch(set_f)//根據當前設置的內容,對應位置閃爍
  268.                 {
  269.                         case 11: lcd1602_write_character(12,1,"   "); break;
  270.                         case 12: lcd1602_write_character(12,2,"   "); break;
  271.                         default: break;
  272.                 }
  273.         }
  274. }
  275. /********************************************************
  276. 函數名稱:void scan(void)
  277. 函數作用:按鍵查詢處理函數
  278. 參數說明:
  279. ********************************************************/
  280. void scan(void)
  281. {
  282.         //設置鍵
  283.         if(hw_data=='B'||key_mode==0)      //按鍵按下
  284.         {  
  285.                 delayms(7);                                            //延時消抖
  286.                 if(hw_data=='B'||key_mode==0)  //再次確認按鍵按下       
  287.                 {
  288.                         BYJ48=P2&0xf0;                            //關閉步進電機
  289.                         if(set_f==6)                                //日期、時間校準完
  290.                         {
  291.                                 LCD_write_command(0x01);//清除屏幕顯示
  292.                                 delay_n40us(100);                //延時等待全部清除完畢
  293.                                 set_f=13;                                //跳到校準窗簾狀態
  294.                         }
  295.                         else
  296.                                 if(set_f==0)            //進入設置先清除屏幕,顯示設置部分
  297.                                 {
  298.                                         Writeds1302 (WRITE_PROTECT,0X00);//禁止DS1302寫保護
  299.                                         LCD_write_command(0x01);         //清除屏幕顯示
  300.                                         delay_n40us(100);                         //延時等待全部清除完畢
  301.                                         switch(mode)//根據對應的模式,設置對應的參數
  302.                                         {
  303.                                                 case 0: set_f=1; break;                 //手動模式
  304.                                                 case 1: set_f=7; break;                 //定時模式
  305.                                                 case 2: set_f=11; break;         //光控模式
  306.                                                 default: break;
  307.                                         }       
  308.                                 }
  309.                                 else
  310.                                         if(set_f==10||set_f==12)//進入設置日期時間
  311.                                         {
  312.                                                 LCD_write_command(0x01);     //清除屏幕顯示
  313.                                                 delay_n40us(100);                     //延時等待全部清除完畢
  314.                                                 set_f=1;                                         //進入校準時間
  315.                                         }
  316.                                          else
  317.                                                 set_f++;                                         //設置變量+1
  318.                         if(set_f>12)
  319.                         {
  320.                                 set_f=0;                                                         //重置設置變量

  321.                                 Writeds1302 (WRITE_MINUTE,(time[1]/10)*16+time[1]%10);//將設置好的時間寫入DS1302
  322.                                 Writeds1302 (WRITE_SECOND,(time[0]/10)*16+time[0]%10);

  323.                                 EEPROM_delete(0x2200);                                  //擦除扇區
  324.                                 EEPROM_write(0x2200,ds[0]);     //寫入【定時時間】數據保存
  325.                                 EEPROM_write(0x2210,ds[1]);     //寫入【定時時間】數據保存存
  326.                                 EEPROM_write(0x2220,ds[2]);     //寫入【定時時間】數據保存存
  327.                                 EEPROM_write(0x2230,ds[3]);     //寫入【定時時間】數據保存存
  328.                                 EEPROM_write(0x2240,light_up);  //寫入【光強上限值】數據保存
  329.                                 EEPROM_write(0x2250,light_down);//寫入【光強下限值】數據保存

  330.                                 LCD_write_command(0x01);             //清除屏幕顯示
  331.                                 delay_n40us(100);                             //延時等待全部清除完畢
  332.                         }                        
  333.                 }
  334.                 while(!key_mode);                            //等待按鍵松開       
  335.         }
  336.         //確定
  337.         if(hw_data=='Q'||key_ok==0)                                //按鍵按下
  338.         {
  339.                 delayms(7);                                                                //延時消抖
  340.                 if((hw_data=='Q'||key_ok==0)&&set_f!=0)//再次確認按鍵按下
  341.                 {
  342.                         if(set_f<7)
  343.                         {
  344.                                 Writeds1302 (WRITE_MINUTE,(time[1]/10)*16+time[1]%10);//將設置好的時間寫入DS1302
  345.                                 Writeds1302 (WRITE_SECOND,(time[0]/10)*16+time[0]%10);
  346.                         }
  347.                         set_f=0;                                                        //重置設置變量
  348.        
  349.                         EEPROM_delete(0x2200);                                  //擦除扇區
  350.                         EEPROM_write(0x2200,ds[0]);     //寫入【定時時間】數據保存
  351.                         EEPROM_write(0x2210,ds[1]);     //寫入【定時時間】數據保存存
  352.                         EEPROM_write(0x2220,ds[2]);     //寫入【定時時間】數據保存存
  353.                         EEPROM_write(0x2230,ds[3]);     //寫入【定時時間】數據保存存
  354.                         EEPROM_write(0x2240,light_up);  //寫入【光強上限值】數據保存
  355.                         EEPROM_write(0x2250,light_down);//寫入【光強下限值】數據保存

  356.                         LCD_write_command(0x01);            //清除屏幕顯示
  357.                         delay_n40us(100);                            //延時等待全部清除完畢
  358.                 }
  359.                 else
  360.                         if(key_ok==0&&set_f==0)                            //切換模式
  361.                         {
  362.                                 mode++;                                                        //模式變量+1
  363.                                 if(mode>=3)                                                //最大3個模式
  364.                                         mode=0;                                                //重新回到第1個模式
  365.                                 if(moto_state==1)                                //如果處于運轉過程中
  366.                                 {
  367.                                         if(moto_f==0)                                //控制步進電機關閉
  368.                                                 moto_state=0;
  369.                                         else                                                //控制步進電機打開
  370.                                                 moto_state=2;               
  371.                                 }
  372.                                 EEPROM_delete(0x2400);                    //擦除扇區
  373.                                 EEPROM_write(0x2400,mode);      //寫入【模式】數據保存               
  374.                         }
  375.                 while(!key_ok);                                //等待按鍵松開
  376.         }
  377.         //加鍵        ,下面減鍵內容一樣       
  378.         if(hw_data=='+'||key_jia==0)
  379.         {
  380.                 delayms(7);
  381.                 if((hw_data=='+'||key_jia==0)&&set_f!=0)
  382.                 {
  383.                         if(set_f==1)           //設置年
  384.                         {
  385.                                 time[6]++;                                                        //年份+1
  386.                                 time[6]=(time[6]/10)*16+time[6]%10;        //將年份轉換成16進制,例如:16年-->0x16
  387.                                 if(time[6]>0x79)                                        //判斷是否達到最大年份79年
  388.                                         time[6]=0x00;                                        //重新回到00年
  389.                                 Writeds1302 (WRITE_YEA,time[6]);        //將設置好的年份寫入到DS1302存儲起來
  390.                         }
  391.                
  392.                         if(set_f==2)           //設置月
  393.                         {
  394.                                 time[4]++;                                                        //月份+1
  395.                                 time[4]=(time[4]/10)*16+time[4]%10;        //將月份轉換成16進制,例如:08月-->0x08
  396.                                 if(time[4]>0x12)                                        //判斷是否達到最大月份12月
  397.                                         time[4]=0x01;                                        //重新回到01月
  398.                                 Writeds1302 (WRITE_MONTH,time[4]);        //將設置好的月份寫入到DS1302存儲起來
  399.                         }
  400.                
  401.                         if(set_f==3)         //設置日
  402.                         {
  403.                                 time[3]++;                                                        //日份+1
  404.                                 time[3]=(time[3]/10)*16+time[3]%10;        //將日份轉換成16進制,例如:15日-->0x15
  405.                                 if(time[4]==1||time[4]==3||time[4]==5||time[4]==7||time[4]==8||time[4]==10||time[4]==12)//1,3,5,7,8,10,12為大月,每月31天
  406.                                 {
  407.                                         if(time[3]>0x31)                                //判斷是否達到最大日份31日
  408.                                                 time[3]=0x01;                                //重新回到01日
  409.                                 }
  410.                                 else                                                                //否者2,4,6,9,11為小月
  411.                                 {
  412.                                         if(time[4]==0x02)                                //如果是2月,需要區分閏、平年
  413.                                         {
  414.                                                 if(((!(time[6]%4) && (time[6]%100)) || !(time[6]%400))==0)//如果閏年
  415.                                                 {
  416.                                                         if(time[3]>0x28)                //判斷是否達到最大日份28日
  417.                                                                 time[3]=0x01;                //重新回到01日
  418.                                                 }
  419.                                                 else                                                //否者平年
  420.                                                 {
  421.                                                         if(time[3]>0x29)                //判斷是否達到最大日份29日
  422.                                                                 time[3]=0x01;                //重新回到01日
  423.                                                 }
  424.                                         }
  425.                                         else                                                        //否者為剩下的月份
  426.                                         {
  427.                                                 if(time[3]>0x30)                        //判斷是否達到最大日份30日
  428.                                                         time[3]=0x01;                        //重新回到01日
  429.                                         }
  430.                                 }       
  431.                                 Writeds1302 (WRITE_DAY,time[3]);        //將設置好的日份寫入到DS1302存儲起來
  432.                         }
  433.                
  434.                         if(set_f==4)          //設置時,同上
  435.                         {                       
  436.                                 time[2]++;
  437.                                 time[2]=(time[2]/10)*16+time[2]%10;
  438.                                 if(time[2]>0x23)
  439.                                         time[2]=0x00;
  440.                                 Writeds1302 (WRITE_HOUR,time[2]);       
  441.                         }
  442.                
  443.                         if(set_f==5)          //設置分,同上
  444.                         {
  445.                                 time[1]++;
  446.                                 time[1]=(time[1]/10)*16+time[1]%10;
  447.                                 if(time[1]>0x59)
  448.                                         time[1]=0x00;
  449.                                 Writeds1302 (WRITE_MINUTE,time[1]);       
  450.                         }
  451.                
  452.                         if(set_f==6)         //設置秒,同上
  453.                         {
  454.                                 time[0]++;
  455.                                 time[0]=(time[0]/10)*16+time[0]%10;
  456.                                 if(time[0]>0x59)
  457.                                         time[0]=0x00;
  458.                                 Writeds1302 (WRITE_SECOND,time[0]);       
  459.                         }
  460.                        
  461.                         if(set_f==7)     //設置定時起始時間——時      
  462.                         {
  463.                                 if(ds[0]<23)
  464.                                         ds[0]++;  
  465.                                 else
  466.                                         ds[0]=0;                       
  467.                         }
  468.        
  469.                         if(set_f==8)    //設置定時起始時間——分        
  470.                         {
  471.                                 if(ds[1]<59)
  472.                                         ds[1]++;  
  473.                                 else
  474.                                         ds[1]=0;                 
  475.                         }

  476.                         if(set_f==9)     //設置定時結束時間——時      
  477.                         {
  478.                                 if(ds[2]<23)
  479.                                         ds[2]++;  
  480.                                 else
  481.                                         ds[2]=0;                       
  482.                         }
  483.        
  484.                         if(set_f==10)    //設置定時結束時間——分        
  485.                         {
  486.                                 if(ds[3]<59)
  487.                                         ds[3]++;  
  488.                                 else
  489.                                         ds[3]=0;                 
  490.                         }
  491.                         if(set_f==11)    //設置 光強上限值
  492.                         {
  493.                                 if(light_up<99)//最大值可設置99%
  494.                                         light_up++;//光強上限值+1%
  495.                         }
  496.        
  497.                         if(set_f==12)    //設置 光強下限值
  498.                         {
  499.                                 if(light_down<99&&light_down+1<light_up)//最大值可設置99%,并且下限不能超過上限
  500.                                         light_down++;//光強下限值+1%
  501.                         }
  502.                 }
  503.                 else
  504.                         if((hw_data=='+'||key_jia==0)&&set_f==0&&mode==0)//手動控制窗簾打開
  505.                         {         
  506.                                 if(moto_state==1&&moto_f==1)//已經在控制狀態。并且控制打開
  507.                                         moto_state=2;    //停止運作
  508.                                 else
  509.                                 {
  510.                                         if(moto_num<192)//判斷是否不處于打開狀態
  511.                                         {
  512.                                                 moto_f=1;         //控制開閉窗
  513.                                                 moto_state=1;    //開啟運作
  514.                                         }
  515.                                 }
  516.                                 while(!key_jia);     //等待按鍵松開
  517.                         }       
  518.         }
  519.         //減鍵
  520.         if(hw_data=='-'||key_jian==0)
  521.         {
  522.                 delayms(7);
  523.                 if((hw_data=='-'||key_jian==0)&&set_f!=0)
  524.                 {
  525.                         if(set_f==1)         //設置年
  526.                         {
  527.                                 if(time[6]==0)                                           //判斷當前是否為00年
  528.                                         time[6]=79;                                           //如果是回到最大年份:79年
  529.                                 else
  530.                                         time[6]--;                                           //否者,年份-1
  531.                                 time[6]=(time[6]/10)*16+time[6]%10;//將年份轉換成16進制,例如:16年-->0x16                       
  532.                                 Writeds1302 (WRITE_YEA,time[6]);   //將設置好的年份寫入到DS1302存儲起來
  533.                         }
  534.        
  535.                         if(set_f==2)         //設置月,同上
  536.                         {
  537.                                 if(time[4]==1)
  538.                                         time[4]=12;
  539.                                 else
  540.                                         time[4]--;
  541.                                 time[4]=(time[4]/10)*16+time[4]%10;
  542.                                 Writeds1302 (WRITE_MONTH,time[4]);               
  543.                         }
  544.        
  545.                         if(set_f==3)        //設置日,同上
  546.                         {
  547.                                 time[3]--;
  548.                                 time[3]=(time[3]/10)*16+time[3]%10;
  549.                                 if(time[4]==1||time[4]==3||time[4]==5||time[4]==7||time[4]==8||time[4]==10||time[4]==12)
  550.                                 {
  551.                                         if(time[3]<0x01)
  552.                                                 time[3]=0x31;
  553.                                 }
  554.                                 else
  555.                                 {
  556.                                         if(time[4]==0x02)
  557.                                         {
  558.                                                 if(((!(time[6]%4) && (time[6]%100)) || !(time[6]%400))==0)
  559.                                                 {
  560.                                                         if(time[3]<0x01)
  561.                                                                 time[3]=0x28;
  562.                                                 }
  563.                                                 else
  564.                                                 {
  565.                                                         if(time[3]<0x01)
  566.                                                                 time[3]=0x29;
  567.                                                 }
  568.                                         }
  569.                                         else
  570.                                         {
  571.                                                 if(time[3]<0x01)
  572.                                                         time[3]=0x30;
  573.                                         }
  574.                                 }       
  575.                                 Writeds1302 (WRITE_DAY,time[3]);               
  576.                         }
  577.        
  578.                         if(set_f==4)        //設置時,同上
  579.                         {                       
  580.                                 if(time[2]==0)
  581.                                         time[2]=23;
  582.                                 else
  583.                                         time[2]--;
  584.                                 time[2]=(time[2]/10)*16+time[2]%10;
  585.                                 Writeds1302 (WRITE_HOUR,time[2]);               
  586.                         }
  587.        
  588.                         if(set_f==5)        //設置分,同上
  589.                         {
  590.                                 if(time[1]==0)
  591.                                         time[1]=59;
  592.                                 else
  593.                                         time[1]--;
  594.                                 time[1]=(time[1]/10)*16+time[1]%10;
  595.                                 Writeds1302 (WRITE_MINUTE,time[1]);               
  596.                         }
  597.        
  598.                         if(set_f==6)        //設置秒,同上
  599.                         {
  600.                                 if(time[0]==0)
  601.                                         time[0]=59;
  602.                                 else
  603.                                         time[0]--;
  604.                                 time[0]=(time[0]/10)*16+time[0]%10;
  605.                                 Writeds1302 (WRITE_SECOND,time[0]);                       
  606.                         }
  607.                         if(set_f==7)     //設置定時起始時間——時      
  608.                         {
  609.                                 if(ds[0]>0)
  610.                                         ds[0]--;  
  611.                                 else
  612.                                         ds[0]=23;                       
  613.                         }
  614.        
  615.                         if(set_f==8)    //設置定時起始時間——分        
  616.                         {
  617.                                 if(ds[1]>0)
  618.                                         ds[1]--;  
  619.                                 else
  620.                                         ds[1]=59;                 
  621.                         }

  622.                         if(set_f==9)     //設置定時結束時間——時      
  623.                         {
  624.                                 if(ds[2]>0)
  625.                                         ds[2]--;  
  626.                                 else
  627.                                         ds[2]=23;                       
  628.                         }
  629.        
  630.                         if(set_f==10)    //設置定時結束時間——分        
  631.                         {
  632.                                 if(ds[3]>0)
  633.                                         ds[3]--;  
  634.                                 else
  635.                                         ds[3]=59;                 
  636.                         }

  637.                         if(set_f==11)    //設置 光強上限值
  638.                         {
  639.                                 if(light_up!=0&&light_up>light_down+1)//最小值可設置成0,并且上限值要大于下限值
  640.                                         light_up--;  //光強上限值-1%
  641.                         }
  642.        
  643.                         if(set_f==12)    //設置 光強下限值
  644.                         {
  645.                                 if(light_down!=0)//最小值可設置成0
  646.                                         light_down--;//光強下限值-1%
  647.                         }
  648.                 }
  649.                 else
  650.                         if((hw_data=='-'||key_jian==0)&&set_f==0&&mode==0)//手動控制窗戶關閉
  651.                         {
  652.                                 if(moto_state==1&&moto_f==0)//已經在控制狀態。并且控制打開
  653.                                         moto_state=0;    //停止運作
  654.                                 else
  655.                                 {
  656.                                         if(moto_num>0)//判斷是否不處于打開狀態
  657.                                         {
  658.                                                 moto_f=0;         //控制開閉窗
  659.                                                 moto_state=1;    //開啟運作
  660.                                         }
  661.                                 }
  662.                                 while(!key_jian);    //等待按鍵松開       
  663.                         }
  664.         }
  665.         //紅外遙控切換模式
  666.         if(hw_data=='|'&&set_f==0)
  667.         {
  668.                 mode++;                                                        //模式變量+1
  669.                 if(mode>=3)                                                //最大3個模式
  670.                         mode=0;                                                //重新回到第1個模式
  671.                 if(moto_state==1)                                //如果處于運轉過程中
  672.                 {
  673.                         if(moto_f==0)                                //控制步進電機關閉
  674.                                 moto_state=0;
  675.                         else                                                //控制步進電機打開
  676.                                 moto_state=2;               
  677.                 }
  678.                 EEPROM_delete(0x2400);                    //擦除扇區
  679.                 EEPROM_write(0x2400,mode);      //寫入【模式】數據保存
  680.         }

  681.         //紅外遙控切換設置上一個參數
  682.         if(hw_data=='<'&&set_f!=0)
  683.         {
  684.                 if(set_f==7||set_f==11)
  685.                 {
  686.                         LCD_write_command(0x01);    //清除屏幕顯示
  687.                         delay_n40us(100);                    //延時等待全部清除完畢
  688.                         set_f=6;
  689.                 }
  690.                 else
  691.                         if(set_f==1)
  692.                         {
  693.                                 LCD_write_command(0x01);//清除屏幕顯示
  694.                                 delay_n40us(100);                //延時等待全部清除完畢
  695.                                 switch(mode)//根據對應的模式,設置對應的參數
  696.                                 {
  697.                                         case 0: set_f=6; break;        //手動模式
  698.                                         case 1: set_f=10; break;//定時模式
  699.                                         case 2: set_f=12; break;//光控模式
  700.                                         default: break;
  701.                                 }
  702.                         }
  703.                         else
  704.                                 set_f--;
  705.         }

  706.         //紅外遙控切換設置下一個參數
  707.         if(hw_data=='>'&&set_f!=0)
  708.         {
  709.                 if(set_f==6)                                //日期、時間校準完
  710.                 {
  711.                         LCD_write_command(0x01);//清除屏幕顯示
  712.                         delay_n40us(100);                //延時等待全部清除完畢
  713.                         set_f=13;                                //跳到校準窗簾狀態
  714.                 }
  715.                 else
  716.                         if(set_f==10||set_f==12)
  717.                         {
  718.                                 LCD_write_command(0x01);     //清除屏幕顯示
  719.                                 delay_n40us(100);                     //延時等待全部清除完畢
  720.                                 set_f=1;                                         //進入校準時間
  721.                         }
  722.                          else
  723.                                 set_f++;                                         //設置變量+1
  724.                 if(set_f>12)
  725.                 {
  726.                         Writeds1302 (WRITE_PROTECT,0X00);//禁止DS1302寫保護
  727.                         LCD_write_command(0x01);         //清除屏幕顯示
  728. ……………………

  729. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
基于單片機的智能窗簾.7z (8.65 MB, 下載次數: 191)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
久久日韩粉嫩一区二区三区| 久久久久中文字幕| 亚洲自啪免费| 人人超在线公开视频| 在线亚洲日本| 美国黄色特级片| 99久re热视频精品98| 欧美精品生活片| 亚洲免费在线视频| 久久精品久久久| 宅男在线观看免费高清网站| 男女视频免费网站| 日韩亚洲欧美中文字幕| 欧美日韩精品不卡| 有码中文亚洲精品| 国产精品久久看| 欧美黄色一级视频| 久草在线中文最新视频| 欧美性性性性性ⅹxxbbbb| 日韩一级av毛片| 丁香花在线影院观看在线播放| 日本久久91av| 91精品国产综合久久久久久 | 欧美最新另类人妖| 免费黄色在线| www视频免费看| www.久久色| ass极品国模人体欣赏| 又大又硬又爽免费视频| 成人女保姆的销魂服务| 亚洲一区二区久久久| 97久久精品一区二区三区的观看方式 | а√在线中文在线新版| 超级碰碰视频| 天天操天天操天天干| 三级在线观看免费大全| 91女神在线观看| 亚洲欧美国产不卡| 国产裸体写真av一区二区| 国产午夜精品美女视频明星a级| 亚洲一区二区在线免费观看视频| 国产精品综合久久| 成人香蕉社区| 欧美大胆的人体xxxx| 激情六月婷婷| 一道精品视频一区二区三区男同 | 美女爽到呻吟久久久久| 欧美三级午夜理伦三级小说| 97超碰免费在线| 青青免费在线视频| 成人免费xx| 久久久9999久久精品小说| 亚洲 欧美 中文字幕| 国产suv精品一区二区| 国产香蕉一区二区三区在线视频| 欧美午夜片在线看| 中文字幕日韩精品一区 | 成年人小视频在线观看| 男人天堂1024| 亚洲欧洲另类精品久久综合| 国产中文字幕日韩| 欧美激情成人在线视频| 亚洲欧美日韩网| 日韩一区二区免费在线电影| 亚洲视频1区2区| 99久久精品国产网站| 日本最新不卡在线| 在线看片日韩| 亚洲大全视频| 日韩成人综合| 啪啪国产精品| 亚洲精品视频一二三区| 伊人久久国产| 国产在线一区二区视频| 亚洲成人影院在线观看| www.久草.com| 黄色动漫免费网站| 中国女人内谢25xxxxx| 中文字幕人成高清视频| www日本高清视频| 中文字幕激情视频| 日韩免费黄色片| 国产精品久久久精品四季影院| 天天综合成人网| 能看的毛片网站| 青青草原av在线播放| 国产精品无码电影在线观看| 一区二区三区在线视频111| 精品一区国产| 女人一区二区三区| 久久青青草原| 日韩电影免费观看高清完整| 欧美日韩最好看的视频| 久久伦理网站| 欧美另类视频在线| 欧美日韩电影一区二区三区| 麻豆亚洲一区| 神马影院午夜我不卡影院| 九九99玖玖| 好吊色欧美一区二区三区四区| 亚洲最大福利网| 999热视频在线观看| 91手机视频在线观看| 成人福利网站在线观看| 91亚洲国产成人精品性色| 91精品啪在线观看麻豆免费| 91精品视频网站| 国产精品对白一区二区三区| 久久精品ww人人做人人爽| 精品国产一区二区三区四区精华 | 91精彩视频在线观看| 北条麻妃在线| 久久五月精品| 深夜在线视频| 亚洲日韩中文字幕一区| 激情久久免费视频| 西野翔中文久久精品国产| 狠狠综合久久av一区二区蜜桃| 欧美一级淫片| 亚洲麻豆视频| 久久精品国产成人一区二区三区| 国产精品影视在线| 92国产精品观看| 中文字幕一区二区三区在线观看| 亚洲乱码国产乱码精品精的特点| 午夜a成v人精品| 在线观看视频一区二区欧美日韩| 日韩视频国产视频| 亚洲欧美色婷婷| 韩剧1988免费观看全集| 成人福利在线观看| 日韩高清av电影| 黄色一级视频在线播放| 日本中文字幕影院| 男生裸体视频网站| 久久久综合久久| 国产免费黄色片| 日本欧美黄色| 成人免费在线观看网站| 免费看美女隐私的视频| 在线激情免费视频| 成人性生交大片免费观看网站| 91在线电影| 成人免费在线| 精品69视频一区二区三区| 日韩美女精品| 免费视频一区二区三区在线观看| 国产91精品久久久久久久网曝门| 国产精品久久久久久久久快鸭 | 欧美在线一级视频| 精品无人区一区二区三区竹菊 | 国产精品一区免费在线| 日韩成人免费| 国产综合成人久久大片91| 日本一区二区三级电影在线观看| 欧美日韩国产中字| 亚洲精品在线看| 国产不卡在线观看| 五月天国产一区| 爱豆国产剧免费观看大全剧苏畅 | 欧美人与性动交| 成人综合色站| av网站在线观看不卡| 精品夜夜澡人妻无码av| 天天射天天干天天| 国产精品臀控福利在线观看| 在线观看午夜看亚太视频| 黄色aa久久| 日韩精品网站| 福利视频网站一区二区三区| 五月婷婷欧美视频| 亚洲欧美日韩区| 成人精品在线观看| www在线观看免费| 无码h肉动漫在线观看| 在线观看中文字幕码| 你懂得视频网站| 国产一区久久精品| 婷婷精品在线观看| 国产原创一区二区三区| 精品久久久久久亚洲精品| 揄拍成人国产精品视频| 国产精品有限公司| 在线观看免费不卡av| 久久夜色精品亚洲| 91在线地址| 在线观看男女av免费网址| 国产成人精品999在线观看| 国产一区二区免费看| 色综合久久久久久久久| 欧美国产一区二区三区| 一区二区三区我不卡| 亚洲a v网站| 国产精品国产一区二区三区四区| 俺去啦最新官网| 国产91足控脚交在线观看| 欧美色图在线播放| 国产成人a级片| 制服丝袜日韩国产| 国产免费亚洲高清| 久久久久久香蕉| 在线观看日韩中文字幕| xfplay资源站夜色先锋5566| 蜜桃av在线播放| 色喇叭免费久久综合网| 久久久噜噜噜久久人人看 | 国产一级特黄a大片99| 日韩精品一区二区三区不卡| 久久黄色免费视频| 国产精品一区牛牛影视| 亚洲婷婷噜噜| 亚洲高清在线| 日韩欧美国产黄色| 日韩美女福利视频| 日本xxxxxxx免费视频| 老熟妇一区二区三区| eeuss鲁片一区| 美女国产精品久久久| 国产一区二区三区黄视频| 4438成人网| 国产精品乱码视频| 一区二区三区少妇| 四虎影视最新网址| 成人bbav| 韩国午夜理伦三级不卡影院| 欧美一级片免费看| 国产精品一区二区免费| 鲁大师私人影院在线观看| 日韩专区第一页| 嫩草黄色影院| 亚洲男人在线| 国产成人小视频| 日韩欧美精品在线视频| 国内视频一区二区| 变态另类ts人妖一区二区| 久久精品国产免费观看99| 国产夫妻在线播放| 久草精品在线观看| 亚洲激情自拍图| 在线免费观看成人网| 成人免费区一区二区三区| 好紧好硬好湿我太爽了| 精品一区欧美| 亚洲国产欧美另类丝袜| 国产精品偷伦视频免费观看国产| 亚洲911精品成人18网站| 免费久久网站| 欧美不卡高清一区二区三区| 成人av电影在线| 久久综合久中文字幕青草| www.欧美日本| 中文字幕麻豆 | 国产美女自拍视频| 精品裸体bbb| 91色婷婷久久久久合中文| 按摩亚洲人久久| 亚洲综合色在线观看| 影音先峰男人站| 日韩性xxx| 91首页免费视频| 91精品国产高清自在线看超| 羞羞的视频在线| 欧美人乱大交xxxxx| 欧美国产视频| 国产欧美久久久精品影院| 91av在线播放视频| 日韩精品――色哟哟| 一个人看的日本免费视频| 高清日韩中文字幕| 亚洲综合视频在线观看| 亚洲xxx视频| 免费观看av网站| 黄色av免费| 欧美jizzhd精品欧美巨大免费| 欧美性少妇18aaaa视频| 92看片淫黄大片欧美看国产片| 九九九视频在线观看| jizzjizzjizzjizz日本| 日韩国产综合| 日韩欧美国产一区二区三区 | www.成人爱| 成人中文字幕合集| 午夜伦理精品一区| 免费成人深夜夜行p站| 男女羞羞电影免费观看| 日韩免费av| 91麻豆精品91久久久久同性| 日韩.欧美.亚洲| 亚洲精品卡一卡二| 在线免费看黄色| 久久精品系列| 久久成人精品视频| 亚洲中文字幕无码av| 国产剧情av在线| 夜夜嗨一区二区| 久久精品91久久久久久再现| 色悠悠在线视频| 电影天堂久久| 玖玖精品视频| 欧美成人激情图片网| 欧美日韩一区二区区| 成人免费网站视频www| 一区二区三区成人精品| 久久综合色88| 国产欧美一区二区三区在线观看视频| 日本一本草久在线中文| 激情偷乱视频一区二区三区| 国内精品久久久久影院 日本资源| 熟女俱乐部一区二区| 日本ー区在线视频| 国产高清不卡一区| 成人黄色片网站| aaaaaa毛片| 高清电影一区| 欧美日韩国产专区| 日b视频免费观看| 国产精选在线视频拍拍拍| 视频一区欧美| 日韩电影免费在线观看中文字幕| 日本一二三区在线| 欧美12一14sex性hd| 韩国欧美国产一区| 国产一区视频在线播放| 免费观看日批视频| 亚洲综合资源| 在线成人午夜影院| 天堂av手机在线| 欧美日韩在线精品一区二区三区激情综 | 国产精品18久久久| 国产精品久久激情| 欧美一区二区三区久久久| 精品三级在线| 欧美性xxxx极品高清hd直播| 激情五月宗合网| 天天碰夜夜操| 韩国v欧美v日本v亚洲v| 99久久99久久精品国产片| 亚洲精品免费在线观看视频| 免费一区二区| 久久久av一区| 精品一区二区三区人妻| 四虎4545www精品视频| 欧美图区在线视频| 一本一道久久a久久综合蜜桃| 粉嫩欧美一区二区三区| www.亚洲色图.com| 狠狠色噜噜狠狠狠狠色吗综合| 欧美一区二区三区成人片在线| 成人精品视频| 久久97精品久久久久久久不卡| 国产一级中文字幕| 精品一区二区三区免费看| 日韩高清不卡av| 动漫性做爰视频| 99tv成人影院| 亚洲男人天堂古典| 久久久久久国产精品视频| 日本中文字幕视频一区| 精品1区2区在线观看| 国产又粗又猛又爽又黄av | av手机在线播放| 亚洲欧美小说色综合小说一区| 91精品国产综合久久福利| 西西大胆午夜视频| 9999热视频在线观看| 岛国视频午夜一区免费在线观看| 天天综合网久久| av在线免费网站| 欧美日韩久久一区| 国产精品无码久久久久一区二区| 日韩脚交footjobhd| 日韩一区二区高清| 99国产精品免费| 国产乱码精品一区二区三区亚洲人 | 日本中文字幕影院| 亚洲成人三级| 精品成人在线视频| 美女少妇一区二区| 男人久久天堂| 国产视频丨精品|在线观看| 中文字幕无线码一区| 一区二区91| 国产香蕉一区二区三区| 97最新国自产拍视频在线完整在线看| 欧美一区二区三区的| 国产一级一级国产| 中日韩视频在线观看| 激情五月五月婷婷| 成人免费网址| 中文字幕av一区二区| 色婷婷视频在线| 99久久久国产精品| 97超碰人人看| 7777精品| 成人网在线免费观看| а√最新版在线天堂| 日本福利一区二区| www.国产高清| 丝袜诱惑制服诱惑色一区在线观看| 欧美大黑帍在线播放|