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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6382|回復(fù): 0
收起左側(cè)

51單片機(jī)智能窗簾控制系統(tǒng)源程序與Proteus仿真圖

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

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

單片機(jī)源程序如下:
  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;         //設(shè)置鍵
  12. sbit key_jia  = P1^1;         //加值鍵
  13. sbit key_jian = P1^2;         //減值鍵
  14. sbit key_ok   = P1^3;         //確定鍵

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

  22. uchar num;                        //計數(shù)變量
  23. uchar ds[4];            //定時控制開時、分、控制關(guān)時、分

  24. uchar mode=0;                //模式標(biāo)記。=0手動,=1定時,=2光控
  25. uchar light;        //存儲光強(qiáng)

  26. uint moto_num=0;  //記錄窗簾位置
  27. uchar moto_state=0;//窗簾狀態(tài),=0已經(jīng)關(guān)閉,=1處于運(yùn)轉(zhuǎn)過程中,=2已經(jīng)打開
  28. bit moto_f=0;           //標(biāo)記當(dāng)前控制狀態(tài),=0控制關(guān),=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ù)作用:正常顯示日期、時間、光強(qiáng)等函數(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行,所有關(guān)于顯示都一樣】
  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行,所有關(guān)于顯示都一樣】
  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.         //顯示光強(qiáng)
  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.         //光強(qiáng)控制
  85.         if(mode==2)//光控模式
  86.         {         
  87.                 if((light>=light_up||light<light_down))//判斷實(shí)際光強(qiáng)是否【大于等于上限 或 小于下限值】、當(dāng)前處于打開狀態(tài)
  88.                 {       
  89.                         moto_f=0;         //標(biāo)記當(dāng)前控制窗簾關(guān)閉  
  90.                         moto_state=1;//標(biāo)記窗簾處于運(yùn)轉(zhuǎn)過程中
  91.                 }
  92.                 else
  93.                         if((light<light_up&&light>=light_down))//判斷實(shí)際光強(qiáng)是否【大于等于下限值 并且 小于上限】、當(dāng)前處于關(guān)閉狀態(tài)
  94.                         {
  95.                                 moto_f=1;         //標(biāo)記當(dāng)前控制窗簾打開  
  96.                                 moto_state=1;//標(biāo)記窗簾處于運(yùn)轉(zhuǎn)過程中
  97.                         }
  98.         }
  99.         else
  100.                 if(mode==1)//定時模式
  101.                 {
  102.                         t[0]=time[2]*60+time[1];//當(dāng)前時間
  103.                         t[1]=ds[0]*60+ds[1];        //窗簾開啟時間點(diǎn)
  104.                         t[2]=ds[2]*60+ds[3];        //窗簾關(guān)閉時間點(diǎn)
  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;            //標(biāo)記當(dāng)前需要打開窗簾
  110.                                 else
  111.                                         moto_f=0;                //標(biāo)記當(dāng)前需要關(guān)閉窗簾
  112.                         }
  113.                         else                                        //0時 --> t[2] --> t[1] --> 24時
  114.                         {
  115.                                 if(t[0]>=t[1]||t[0]<=t[2])
  116.                                         moto_f=1;                //標(biāo)記當(dāng)前需要打開窗簾
  117.                                 else
  118.                                         moto_f=0;                //標(biāo)記當(dāng)前需要關(guān)閉窗簾
  119.                         }
  120.                         moto_state=1;          //標(biāo)記窗簾處于運(yùn)轉(zhuǎn)過程中
  121.                 }
  122.         if(moto_f==0&&moto_state!=0&&sw2!=0)//控制關(guān)閉窗簾
  123.         {
  124.                 if(moto_num==0)                          //控制次數(shù)減到0時,表示窗戶已經(jīng)關(guān)閉完成
  125.                 {
  126.                         BYJ48=P2&0xf0;                  //關(guān)閉步進(jìn)電機(jī)
  127.                         moto_state=0;                  //標(biāo)記窗簾處于關(guān)閉狀態(tài)
  128.                         lcd1602_write_character(10,2,"ZT:OFF");
  129.                 }
  130.                 else
  131.                 {
  132.                         motor_z();                                  //步進(jìn)電機(jī)正轉(zhuǎn)
  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;                  //關(guān)閉步進(jìn)電機(jī)
  143.                                 moto_state=2;          //標(biāo)記窗簾處于打開狀態(tài)
  144.                                 lcd1602_write_character(10,2,"ZT:ON ");
  145.                         }
  146.                         else
  147.                         {
  148.                                 motor_f();                          //步進(jìn)電機(jī)反轉(zhuǎn)
  149.                                 moto_num++;                          //控制次數(shù)+1
  150.                                 lcd1602_write_character(10,2,"-->ON ");
  151.                         }               
  152.                 }
  153.                 else                                          //窗戶處于停止?fàn)顟B(tài)
  154.                 {
  155.                         BYJ48=P2&0xf0;                  //關(guān)閉步進(jìn)電機(jī)
  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ù)作用:顯示調(diào)整日期、時間函數(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ù)次不顯示。這樣就會有閃爍效果,可以清楚看到當(dāng)前設(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ù)當(dāng)前設(shè)置的內(nèi)容,對應(yīng)位置閃爍
  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ù)作用:顯示調(diào)整定時時間函數(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ù)次不顯示。這樣就會有閃爍效果,可以清楚看到當(dāng)前設(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]); //顯示定時關(guān)-時
  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]); //顯示定時關(guān)-分
  229.                 LCD_disp_char(14, 2, ASCII[ds[3]%10]);
  230.         }
  231.         else                         //奇數(shù)次不顯示
  232.         {
  233.                 switch(set_f)//根據(jù)當(dāng)前設(shè)置的內(nèi)容,對應(yīng)位置閃爍
  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ù)作用:顯示調(diào)整光強(qiáng)控制函數(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ù)次不顯示。這樣就會有閃爍效果,可以清楚看到當(dāng)前設(shè)置的是哪個值
  256.         {
  257.                 LCD_disp_char(12, 1, ASCII[light_up/100]);           //顯示光強(qiáng)上限值
  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]);   //顯示光強(qiáng)下限值
  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ù)當(dāng)前設(shè)置的內(nèi)容,對應(yīng)位置閃爍
  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.         //設(shè)置鍵
  283.         if(hw_data=='B'||key_mode==0)      //按鍵按下
  284.         {  
  285.                 delayms(7);                                            //延時消抖
  286.                 if(hw_data=='B'||key_mode==0)  //再次確認(rèn)按鍵按下       
  287.                 {
  288.                         BYJ48=P2&0xf0;                            //關(guān)閉步進(jìn)電機(jī)
  289.                         if(set_f==6)                                //日期、時間校準(zhǔn)完
  290.                         {
  291.                                 LCD_write_command(0x01);//清除屏幕顯示
  292.                                 delay_n40us(100);                //延時等待全部清除完畢
  293.                                 set_f=13;                                //跳到校準(zhǔn)窗簾狀態(tài)
  294.                         }
  295.                         else
  296.                                 if(set_f==0)            //進(jìn)入設(shè)置先清除屏幕,顯示設(shè)置部分
  297.                                 {
  298.                                         Writeds1302 (WRITE_PROTECT,0X00);//禁止DS1302寫保護(hù)
  299.                                         LCD_write_command(0x01);         //清除屏幕顯示
  300.                                         delay_n40us(100);                         //延時等待全部清除完畢
  301.                                         switch(mode)//根據(jù)對應(yīng)的模式,設(shè)置對應(yīng)的參數(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)//進(jìn)入設(shè)置日期時間
  311.                                         {
  312.                                                 LCD_write_command(0x01);     //清除屏幕顯示
  313.                                                 delay_n40us(100);                     //延時等待全部清除完畢
  314.                                                 set_f=1;                                         //進(jìn)入校準(zhǔn)時間
  315.                                         }
  316.                                          else
  317.                                                 set_f++;                                         //設(shè)置變量+1
  318.                         if(set_f>12)
  319.                         {
  320.                                 set_f=0;                                                         //重置設(shè)置變量

  321.                                 Writeds1302 (WRITE_MINUTE,(time[1]/10)*16+time[1]%10);//將設(shè)置好的時間寫入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);  //寫入【光強(qiáng)上限值】數(shù)據(jù)保存
  329.                                 EEPROM_write(0x2250,light_down);//寫入【光強(qiáng)下限值】數(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)//再次確認(rèn)按鍵按下
  341.                 {
  342.                         if(set_f<7)
  343.                         {
  344.                                 Writeds1302 (WRITE_MINUTE,(time[1]/10)*16+time[1]%10);//將設(shè)置好的時間寫入DS1302
  345.                                 Writeds1302 (WRITE_SECOND,(time[0]/10)*16+time[0]%10);
  346.                         }
  347.                         set_f=0;                                                        //重置設(shè)置變量
  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);  //寫入【光強(qiáng)上限值】數(shù)據(jù)保存
  355.                         EEPROM_write(0x2250,light_down);//寫入【光強(qiáng)下限值】數(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)                                //如果處于運(yùn)轉(zhuǎn)過程中
  366.                                 {
  367.                                         if(moto_f==0)                                //控制步進(jìn)電機(jī)關(guān)閉
  368.                                                 moto_state=0;
  369.                                         else                                                //控制步進(jìn)電機(jī)打開
  370.                                                 moto_state=2;               
  371.                                 }
  372.                                 EEPROM_delete(0x2400);                    //擦除扇區(qū)
  373.                                 EEPROM_write(0x2400,mode);      //寫入【模式】數(shù)據(jù)保存               
  374.                         }
  375.                 while(!key_ok);                                //等待按鍵松開
  376.         }
  377.         //加鍵        ,下面減鍵內(nèi)容一樣       
  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)           //設(shè)置年
  384.                         {
  385.                                 time[6]++;                                                        //年份+1
  386.                                 time[6]=(time[6]/10)*16+time[6]%10;        //將年份轉(zhuǎn)換成16進(jìn)制,例如:16年-->0x16
  387.                                 if(time[6]>0x79)                                        //判斷是否達(dá)到最大年份79年
  388.                                         time[6]=0x00;                                        //重新回到00年
  389.                                 Writeds1302 (WRITE_YEA,time[6]);        //將設(shè)置好的年份寫入到DS1302存儲起來
  390.                         }
  391.                
  392.                         if(set_f==2)           //設(shè)置月
  393.                         {
  394.                                 time[4]++;                                                        //月份+1
  395.                                 time[4]=(time[4]/10)*16+time[4]%10;        //將月份轉(zhuǎn)換成16進(jìn)制,例如:08月-->0x08
  396.                                 if(time[4]>0x12)                                        //判斷是否達(dá)到最大月份12月
  397.                                         time[4]=0x01;                                        //重新回到01月
  398.                                 Writeds1302 (WRITE_MONTH,time[4]);        //將設(shè)置好的月份寫入到DS1302存儲起來
  399.                         }
  400.                
  401.                         if(set_f==3)         //設(shè)置日
  402.                         {
  403.                                 time[3]++;                                                        //日份+1
  404.                                 time[3]=(time[3]/10)*16+time[3]%10;        //將日份轉(zhuǎn)換成16進(jìn)制,例如: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)                                //判斷是否達(dá)到最大日份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)                //判斷是否達(dá)到最大日份28日
  417.                                                                 time[3]=0x01;                //重新回到01日
  418.                                                 }
  419.                                                 else                                                //否者平年
  420.                                                 {
  421.                                                         if(time[3]>0x29)                //判斷是否達(dá)到最大日份29日
  422.                                                                 time[3]=0x01;                //重新回到01日
  423.                                                 }
  424.                                         }
  425.                                         else                                                        //否者為剩下的月份
  426.                                         {
  427.                                                 if(time[3]>0x30)                        //判斷是否達(dá)到最大日份30日
  428.                                                         time[3]=0x01;                        //重新回到01日
  429.                                         }
  430.                                 }       
  431.                                 Writeds1302 (WRITE_DAY,time[3]);        //將設(shè)置好的日份寫入到DS1302存儲起來
  432.                         }
  433.                
  434.                         if(set_f==4)          //設(shè)置時,同上
  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)          //設(shè)置分,同上
  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)         //設(shè)置秒,同上
  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)     //設(shè)置定時起始時間——時      
  462.                         {
  463.                                 if(ds[0]<23)
  464.                                         ds[0]++;  
  465.                                 else
  466.                                         ds[0]=0;                       
  467.                         }
  468.        
  469.                         if(set_f==8)    //設(shè)置定時起始時間——分        
  470.                         {
  471.                                 if(ds[1]<59)
  472.                                         ds[1]++;  
  473.                                 else
  474.                                         ds[1]=0;                 
  475.                         }

  476.                         if(set_f==9)     //設(shè)置定時結(jié)束時間——時      
  477.                         {
  478.                                 if(ds[2]<23)
  479.                                         ds[2]++;  
  480.                                 else
  481.                                         ds[2]=0;                       
  482.                         }
  483.        
  484.                         if(set_f==10)    //設(shè)置定時結(jié)束時間——分        
  485.                         {
  486.                                 if(ds[3]<59)
  487.                                         ds[3]++;  
  488.                                 else
  489.                                         ds[3]=0;                 
  490.                         }
  491.                         if(set_f==11)    //設(shè)置 光強(qiáng)上限值
  492.                         {
  493.                                 if(light_up<99)//最大值可設(shè)置99%
  494.                                         light_up++;//光強(qiáng)上限值+1%
  495.                         }
  496.        
  497.                         if(set_f==12)    //設(shè)置 光強(qiáng)下限值
  498.                         {
  499.                                 if(light_down<99&&light_down+1<light_up)//最大值可設(shè)置99%,并且下限不能超過上限
  500.                                         light_down++;//光強(qiáng)下限值+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;    //停止運(yùn)作
  508.                                 else
  509.                                 {
  510.                                         if(moto_num<192)//判斷是否不處于打開狀態(tài)
  511.                                         {
  512.                                                 moto_f=1;         //控制開閉窗
  513.                                                 moto_state=1;    //開啟運(yùn)作
  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)         //設(shè)置年
  526.                         {
  527.                                 if(time[6]==0)                                           //判斷當(dāng)前是否為00年
  528.                                         time[6]=79;                                           //如果是回到最大年份:79年
  529.                                 else
  530.                                         time[6]--;                                           //否者,年份-1
  531.                                 time[6]=(time[6]/10)*16+time[6]%10;//將年份轉(zhuǎn)換成16進(jìn)制,例如:16年-->0x16                       
  532.                                 Writeds1302 (WRITE_YEA,time[6]);   //將設(shè)置好的年份寫入到DS1302存儲起來
  533.                         }
  534.        
  535.                         if(set_f==2)         //設(shè)置月,同上
  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)        //設(shè)置日,同上
  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)        //設(shè)置時,同上
  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)        //設(shè)置分,同上
  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)        //設(shè)置秒,同上
  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)     //設(shè)置定時起始時間——時      
  608.                         {
  609.                                 if(ds[0]>0)
  610.                                         ds[0]--;  
  611.                                 else
  612.                                         ds[0]=23;                       
  613.                         }
  614.        
  615.                         if(set_f==8)    //設(shè)置定時起始時間——分        
  616.                         {
  617.                                 if(ds[1]>0)
  618.                                         ds[1]--;  
  619.                                 else
  620.                                         ds[1]=59;                 
  621.                         }

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

  637.                         if(set_f==11)    //設(shè)置 光強(qiáng)上限值
  638.                         {
  639.                                 if(light_up!=0&&light_up>light_down+1)//最小值可設(shè)置成0,并且上限值要大于下限值
  640.                                         light_up--;  //光強(qiáng)上限值-1%
  641.                         }
  642.        
  643.                         if(set_f==12)    //設(shè)置 光強(qiáng)下限值
  644.                         {
  645.                                 if(light_down!=0)//最小值可設(shè)置成0
  646.                                         light_down--;//光強(qiáng)下限值-1%
  647.                         }
  648.                 }
  649.                 else
  650.                         if((hw_data=='-'||key_jian==0)&&set_f==0&&mode==0)//手動控制窗戶關(guān)閉
  651.                         {
  652.                                 if(moto_state==1&&moto_f==0)//已經(jīng)在控制狀態(tài)。并且控制打開
  653.                                         moto_state=0;    //停止運(yùn)作
  654.                                 else
  655.                                 {
  656.                                         if(moto_num>0)//判斷是否不處于打開狀態(tài)
  657.                                         {
  658.                                                 moto_f=0;         //控制開閉窗
  659.                                                 moto_state=1;    //開啟運(yùn)作
  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)                                //如果處于運(yùn)轉(zhuǎn)過程中
  672.                 {
  673.                         if(moto_f==0)                                //控制步進(jìn)電機(jī)關(guān)閉
  674.                                 moto_state=0;
  675.                         else                                                //控制步進(jìn)電機(jī)打開
  676.                                 moto_state=2;               
  677.                 }
  678.                 EEPROM_delete(0x2400);                    //擦除扇區(qū)
  679.                 EEPROM_write(0x2400,mode);      //寫入【模式】數(shù)據(jù)保存
  680.         }

  681.         //紅外遙控切換設(shè)置上一個參數(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ù)對應(yīng)的模式,設(shè)置對應(yīng)的參數(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è)置下一個參數(shù)
  707.         if(hw_data=='>'&&set_f!=0)
  708.         {
  709.                 if(set_f==6)                                //日期、時間校準(zhǔn)完
  710.                 {
  711.                         LCD_write_command(0x01);//清除屏幕顯示
  712.                         delay_n40us(100);                //延時等待全部清除完畢
  713.                         set_f=13;                                //跳到校準(zhǔn)窗簾狀態(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;                                         //進(jìn)入校準(zhǔn)時間
  721.                         }
  722.                          else
  723.                                 set_f++;                                         //設(shè)置變量+1
  724.                 if(set_f>12)
  725.                 {
  726.                         Writeds1302 (WRITE_PROTECT,0X00);//禁止DS1302寫保護(hù)
  727.                         LCD_write_command(0x01);         //清除屏幕顯示
  728. ……………………

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

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



評分

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

查看全部評分

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久www| 国产精品毛片一区二区三区 | 亚洲精久 | 亚洲成人在线视频播放 | 午夜精品影院 | 日韩欧美精品一区 | 羞羞的视频免费在线观看 | 国产伦精品一区二区三区照片91 | 黄色一级大片在线免费看产 | 日日日视频 | 日韩久久在线 | 精品欧美一区二区精品久久 | 在线欧美激情 | 在线视频久久 | 99reav| 久久伊| 欧美性网 | 欧美综合在线观看 | 成人在线观看亚洲 | a级毛片基地 | 在线视频亚洲 | 亚洲香蕉在线视频 | 狠狠躁躁夜夜躁波多野结依 | 五月婷婷在线播放 | 日韩在线免费观看视频 | 国产一区二区在线免费观看 | 亚洲成人免费在线 | 一区二区三区网站 | 亚洲精品乱码久久久久久蜜桃91 | 国产1区 | 国产在线对白 | 亚洲成人一区 | 久久亚洲欧美日韩精品专区 | 久久国产精品一区二区 | 亚洲天天干 | 亚洲天堂中文字幕 | 日韩一区二区三区在线播放 | 美女久久久久久久久 | 在线观看免费黄色片 | 99久久日韩精品免费热麻豆美女 | 日韩av免费看 |