|
電路原理圖如下:
智能窗簾原理圖.png (57.24 KB, 下載次數(shù): 58)
下載附件
2020-3-9 13:32 上傳
10UF電解電容 C2
47UF電解電容 C6
光敏電阻 R10
限位開關(guān) K1, K2
微動(dòng)開關(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ū)動(dòng)芯片 U5
DS1302時(shí)鐘芯片 U6
12MHZ晶振 Y1
32.768KHZ晶振 Y2
單片機(jī)源程序如下:
- /*************************************************************
- 智能窗簾
- 補(bǔ)充說明:
- ***************************************************************/
- #include<reg52.h> //頭文件
- #include<LCD1602.h>
- #include<DS1302.h>
- #include<28BYJ48.h>
- #include<EEPROM.h>
- #include<ADC0832.h>
- #include<HW.h>
- #define uchar unsigned char//宏定義
- #define uint unsigned int
- /*******************引腳定義*********************/
- sbit key_mode = P1^0; //設(shè)置鍵
- sbit key_jia = P1^1; //加值鍵
- sbit key_jian = P1^2; //減值鍵
- sbit key_ok = P1^3; //確定鍵
- sbit sw1=P3^7; //全開 限位開關(guān)
- sbit sw2=P3^6; //全關(guān) 限位開關(guān)
- /*******************變量定義*********************/
- uchar light_up,light_down;//存儲(chǔ)光強(qiáng)上、下限值
- uchar set_f=0; //設(shè)置選擇標(biāo)記,=0非設(shè)置,=1設(shè)置年,=2設(shè)置月,=3設(shè)置日,=4設(shè)置時(shí),=5設(shè)置分,=6設(shè)置秒
- // =7設(shè)置定時(shí)-時(shí),=8設(shè)置定時(shí)-分,=9設(shè)置定時(shí)-開關(guān),=10設(shè)置窗簾打開/關(guān)閉
- // =11設(shè)置光強(qiáng)上限,=12設(shè)置光強(qiáng)下限,=13設(shè)置校準(zhǔn)窗簾位置
- uchar num; //計(jì)數(shù)變量
- uchar ds[4]; //定時(shí)控制開時(shí)、分、控制關(guān)時(shí)、分
- uchar mode=0; //模式標(biāo)記。=0手動(dòng),=1定時(shí),=2光控
- uchar light; //存儲(chǔ)光強(qiáng)
- uint moto_num=0; //記錄窗簾位置
- uchar moto_state=0;//窗簾狀態(tài),=0已經(jīng)關(guān)閉,=1處于運(yùn)轉(zhuǎn)過程中,=2已經(jīng)打開
- bit moto_f=0; //標(biāo)記當(dāng)前控制狀態(tài),=0控制關(guān),=1控制開
- uchar code display_mode[3][3]={"SD\0","DS\0","GK\0"};//顯示模式
- /********************************************************
- 函數(shù)名稱:void delayms(uint ms)
- 函數(shù)作用:毫秒延時(shí)函數(shù)
- 參數(shù)說明:
- ********************************************************/
- void delayms(uint ms)
- {
- unsigned char i=100,j;
- for(;ms;ms--)
- {
- while(--i)
- {
- j=10;
- while(--j);
- }
- }
- }
- /********************************************************
- 函數(shù)名稱:void display(void)
- 函數(shù)作用:正常顯示日期、時(shí)間、光強(qiáng)等函數(shù)
- 參數(shù)說明:
- ********************************************************/
- void display(void)
- {
- uint t[3];
- //顯示時(shí)間
- LCD_disp_char(0,2,ASCII[time[2]/10]);//顯示時(shí)【0:表示第1列,2:表示第2行,所有關(guān)于顯示都一樣】
- LCD_disp_char(1,2,ASCII[time[2]%10]);
- LCD_disp_char(2,2,':');
- LCD_disp_char(3,2,ASCII[time[1]/10]);//顯示分【3:表示第4列,2:表示第2行,所有關(guān)于顯示都一樣】
- LCD_disp_char(4,2,ASCII[time[1]%10]);
- LCD_disp_char(5,2,':');
- LCD_disp_char(6,2,ASCII[time[0]/10]);//顯示秒
- LCD_disp_char(7,2,ASCII[time[0]%10]);
- //顯示日期
- LCD_disp_char(0,1,ASCII[time[6]/10]);//顯示年
- LCD_disp_char(1,1,ASCII[time[6]%10]);
- LCD_disp_char(2,1,'/');
- LCD_disp_char(3,1,ASCII[time[4]/10]);//顯示月
- LCD_disp_char(4,1,ASCII[time[4]%10]);
- LCD_disp_char(5,1,'/');
- LCD_disp_char(6,1,ASCII[time[3]/10]);//顯示日
- LCD_disp_char(7,1,ASCII[time[3]%10]);
- //顯示模式
- lcd1602_write_character(9,1,display_mode[mode]);
-
- //顯示光強(qiáng)
- if(light>99)
- LCD_disp_char(12,1,ASCII[light/100]);
- else
- LCD_disp_char(12,1,' ');
- LCD_disp_char(13,1,ASCII[light%100/10]);
- LCD_disp_char(14,1,ASCII[light%10]);
- LCD_disp_char(15,1,'%');
- //光強(qiáng)控制
- if(mode==2)//光控模式
- {
- if((light>=light_up||light<light_down))//判斷實(shí)際光強(qiáng)是否【大于等于上限 或 小于下限值】、當(dāng)前處于打開狀態(tài)
- {
- moto_f=0; //標(biāo)記當(dāng)前控制窗簾關(guān)閉
- moto_state=1;//標(biāo)記窗簾處于運(yùn)轉(zhuǎn)過程中
- }
- else
- if((light<light_up&&light>=light_down))//判斷實(shí)際光強(qiáng)是否【大于等于下限值 并且 小于上限】、當(dāng)前處于關(guān)閉狀態(tài)
- {
- moto_f=1; //標(biāo)記當(dāng)前控制窗簾打開
- moto_state=1;//標(biāo)記窗簾處于運(yùn)轉(zhuǎn)過程中
- }
- }
- else
- if(mode==1)//定時(shí)模式
- {
- t[0]=time[2]*60+time[1];//當(dāng)前時(shí)間
- t[1]=ds[0]*60+ds[1]; //窗簾開啟時(shí)間點(diǎn)
- t[2]=ds[2]*60+ds[3]; //窗簾關(guān)閉時(shí)間點(diǎn)
-
- if(t[1]<t[2]) //0時(shí) --> t[1] --> t[2] --> 24時(shí)
- {
- if(t[0]>=t[1]&&t[0]<=t[2])
- moto_f=1; //標(biāo)記當(dāng)前需要打開窗簾
- else
- moto_f=0; //標(biāo)記當(dāng)前需要關(guān)閉窗簾
- }
- else //0時(shí) --> t[2] --> t[1] --> 24時(shí)
- {
- if(t[0]>=t[1]||t[0]<=t[2])
- moto_f=1; //標(biāo)記當(dāng)前需要打開窗簾
- else
- moto_f=0; //標(biāo)記當(dāng)前需要關(guān)閉窗簾
- }
- moto_state=1; //標(biāo)記窗簾處于運(yùn)轉(zhuǎn)過程中
- }
- if(moto_f==0&&moto_state!=0&&sw2!=0)//控制關(guān)閉窗簾
- {
- if(moto_num==0) //控制次數(shù)減到0時(shí),表示窗戶已經(jīng)關(guān)閉完成
- {
- BYJ48=P2&0xf0; //關(guān)閉步進(jìn)電機(jī)
- moto_state=0; //標(biāo)記窗簾處于關(guān)閉狀態(tài)
- lcd1602_write_character(10,2,"ZT:OFF");
- }
- else
- {
- motor_z(); //步進(jìn)電機(jī)正轉(zhuǎn)
- moto_num--; //控制次數(shù)-1
- lcd1602_write_character(10,2,"-->OFF");
- }
- }
- else
- if(moto_f==1&&moto_state!=2&&sw1!=0)//控制打開窗簾
- {
- if(moto_num>=192) //控制次數(shù)加到128時(shí),表示窗戶已經(jīng)打開完成
- {
- BYJ48=P2&0xf0; //關(guān)閉步進(jìn)電機(jī)
- moto_state=2; //標(biāo)記窗簾處于打開狀態(tài)
- lcd1602_write_character(10,2,"ZT:ON ");
- }
- else
- {
- motor_f(); //步進(jìn)電機(jī)反轉(zhuǎn)
- moto_num++; //控制次數(shù)+1
- lcd1602_write_character(10,2,"-->ON ");
- }
- }
- else //窗戶處于停止?fàn)顟B(tài)
- {
- BYJ48=P2&0xf0; //關(guān)閉步進(jìn)電機(jī)
- if(moto_state==0||sw2==0)
- lcd1602_write_character(10,2,"ZT:OFF");
- else
- if(moto_state==2||sw1==0)
- lcd1602_write_character(10,2,"ZT:ON ");
- }
- }
- /********************************************************
- 函數(shù)名稱:void display2(void)
- 函數(shù)作用:顯示調(diào)整日期、時(shí)間函數(shù)
- 參數(shù)說明:
- ********************************************************/
- void display2()
- {
- num++;
- lcd1602_write_character(1,1,"Date:");
- lcd1602_write_character(1,2,"Time:");
-
- if(num%2==0) //偶數(shù)次顯示,奇數(shù)次不顯示。這樣就會(huì)有閃爍效果,可以清楚看到當(dāng)前設(shè)置的是哪個(gè)值
- {
- LCD_disp_char(6,1,ASCII[time[6]/10]); //顯示年
- LCD_disp_char(7,1,ASCII[time[6]%10]);
- LCD_disp_char(8,1,'/');
- LCD_disp_char(9,1,ASCII[time[4]/10]); //顯示月
- LCD_disp_char(10,1,ASCII[time[4]%10]);
- LCD_disp_char(11,1,'/');
- LCD_disp_char(12,1,ASCII[time[3]/10]);//顯示日
- LCD_disp_char(13,1,ASCII[time[3]%10]);
-
- LCD_disp_char(6,2,ASCII[time[2]/10]); //顯示時(shí)
- LCD_disp_char(7,2,ASCII[time[2]%10]);
- LCD_disp_char(8,2,':');
- LCD_disp_char(9,2,ASCII[time[1]/10]); //顯示分
- LCD_disp_char(10,2,ASCII[time[1]%10]);
- LCD_disp_char(11,2,':');
- LCD_disp_char(12,2,ASCII[time[0]/10]);//顯示秒
- LCD_disp_char(13,2,ASCII[time[0]%10]);
- }
- else //奇數(shù)次不顯示
- {
- switch(set_f)//根據(jù)當(dāng)前設(shè)置的內(nèi)容,對應(yīng)位置閃爍
- {
- case 1: lcd1602_write_character(6,1," "); break;
- case 2: lcd1602_write_character(9,1," "); break;
- case 3: lcd1602_write_character(12,1," "); break;
- case 4: lcd1602_write_character(6,2," "); break;
- case 5: lcd1602_write_character(9,2," "); break;
- case 6: lcd1602_write_character(12,2," "); break;
- default: break;
- }
- }
- }
- /********************************************************
- 函數(shù)名稱:void display3(void)
- 函數(shù)作用:顯示調(diào)整定時(shí)時(shí)間函數(shù)
- 參數(shù)說明:
- ********************************************************/
- void display3()
- {
- num++;
- lcd1602_write_character(0, 1, "Sets timer time:");
- lcd1602_write_character(7, 2, "--");
- if(num%2==0) //偶數(shù)次顯示,奇數(shù)次不顯示。這樣就會(huì)有閃爍效果,可以清楚看到當(dāng)前設(shè)置的是哪個(gè)值
- {
- LCD_disp_char(1, 2, ASCII[ds[0]/10]); //顯示定時(shí)開-時(shí)
- LCD_disp_char(2, 2, ASCII[ds[0]%10]);
- LCD_disp_char(3, 2, ':');
- LCD_disp_char(4, 2, ASCII[ds[1]/10]); //顯示定時(shí)開-分
- LCD_disp_char(5, 2, ASCII[ds[1]%10]);
- LCD_disp_char(10, 2, ASCII[ds[2]/10]); //顯示定時(shí)關(guān)-時(shí)
- LCD_disp_char(11, 2, ASCII[ds[2]%10]);
- LCD_disp_char(12, 2, ':');
- LCD_disp_char(13, 2, ASCII[ds[3]/10]); //顯示定時(shí)關(guān)-分
- LCD_disp_char(14, 2, ASCII[ds[3]%10]);
- }
- else //奇數(shù)次不顯示
- {
- switch(set_f)//根據(jù)當(dāng)前設(shè)置的內(nèi)容,對應(yīng)位置閃爍
- {
- case 7: lcd1602_write_character(1,2," "); break;
- case 8: lcd1602_write_character(4,2," "); break;
- case 9: lcd1602_write_character(10,2," "); break;
- case 10: lcd1602_write_character(13,2," "); break;
- default: break;
- }
- }
- }
- /********************************************************
- 函數(shù)名稱:void display4(void)
- 函數(shù)作用:顯示調(diào)整光強(qiáng)控制函數(shù)
- 參數(shù)說明:
- ********************************************************/
- void display4(void)
- {
- num++;
- lcd1602_write_character(0, 1, "Light_Up :");
- lcd1602_write_character(0, 2, "Light_Down:");
- LCD_disp_char(15,1,'%');
- LCD_disp_char(15,2,'%');
- if(num%2==0) //偶數(shù)次顯示,奇數(shù)次不顯示。這樣就會(huì)有閃爍效果,可以清楚看到當(dāng)前設(shè)置的是哪個(gè)值
- {
- LCD_disp_char(12, 1, ASCII[light_up/100]); //顯示光強(qiáng)上限值
- LCD_disp_char(13, 1, ASCII[light_up%100/10]);
- LCD_disp_char(14, 1, ASCII[light_up%10]);
-
- LCD_disp_char(12, 2, ASCII[light_down/100]); //顯示光強(qiáng)下限值
- LCD_disp_char(13, 2, ASCII[light_down%100/10]);
- LCD_disp_char(14, 2, ASCII[light_down%10]);
- }
- else //奇數(shù)次不顯示
- {
- switch(set_f)//根據(jù)當(dāng)前設(shè)置的內(nèi)容,對應(yīng)位置閃爍
- {
- case 11: lcd1602_write_character(12,1," "); break;
- case 12: lcd1602_write_character(12,2," "); break;
- default: break;
- }
- }
- }
- /********************************************************
- 函數(shù)名稱:void scan(void)
- 函數(shù)作用:按鍵查詢處理函數(shù)
- 參數(shù)說明:
- ********************************************************/
- void scan(void)
- {
- //設(shè)置鍵
- if(hw_data=='B'||key_mode==0) //按鍵按下
- {
- delayms(7); //延時(shí)消抖
- if(hw_data=='B'||key_mode==0) //再次確認(rèn)按鍵按下
- {
- BYJ48=P2&0xf0; //關(guān)閉步進(jìn)電機(jī)
- if(set_f==6) //日期、時(shí)間校準(zhǔn)完
- {
- LCD_write_command(0x01);//清除屏幕顯示
- delay_n40us(100); //延時(shí)等待全部清除完畢
- set_f=13; //跳到校準(zhǔn)窗簾狀態(tài)
- }
- else
- if(set_f==0) //進(jìn)入設(shè)置先清除屏幕,顯示設(shè)置部分
- {
- Writeds1302 (WRITE_PROTECT,0X00);//禁止DS1302寫保護(hù)
- LCD_write_command(0x01); //清除屏幕顯示
- delay_n40us(100); //延時(shí)等待全部清除完畢
- switch(mode)//根據(jù)對應(yīng)的模式,設(shè)置對應(yīng)的參數(shù)
- {
- case 0: set_f=1; break; //手動(dòng)模式
- case 1: set_f=7; break; //定時(shí)模式
- case 2: set_f=11; break; //光控模式
- default: break;
- }
- }
- else
- if(set_f==10||set_f==12)//進(jìn)入設(shè)置日期時(shí)間
- {
- LCD_write_command(0x01); //清除屏幕顯示
- delay_n40us(100); //延時(shí)等待全部清除完畢
- set_f=1; //進(jìn)入校準(zhǔn)時(shí)間
- }
- else
- set_f++; //設(shè)置變量+1
- if(set_f>12)
- {
- set_f=0; //重置設(shè)置變量
- Writeds1302 (WRITE_MINUTE,(time[1]/10)*16+time[1]%10);//將設(shè)置好的時(shí)間寫入DS1302
- Writeds1302 (WRITE_SECOND,(time[0]/10)*16+time[0]%10);
- EEPROM_delete(0x2200); //擦除扇區(qū)
- EEPROM_write(0x2200,ds[0]); //寫入【定時(shí)時(shí)間】數(shù)據(jù)保存
- EEPROM_write(0x2210,ds[1]); //寫入【定時(shí)時(shí)間】數(shù)據(jù)保存存
- EEPROM_write(0x2220,ds[2]); //寫入【定時(shí)時(shí)間】數(shù)據(jù)保存存
- EEPROM_write(0x2230,ds[3]); //寫入【定時(shí)時(shí)間】數(shù)據(jù)保存存
- EEPROM_write(0x2240,light_up); //寫入【光強(qiáng)上限值】數(shù)據(jù)保存
- EEPROM_write(0x2250,light_down);//寫入【光強(qiáng)下限值】數(shù)據(jù)保存
- LCD_write_command(0x01); //清除屏幕顯示
- delay_n40us(100); //延時(shí)等待全部清除完畢
- }
- }
- while(!key_mode); //等待按鍵松開
- }
- //確定
- if(hw_data=='Q'||key_ok==0) //按鍵按下
- {
- delayms(7); //延時(shí)消抖
- if((hw_data=='Q'||key_ok==0)&&set_f!=0)//再次確認(rèn)按鍵按下
- {
- if(set_f<7)
- {
- Writeds1302 (WRITE_MINUTE,(time[1]/10)*16+time[1]%10);//將設(shè)置好的時(shí)間寫入DS1302
- Writeds1302 (WRITE_SECOND,(time[0]/10)*16+time[0]%10);
- }
- set_f=0; //重置設(shè)置變量
-
- EEPROM_delete(0x2200); //擦除扇區(qū)
- EEPROM_write(0x2200,ds[0]); //寫入【定時(shí)時(shí)間】數(shù)據(jù)保存
- EEPROM_write(0x2210,ds[1]); //寫入【定時(shí)時(shí)間】數(shù)據(jù)保存存
- EEPROM_write(0x2220,ds[2]); //寫入【定時(shí)時(shí)間】數(shù)據(jù)保存存
- EEPROM_write(0x2230,ds[3]); //寫入【定時(shí)時(shí)間】數(shù)據(jù)保存存
- EEPROM_write(0x2240,light_up); //寫入【光強(qiáng)上限值】數(shù)據(jù)保存
- EEPROM_write(0x2250,light_down);//寫入【光強(qiáng)下限值】數(shù)據(jù)保存
- LCD_write_command(0x01); //清除屏幕顯示
- delay_n40us(100); //延時(shí)等待全部清除完畢
- }
- else
- if(key_ok==0&&set_f==0) //切換模式
- {
- mode++; //模式變量+1
- if(mode>=3) //最大3個(gè)模式
- mode=0; //重新回到第1個(gè)模式
- if(moto_state==1) //如果處于運(yùn)轉(zhuǎn)過程中
- {
- if(moto_f==0) //控制步進(jìn)電機(jī)關(guān)閉
- moto_state=0;
- else //控制步進(jìn)電機(jī)打開
- moto_state=2;
- }
- EEPROM_delete(0x2400); //擦除扇區(qū)
- EEPROM_write(0x2400,mode); //寫入【模式】數(shù)據(jù)保存
- }
- while(!key_ok); //等待按鍵松開
- }
- //加鍵 ,下面減鍵內(nèi)容一樣
- if(hw_data=='+'||key_jia==0)
- {
- delayms(7);
- if((hw_data=='+'||key_jia==0)&&set_f!=0)
- {
- if(set_f==1) //設(shè)置年
- {
- time[6]++; //年份+1
- time[6]=(time[6]/10)*16+time[6]%10; //將年份轉(zhuǎn)換成16進(jìn)制,例如:16年-->0x16
- if(time[6]>0x79) //判斷是否達(dá)到最大年份79年
- time[6]=0x00; //重新回到00年
- Writeds1302 (WRITE_YEA,time[6]); //將設(shè)置好的年份寫入到DS1302存儲(chǔ)起來
- }
-
- if(set_f==2) //設(shè)置月
- {
- time[4]++; //月份+1
- time[4]=(time[4]/10)*16+time[4]%10; //將月份轉(zhuǎn)換成16進(jìn)制,例如:08月-->0x08
- if(time[4]>0x12) //判斷是否達(dá)到最大月份12月
- time[4]=0x01; //重新回到01月
- Writeds1302 (WRITE_MONTH,time[4]); //將設(shè)置好的月份寫入到DS1302存儲(chǔ)起來
- }
-
- if(set_f==3) //設(shè)置日
- {
- time[3]++; //日份+1
- time[3]=(time[3]/10)*16+time[3]%10; //將日份轉(zhuǎn)換成16進(jìn)制,例如:15日-->0x15
- 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天
- {
- if(time[3]>0x31) //判斷是否達(dá)到最大日份31日
- time[3]=0x01; //重新回到01日
- }
- else //否者2,4,6,9,11為小月
- {
- if(time[4]==0x02) //如果是2月,需要區(qū)分閏、平年
- {
- if(((!(time[6]%4) && (time[6]%100)) || !(time[6]%400))==0)//如果閏年
- {
- if(time[3]>0x28) //判斷是否達(dá)到最大日份28日
- time[3]=0x01; //重新回到01日
- }
- else //否者平年
- {
- if(time[3]>0x29) //判斷是否達(dá)到最大日份29日
- time[3]=0x01; //重新回到01日
- }
- }
- else //否者為剩下的月份
- {
- if(time[3]>0x30) //判斷是否達(dá)到最大日份30日
- time[3]=0x01; //重新回到01日
- }
- }
- Writeds1302 (WRITE_DAY,time[3]); //將設(shè)置好的日份寫入到DS1302存儲(chǔ)起來
- }
-
- if(set_f==4) //設(shè)置時(shí),同上
- {
- time[2]++;
- time[2]=(time[2]/10)*16+time[2]%10;
- if(time[2]>0x23)
- time[2]=0x00;
- Writeds1302 (WRITE_HOUR,time[2]);
- }
-
- if(set_f==5) //設(shè)置分,同上
- {
- time[1]++;
- time[1]=(time[1]/10)*16+time[1]%10;
- if(time[1]>0x59)
- time[1]=0x00;
- Writeds1302 (WRITE_MINUTE,time[1]);
- }
-
- if(set_f==6) //設(shè)置秒,同上
- {
- time[0]++;
- time[0]=(time[0]/10)*16+time[0]%10;
- if(time[0]>0x59)
- time[0]=0x00;
- Writeds1302 (WRITE_SECOND,time[0]);
- }
-
- if(set_f==7) //設(shè)置定時(shí)起始時(shí)間——時(shí)
- {
- if(ds[0]<23)
- ds[0]++;
- else
- ds[0]=0;
- }
-
- if(set_f==8) //設(shè)置定時(shí)起始時(shí)間——分
- {
- if(ds[1]<59)
- ds[1]++;
- else
- ds[1]=0;
- }
- if(set_f==9) //設(shè)置定時(shí)結(jié)束時(shí)間——時(shí)
- {
- if(ds[2]<23)
- ds[2]++;
- else
- ds[2]=0;
- }
-
- if(set_f==10) //設(shè)置定時(shí)結(jié)束時(shí)間——分
- {
- if(ds[3]<59)
- ds[3]++;
- else
- ds[3]=0;
- }
- if(set_f==11) //設(shè)置 光強(qiáng)上限值
- {
- if(light_up<99)//最大值可設(shè)置99%
- light_up++;//光強(qiáng)上限值+1%
- }
-
- if(set_f==12) //設(shè)置 光強(qiáng)下限值
- {
- if(light_down<99&&light_down+1<light_up)//最大值可設(shè)置99%,并且下限不能超過上限
- light_down++;//光強(qiáng)下限值+1%
- }
- }
- else
- if((hw_data=='+'||key_jia==0)&&set_f==0&&mode==0)//手動(dòng)控制窗簾打開
- {
- if(moto_state==1&&moto_f==1)//已經(jīng)在控制狀態(tài)。并且控制打開
- moto_state=2; //停止運(yùn)作
- else
- {
- if(moto_num<192)//判斷是否不處于打開狀態(tài)
- {
- moto_f=1; //控制開閉窗
- moto_state=1; //開啟運(yùn)作
- }
- }
- while(!key_jia); //等待按鍵松開
- }
- }
- //減鍵
- if(hw_data=='-'||key_jian==0)
- {
- delayms(7);
- if((hw_data=='-'||key_jian==0)&&set_f!=0)
- {
- if(set_f==1) //設(shè)置年
- {
- if(time[6]==0) //判斷當(dāng)前是否為00年
- time[6]=79; //如果是回到最大年份:79年
- else
- time[6]--; //否者,年份-1
- time[6]=(time[6]/10)*16+time[6]%10;//將年份轉(zhuǎn)換成16進(jìn)制,例如:16年-->0x16
- Writeds1302 (WRITE_YEA,time[6]); //將設(shè)置好的年份寫入到DS1302存儲(chǔ)起來
- }
-
- if(set_f==2) //設(shè)置月,同上
- {
- if(time[4]==1)
- time[4]=12;
- else
- time[4]--;
- time[4]=(time[4]/10)*16+time[4]%10;
- Writeds1302 (WRITE_MONTH,time[4]);
- }
-
- if(set_f==3) //設(shè)置日,同上
- {
- time[3]--;
- time[3]=(time[3]/10)*16+time[3]%10;
- if(time[4]==1||time[4]==3||time[4]==5||time[4]==7||time[4]==8||time[4]==10||time[4]==12)
- {
- if(time[3]<0x01)
- time[3]=0x31;
- }
- else
- {
- if(time[4]==0x02)
- {
- if(((!(time[6]%4) && (time[6]%100)) || !(time[6]%400))==0)
- {
- if(time[3]<0x01)
- time[3]=0x28;
- }
- else
- {
- if(time[3]<0x01)
- time[3]=0x29;
- }
- }
- else
- {
- if(time[3]<0x01)
- time[3]=0x30;
- }
- }
- Writeds1302 (WRITE_DAY,time[3]);
- }
-
- if(set_f==4) //設(shè)置時(shí),同上
- {
- if(time[2]==0)
- time[2]=23;
- else
- time[2]--;
- time[2]=(time[2]/10)*16+time[2]%10;
- Writeds1302 (WRITE_HOUR,time[2]);
- }
-
- if(set_f==5) //設(shè)置分,同上
- {
- if(time[1]==0)
- time[1]=59;
- else
- time[1]--;
- time[1]=(time[1]/10)*16+time[1]%10;
- Writeds1302 (WRITE_MINUTE,time[1]);
- }
-
- if(set_f==6) //設(shè)置秒,同上
- {
- if(time[0]==0)
- time[0]=59;
- else
- time[0]--;
- time[0]=(time[0]/10)*16+time[0]%10;
- Writeds1302 (WRITE_SECOND,time[0]);
- }
- if(set_f==7) //設(shè)置定時(shí)起始時(shí)間——時(shí)
- {
- if(ds[0]>0)
- ds[0]--;
- else
- ds[0]=23;
- }
-
- if(set_f==8) //設(shè)置定時(shí)起始時(shí)間——分
- {
- if(ds[1]>0)
- ds[1]--;
- else
- ds[1]=59;
- }
- if(set_f==9) //設(shè)置定時(shí)結(jié)束時(shí)間——時(shí)
- {
- if(ds[2]>0)
- ds[2]--;
- else
- ds[2]=23;
- }
-
- if(set_f==10) //設(shè)置定時(shí)結(jié)束時(shí)間——分
- {
- if(ds[3]>0)
- ds[3]--;
- else
- ds[3]=59;
- }
- if(set_f==11) //設(shè)置 光強(qiáng)上限值
- {
- if(light_up!=0&&light_up>light_down+1)//最小值可設(shè)置成0,并且上限值要大于下限值
- light_up--; //光強(qiáng)上限值-1%
- }
-
- if(set_f==12) //設(shè)置 光強(qiáng)下限值
- {
- if(light_down!=0)//最小值可設(shè)置成0
- light_down--;//光強(qiáng)下限值-1%
- }
- }
- else
- if((hw_data=='-'||key_jian==0)&&set_f==0&&mode==0)//手動(dòng)控制窗戶關(guān)閉
- {
- if(moto_state==1&&moto_f==0)//已經(jīng)在控制狀態(tài)。并且控制打開
- moto_state=0; //停止運(yùn)作
- else
- {
- if(moto_num>0)//判斷是否不處于打開狀態(tài)
- {
- moto_f=0; //控制開閉窗
- moto_state=1; //開啟運(yùn)作
- }
- }
- while(!key_jian); //等待按鍵松開
- }
- }
- //紅外遙控切換模式
- if(hw_data=='|'&&set_f==0)
- {
- mode++; //模式變量+1
- if(mode>=3) //最大3個(gè)模式
- mode=0; //重新回到第1個(gè)模式
- if(moto_state==1) //如果處于運(yùn)轉(zhuǎn)過程中
- {
- if(moto_f==0) //控制步進(jìn)電機(jī)關(guān)閉
- moto_state=0;
- else //控制步進(jìn)電機(jī)打開
- moto_state=2;
- }
- EEPROM_delete(0x2400); //擦除扇區(qū)
- EEPROM_write(0x2400,mode); //寫入【模式】數(shù)據(jù)保存
- }
- //紅外遙控切換設(shè)置上一個(gè)參數(shù)
- if(hw_data=='<'&&set_f!=0)
- {
- if(set_f==7||set_f==11)
- {
- LCD_write_command(0x01); //清除屏幕顯示
- delay_n40us(100); //延時(shí)等待全部清除完畢
- set_f=6;
- }
- else
- if(set_f==1)
- {
- LCD_write_command(0x01);//清除屏幕顯示
- delay_n40us(100); //延時(shí)等待全部清除完畢
- switch(mode)//根據(jù)對應(yīng)的模式,設(shè)置對應(yīng)的參數(shù)
- {
- case 0: set_f=6; break; //手動(dòng)模式
- case 1: set_f=10; break;//定時(shí)模式
- case 2: set_f=12; break;//光控模式
- default: break;
- }
- }
- else
- set_f--;
- }
- //紅外遙控切換設(shè)置下一個(gè)參數(shù)
- if(hw_data=='>'&&set_f!=0)
- {
- if(set_f==6) //日期、時(shí)間校準(zhǔn)完
- {
- LCD_write_command(0x01);//清除屏幕顯示
- delay_n40us(100); //延時(shí)等待全部清除完畢
- set_f=13; //跳到校準(zhǔn)窗簾狀態(tài)
- }
- else
- if(set_f==10||set_f==12)
- {
- LCD_write_command(0x01); //清除屏幕顯示
- delay_n40us(100); //延時(shí)等待全部清除完畢
- set_f=1; //進(jìn)入校準(zhǔn)時(shí)間
- }
- else
- set_f++; //設(shè)置變量+1
- if(set_f>12)
- {
- Writeds1302 (WRITE_PROTECT,0X00);//禁止DS1302寫保護(hù)
- LCD_write_command(0x01); //清除屏幕顯示
- delay_n40us(100); //延時(shí)等待全部清除完畢
- switch(mode)//根據(jù)對應(yīng)的模式,設(shè)置對應(yīng)的參數(shù)
- {
- case 0: set_f=1; break; //手動(dòng)模式
- case 1: set_f=7; break; //定時(shí)模式
- case 2: set_f=11; break; //光控模式
- default: break;
- }
- }
- }
- hw_data=0xff;//清除紅外接收的數(shù)據(jù)
- }
- /********************************************************
- 函數(shù)名稱:void mian()
- 函數(shù)作用:主函數(shù)
- 參數(shù)說明:
- ********************************************************/
- void main()
- {
- uchar lowtime; //記錄上次采集光強(qiáng)的時(shí)間
- uchar nums; //循環(huán)計(jì)數(shù)變量
- if(key_ok==0)
- {
- delayms(100);
- if(key_ok==0)
- {
- EEPROM_delete(0x2200); //擦除扇區(qū)
- EEPROM_write(0x2200,8); //寫入【定時(shí)時(shí)間】數(shù)據(jù)保存
- EEPROM_write(0x2210,30);//寫入【定時(shí)時(shí)間】數(shù)據(jù)保存存
- EEPROM_write(0x2220,16);//寫入【定時(shí)時(shí)間】數(shù)據(jù)保存存
- EEPROM_write(0x2230,20);//寫入【定時(shí)時(shí)間】數(shù)據(jù)保存存
- EEPROM_write(0x2240,80);//寫入【光強(qiáng)上限值】數(shù)據(jù)保存
- EEPROM_write(0x2250,30);//寫入【光強(qiáng)下限值】數(shù)據(jù)保存
- EEPROM_delete(0x2400); //擦除扇區(qū)
- EEPROM_write(0x2400,0); //寫入【模式】數(shù)據(jù)保存
- }
- }
- ds[0]=EEPROM_read(0x2200); //讀取存儲(chǔ)的【定時(shí)時(shí)間】數(shù)據(jù)
- ds[1]=EEPROM_read(0x2210); //讀取存儲(chǔ)的【定時(shí)時(shí)間】數(shù)據(jù)
- ds[2]=EEPROM_read(0x2220); //讀取存儲(chǔ)的【定時(shí)時(shí)間】數(shù)據(jù)
- ds[3]=EEPROM_read(0x2230); //讀取存儲(chǔ)的【定時(shí)時(shí)間】數(shù)據(jù)
- light_up=EEPROM_read(0x2240); //讀取存儲(chǔ)的【光強(qiáng)上限值】數(shù)據(jù)
- light_down=EEPROM_read(0x2250); //讀取存儲(chǔ)的【光強(qiáng)下限值】數(shù)據(jù)
- mode=EEPROM_read(0x2400); //讀取存儲(chǔ)的【模式】數(shù)據(jù)
- HW_init(); //紅外接收初始化
- LCD_init(); //LCD1602初始化
- ADC0832_read(0);
- ADC0832_read(0);
- while(1) //死循環(huán)
- {
- scan(); //按鍵檢測處理
- if(set_f==0) //正常顯示
- {
- nums++; //循環(huán)次數(shù)+1
- if(nums==10) //每循環(huán)10次,讀取一次日期、時(shí)間
- {
- nums=0; //重置循環(huán)次數(shù)
- Read_time(); //讀取日期、時(shí)間
- }
- if(time[0]!=lowtime) //時(shí)間過去一秒
- {
- lowtime=time[0]; //重新記錄時(shí)間
- light=ADC0832_read(0);//讀取AD值
- light=light*100/255;//轉(zhuǎn)換為光強(qiáng)
- }
- display(); //更新顯示數(shù)據(jù)
- }
- else
- if(set_f<7) //校準(zhǔn)日期、時(shí)間
- {
- Read_time(); //讀取日期、時(shí)間
- display2();
- }
- else
- if(set_f<11) //設(shè)置定時(shí)
- display3();
- else
- if(set_f<13) //設(shè)置光強(qiáng)控制值
- display4();
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
51智能窗簾.7z
(4.32 MB, 下載次數(shù): 173)
2020-3-9 13:34 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|