基于51单片机的蓝牙智能光控窗帘.docx

上传人:b****4 文档编号:6881320 上传时间:2023-05-10 格式:DOCX 页数:26 大小:318.91KB
下载 相关 举报
基于51单片机的蓝牙智能光控窗帘.docx_第1页
第1页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第2页
第2页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第3页
第3页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第4页
第4页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第5页
第5页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第6页
第6页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第7页
第7页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第8页
第8页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第9页
第9页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第10页
第10页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第11页
第11页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第12页
第12页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第13页
第13页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第14页
第14页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第15页
第15页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第16页
第16页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第17页
第17页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第18页
第18页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第19页
第19页 / 共26页
基于51单片机的蓝牙智能光控窗帘.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于51单片机的蓝牙智能光控窗帘.docx

《基于51单片机的蓝牙智能光控窗帘.docx》由会员分享,可在线阅读,更多相关《基于51单片机的蓝牙智能光控窗帘.docx(26页珍藏版)》请在冰点文库上搜索。

基于51单片机的蓝牙智能光控窗帘.docx

基于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");

}

/*------------------------------------------------

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2