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

標題: 51單片機智能窗簾控制系統(tǒng)源程序與Proteus仿真圖 [打印本頁]

作者: Talon.    時間: 2021-5-23 13:18
標題: 51單片機智能窗簾控制系統(tǒng)源程序與Proteus仿真圖
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)



元件清單:
10UF電解電容    C2
47UF電解電容    C6
光敏電阻    R10
限位開關    K1, K2
微動開關    KEY1, KEY2, KEY3, KEY4, KEY5
步進電機    P1
DC-002電源插座    P2
LCD1602液晶    Q1
紅外一體接頭    Q5
10K色環(huán)電阻    R1, R4, R5, R6, R8, R9
10K電位器    R2
10k排阻    R3
雙擲開關    SW1
2Pi插針    U2
STC89C52單片機    U3
ADC0832模數(shù)轉換芯片    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;                        //計數(shù)變量
  23. uchar ds[4];            //定時控制開時、分、控制關時、分

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

  26. uint moto_num=0;  //記錄窗簾位置
  27. uchar moto_state=0;//窗簾狀態(tài),=0已經(jīng)關閉,=1處于運轉過程中,=2已經(jīng)打開
  28. bit moto_f=0;           //標記當前控制狀態(tài),=0控制關,=1控制開
  29. uchar code display_mode[3][3]={"SD\0","DS\0","GK\0"};//顯示模式
  30. /********************************************************
  31. 函數(shù)名稱:void delayms(uint ms)
  32. 函數(shù)作用:毫秒延時函數(shù)
  33. 參數(shù)說明:
  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. 函數(shù)名稱:void display(void)
  49. 函數(shù)作用:正常顯示日期、時間、光強等函數(shù)
  50. 參數(shù)說明:
  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))//判斷實際光強是否【大于等于上限 或 小于下限值】、當前處于打開狀態(tài)
  88.                 {       
  89.                         moto_f=0;         //標記當前控制窗簾關閉  
  90.                         moto_state=1;//標記窗簾處于運轉過程中
  91.                 }
  92.                 else
  93.                         if((light<light_up&&light>=light_down))//判斷實際光強是否【大于等于下限值 并且 小于上限】、當前處于關閉狀態(tài)
  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)                          //控制次數(shù)減到0時,表示窗戶已經(jīng)關閉完成
  125.                 {
  126.                         BYJ48=P2&0xf0;                  //關閉步進電機
  127.                         moto_state=0;                  //標記窗簾處于關閉狀態(tài)
  128.                         lcd1602_write_character(10,2,"ZT:OFF");
  129.                 }
  130.                 else
  131.                 {
  132.                         motor_z();                                  //步進電機正轉
  133.                         moto_num--;                                  //控制次數(shù)-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)          //控制次數(shù)加到128時,表示窗戶已經(jīng)打開完成
  141.                         {
  142.                                 BYJ48=P2&0xf0;                  //關閉步進電機
  143.                                 moto_state=2;          //標記窗簾處于打開狀態(tài)
  144.                                 lcd1602_write_character(10,2,"ZT:ON ");
  145.                         }
  146.                         else
  147.                         {
  148.                                 motor_f();                          //步進電機反轉
  149.                                 moto_num++;                          //控制次數(shù)+1
  150.                                 lcd1602_write_character(10,2,"-->ON ");
  151.                         }               
  152.                 }
  153.                 else                                          //窗戶處于停止狀態(tài)
  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. 函數(shù)名稱:void display2(void)
  165. 函數(shù)作用:顯示調整日期、時間函數(shù)
  166. 參數(shù)說明:
  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)        //偶數(shù)次顯示,奇數(shù)次不顯示。這樣就會有閃爍效果,可以清楚看到當前設置的是哪個值
  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                        //奇數(shù)次不顯示
  195.         {
  196.                 switch(set_f)//根據(jù)當前設置的內容,對應位置閃爍
  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. 函數(shù)名稱:void display3(void)
  210. 函數(shù)作用:顯示調整定時時間函數(shù)
  211. 參數(shù)說明:
  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)        //偶數(shù)次顯示,奇數(shù)次不顯示。這樣就會有閃爍效果,可以清楚看到當前設置的是哪個值
  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                         //奇數(shù)次不顯示
  232.         {
  233.                 switch(set_f)//根據(jù)當前設置的內容,對應位置閃爍
  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. 函數(shù)名稱:void display4(void)
  245. 函數(shù)作用:顯示調整光強控制函數(shù)
  246. 參數(shù)說明:
  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)        //偶數(shù)次顯示,奇數(shù)次不顯示。這樣就會有閃爍效果,可以清楚看到當前設置的是哪個值
  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                           //奇數(shù)次不顯示
  266.         {
  267.                 switch(set_f)//根據(jù)當前設置的內容,對應位置閃爍
  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. 函數(shù)名稱:void scan(void)
  277. 函數(shù)作用:按鍵查詢處理函數(shù)
  278. 參數(shù)說明:
  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;                                //跳到校準窗簾狀態(tài)
  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)//根據(jù)對應的模式,設置對應的參數(shù)
  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);                                  //擦除扇區(qū)
  324.                                 EEPROM_write(0x2200,ds[0]);     //寫入【定時時間】數(shù)據(jù)保存
  325.                                 EEPROM_write(0x2210,ds[1]);     //寫入【定時時間】數(shù)據(jù)保存存
  326.                                 EEPROM_write(0x2220,ds[2]);     //寫入【定時時間】數(shù)據(jù)保存存
  327.                                 EEPROM_write(0x2230,ds[3]);     //寫入【定時時間】數(shù)據(jù)保存存
  328.                                 EEPROM_write(0x2240,light_up);  //寫入【光強上限值】數(shù)據(jù)保存
  329.                                 EEPROM_write(0x2250,light_down);//寫入【光強下限值】數(shù)據(jù)保存

  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);                                  //擦除扇區(qū)
  350.                         EEPROM_write(0x2200,ds[0]);     //寫入【定時時間】數(shù)據(jù)保存
  351.                         EEPROM_write(0x2210,ds[1]);     //寫入【定時時間】數(shù)據(jù)保存存
  352.                         EEPROM_write(0x2220,ds[2]);     //寫入【定時時間】數(shù)據(jù)保存存
  353.                         EEPROM_write(0x2230,ds[3]);     //寫入【定時時間】數(shù)據(jù)保存存
  354.                         EEPROM_write(0x2240,light_up);  //寫入【光強上限值】數(shù)據(jù)保存
  355.                         EEPROM_write(0x2250,light_down);//寫入【光強下限值】數(shù)據(jù)保存

  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);                    //擦除扇區(qū)
  373.                                 EEPROM_write(0x2400,mode);      //寫入【模式】數(shù)據(jù)保存               
  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月,需要區(qū)分閏、平年
  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)//已經(jīng)在控制狀態(tài)。并且控制打開
  507.                                         moto_state=2;    //停止運作
  508.                                 else
  509.                                 {
  510.                                         if(moto_num<192)//判斷是否不處于打開狀態(tài)
  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)//已經(jīng)在控制狀態(tài)。并且控制打開
  653.                                         moto_state=0;    //停止運作
  654.                                 else
  655.                                 {
  656.                                         if(moto_num>0)//判斷是否不處于打開狀態(tài)
  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);                    //擦除扇區(qū)
  679.                 EEPROM_write(0x2400,mode);      //寫入【模式】數(shù)據(jù)保存
  680.         }

  681.         //紅外遙控切換設置上一個參數(shù)
  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)//根據(jù)對應的模式,設置對應的參數(shù)
  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.         //紅外遙控切換設置下一個參數(shù)
  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;                                //跳到校準窗簾狀態(tài)
  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, 下載次數(shù): 191)








歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 97精品一区二区 | 九九热最新视频 | 香蕉av免费| 午夜成人在线视频 | 免费高清av | 五月天婷婷综合 | 精品国产乱码久久久久久蜜柚 | 久久久久久国产精品免费免费 | 久久99精品久久久久婷婷 | 久久小视频 | 成人毛片视频免费 | 日韩综合在线 | 性视频网 | 欧美在线一区二区三区 | 国产高清视频 | 国产片侵犯亲女视频播放 | 国产精品久久久久久久久久免费看 | 欧美不卡一区 | 国产精品乱码一区二三区小蝌蚪 | 午夜爽爽爽男女免费观看影院 | 国产黄色精品 | 亚洲精品一区二区 | 欧美视频成人 | 亚洲国产高清高潮精品美女 | 国产中文字幕亚洲 | 日本在线视 | 男女羞羞视频在线看 | av在线亚洲天堂 | 黄色av网站在线观看 | 激情 婷婷 | 成人亚洲视频 | 一区二区三区久久久 | 国产免费va | 亚洲国产精品久久 | 欧美人妇做爰xxxⅹ性高电影 | 综合久久综合久久 | 久久久久久免费免费 | 亚洲视频第一页 | 欧美在线观看一区 | 成年人在线观看 | 99精品一区二区三区 |