|
自動窗簾仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (37.27 KB, 下載次數(shù): 79)
下載附件
2020-12-8 16:01 上傳
51hei.png (29.06 KB, 下載次數(shù): 53)
下載附件
2020-12-8 16:01 上傳
51hei.png (24.05 KB, 下載次數(shù): 69)
下載附件
2020-12-8 16:01 上傳
單片機(jī)源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include<auto.h>
- void io_inithw(void);
- void int_init(void);
- void io_inithw(void)
- {
- P0=0xff;
- P1=0xff;
- P2=0xff;
- P3=0xff;
- }
- void int_inithw(void)
- {
- EX0=1;
- EA=1;
- }
- /*********************************************************/
- // 毫秒級的延時函數(shù),time是要延時的毫秒數(shù)
- /*********************************************************/
- void DelayMs(uint time)
- {
- uint i,j;
- for(i=0;i<time;i++)
- for(j=0;j<112;j++);
- }
- /*********************************************************/
- // 1602液晶寫命令函數(shù),cmd就是要寫入的命令
- /*********************************************************/
- void LcdWriteCmd(uchar cmd)
- {
- LcdRs_P = 0;
- LcdRw_P = 0;
- LcdEn_P = 0;
- P0=cmd;
- DelayMs(2);
- LcdEn_P = 1;
- DelayMs(2);
- LcdEn_P = 0;
- }
- /*********************************************************/
- // 1602液晶寫數(shù)據(jù)函數(shù),dat就是要寫入的數(shù)據(jù)
- /*********************************************************/
- void LcdWriteData(uchar dat)
- {
- LcdRs_P = 1;
- LcdRw_P = 0;
- LcdEn_P = 0;
- P0=dat;
- DelayMs(2);
- LcdEn_P = 1;
- DelayMs(2);
- LcdEn_P = 0;
- }
- /*********************************************************/
- // 1602液晶初始化函數(shù)
- /*********************************************************/
- void LcdInit()
- {
- LcdWriteCmd(0x38); // 16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)口
- LcdWriteCmd(0x0C); // 開顯示,不顯示光標(biāo)
- LcdWriteCmd(0x06); // 地址加1,當(dāng)寫入數(shù)據(jù)后光標(biāo)右移
- LcdWriteCmd(0x01); // 清屏
- }
- /*********************************************************/
- // 液晶光標(biāo)定位函數(shù)
- /*********************************************************/
- void LcdGotoXY(uchar line,uchar column)
- {
- // 第一行
- if(line==0)
- LcdWriteCmd(0x80+column);
- // 第二行
- if(line==1)
- LcdWriteCmd(0x80+0x40+column);
- }
- /*********************************************************/
- // 液晶輸出字符串函數(shù)
- /*********************************************************/
- void LcdPrintStr(uchar *str)
- {
- while(*str!='\0')
- LcdWriteData(*str++);
- }
- /*********************************************************/
- // 液晶輸出數(shù)字(0-99)
- /*********************************************************/
- void LcdPrintNum(uchar num)
- {
- LcdWriteData(num/10+48); // 十位
- LcdWriteData(num%10+48); // 個位
- }
- /*********************************************************/
- // 顯示模式
- /*********************************************************/
- void LcdPrintMode(uchar num)
- {
- switch(num)
- {
- case 1: LcdPrintStr("Manual"); break;
- case 2: LcdPrintStr("Timing"); break;
- case 3: LcdPrintStr("Liging"); break;
- default: break;
- }
- }
- /*********************************************************/
- // 液晶顯示內(nèi)容的初始化
- /*********************************************************/
- void LcdShowInit()
- {
- LcdGotoXY(0,0);
- LcdPrintStr("20 - - : ");
- LcdGotoXY(1,0);
- LcdPrintStr(" gz: ");
- LcdGotoXY(1,0);
- LcdPrintMode(gMode);
- }
- /*********************************************************/
- // 刷新時間顯示
- /*********************************************************/
- void FlashTime()
- {
- LcdGotoXY(0,2); // 年份
- LcdPrintNum(TimeBuff[0]);
- LcdGotoXY(0,5); // 月份
- LcdPrintNum(TimeBuff[1]);
- LcdGotoXY(0,8); // 日期
- LcdPrintNum(TimeBuff[2]);
- LcdGotoXY(0,11); // 小時
- LcdPrintNum(TimeBuff[4]);
- LcdGotoXY(0,14); // 分鐘
- LcdPrintNum(TimeBuff[5]);
- LcdGotoXY(0,13); // 秒鐘
- if(TimeBuff[6]%2==0) // 秒鐘是偶數(shù)顯示冒號
- LcdWriteData(':');
- else // 秒鐘是奇數(shù)顯示空格
- LcdWriteData(' ');
- }
- /*********************************************************/
- // 初始化DS1302
- /*********************************************************/
- void DS1302_Init(void)
- {
- RST_P=0; // RST腳置低
- SCK_P=0; // SCK腳置低
- SDA_P=0; // SDA腳置低
- }
- /*********************************************************/
- // 從DS1302讀出一字節(jié)數(shù)據(jù)
- /*********************************************************/
- uchar DS1302_Read_Byte(uchar addr)
- {
- uchar i;
- uchar temp;
-
- RST_P=1;
-
- /* 寫入目標(biāo)地址:addr*/
- for(i=0;i<8;i++)
- {
- if(addr&0x01)
- SDA_P=1;
- else
- SDA_P=0;
-
- SCK_P=1;
- _nop_();
- SCK_P=0;
- _nop_();
-
- addr=addr>> 1;
- }
-
- /* 讀出該地址的數(shù)據(jù) */
- for(i=0;i<8;i++)
- {
- temp=temp>>1;
-
- if(SDA_P)
- temp|= 0x80;
- else
- temp&=0x7F;
-
- SCK_P=1;
- _nop_();
- SCK_P=0;
- _nop_();
- }
-
- RST_P=0;
-
- return temp;
- }
- /*********************************************************/
- // 向DS1302寫入一字節(jié)數(shù)據(jù)
- /*********************************************************/
- void DS1302_Write_Byte(uchar addr, uchar dat)
- {
- uchar i;
-
- RST_P = 1;
-
- /* 寫入目標(biāo)地址:addr*/
- for(i=0;i<8;i++)
- {
- if(addr&0x01)
- SDA_P=1;
- else
- SDA_P=0;
- SCK_P=1;
- _nop_();
- SCK_P=0;
- _nop_();
-
- addr=addr>>1;
- }
-
- /* 寫入數(shù)據(jù):dat*/
- for(i=0;i<8;i++)
- {
- if(dat&0x01)
- SDA_P=1;
- else
- SDA_P=0;
-
- SCK_P=1;
- _nop_();
- SCK_P=0;
- _nop_();
-
- dat=dat>>1;
- }
-
- RST_P=0;
- }
- /*********************************************************/
- // 向DS1302寫入時間數(shù)據(jù)
- /*********************************************************/
- void DS1302_Write_Time()
- {
- uchar i;
- uchar temp1;
- uchar temp2;
-
- for(i=0;i<7;i++) // 十進(jìn)制轉(zhuǎn)BCD碼
- {
- temp1=(TimeBuff[i]/10)<<4;
- temp2=TimeBuff[i]%10;
- TimeBuff[i]=temp1+temp2;
- }
-
- DS1302_Write_Byte(0x8E,0x00); // 關(guān)閉寫保護(hù)
- DS1302_Write_Byte(0x80,0x80); // 暫停時鐘
- DS1302_Write_Byte(0x8C,TimeBuff[0]); // 年
- DS1302_Write_Byte(0x88,TimeBuff[1]); // 月
- DS1302_Write_Byte(0x86,TimeBuff[2]); // 日
- DS1302_Write_Byte(0x8A,TimeBuff[3]); // 星期
- DS1302_Write_Byte(0x84,TimeBuff[4]); // 時
- DS1302_Write_Byte(0x82,TimeBuff[5]); // 分
- DS1302_Write_Byte(0x80,TimeBuff[6]); // 秒
- DS1302_Write_Byte(0x80,TimeBuff[6]&0x7F); // 運(yùn)行時鐘
- DS1302_Write_Byte(0x8E,0x80); // 打開寫保護(hù)
- }
- /*********************************************************/
- // 從DS1302讀出時間數(shù)據(jù)
- /*********************************************************/
- void DS1302_Read_Time()
- {
- uchar i;
- TimeBuff[0]=DS1302_Read_Byte(0x8D); // 年
- TimeBuff[1]=DS1302_Read_Byte(0x89); // 月
- TimeBuff[2]=DS1302_Read_Byte(0x87); // 日
- TimeBuff[3]=DS1302_Read_Byte(0x8B); // 星期
- TimeBuff[4]=DS1302_Read_Byte(0x85); // 時
- TimeBuff[5]=DS1302_Read_Byte(0x83); // 分
- TimeBuff[6]=(DS1302_Read_Byte(0x81))&0x7F; // 秒
- for(i=0;i<7;i++) // BCD轉(zhuǎn)十進(jìn)制
- {
- TimeBuff[i]=(TimeBuff[i]/16)*10+TimeBuff[i]%16;
- }
- }
- /*********************************************************/
- // ADC0832的時鐘脈沖
- /*********************************************************/
- void WavePlus()
- {
- _nop_();
- ADC_CLK = 1;
- _nop_();
- ADC_CLK = 0;
- }
- /*********************************************************/
- // 獲取指定通道的A/D轉(zhuǎn)換結(jié)果
- /*********************************************************/
- uchar Get_ADC0832()
- {
- uchar i;
- uchar dat1=0;
- uchar dat2=0;
-
- ADC_CLK = 0; // 電平初始化
- ADC_DAT = 1;
- _nop_();
- ADC_CS = 0;
- WavePlus(); // 起始信號
- ADC_DAT = 1;
- WavePlus(); // 通道選擇的第一位
- ADC_DAT = 0;
- WavePlus(); // 通道選擇的第二位
- ADC_DAT = 1;
-
- for(i=0;i<8;i++) // 第一次讀取
- {
- dat1<<=1;
- WavePlus();
- if(ADC_DAT)
- dat1=dat1|0x01;
- else
- dat1=dat1|0x00;
- }
-
- for(i=0;i<8;i++) // 第二次讀取
- {
- dat2>>= 1;
- if(ADC_DAT)
- dat2=dat2|0x80;
- else
- dat2=dat2|0x00;
- WavePlus();
- }
-
- _nop_(); // 結(jié)束此次傳輸
- ADC_DAT = 1;
- ADC_CLK = 1;
- ADC_CS = 1;
- if(dat1==dat2) // 返回采集結(jié)果
- return dat1;
- else
- return 0;
- }
- /*********************************************************/
- // 按鍵掃描(設(shè)置當(dāng)前時間)
- /*********************************************************/
- void KeyScanf1()
- {
- if(KeySet_P==0)
- {
- LcdGotoXY(0,13); // 顯示秒鐘的冒號
- LcdWriteData(':');
- LcdWriteCmd(0x0f); // 啟動光標(biāo)閃爍
- LcdGotoXY(0,3); // 定位光標(biāo)到年份閃爍
- DelayMs(10); // 延時等待,消除按鍵按下的抖動
- while(!KeySet_P); // 等待按鍵釋放
- DelayMs(10); // 延時等待,消除按鍵松開的抖動
-
- /* 調(diào)整年份 */
- while(1)
- {
- if(KeyDown_P==0) // 如果減按鍵被下去
- {
- if(TimeBuff[0]>0) // 判斷年份是否大于0
- TimeBuff[0]--; // 是的話就減去1
- LcdGotoXY(0,2); // 光標(biāo)定位到年份的位置
- LcdPrintNum(TimeBuff[0]); // 刷新顯示改變后的年份
- LcdGotoXY(0,3); // 定位光標(biāo)到年份閃爍
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeyUp_P==0) // 如果加按鍵被下去
- {
- if(TimeBuff[0]<99) // 判斷年份是否小于99
- TimeBuff[0]++; // 是的話就加上1
- LcdGotoXY(0,2); // 光標(biāo)定位到年份的位置
- LcdPrintNum(TimeBuff[0]); // 刷新顯示改變后的年份
- LcdGotoXY(0,3); // 定位光標(biāo)到年份閃爍
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeySet_P==0)
- {
- break;
- }
- }
-
- LcdGotoXY(0,6); // 定位光標(biāo)到月份閃爍
- DelayMs(10); // 延時等待,消除按鍵按下的抖動
- while(!KeySet_P); // 等待按鍵釋放
- DelayMs(10); // 延時等待,消除按鍵松開的抖動
-
- /* 調(diào)整月份 */
- while(1)
- {
- if(KeyDown_P==0) // 如果減按鍵被下去
- {
- if(TimeBuff[1]>1) // 判斷月份是否大于1
- TimeBuff[1]--; // 是的話就減去1
- LcdGotoXY(0,5); // 光標(biāo)定位到月份的位置
- LcdPrintNum(TimeBuff[1]); // 刷新顯示改變后的月份
- LcdGotoXY(0,6); // 定位光標(biāo)到月份閃爍
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeyUp_P==0) // 如果加按鍵被下去
- {
- if(TimeBuff[1]<12) // 判斷月份是否小于12
- TimeBuff[1]++; // 是的話就加上1
- LcdGotoXY(0,5); // 光標(biāo)定位到月份的位置
- LcdPrintNum(TimeBuff[1]); // 刷新顯示改變后的月份
- LcdGotoXY(0,6); // 定位光標(biāo)到月份閃爍
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeySet_P==0)
- {
- break;
- }
- }
-
- LcdGotoXY(0,9); // 定位光標(biāo)到日期閃爍
- DelayMs(10); // 延時等待,消除按鍵按下的抖動
- while(!KeySet_P); // 等待按鍵釋放
- DelayMs(10); // 延時等待,消除按鍵松開的抖動
-
- /* 調(diào)整日期 */
- while(1)
- {
- if(KeyDown_P==0) // 如果減按鍵被下去
- {
- if(TimeBuff[2]>1) // 判斷日期是否大于1
- TimeBuff[2]--; // 是的話就減去1
- LcdGotoXY(0,8); // 光標(biāo)定位到日期的位置
- LcdPrintNum(TimeBuff[2]); // 刷新顯示改變后的日期
- LcdGotoXY(0,9); // 定位光標(biāo)到日期閃爍
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeyUp_P==0) // 如果加按鍵被下去
- {
- if(TimeBuff[2]<31) // 判斷日期是否小于31
- TimeBuff[2]++; // 是的話就加上1
- LcdGotoXY(0,8); // 光標(biāo)定位到日期的位置
- LcdPrintNum(TimeBuff[2]); // 刷新顯示改變后的日期
- LcdGotoXY(0,9); // 定位光標(biāo)到日期閃爍
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeySet_P==0)
- {
- break;
- }
- }
-
- LcdGotoXY(0,12); // 定位光標(biāo)到小時閃爍
- DelayMs(10); // 延時等待,消除按鍵按下的抖動
- while(!KeySet_P); // 等待按鍵釋放
- DelayMs(10); // 延時等待,消除按鍵松開的抖動
-
-
- /* 調(diào)整小時 */
- while(1)
- {
- if(KeyDown_P==0) // 如果減按鍵被下去
- {
- if(TimeBuff[4]>0) // 判斷小時是否大于0
- TimeBuff[4]--; // 是的話就減去1
- LcdGotoXY(0,11); // 光標(biāo)定位到小時的位置
- LcdPrintNum(TimeBuff[4]); // 刷新顯示改變后的小時
- LcdGotoXY(0,12); // 定位光標(biāo)到小時閃爍
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeyUp_P==0) // 如果加按鍵被下去
- {
- if(TimeBuff[4]<23) // 判斷小時是否小于23
- TimeBuff[4]++; // 是的話就加上1
- LcdGotoXY(0,11); // 光標(biāo)定位到小時的位置
- LcdPrintNum(TimeBuff[4]); // 刷新顯示改變后的小時
- LcdGotoXY(0,12); // 定位光標(biāo)到小時閃爍
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeySet_P==0)
- {
- break;
- }
- }
-
- LcdGotoXY(0,15); // 定位光標(biāo)到分鐘閃爍
- DelayMs(10); // 延時等待,消除按鍵按下的抖動
- while(!KeySet_P); // 等待按鍵釋放
- DelayMs(10); // 延時等待,消除按鍵松開的抖動
-
- /* 調(diào)整分鐘 */
- while(1)
- {
- if(KeyDown_P==0) // 如果減按鍵被下去
- {
- if(TimeBuff[5]>0) // 判斷分鐘是否大于0
- TimeBuff[5]--; // 是的話就減去1
- LcdGotoXY(0,14); // 光標(biāo)定位到分鐘的位置
- LcdPrintNum(TimeBuff[5]); // 刷新顯示改變后的分鐘
- LcdGotoXY(0,15); // 定位光標(biāo)到分鐘閃爍
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeyUp_P==0) // 如果加按鍵被下去
- {
- if(TimeBuff[5]<59) // 判斷分鐘是否小于59
- TimeBuff[5]++; // 是的話就加上1
- LcdGotoXY(0,14); // 光標(biāo)定位到分鐘的位置
- LcdPrintNum(TimeBuff[5]); // 刷新顯示改變后的分鐘
- LcdGotoXY(0,15); // 定位光標(biāo)到分鐘閃爍
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeySet_P==0)
- {
- break;
- }
- }
-
- /* 退出前的設(shè)置 */
- LcdWriteCmd(0x0C); // 關(guān)閉光標(biāo)閃爍
- DS1302_Write_Time(); // 把新設(shè)置的時間值存入DS1302芯片
- DelayMs(10); // 延時等待,消除按鍵按下的抖動
- while(!KeySet_P); // 等待按鍵釋放
- DelayMs(10); // 延時等待,消除按鍵松開的抖動
- }
- }
- /*********************************************************/
- // 按鍵掃描(設(shè)置窗簾的動作)
- /*********************************************************/
- void KeyScanf2()
- {
- if(KeySet2_P==0)
- {
- LcdGotoXY(0,0); // 光標(biāo)定位
- LcdPrintStr(" OpenTime : "); // 顯示第1行內(nèi)容
- LcdGotoXY(1,0); // 光標(biāo)定位
- LcdPrintStr("CloseTime : "); // 顯示第2行內(nèi)容
- LcdGotoXY(0,10); // 光標(biāo)定位
- LcdPrintNum(OpenHour); // 顯示開啟窗簾的小時
- LcdGotoXY(0,13); // 光標(biāo)定位
- LcdPrintNum(OpenMinute); // 顯示開啟窗簾的分鐘
- LcdGotoXY(1,10); // 光標(biāo)定位
- LcdPrintNum(CloseHour); // 顯示關(guān)閉窗簾的小時
- LcdGotoXY(1,13); // 光標(biāo)定位
- LcdPrintNum(CloseMinute); // 顯示關(guān)閉窗簾的分鐘
-
- LcdWriteCmd(0x0f); // 啟動光標(biāo)閃爍
- LcdGotoXY(0,11); // 定位光標(biāo)
- DelayMs(10); // 延時等待,消除按鍵按下的抖動
- while(!KeySet2_P); // 等待按鍵釋放
- DelayMs(10); // 延時等待,消除按鍵松開的抖動
-
- /* 調(diào)整開啟的小時 */
- while(1)
- {
- if(KeyDown_P==0) // 如果減按鍵被下去
- {
- if(OpenHour>0) // 判斷小時是否大于0
- OpenHour--; // 是的話就減去1
- LcdGotoXY(0,10); // 光標(biāo)定位
- LcdPrintNum(OpenHour); // 刷新顯示改變后的小時
- LcdGotoXY(0,11); // 定位光標(biāo)
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeyUp_P==0) // 如果加按鍵被下去
- {
- if(OpenHour<23) // 判斷小時是否小于23
- OpenHour++; // 是的話就加上1
- LcdGotoXY(0,10); // 光標(biāo)定位
- LcdPrintNum(OpenHour); // 刷新顯示改變后的小時
- LcdGotoXY(0,11); // 定位光標(biāo)
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeySet2_P==0)
- {
- break;
- }
- }
-
- LcdGotoXY(0,14); // 定位光標(biāo)
- DelayMs(10); // 延時等待,消除按鍵按下的抖動
- while(!KeySet2_P); // 等待按鍵釋放
- DelayMs(10); // 延時等待,消除按鍵松開的抖動
-
- /* 調(diào)整開啟的分鐘 */
- while(1)
- {
- if(KeyDown_P==0) // 如果減按鍵被下去
- {
- if(OpenMinute>0) // 判斷分鐘是否大于0
- OpenMinute--; // 是的話就減去1
- LcdGotoXY(0,13); // 光標(biāo)定位
- LcdPrintNum(OpenMinute); // 刷新顯示改變后的分鐘
- LcdGotoXY(0,14); // 定位光標(biāo)
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeyUp_P==0) // 如果加按鍵被下去
- {
- if(OpenMinute<59) // 判斷分鐘是否小于59
- OpenMinute++; // 是的話就加上1
- LcdGotoXY(0,13); // 光標(biāo)定位
- LcdPrintNum(OpenMinute); // 刷新顯示改變后的分鐘
- LcdGotoXY(0,14); // 定位光標(biāo)
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeySet2_P==0)
- {
- break;
- }
- }
-
- LcdGotoXY(1,11); // 定位光標(biāo)
- DelayMs(10); // 延時等待,消除按鍵按下的抖動
- while(!KeySet2_P); // 等待按鍵釋放
- DelayMs(10); // 延時等待,消除按鍵松開的抖動
-
- /* 調(diào)整關(guān)閉的小時 */
- while(1)
- {
- if(KeyDown_P==0) // 如果減按鍵被下去
- {
- if(CloseHour>0) // 判斷小時是否大于0
- CloseHour--; // 是的話就減去1
- LcdGotoXY(1,10); // 光標(biāo)定位
- LcdPrintNum(CloseHour); // 刷新顯示改變后的小時
- LcdGotoXY(1,11); // 定位光標(biāo)
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeyUp_P==0) // 如果加按鍵被下去
- {
- if(CloseHour<23) // 判斷小時是否小于23
- CloseHour++; // 是的話就加上1
- LcdGotoXY(1,10); // 光標(biāo)定位
- LcdPrintNum(CloseHour); // 刷新顯示改變后的小時
- LcdGotoXY(1,11); // 定位光標(biāo)
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeySet2_P==0)
- {
- break;
- }
- }
-
- LcdGotoXY(1,14); // 定位光標(biāo)
- DelayMs(10); // 延時等待,消除按鍵按下的抖動
- while(!KeySet2_P); // 等待按鍵釋放
- DelayMs(10); // 延時等待,消除按鍵松開的抖動
-
- /* 調(diào)整關(guān)閉的分鐘 */
- while(1)
- {
- if(KeyDown_P==0) // 如果減按鍵被下去
- {
- if(CloseMinute>0) // 判斷分鐘是否大于0
- CloseMinute--; // 是的話就減去1
- LcdGotoXY(1,13); // 光標(biāo)定位
- LcdPrintNum(CloseMinute); // 刷新顯示改變后的分鐘
- LcdGotoXY(1,14); // 定位光標(biāo)
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeyUp_P==0) // 如果加按鍵被下去
- {
- if(CloseMinute<59) // 判斷分鐘是否小于59
- CloseMinute++; // 是的話就加上1
- LcdGotoXY(1,13); // 光標(biāo)定位
- LcdPrintNum(CloseMinute); // 刷新顯示改變后的分鐘
- LcdGotoXY(1,14); // 定位光標(biāo)
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeySet2_P==0)
- {
- break;
- }
- }
-
- DelayMs(10); // 延時等待,消除按鍵按下的抖動
- while(!KeySet2_P); // 等待按鍵釋放
- DelayMs(10); // 延時等待,消除按鍵松開的抖動
-
- /* 光照強(qiáng)度的設(shè)置 */
- LcdWriteCmd(0x0C); // 關(guān)閉光標(biāo)閃爍
- LcdGotoXY(0,0); // 光標(biāo)定位
- LcdPrintStr(" Light Set "); // 顯示第1行內(nèi)容
- LcdGotoXY(1,0); // 光標(biāo)定位
- LcdPrintStr(" "); // 顯示第2行內(nèi)容
- LcdGotoXY(1,7); // 光標(biāo)定位
- LcdPrintNum(gLight); // 顯示窗簾的光線控制強(qiáng)度閾值
-
- while(1)
- {
- if(KeyDown_P==0) // 如果減按鍵被下去
- {
- if(gLight>0) // 判斷光線閾值是否大于0
- gLight--; // 是的話就減去1
- LcdGotoXY(1,7); // 光標(biāo)定位
- LcdPrintNum(gLight); // 刷新顯示改變后的光線閾值
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeyUp_P==0) // 如果加按鍵被下去
- {
- if(gLight<99) // 判斷光線閾值是否小于59
- gLight++; // 是的話就加上1
- LcdGotoXY(1,7); // 光標(biāo)定位
- LcdPrintNum(gLight); // 刷新顯示改變后的光線閾值
- DelayMs(300); // 延時0.3秒左右
- }
-
- if(KeySet2_P==0)
- {
- break;
- }
- }
-
- /* 退出前的設(shè)置 */
- LcdShowInit(); // 液晶顯示內(nèi)容初始化
- DelayMs(10); // 延時等待,消除按鍵按下的抖動
- while(!KeySet2_P); // 等待按鍵釋放
- DelayMs(10); // 延時等待,消除按鍵松開的抖動
- }
- }
- /*********************************************************/
- // 按鍵掃描(模式切換)
- /*********************************************************/
- void KeyScanf3()
- {
- if(KeyMode_P==0)
- {
- gMode++; // 切換到下一模式
- if(gMode==4) // 如果到盡頭了
- gMode=1; // 回到第一種模式
- LcdGotoXY(1,0); // 光標(biāo)定位
- LcdPrintMode(gMode); // 顯示模式
- DelayMs(10); // 去除按鍵按下的抖動
- while(!KeyMode_P); // 等待按鍵是否
- DelayMs(10); // 去除按鍵松開的抖動
- }
- }
- /*********************************************************/
- // 開窗
- /*********************************************************/
- void Open()
- {
- uint i,j;
- for(j=0;j<255;j++) // 控制步進(jìn)電機(jī)正轉(zhuǎn)
- {
- for(i=0;i<4;i++)
- {
- P2=Clock[i];
- DelayMs(3);
- }
- }
- Led_P=0;
- }
- /*********************************************************/
- // 關(guān)窗
- /*********************************************************/
- void Close()
- {
- uint i,j;
- for(j=0;j<255;j++) // 控制步進(jìn)電機(jī)反轉(zhuǎn)
- {
- for(i=0;i<4;i++)
- {
- P2=AntiClock[i];
- DelayMs(3);
- }
- }
- Led_P=1;
- }
- /*********************************************************/
- // 主函數(shù)
- /*********************************************************/
- void main()
- {
- uchar light;
-
- LcdInit(); // 執(zhí)行液晶初始化
- DS1302_Init(); // 時鐘芯片的初始化
- LcdShowInit(); // 液晶顯示內(nèi)容的初始化
- io_inithw();
- int_inithw();
- if(DS1302_Read_Byte(0x81)>=128) // 判斷時鐘芯片是否正在運(yùn)行
- {
- DS1302_Write_Time(); // 如果沒有,則初始化一個時間
- }
-
- while(1)
- {
- DS1302_Read_Time(); // 獲取當(dāng)前時鐘芯片的時間,存在數(shù)組time_buf中
- FlashTime(); // 刷新時間顯示
- light=Get_ADC0832(); // 讀取光照強(qiáng)度
- light=light/2.5; // 縮小光照檢測結(jié)果(在0-99)
- if(light>99) // 如果大于99
- light=99; // 則依然保持99
- LcdGotoXY(1,14); // 光標(biāo)定位
- LcdPrintNum(light); // 顯示光照強(qiáng)度
-
- KeyScanf1(); // 按鍵掃描(時間的設(shè)置)
- KeyScanf2(); // 按鍵掃描(閾值的設(shè)置)
- KeyScanf3(); // 按鍵掃描(模式切換)
-
- /*手動控制模式*/
- if(gMode==1)
- {
- if(closeflag==1)
- {
- if(Led_P==0) // 如果窗簾當(dāng)前是打開的
- {
- closeflag=0;
- Close(); // 則光標(biāo)窗簾
- }else
- closeflag=0;
- }
- if(KeyDown_P==0) // 如果關(guān)窗簾鍵按下了
- {
- if(Led_P==0) // 如果窗簾當(dāng)前是打開的
- {
- Close(); // 則光標(biāo)窗簾
- }
- }
- if(openflag==1)
- {
- if(Led_P==1) // 如果窗簾當(dāng)前是關(guān)閉的
- {
- openflag=0;
- Open(); // 則打開窗簾
- }else{
- openflag=0;
- }
-
- }
- if(KeyUp_P==0) // 如果開窗簾鍵按下了
- {
- if(Led_P==1) // 如果窗簾當(dāng)前是關(guān)閉的
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
51hei.png (11.14 KB, 下載次數(shù): 57)
下載附件
2020-12-8 16:03 上傳
所有資料51hei提供下載:
自動窗簾設(shè)計(jì).zip
(981.85 KB, 下載次數(shù): 193)
2020-12-8 15:23 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|