基于51单片机的蓝牙智能光控窗帘.docx
《基于51单片机的蓝牙智能光控窗帘.docx》由会员分享,可在线阅读,更多相关《基于51单片机的蓝牙智能光控窗帘.docx(26页珍藏版)》请在冰点文库上搜索。
![基于51单片机的蓝牙智能光控窗帘.docx](https://file1.bingdoc.com/fileroot1/2023-5/10/4cf664aa-b5da-48f1-bf24-89883163ba22/4cf664aa-b5da-48f1-bf24-89883163ba221.gif)
基于51单片机的蓝牙智能光控窗帘
基于51单片机的蓝牙智能光控窗帘
1、?
?
思路
系?
?
用STC12C5A60S2作?
主控芯片,用以完成?
系?
?
行机构的控制、信息?
理和液晶?
示。
?
片机控制直流?
速?
机?
?
窗帘、窗?
的控制。
光照?
度、?
?
度信?
均通?
?
?
?
牙模?
?
?
至?
片机,?
?
理后?
?
?
机?
窗?
、窗帘的自?
控制。
根据?
?
方案和要求,可?
?
路分?
5部分,分?
?
?
?
?
牙?
控,?
感器?
据采集,?
机?
?
控制,?
片机主控和?
源部分。
2、系?
?
构
此方案控制采用51?
片机的最小系?
?
?
?
步?
?
?
机控制窗?
和窗帘的拉?
和?
?
。
家居推拉窗及窗帘控制系?
可以利用?
牙?
?
模?
根据室外?
境亮度?
?
?
境亮度光控。
以及光控?
?
下?
境亮度的控制?
?
的?
整等等。
?
控制?
?
可?
是一款多功能的推拉窗及窗帘控制系?
?
?
方案。
系?
?
件?
?
框?
如下:
1.光?
度?
感器BH1750FVI
不?
分光源?
字型?
境光?
度?
感器BH1750FVI是日本RHOM株式?
社近些年推出的一种?
?
式串行?
?
接口的集成?
路,可以根据收集的光?
?
度?
据?
?
行?
境?
?
,其具有1~65535x的高分辨率,可支持?
大范?
的光照?
度?
化。
BH1750FVI?
构框?
如?
1所示。
?
1BH1750FVI?
构框?
?
?
构框?
可容易看出,外部光照被接近人眼反?
的高精度光敏二极管PD探?
到后,通?
集成?
算放大器?
PD?
流?
?
?
PD?
?
,由模?
?
?
器?
取16位?
字?
据,然后被?
?
和IC界面?
行?
据?
理与存?
。
OSC?
?
部的振?
器提供?
部?
?
?
?
,通?
相?
的指令操作即可?
取出?
部存?
的光照?
据。
?
据?
?
使用?
准的I2C?
?
,按照?
序要求操作起?
也非常方便。
2.?
?
?
感器:
DHT11?
字?
?
度?
感器是一款含有已校准?
字信?
?
出的?
?
度复合?
感器。
它?
用?
用的?
字模?
采集技?
和?
?
度?
感技?
,确保?
品具有极高的可靠性与卓越的?
期?
定性。
?
感器包括一?
?
阻式感?
元件和一?
NTC?
?
元件,并与一?
高性能8位?
片机相?
接。
因此?
?
品具有品?
卓越、超快?
?
、抗干扰能力?
、性价比极高等优?
。
每?
DHT11?
感器都在极?
精确的?
度校?
室中?
行校准。
校准系?
以程序的形式?
存在OTP?
存中,?
感器?
部在?
?
信?
的?
理?
程中要?
用?
些校准系?
。
?
?
制串行接口,使系?
集成?
得?
易快捷。
超小的体?
、极低的功耗,信?
?
?
距离可?
20米以上,使其成?
各?
?
用甚至最?
苛刻的?
用?
合的最佳?
?
。
?
品?
4?
?
排引?
封?
。
?
接方便,特殊封?
形式可根据用?
需求而提供。
3.?
机?
?
L298N的?
明及?
用
恒?
恒流?
式2A?
?
芯片L298NL298是SGS公司的?
品,比?
常?
的是15?
Multiwatt封?
的L298N,?
部同?
包含4通道?
?
?
?
?
路。
可以方便的?
?
?
?
直
流?
机,或一?
?
相步?
?
机。
L298N芯片可以?
?
?
?
二相?
机,也可以?
?
一?
四相?
机,?
出?
?
最高可?
50V,可以直接通?
?
源?
?
?
?
出?
?
;可以直接用
?
片机的IO口提供信?
;而且?
路?
?
,使用比?
方便。
L298N可接受?
准TTL?
?
?
平信?
VSS,VSS可接4.5~7V?
?
。
4?
VS接?
源?
?
,VS?
?
范?
VIH?
+2.5~46V。
?
出?
流可?
2A,可?
?
?
感性?
?
。
1?
和15?
下管的?
射极分?
?
?
引出以
便接入?
流采?
?
阻,形成?
流?
感信?
。
L298可?
?
2?
?
?
机,OUT1,OUT2和OUT3,OUT4之?
可分?
接?
?
机,本?
?
?
置我?
?
用?
?
一台?
?
机。
5,7,10,12?
接?
入控制?
平,控制?
机的正反?
。
EnA,EnB接控制使能端,控制?
机的停?
。
表1是L298N功能?
?
?
。
L298N?
?
模?
的?
用In3,In4的?
?
?
与表1相同。
由表1可知EnA?
低?
平?
,?
入?
平?
?
机控制起作用,?
EnA?
高?
平,?
入?
平?
一高一低,?
机
正或反?
。
同?
低?
平?
机停止,同?
高?
平?
机?
停。
L298N控制器原理如下:
3、控制?
件流程?
(多?
)
1.?
感器控制程序
凡是利用一定的物性(物理、化?
、生物)法?
、定理、定律、效?
等?
行能量?
?
与信息?
?
,并且?
出与?
入?
格一一?
?
的器件和?
置均可?
?
?
感器;?
感器又被?
?
?
?
器、?
?
器、?
?
器、敏感元件、?
能器和一次?
表等。
?
感器一般由敏感元件、?
?
元件和?
量?
路三部分?
成,有?
?
加上?
助?
源。
系?
中的?
感器是感受被?
量的大小并?
出相?
?
的可用?
出信?
的器件或?
置。
?
据?
?
?
?
用?
?
?
?
据。
?
?
?
系?
的几?
功能?
?
?
立地分隔?
的?
候,?
必?
由一?
地方向另一?
地方?
?
?
据,?
据?
?
?
?
就是完成?
种?
?
功能。
2.中?
控制程序
?
?
感器模?
?
?
的?
据并判?
正确?
,?
中?
程序?
T1口?
行初始化,?
而接收?
自?
?
模?
的新?
据,比?
判?
后?
到命令地址?
而?
?
机?
行?
?
和通?
?
示器?
示出?
。
中?
控制程序
3.?
机?
?
程序
步?
?
机?
行?
自控制器的命令,判?
其命令是否正确,若不正确?
返回,若正确?
?
?
?
行命令,比?
做出相?
的?
作,?
窗帘及推拉窗到?
指定的位置?
停止,器流程?
如下。
4、主要程序的指令:
附?
一:
?
牙?
?
模?
附?
二:
DHT11?
字?
?
度?
感器
附?
三:
光?
度?
感器BH1750
附?
一:
?
牙?
?
模?
:
修改at:
#include//引用程式庫
SoftwareSerialBT(8,9);//接收腳,傳送腳
charval;//儲存接收資料的變數
voidsetup(){
Serial.begin(9600);//與電腦序列埠連線
Serial.println("BTisready!
");
//設定藍牙模組的連線速率
BT.begin(9600);
}
voidloop(){
//若收到「序列埠監控視窗」的資料,則送到藍牙模組
if(Serial.available()){
val=Serial.read();
BT.print(val);
}
//若收到藍牙模組的資料,則送到「序列埠監控視窗」
if(BT.available()){
val=BT.read();
Serial.print(val);
}
}
?
机:
voidsetup()
{
Serial.begin(9600);
}
voidloop()
{
while(Serial.available())
{
charc=Serial.read();
if(c=='A')
{
Serial.println("HelloIamamarino");
}
}
}
主机:
voidsetup(){
Serial.begin(9600);
}
voidloop(){
Serial.println('A');//?
送A
while
(1);
}
附?
二:
DHT11?
字?
?
度?
感器:
U8codetable2[]="wendushidu";
U8codetable3[]="..";
sbitRS=P2^6;
sbitRW=P2^5;
sbitE=P2^7;
voidwrite_com(U8com)
{
E=0;
RS=0;
RW=0;
Delay(5);
E=1;
P0=com;
E=0;
}
voidwrite_date(U8date)
{
E=0;
RS=1;
RW=0;
Delay(5);
E=1;
P0=date;
E=0;
P0=0;
}
voidinit()
{
U8num;
Delay(15);
write_com(0x38);
write_com(0x38);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
for(num=0;num<15;num++)
{
write_date(table2[num]);
Delay
(1);
}
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
write_date(table3[num]);
Delay
(1);
}
}
voidwrite_dht11(U8add,U8date)
{
U8shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
/***********************dht11.h***************************/
typedefunsignedcharU8;
typedefunsignedintU16;
sbitP1_0=P2^0;
U8U8FLAG,k;
U8U8temp;
U8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8U8comdata;
voidDelay(U16z)
{
U8x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddelay_10us()
{
U8i;
i--;
i--;
i--;
i--;
i--;
i--;
}
voidCOM(void)//?
据01确?
{
U8i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!
P1_0)&&U8FLAG++);//1bit是否?
束
delay_10us();
delay_10us();
delay_10us();
U8temp=0;//26us~28us表示?
0
if(P1_0)U8temp=1;//超?
28us依然?
高?
平表示?
1
U8FLAG=2;
while((P1_0)&&U8FLAG++);
if(U8FLAG==1)break;//U8FLAG溢出超?
?
跳出for循?
//判?
?
据位是0?
是1
//如果高?
平高?
?
定0高?
平值?
?
据位?
1
U8comdata<<=1;
U8comdata|=U8temp;
}
}
voidRH(void)//-----?
?
度?
取子程序------------
{
P1_0=0;
Delay(34);//主机拉低高于18ms
P1_0=1;
//?
?
由上拉?
阻拉高主机延?
20us
delay_10us();
delay_10us();
delay_10us();
delay_10us();
P1_0=1;//主机?
?
?
入判?
?
机?
?
信?
if(!
P1_0)//判?
?
机是否有低?
平?
?
信?
如不?
?
?
跳出,?
?
?
向下?
行
{
U8FLAG=2;
while((!
P1_0)&&U8FLAG++);//判?
?
机是否?
出80us的低?
平?
?
信?
是否?
束
U8FLAG=2;
while((P1_0)&&U8FLAG++);//判?
?
机是否?
出80us的高?
平,如?
出?
?
入?
据接收?
?
COM();//?
据接收?
?
U8RH_data_H_temp=U8comdata;//?
度整?
8位
COM();
U8RH_data_L_temp=U8comdata;//?
度小?
8位
COM();
U8T_data_H_temp=U8comdata;//?
度整?
8位
COM();
U8T_data_L_temp=U8comdata;//?
度小?
8位
COM();
U8checkdata_temp=U8comdata;//校?
位
P1_0=1;U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)//?
据校?
正确?
行
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}
}
}
/***********************main.c***************************/
#include
#include
U16a,b,t;
U8flag,i;
voidmain()
{
RW=1;
t=0;
flag=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
init();
P1_0=1;
P2=0xff;
Delay(40);
while
(1)
{
RH();
write_dht11(0,U8T_data_H);
write_dht11(3,U8T_data_L);
write_dht11(9,U8RH_data_H);
write_dht11(12,U8RH_data_L);
if(flag==2)//100后flag?
2,?
行比?
{
if(a==U8T_data_H&&b==U8RH_data_H)
Buzzer=0;
while(a==U8T_data_H&&b==U8RH_data_H);
flag=0;
}
test();
}
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==2000)//100秒?
?
一次
{
t=0;
flag=2;//100秒后flag?
2
}
if(flag==0)//最?
始flag?
0?
值
{
a=U8T_data_H;
b=U8RH_data_H;
flag=1;//flag?
化
}
}
附?
三:
光?
度?
感器BH1750:
//使用?
,用?
只需更改GPIO_Pin_14、GPIO_Pin_15?
?
?
引?
并在主函?
里面?
用此函?
即可。
voidBH1750_Get_Guang(float*Zhaodu)
#include"stm32f10x_lib.h"
#defineucharunsignedchar
#defineuintunsignedint
#defineDataPortP0//LCD1602?
据端口
#defineSlaveAddress0x46//定?
器件在IIC?
?
中的?
地址,根据ALTADDRESS地址引?
不同修改
//ALTADDRESS引?
接地?
地址?
0x46,接?
源?
地址?
0xB8
#defineBH1750_SCLGPIO_Pin_14
#defineBH1750_SDAGPIO_Pin_15
//#defineGPIO_I2CGPIOB
#defineBH1750_SCL_0()GPIOF->BRR=BH1750_SCL
#defineBH1750_SCL_1()GPIOF->BSRR=BH1750_SCL
#defineBH1750_SDA_0()GPIOF->BRR=BH1750_SDA
#defineBH1750_SDA_1()GPIOF->BSRR=BH1750_SDA
#defineBH1750_SDA_STATE()(GPIOF->IDR&BH1750_SDA)//{return(GPIOB->IDR&PIN_SDA)!
=0;}
typedefunsignedcharBYTE;
typedefunsignedshortWORD;
BYTEBUF[8];//接收?
据?
存?
ucharge,shi,bai,qian,wan;//?
示?
量
intdis_data;//?
量
voidInit_BH1750(void);
voidconversion(uinttemp_data);
voidSingle_Write_BH1750(ucharREG_Address);//?
?
?
入?
据
ucharSingle_Read_BH1750(ucharREG_Address);//?
?
?
取?
部寄存器?
据
voidMultiple_Read_BH1750(void);//?
?
的?
取?
部寄存器?
据
//------------------------------------
u8BH1750_Start(void);
voidBH1750_Stop(void);
u8BH1750_SendByte(u8Data);
u8BH1750_ReceiveByte(void);
voidBH1750_SendACK(void);
voidBH1750_SendNACK(void);
voidBH1750_Nop(void);
voidBH1750_Delay(unsignedintk);
//-----------------------------------
u8BH1750_ACK=0;
u8BH1750_READY=0;
u8BH1750_NACK=1;
u8BH1750_BUS_BUSY=2;
u8BH1750_BUS_ERROR=3;
u8BH1750_RETRY_COUNT=3;//重?
次?
voidBH1750_Nop(void)
{
u8i=50;
while(i)
i--;
}
voidBH1750_Delay(unsignedintk)
{
unsignedinti,j;
for(i=0;i{
for(j=0;j<121;j++);
}
}
/*******************************************************************************
*函?
名?
:
IIC_START
*描述:
?
送?
?
*
*?
入:
?
*?
出:
?
*返回:
?
*作者:
*修改日期:
2010年6月8日
*******************************************************************************/
u8BH1750_Start(void)
{
BH1750_SDA_1();
BH1750_Nop();
BH1750_SCL_1();
BH1750_Nop();
if(!
BH1750_SDA_STATE())
{
////DebugPrint("TWI_START:
BUSY\n");
returnBH1750_BUS_BUSY;
}
BH1750_SDA_0();
BH1750_Nop();
BH1750_SCL_0();
BH1750_Nop();
if(BH1750_SDA_STATE())
{
////DebugPrint("TWI_START:
BUSERROR\n");
returnBH1750_BUS_ERROR;
}
returnBH1750_READY;
}
/*--------------------------------------------------------------------------*/
/**
*@Brief:
IIC_STOP
*/
/*--------------------------------------------------------------------------*/
voidBH1750_Stop(void)
{
BH1750_SDA_0();
BH1750_Nop();
BH1750_SCL_1();
BH1750_Nop();
BH1750_SDA_1();
BH1750_Nop();
//////DebugPrint("TWI_STOP\n");
}
/*--------------------------------------------------------------------------*/
/**
*@Brief:
IIC_SendACK
*/
/*--------------------------------------------------------------------------*/
voidBH1750_SendACK(void)
{
BH1750_SDA_0();
BH1750_Nop();
BH1750_SCL_1();
BH1750_Nop();
BH1750_SCL_0();
BH1750_Nop();
BH1750_SDA_1();
//////DebugPrint("TWI_SendACK\n");
}
/*------------------------------------------------