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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)



元件清單:
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 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
亚洲电影男人天堂| 亚洲最大av网站| 亚洲精品久久久久久久久久久久| 精品视频在线免费| 岛国av一区二区在线在线观看| 亚洲色图都市小说| 亚洲国产精品ⅴa在线观看| av资源网一区| 久久综合色之久久综合| 国产成人综合亚洲网站| 蜜臀99久久精品久久久久久软件| 日本人妖一区二区| 日本不卡视频在线| 美女任你摸久久| 国产一区二区三区视频在线播放| 韩国三级在线一区| 成人免费看视频| 四虎精品在线观看| 精品91福利视频| 国产精品巨作av| 国产一区99| 欧美久久九九| 日本在线不卡一区| 国产成人免费视频网站 | 亚洲女同性videos| 亚洲小视频在线| 久久伊人91精品综合网站| 久久人91精品久久久久久不卡| 97国产一区二区精品久久呦| 国产不卡精品视男人的天堂| 91久久精品国产| 欧美二区三区| 丁香色欲久久久久久综合网| 无码播放一区二区三区| 精品久久久久久久免费人妻| 五月婷婷丁香综合网| 91香蕉视频免费看| 51妺嘿嘿午夜福利| 成人毛片18女人毛片| av一级黄色片| 国产精品不卡一区二区三区在线观看| jizzjizzjizzjizzjizzjizzjizz| 午夜影院免费| 国内外成人免费激情在线视频网站| 91美女免费看| 欧美性猛片aaaaaaa做受| 91豆麻精品91久久久久久| 欧美日本国产视频| 亚洲欧洲在线视频| 韩国19禁主播vip福利视频| 欧美一区在线直播| 国产精品免费观看高清| youjizz.com亚洲| 日韩有码免费视频| 风间由美一二三区av片| 在线免费日韩av| 99久久免费国产精精品| 韩国av在线播放| 秋霞福利视频| 欧美卡一卡二| 99re8这里有精品热视频免费| 99久久久久国产精品| 免费欧美在线视频| 国产精品亲子伦对白| 日韩一级免费| 国产成人精品免费一区二区| 一区二区三区**美女毛片| 欧美一区二区三区在线视频| 久久手机免费视频| 亚洲bt天天射| 加勒比成人在线| 日韩网站在线播放| 国产精品51麻豆cm传媒| 国产一线天粉嫩馒头极品av| 秋霞福利视频| 成av人片在线观看www| 亚洲精品无吗| 日本成人在线视频网站| 国产精品美女久久久久久久久久久| 日本韩国视频一区二区| 日韩中文字幕国产| 91夜夜揉人人捏人人添红杏| 欧美视频在线第一页| 丰满少妇xbxb毛片日本| 天天操天天爽天天干| 蜜桃色永久入口| 在线资源免费观看| 国产黄色精品| 亚洲美女色禁图| 国产精品福利一区二区三区| 欧美绝品在线观看成人午夜影视| 久久av资源网站| 精品一卡二卡三卡四卡日本乱码 | 999久久久91| 国内精品免费在线观看| 亚洲综合无码一区二区| 亚洲欧美成人网| 91在线视频精品| 男女午夜激情视频| 免费一级片视频| 天堂tv亚洲tv日本tv欧美人tv| 在线观看一二三区| 色多多视频网站| 污视频网站免费在线观看| 欧美日韩破处| 国产91精品在线观看| 欧美日本精品一区二区三区| 国产福利视频一区| 免费在线观看视频a| 一级黄色片日本| 人xxxx性xxxxx欧美| 91最新在线| 欧美日韩一二三四| 久久欧美中文字幕| 亚洲精品视频在线播放| 国产精品乱码| 动漫美女无遮挡免费| 国产按摩一区二区三区| 国产美女极品在线| 亚洲无线观看| 国产91在线看| 欧美精品一区二区三区很污很色的| 国产一区二区香蕉| 热久久久久久久久| 99在线观看免费| 中文在线播放| 中日韩免视频上线全都免费| 91尤物视频在线观看| 亚洲精品wwww| 鲁鲁狠狠狠7777一区二区| 中文字幕人妻一区二区三区| 女人18毛片水真多18精品| 国产黄在线看| 97精品视频在线看| 亚洲一区二区视频在线观看| 久久久久久久久综合| 久久久久久免费看| 国产精品熟女视频| 一本到av在线| 欧美综合视频| 亚洲欧洲一区二区在线播放| 欧美另类xxx| 一区二区传媒有限公司| 波多野结衣视频在线观看| 日本韩国福利视频| 无码少妇一区二区三区| 国产精品美女视频| 午夜精品久久久久久久男人的天堂 | 亚洲精品小区久久久久久| japanese色系久久精品| proumb性欧美在线观看| 中文字幕在线精品| 99久久久精品视频| 无码无套少妇毛多18pxxxx| 久草在线看片| 99re66热这里只有精品8| 一卡二卡三卡日韩欧美| 日本高清+成人网在线观看| 欧洲美女亚洲激情| 四虎www4hu永久免费| 日韩av影片| 国产乱码精品一区二区三区五月婷| 欧美精品一区二区三区蜜桃| 在线不卡日本| 无码久久精品国产亚洲av影片| 日本天堂影院在线视频| 韩国自拍一区| 欧美一区二区三区免费大片| 亚洲国产一区二区精品视频| 91香蕉在线视频| 亚洲图片123| 日韩视频一区| 亚洲国产精品人久久电影| 咪咪色在线视频| 在线观看国产精品入口男同| 激情在线小视频| 精品一区二区三区免费观看| 中文字幕在线观看日韩| 九九视频精品在线观看| 中文一区在线观看| 91精品亚洲一区在线观看| 欧美国产视频在线| 国产成人精品一区二区在线| 受虐m奴xxx在线观看| eeuss影院www影院| 日本久久一二三四| 欧美人妖巨大在线| 熟女熟妇伦久久影院毛片一区二区| 久久国产香蕉视频| 性欧美高清come| 国产成人av一区二区| 欧美高跟鞋交xxxxxhd| 一本之道在线视频| 黄色网址网站在线观看| 免费欧美激情| 欧美日韩亚洲丝袜制服| 91视频成人免费| 好男人www在线视频| 尤物视频网站| 国产一区二区三区日韩精品| 在线免费观看日本欧美| 亚洲春色在线视频| 99久久久久久久| 成人午夜亚洲| 亚洲综合区在线| 欧美一区二区三区四区五区六区 | 久久国产一区二区三区| 欧美日韩一区二区区| 黄色网免费观看| 中文精品久久| 精品无人区太爽高潮在线播放 | 国产精品美女久久久久久不卡| 在线观看成人小视频| 一区二区三区一级片| 高h放荡受浪受bl| 国产一区二区三区国产精品| 午夜久久电影网| 日产中文字幕在线精品一区| 国产成人免费看一级大黄| 欧美一级免费| 精品久久久久久久久久久久久| 亚洲第一导航| 影音先锋一区二区资源站| 福利在线一区| 欧美精品777| 可以在线看的黄色网址| 免费人成福利播放| 亚洲福利久久| 欧美插天视频在线播放| 一级黄色片毛片| 原千岁中文字幕| 韩国毛片一区二区三区| 国产精品爽爽爽| 国产黄色免费视频| 伊人久久大香伊蕉在人线观看热v| 日韩欧美国产视频| 少妇高潮喷水在线观看| 黄网站网址视频| 免费一区视频| 2020欧美日韩在线视频| 日本一二三区不卡| 欧美理论影院| 欧美日韩亚洲精品一区二区三区| 精品嫩模一区二区三区| 顶级欧美妇高清xxxxx| 成人在线播放视频| 久久综合色一综合色88| 欧美国产综合视频| 男人的天堂va免费视频| 日韩成人精品一区| 日韩在线免费视频观看| 国产视频不卡在线| 国产中文在线播放| 日韩欧美国产中文字幕| 欧美在线观看视频网站| 日本aa大片在线播放免费看| 国产成人精品亚洲日本在线桃色| 国产精品一区二区免费看| 精品人妻午夜一区二区三区四区| 日韩欧美在线精品| 尤物精品国产第一福利三区| а天堂中文在线资源| 黄色在线网站噜噜噜| 色天使久久综合网天天| 亚洲色图 在线视频| 大地资源高清播放在线观看| 91视频观看视频| 日韩在线导航| 免费能直接在线观看黄的视频| 久久久久.com| 成人羞羞国产免费| 亚洲黄色片视频| 午夜欧美在线| 97国产精品人人爽人人做| 制服丝袜在线一区| 外国成人在线视频| 久久久www成人免费精品张筱雨| 九九视频在线免费观看| 高清不卡一区| 日韩电影中文字幕一区| 女同久久另类69精品国产| 香蕉视频亚洲一级| 精品国产1区二区| av在线免费播放网址| 99久久er| 亚洲精品成人久久电影| 日日噜噜夜夜狠狠久久波多野| av在线不卡精品| 亚洲成人激情在线| 欧美激情精品久久久久久免费| 久久久人成影片一区二区三区在哪下载| 欧美绝品在线观看成人午夜影视| 日本免费福利视频| 日韩在线短视频| 亚洲精品一二区| 日产欧产va高清| 亚洲自拍都市欧美小说| 久久久久久久久久国产| 国产视频在线观看免费| 红桃视频亚洲| 91在线观看免费高清| 国产黄色麻豆视频| 国产a区久久久| 国内自拍中文字幕| 在线影视一区| 欧美午夜美女看片| 免费看黄色片的网站| 成人亚洲欧美| 国产亚洲欧美日韩美女| jizz国产在线| 欧美国产激情| 色婷婷精品大在线视频| 催眠调教后宫乱淫校园| 成人开心激情| 中文字幕日韩视频| 国产精品久久久久久久一区二区| 欧美久久视频| 精品国产一区二区三区四区vr | 日韩欧美激情一区二区| 91xxxxx| 亚洲日本在线观看| 成人欧美精品一区二区| 高清成人在线| 久久成人人人人精品欧| 国产wwwwwww| 免费观看成人鲁鲁鲁鲁鲁视频| 涩涩涩999| 在线观看av网| 在线看不卡av| 韩国一级黄色录像| 欧美猛男男男激情videos| 国产精品一区专区欧美日韩| 91成品视频入口| 国产精品日韩成人| 国产国语老龄妇女a片| 日韩深夜福利网站| 久久全国免费视频| 欧美性巨大欧美| 久久综合九色综合欧美就去吻| 亚洲最大综合网| 中文在线中文资源| 日韩小视频在线观看| 色窝窝无码一区二区三区| 国产黄人亚洲片| 成人免费视频久久| 亚洲四虎影院| 国内精品久久久久久中文字幕| 欧美最猛性xxxx免费| 国产午夜精品在线观看| 秘密基地免费观看完整版中文| 精品一区二区三区视频在线播放| 青青在线视频一区二区三区| 在线观看免费电影| 一区二区三区在线播| 国产99在线 | 亚洲| 99久久影视| 亚洲精品影院| 成人高清免费在线| 日韩在线视频免费观看高清中文| 亚洲欧洲国产综合| 久久久激情视频| 人妻av一区二区| 蜜桃国内精品久久久久软件9| 国产精品国产三级国产专区53| 天堂影视av| 日韩欧美激情一区| 一二三四区视频| 国产一区二区调教| 91精品国产三级| 国产精品久av福利在线观看| **亚洲第一综合导航网站| 116美女写真午夜一级久久| 日韩一区二区在线观看视频播放| 一级黄色大片网站| 成人精品亚洲人成在线| 国产主播精品在线| 国产专区视频| 88在线观看91蜜桃国自产| 中文字幕在线日亚洲9| 国产专区综合网| 能看毛片的网站| 一道本一区二区三区| 视频一区二区三区免费观看| 麻豆网站在线观看| 欧美www在线| 黄色免费大片| 欧美午夜电影网| 中文字幕人妻一区二区三区视频| 国产91在线观看| 双性尿奴穿贞c带憋尿| 亚洲欧美网站在线观看| 欧洲xxxxx| 日韩护士脚交太爽了| 超碰国产精品久久国产精品99| sese一区| 91精品国产高清久久久久久91 | 中文字幕一区二| 欧美高清视频一区二区三区| 日韩主播视频在线| 无套白嫩进入乌克兰美女|