|
電動窗簾主要有以下幾大功能:(1)手動控制:該功能使電動窗簾具有手動正傳、手動反轉(zhuǎn) 和手動停止的功能。而且增加了工作狀態(tài)指示,電機(jī)工作在正傳、反轉(zhuǎn)和停止?fàn)顟B(tài)的時(shí)候,手機(jī)APP上均有不同工作狀態(tài)指示。(2)自動控制:窗簾的關(guān)閉和開啟通過環(huán)境亮度自動完成窗簾的開啟或關(guān)閉操作,“天黑關(guān)閉,天亮打開”具有智能管理,不產(chǎn)生誤動作。(3)防過卷功能:通過在窗戶兩邊各安裝一個(gè)行程開關(guān),當(dāng)窗簾開啟或關(guān)閉到位時(shí),行程開關(guān)動作,然后單片機(jī)發(fā)出控制信號使步進(jìn)電機(jī)停止動作。
窗簾的正轉(zhuǎn)、反轉(zhuǎn)和停止功能可由手機(jī)APP通過藍(lán)牙通訊向單片機(jī)發(fā)布命令來控制步進(jìn)電機(jī)的運(yùn)轉(zhuǎn)以實(shí)現(xiàn)。自動控制通過光線檢測電路來控制單片機(jī)輸出電平繼而控制電機(jī)的正轉(zhuǎn)和反轉(zhuǎn)。
軟件程序代碼:
#include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
#include"XPT2046.h"
typedef unsigned int u16; //對數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;
u8 receiveData;
sbit led=P2^4; //手動運(yùn)行指示燈
sbit xcg=P3^2; //左行程開關(guān)
sbit xck=P3^3; //右行程開關(guān)
u8 tab[]={0x0e,0x0c,0x0d,0x09,0x0b,0x03,0x07,0x06};
u8 a=0,b=1;//用于記憶行程開關(guān)狀態(tài)
void delay(u16 i)//延時(shí)函數(shù)
{
while(i--);
}
void UsartConfiguration()
{
SCON=0X50; //設(shè)置為工作方式1
TMOD=0X20; //設(shè)置定時(shí)器1工作方式2
TH1=0XFD; //定時(shí)器裝初值(波特率為9600)
TL1=0XFD;
ES=1; //開串行中斷
EA=1; //開總中斷
TR1=1; //啟動定時(shí)器1
}
void motor1()//關(guān)窗簾
{
u8 i;
for(i=0;i<8;i++)
{
P1=tab;
delay(180);
}
}
void motor2()//開窗簾
{
u8 i;
for(i=7;i>=0;i--)
{
P1=tab;
delay(180);
}
}
void xcg1()
{
if(xcg==0) //檢測按鍵是否按下
{
delay(600); //消除抖動 一般大約10ms
if(xcg==0) //再次判斷按鍵是否按下
{
a=0;
b=1;
}
}
}
void xck1()
{
if(xck==0) //檢測按鍵是否按下
{
delay(600); //消除抖動 一般大約10ms
if(xck==0) //再次判斷按鍵是否按下
{
a=1;
b=0;
}
}
}
void main()
{
u16 light,mode=1;//開機(jī)進(jìn)入自動模式(mode=1)
UsartConfiguration();
while(1)
{
while(mode==1)//自動模式
{
led=1;
light=Read_AD_Data(0xA4);//讀取光敏電阻值
if(receiveData=='S'){mode=0;}//手動模式
while (a==1&&light<150)//關(guān)窗簾
{
if(receiveData=='S'){mode=0;light=150;}
while(receiveData=='T'){P1=0xFF;}
motor1();
xcg1();
}
while (b==1&&light>200)//開窗簾
{
if(receiveData=='S'){mode=0;light=200;}
while(receiveData=='T'){P1=0xFF;}
motor2();
xck1();
}
P1=0xFF;//電機(jī)斷電停止
}
while(mode==0)//手動模式
{ led=0;//手動控制指示燈
if (receiveData=='Z'){mode=1;}
while (a==1&&receiveData=='G')//關(guān)窗簾
{
motor1();
b=1;
xcg1();
while(receiveData=='T'){P1=0xFF;}
}
while (b==1&&receiveData=='K')//開窗簾
{
motor2();
a=1;
xck1();
while(receiveData=='T'){P1=0xFF;}
}
P1=0xFF;
}
}
}
void Usart() interrupt 4 //串行口中斷
{
receiveData=SBUF; //接收數(shù)據(jù)
RI = 0; //清除接收中斷標(biāo)志位
}
AD轉(zhuǎn)換 XPT2046.h程序:
#include"XPT2046.h"
sbit DOUT = P3^7; //輸出
sbit CLK = P3^6; //時(shí)鐘
sbit DIN = P3^4; //輸入
sbit CS = P3^5; //片選
uint Read_AD_Data(uchar cmd);
uint SPI_Read(void);
void SPI_Write(uchar dat);
void SPI_Start(void)
{
CLK = 0;
CS = 1;
DIN = 1;
CLK = 1;
CS = 0;
}
void SPI_Write(uchar dat)
{
uchar i;
CLK = 0;
for(i=0; i<8; i++)
{
DIN = dat >> 7; //放置最高位
dat <<= 1;
CLK = 0; //上升沿放置數(shù)據(jù)
CLK = 1;
}
}
uint SPI_Read(void)
{
uint i, dat=0;
CLK = 0;
for(i=0; i<12; i++) //接收12位數(shù)據(jù)
{
dat <<= 1;
CLK = 1;
CLK = 0;
dat |= DOUT;
}
return dat;
}
uint Read_AD_Data(uchar cmd)
{
uchar i;
uint AD_Value;
CLK = 0;
CS = 0;
SPI_Write(cmd);
for(i=6; i>0; i--); //延時(shí)等待轉(zhuǎn)換結(jié)果
CLK = 1; //發(fā)送一個(gè)時(shí)鐘周期,清除BUSY
_nop_();
_nop_();
CLK = 0;
_nop_();
_nop_();
AD_Value=SPI_Read();
CS = 1;
return AD_Value;
}
|
|