標(biāo)題:
基于51單片機(jī)的智能窗簾程序+原理圖
[打印本頁(yè)]
作者:
郁彼丨北林
時(shí)間:
2021-6-13 19:10
標(biāo)題:
基于51單片機(jī)的智能窗簾程序+原理圖
自己搜集資料做的一個(gè)智能窗簾,之前下的別人的 有很多問題,自己全改過來了。實(shí)現(xiàn)功能:實(shí)時(shí)顯示、定時(shí)開關(guān)、光控、溫控、手動(dòng)控制
修改好的源程序+原理圖
51hei.png
(107.21 KB, 下載次數(shù): 65)
下載附件
2021-6-14 04:42 上傳
單片機(jī)源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char // 以后unsigned char就可以用uchar代替
#define uint unsigned int // 以后unsigned int 就可以用uint 代替
sbit ADC_CS = P1^6; // ADC0832的CS引腳
sbit ADC_CLK = P1^7; // ADC0832的CLK引腳
sbit ADC_DAT = P3^0; // ADC0832的DI/DO引腳
sbit SCK_P = P1^0; // 時(shí)鐘芯片DS1302的SCK管腳
sbit SDA_P = P1^1; // 時(shí)鐘芯片DS1302的SDA管腳
sbit RST_P = P1^2; // 時(shí)鐘芯片DS1302的RST管腳
sbit LcdRs_P = P1^3; // 1602液晶的RS管腳
sbit LcdRw_P = P1^4; // 1602液晶的RW管腳
sbit LcdEn_P = P1^5; // 1602液晶的EN管腳
sbit KeyMode_P = P3^3; // 模式切換
sbit KeySet_P = P3^4; // 設(shè)置時(shí)間按鍵
sbit KeySet2_P = P3^5; // 設(shè)置時(shí)間模式的開關(guān)時(shí)間和光照控制強(qiáng)度
sbit KeyDown_P = P3^6; // 減按鍵
sbit KeyUp_P = P3^7; // 加按鍵
sbit Led_P = P2^0; // 指示燈
sbit ds=P3^1;
bit closeflag,openflag;
uchar gMode=1; // 1是手動(dòng)模式,2是時(shí)間自動(dòng)模式,3是亮度自動(dòng)模式
uchar OpenHour = 18; // 開啟窗簾的小時(shí)
uchar OpenMinute = 20; // 開啟窗簾的分鐘
uchar CloseHour = 10; // 關(guān)閉窗簾的小時(shí)
uchar CloseMinute = 30; // 關(guān)閉窗簾的分鐘
uchar gLight = 40; // 窗簾開關(guān)的閾值
uchar wDu=35;
uint wd=13,t;
uchar xsflag;
uchar code Clock[]={0x8f,0x4f,0x2f,0x1f}; // 步進(jìn)電機(jī)順時(shí)針旋轉(zhuǎn)數(shù)組
uchar code AntiClock[]={0x1f,0x2f,0x4f,0x8f}; // 步進(jìn)電機(jī)逆時(shí)針旋轉(zhuǎn)數(shù)組
uchar TimeBuff[7]={17,9,1,6,18,30,40}; // 時(shí)間數(shù)組,默認(rèn)2017年9月1日,星期五,18:30:40
/*********************************************************/
// 毫秒級(jí)的延時(shí)函數(shù),time是要延時(shí)的毫秒數(shù)
/*********************************************************/
void DelayMs(uint time)
{
uint i,j;
for(i=0;i<time;i++)
for(j=0;j<112;j++);
}
void delay(uint z) //延時(shí)函數(shù)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*********************************************************/
// 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+0x30); // 十位
LcdWriteData(num%10+0x30); // 個(gè)位
//LcdWriteData(num%10+'0'); // 個(gè)位
}
void LcdPrintNum2(uchar num2)
{
LcdWriteData(num2/100+0x30); // 百位
LcdWriteData(num2%100/10+0x30); // 十位
LcdWriteData(num2%100%10+0x30); // 個(gè)位
}
/*********************************************************/
// 顯示模式
/*********************************************************/
void LcdPrintMode(uchar num)
{
switch(num)
{
case 1: LcdPrintStr("Manual"); break;
case 2: LcdPrintStr(" TIME "); break;
case 3: LcdPrintStr("LIGHT "); break;
case 4: LcdPrintStr(" TEMP "); break;
default: break;
}
}
/*********************************************************/
// 液晶顯示內(nèi)容的初始化
/*********************************************************/
void LcdShowInit()
{
LcdGotoXY(0,0);
LcdPrintStr("20'C - : ");
LcdGotoXY(1,0);
LcdPrintStr(" gz: ");
LcdGotoXY(1,0);
LcdPrintMode(gMode);
}
/*********************************************************/
// 刷新時(shí)間顯示
/*********************************************************/
void FlashTime()
{
LcdGotoXY(0,0); // 年份
LcdPrintNum(wd);
LcdGotoXY(0,5); // 月份
LcdPrintNum(TimeBuff[1]);
LcdGotoXY(0,8); // 日期
LcdPrintNum(TimeBuff[2]);
LcdGotoXY(0,11); // 小時(shí)
LcdPrintNum(TimeBuff[4]);
LcdGotoXY(0,14); // 分鐘
LcdPrintNum(TimeBuff[5]);
LcdGotoXY(0,13); // 秒鐘
if(TimeBuff[6]%2==0) // 秒鐘是偶數(shù)顯示冒號(hào)
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í)間數(shù)據(jù)
/*********************************************************/
void DS1302_Write_Time()
{
uchar i;
uchar temp1;
uchar temp2;
for(i=0;i<7;i++) // 十進(jìn)制轉(zhuǎn)BCD碼
{
temp2=TimeBuff[i]%10;
TimeBuff[i]=temp1+temp2;
}
DS1302_Write_Byte(0x8E,0x00); // 關(guān)閉寫保護(hù)
DS1302_Write_Byte(0x80,0x80); // 暫停時(shí)鐘
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]); // 時(shí)
DS1302_Write_Byte(0x82,TimeBuff[5]); // 分
DS1302_Write_Byte(0x80,TimeBuff[6]); // 秒
DS1302_Write_Byte(0x80,TimeBuff[6]&0x7F); // 運(yùn)行時(shí)鐘
DS1302_Write_Byte(0x8E,0x80); // 打開寫保護(hù)
}
/*********************************************************/
// 從DS1302讀出時(shí)間數(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); // 時(shí)
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的時(shí)鐘脈沖
/*********************************************************/
void WavePlus()
{
_nop_();
ADC_CLK = 1;
_nop_();
ADC_CLK = 0;
}
/*********************************************************/
// 獲取指定通道的A/D轉(zhuǎn)換結(jié)果
/*********************************************************/
uchar Get_ADC0832(unsigned char num1 )
{
uchar i,dat1=0,dat2=0;
ADC_CS = 0; ADC_CLK = 0;ADC_DAT = 1; _nop_(); _nop_();
ADC_CLK = 1; _nop_(); _nop_(); ADC_CLK = 0; //準(zhǔn)備
ADC_CLK = 1; _nop_(); _nop_();ADC_CLK = 0; //開始 核實(shí)準(zhǔn)備工作
ADC_DAT = num1; _nop_(); _nop_();ADC_CLK = 1; //上升沿傳地地址的低位
ADC_DAT = num1; _nop_(); _nop_();ADC_CLK = 0; //下降沿傳地地址的高位
ADC_DAT = 1; _nop_(); _nop_(); //準(zhǔn)備傳輸數(shù)據(jù)
for(i=0;i<8;i++)
{
dat1 = dat1 | ADC_DAT;
ADC_CLK = 1; _nop_(); _nop_();
ADC_CLK = 0; _nop_(); _nop_();
dat1 = dat1 << 1 ;
}
ADC_CS = 1;
return dat1;
}
/*********************************************************/
// 按鍵掃描(設(shè)置當(dāng)前時(shí)間)
/*********************************************************/
void KeyScanf1()
{
if(KeySet_P==0)
{
LcdGotoXY(0,13); // 顯示秒鐘的冒號(hào)
LcdWriteData(':');
DelayMs(10); // 延時(shí)等待,消除按鍵按下的抖動(dòng)
while(!KeySet_P); // 等待按鍵釋放
DelayMs(10); // 延時(shí)等待,消除按鍵松開的抖動(dòng)
LcdGotoXY(0,6); // 定位光標(biāo)到月份閃爍
LcdWriteCmd(0x0f); // 啟動(dòng)光標(biāo)閃爍
DelayMs(10); // 延時(shí)等待,消除按鍵按下的抖動(dòng)
while(!KeySet_P); // 等待按鍵釋放
DelayMs(10); // 延時(shí)等待,消除按鍵松開的抖動(dòng)
/* 調(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); // 延時(shí)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); // 延時(shí)0.3秒左右
}
if(KeySet_P==0)
{
break;
}
}
LcdGotoXY(0,9); // 定位光標(biāo)到日期閃爍
DelayMs(10); // 延時(shí)等待,消除按鍵按下的抖動(dòng)
while(!KeySet_P); // 等待按鍵釋放
DelayMs(10); // 延時(shí)等待,消除按鍵松開的抖動(dòng)
/* 調(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); // 延時(shí)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); // 延時(shí)0.3秒左右
}
if(KeySet_P==0)
{
break;
}
}
LcdGotoXY(0,12); // 定位光標(biāo)到小時(shí)閃爍
DelayMs(10); // 延時(shí)等待,消除按鍵按下的抖動(dòng)
while(!KeySet_P); // 等待按鍵釋放
DelayMs(10); // 延時(shí)等待,消除按鍵松開的抖動(dòng)
/* 調(diào)整小時(shí) */
while(1)
{
if(KeyDown_P==0) // 如果減按鍵被下去
{
if(TimeBuff[4]>0) // 判斷小時(shí)是否大于0
TimeBuff[4]--; // 是的話就減去1
LcdGotoXY(0,11); // 光標(biāo)定位到小時(shí)的位置
LcdPrintNum(TimeBuff[4]); // 刷新顯示改變后的小時(shí)
LcdGotoXY(0,12); // 定位光標(biāo)到小時(shí)閃爍
DelayMs(300); // 延時(shí)0.3秒左右
}
if(KeyUp_P==0) // 如果加按鍵被下去
{
if(TimeBuff[4]<23) // 判斷小時(shí)是否小于23
TimeBuff[4]++; // 是的話就加上1
LcdGotoXY(0,11); // 光標(biāo)定位到小時(shí)的位置
LcdPrintNum(TimeBuff[4]); // 刷新顯示改變后的小時(shí)
LcdGotoXY(0,12); // 定位光標(biāo)到小時(shí)閃爍
DelayMs(300); // 延時(shí)0.3秒左右
}
if(KeySet_P==0)
{
break;
}
}
LcdGotoXY(0,15); // 定位光標(biāo)到分鐘閃爍
DelayMs(10); // 延時(shí)等待,消除按鍵按下的抖動(dòng)
while(!KeySet_P); // 等待按鍵釋放
DelayMs(10); // 延時(shí)等待,消除按鍵松開的抖動(dòng)
/* 調(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); // 延時(shí)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); // 延時(shí)0.3秒左右
}
if(KeySet_P==0)
{
break;
}
}
/* 退出前的設(shè)置 */
LcdWriteCmd(0x0C); // 關(guān)閉光標(biāo)閃爍
DS1302_Write_Time(); // 把新設(shè)置的時(shí)間值存入DS1302芯片
DelayMs(10); // 延時(shí)等待,消除按鍵按下的抖動(dòng)
while(!KeySet_P); // 等待按鍵釋放
DelayMs(10); // 延時(shí)等待,消除按鍵松開的抖動(dòng)
}
}
uint temp,mm;uchar i;float f_temp;
/*******************************************************
溫度函數(shù)
*******************************************************/
void dsreset(void) //下邊是溫度獲取子程衼E
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void) //讀一位
{
uint i;
bit dat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchar tempread(void) //獲取溫度
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void tempwritebyte(uchar dat) //寫一個(gè)字節(jié)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void) //溫度轉(zhuǎn)換
{
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
uint get_temp() //獲取溫度
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
f_temp=f_temp+0.05;
return temp;
}
/***********************************/
/*********************************************************/
// 按鍵掃描(設(shè)置窗簾的動(dòng)作)
/*********************************************************/
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); // 顯示開啟窗簾的小時(shí)
LcdGotoXY(0,13); // 光標(biāo)定位
LcdPrintNum(OpenMinute); // 顯示開啟窗簾的分鐘
LcdGotoXY(1,10); // 光標(biāo)定位
LcdPrintNum(CloseHour); // 顯示關(guān)閉窗簾的小時(shí)
LcdGotoXY(1,13); // 光標(biāo)定位
LcdPrintNum(CloseMinute); // 顯示關(guān)閉窗簾的分鐘
LcdWriteCmd(0x0f); // 啟動(dòng)光標(biāo)閃爍
LcdGotoXY(0,11); // 定位光標(biāo)
DelayMs(10); // 延時(shí)等待,消除按鍵按下的抖動(dòng)
while(!KeySet2_P); // 等待按鍵釋放
DelayMs(10); // 延時(shí)等待,消除按鍵松開的抖動(dòng)
/* 調(diào)整開啟的小時(shí) */
while(1)
{
if(KeyDown_P==0) // 如果減按鍵被下去
{
if(OpenHour>0) // 判斷小時(shí)是否大于0
OpenHour--; // 是的話就減去1
LcdGotoXY(0,10); // 光標(biāo)定位
LcdPrintNum(OpenHour); // 刷新顯示改變后的小時(shí)
LcdGotoXY(0,11); // 定位光標(biāo)
DelayMs(300); // 延時(shí)0.3秒左右
}
if(KeyUp_P==0) // 如果加按鍵被下去
{
if(OpenHour<23) // 判斷小時(shí)是否小于23
OpenHour++; // 是的話就加上1
LcdGotoXY(0,10); // 光標(biāo)定位
LcdPrintNum(OpenHour); // 刷新顯示改變后的小時(shí)
LcdGotoXY(0,11); // 定位光標(biāo)
DelayMs(300); // 延時(shí)0.3秒左右
}
if(KeySet2_P==0)
{
break;
}
}
LcdGotoXY(0,14); // 定位光標(biāo)
DelayMs(10); // 延時(shí)等待,消除按鍵按下的抖動(dòng)
while(!KeySet2_P); // 等待按鍵釋放
DelayMs(10); // 延時(shí)等待,消除按鍵松開的抖動(dòng)
/* 調(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); // 延時(shí)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); // 延時(shí)0.3秒左右
}
if(KeySet2_P==0)
{
break;
}
}
LcdGotoXY(1,11); // 定位光標(biāo)
DelayMs(10); // 延時(shí)等待,消除按鍵按下的抖動(dòng)
while(!KeySet2_P); // 等待按鍵釋放
DelayMs(10); // 延時(shí)等待,消除按鍵松開的抖動(dòng)
/* 調(diào)整關(guān)閉的小時(shí) */
while(1)
{
if(KeyDown_P==0) // 如果減按鍵被下去
{
if(CloseHour>0) // 判斷小時(shí)是否大于0
CloseHour--; // 是的話就減去1
LcdGotoXY(1,10); // 光標(biāo)定位
LcdPrintNum(CloseHour); // 刷新顯示改變后的小時(shí)
LcdGotoXY(1,11); // 定位光標(biāo)
DelayMs(300); // 延時(shí)0.3秒左右
}
if(KeyUp_P==0) // 如果加按鍵被下去
{
if(CloseHour<23) // 判斷小時(shí)是否小于23
CloseHour++; // 是的話就加上1
LcdGotoXY(1,10); // 光標(biāo)定位
LcdPrintNum(CloseHour); // 刷新顯示改變后的小時(shí)
LcdGotoXY(1,11); // 定位光標(biāo)
DelayMs(300); // 延時(shí)0.3秒左右
}
if(KeySet2_P==0)
{
break;
}
}
LcdGotoXY(1,14); // 定位光標(biāo)
DelayMs(10); // 延時(shí)等待,消除按鍵按下的抖動(dòng)
while(!KeySet2_P); // 等待按鍵釋放
DelayMs(10); // 延時(shí)等待,消除按鍵松開的抖動(dòng)
/* 調(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); // 延時(shí)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); // 延時(shí)0.3秒左右
}
if(KeySet2_P==0)
{
break;
}
}
DelayMs(10); // 延時(shí)等待,消除按鍵按下的抖動(dòng)
while(!KeySet2_P); // 等待按鍵釋放
DelayMs(10); // 延時(shí)等待,消除按鍵松開的抖動(dòng)
/* 光照強(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); // 延時(shí)0.3秒左右
}
if(KeyUp_P==0) // 如果加按鍵被下去
{
if(gLight<99) // 判斷光線閾值是否小于59
gLight++; // 是的話就加上1
LcdGotoXY(1,7); // 光標(biāo)定位
LcdPrintNum(gLight); // 刷新顯示改變后的光線閾值
DelayMs(300); // 延時(shí)0.3秒左右
}
if(KeySet2_P==0)
{
break;
}
}
DelayMs(10); // 延時(shí)等待,消除按鍵按下的抖動(dòng)
while(!KeySet2_P); // 等待按鍵釋放
DelayMs(10); // 延時(shí)等待,消除按鍵松開的抖動(dòng)
// 設(shè)置溫度
LcdWriteCmd(0x0C); // 關(guān)閉光眮E了?
LcdGotoXY(0,0); // 光眮Eㄎ?
LcdPrintStr(" TEMP Set "); // 顯示第1行內(nèi)容
LcdGotoXY(1,0); // 光眮Eㄎ?
LcdPrintStr(" "); // 顯示第2行內(nèi)容
LcdGotoXY(1,7); // 光眮Eㄎ?
LcdPrintNum(wDu); // 顯示窗簾的光線控制強(qiáng)度閾值
while(1){
LcdGotoXY(1,7); // 光眮Eㄎ?
LcdPrintNum(wDu); // 顯示窗簾的光線控制強(qiáng)度閾值
if(KeyDown_P==0) // 如果減按紒E幌氯?
{
if(wDu>0) // 判斷光線閾值是否大于0
wDu--; // 是的話就減去1
DelayMs(300); // 延時(shí)0.3脕E笥?
}
if(KeyUp_P==0) // 如果加按紒E幌氯?
{
if(wDu<99) // 判斷光線閾值是否小于59
wDu++; // 是的話就加上1
DelayMs(300); // 延時(shí)0.3脕E笥?
}
if(KeySet2_P==0)
{
break;
}
}
/* 退出前的設(shè)置 */
LcdShowInit(); // 液晶顯示內(nèi)容初始化
DelayMs(10); // 延時(shí)等待,消除按鍵按下的抖動(dòng)
while(!KeySet2_P); // 等待按鍵釋放
DelayMs(10); // 延時(shí)等待,消除按鍵松開的抖動(dòng)
}
}
/*********************************************************/
// 按鍵掃描(模式切換)
/*********************************************************/
void KeyScanf3()
{
if(KeyMode_P==0)
{
gMode++; // 切換到下一模式
if(gMode==5) // 如果到盡頭了
gMode=1; // 回到第一種模式
LcdGotoXY(1,0); // 光標(biāo)定位
LcdPrintMode(gMode); // 顯示模式
DelayMs(10); // 去除按鍵按下的抖動(dòng)
while(!KeyMode_P); // 等待按鍵是否
DelayMs(10); // 去除按鍵松開的抖動(dòng)
}
}
/*********************************************************/
// 開窗
/*********************************************************/
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(); // 時(shí)鐘芯片的初始化
LcdShowInit(); // 液晶顯示內(nèi)容的初始化
if(DS1302_Read_Byte(0x81)>=128) // 判斷時(shí)鐘芯片是否正在運(yùn)行
{
DS1302_Write_Time(); // 如果沒有,則初始化一個(gè)時(shí)間
}
while(1)
{
tempchange();
t=get_temp();
if(t>=0&&t<=1250) //溫度合法范圍,不在這個(gè)范圍就是沒有獲取到合適的值
{
wd=t/10;
}
// if(yudi==0 && gMode > 1){ //檢測(cè)到有雨,并且不在手動(dòng)模式(雨天想開窗必須是手動(dòng)模式下才能開)
// delay(5);
// if(yudi==0){
// gMode=5;//立即切換到手動(dòng)模式,防止雨停自動(dòng)開啟窗簾
// LcdGotoXY(1,0); // 光標(biāo)定位
// LcdPrintMode(gMode); // 顯示模式
// DelayMs(10); // 去除按鍵按下的抖動(dòng)
// if(Led_P==0) // 如果窗簾當(dāng)前是打開的
// {
// Close(); // 則關(guān)閉窗簾
// }
// }
// }
DS1302_Read_Time(); // 獲取當(dāng)前時(shí)鐘芯片的時(shí)間,存在數(shù)組time_buf中
FlashTime(); // 刷新時(shí)間顯示
light=Get_ADC0832(1); // 讀取光照強(qiáng)度
//light=light/2; // 縮小光照檢測(cè)結(jié)果(在0-99)
LcdGotoXY(1,13); // 光標(biāo)定位
LcdPrintNum2(light);
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有程序51hei提供下載:
窗簾程序.rar
(71.3 KB, 下載次數(shù): 60)
2021-6-13 19:08 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
電路原理圖.pdf
(65.8 KB, 下載次數(shù): 57)
2021-6-13 19:08 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
usaboy
時(shí)間:
2021-6-14 06:39
very good job, thank u sir!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1