




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于51单片机的蓝牙智能光控窗帘1、 设计思路系统选用 stc12c5a60s2 作为主控芯片,用以完成对系统执行机构的控制、信息处理和液晶显示。 单片机控制直流减速电机实现窗帘、窗户的控制。 光照强度、温湿度信号均通过无线蓝牙模块传输至单片机,经处理后实现电机对窗户、窗帘的自动控制。根据设计方案和要求,可将电路分为 5 部分,分别为无线蓝牙遥控,传感器数据采集,电机驱动控制,单片机主控和电源部分。电机驱动电源模块51单片机a/d转换器蓝牙模块温湿度传感器光电传感器2、 系统结构此方案控制采用51单片机的最小系统来驱动步进电动机控制窗户和窗帘的拉开和关闭。家居推拉窗及窗帘控制系统可以利用蓝牙无线模块根据室外环境亮度实现环境亮度光控。以及光控状态下环境亮度的控制参数的调整等等。该控制设计可谓是一款多功能的推拉窗及窗帘控制系统设计方案。系统软件设计框图如下:单片机中央控制程序传感器控制 电机驱动1. 光强度传感器 bh1750fvi不区分光源数字型环境光强度传感器bh1750fvi是日本 株式会社近些年推出的一种两线式串行总线接口的集成电路,可以根据收集的光线强度数据来进行环境监测,其具有165535的高分辨率,可支持较大范围的光照强度变化。bh1750fvi结构框图如图所示。图1 bh1750fvi结构框图从结构框图可容易看出,外部光照被接近人眼反应的 高精度光敏二极管探测到后,通过集成运算放大器将 电流转换为 电压,由模数转换器获取 位数字数 据,然后被逻辑和界面进行数据处理与存储。为 内部的振荡器提供内部逻辑时钟,通过相应的指令操作即 可读取出内部存储的光照数据。数据传输使用标准的 总线,按照时序要求操作起来也非常方便。2. 温湿传感器: dht11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个ntc测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个dht11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在otp内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。243. 电机驱动l298n 的说明及应用恒压恒流桥式2a 驱动芯片l298nl298 是sgs 公司的产品,比较常见的是15 脚multiwatt 封装的l298n,内部同样包含4 通道逻辑驱动电路。可以方便的驱动两个直流电机,或一个两相步进电机。l298n 芯片可以驱动两个二相电机,也可以驱动一个四相电机,输出电压最高可达50v,可以直接通过电源来调节输出电压;可以直接用单片机的io 口提供信号;而且电路简单,使用比较方便。l298n 可接受标准ttl 逻辑电平信号vss,vss 可接457 v 电压。4 脚vs 接电源电压,vs 电压范围vih 为2546 v。输出电流可达2 a,可驱动电感性负载。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 / 引用程式庫softwareserial bt(8, 9); / 接收腳, 傳送腳char val; / 儲存接收資料的變數void setup() serial.begin(9600); / 與電腦序列埠連線 serial.println(bt is ready!); / 設定藍牙模組的連線速率 bt.begin(9600);void loop() / 若收到序列埠監控視窗的資料,則送到藍牙模組 if (serial.available() val = serial.read(); bt.print(val); / 若收到藍牙模組的資料,則送到序列埠監控視窗 if (bt.available() val = bt.read(); serial.print(val); 从机:void setup() serial.begin(9600);void loop() while(serial.available() char c=serial.read(); if(c=a) serial.println(hello i am amarino); 主机:void setup() serial.begin(9600);void loop() serial.println(a); / 发送a while(1); 附录二:dht11数字温湿度传感器:u8 code table2= wendu shidu ;u8 code table3= . . ;sbit rs=p26;sbit rw=p25;sbit e=p27;void write_com(u8 com)e=0;rs=0;rw=0;delay(5);e=1;p0=com;e=0;void write_date(u8 date)e=0;rs=1;rw=0;delay(5);e=1;p0=date;e=0;p0=0;void init()u8 num;delay(15);write_com(0x38);write_com(0x38);write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);for(num=0;num15;num+)write_date(table2num);delay(1);write_com(0x80+0x40);for(num=0;num0;x-) for(y=110;y0;y-);void delay_10us() u8 i; i-; i-; i-; i-; i-; i-; void com(void) /数据0 1确认 u8 i; for(i=0;i8;i+) u8flag=2; while(!p1_0)&u8flag+); /1bit是否结束 delay_10us(); delay_10us(); delay_10us(); u8temp=0;/ 26us28us 表示为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; void rh(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 u16 a,b,t;u8 flag,i;void main() 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();void timer0() interrupt 1th0=(65536-50000)/256;tl0=(65536-50000)%256;t+;if(t=2000)/100秒检测一次t=0;flag=2;/100秒后flag为2if(flag=0)/最开始 flag为0 赋值a=u8t_data_h;b=u8rh_data_h;flag=1;/flag变化附录三:光强度传感器bh1750:/使用时,用户只需更改gpio_pin_14、gpio_pin_15这两个引脚,并在主函数里面调用此函数即可。void bh1750_get_guang( float *zhaodu)#include stm32f10x_lib.h#define uchar unsigned char#define uint unsigned int#define dataport p0 /lcd1602数据端口#define slaveaddress 0x46 /定义器件在iic总线中的从地址,根据alt address地址引脚不同修改 /alt address引脚接地时地址为0x46,接电源时地址为0xb8#define bh1750_scl gpio_pin_14 #define bh1750_sda gpio_pin_15 /#define gpio_i2c gpiob#define bh1750_scl_0() gpiof-brr=bh1750_scl#define bh1750_scl_1() gpiof-bsrr=bh1750_scl#define bh1750_sda_0() gpiof-brr=bh1750_sda#define bh1750_sda_1() gpiof-bsrr=bh1750_sda#define bh1750_sda_state() (gpiof-idr&bh1750_sda) / return (gpiob-idr & pin_sda) != 0; typedef unsigned char byte;typedef unsigned short word;byte buf8; /接收数据缓存区 uchar ge,shi,bai,qian,wan; /显示变量int dis_data; /变量void init_bh1750(void);void conversion(uint temp_data);void single_write_bh1750(uchar reg_address); /单个写入数据uchar single_read_bh1750(uchar reg_address); /单个读取内部寄存器数据void multiple_read_bh1750(void); /连续的读取内部寄存器数据/-u8 bh1750_start(void); void bh1750_stop(void); u8 bh1750_sendbyte(u8 data); u8 bh1750_receivebyte(void); void bh1750_sendack(void); void bh1750_sendnack(void);void bh1750_nop(void );void bh1750_delay(unsigned int k) ;/-u8 bh1750_ack =0; u8 bh1750_ready =0; u8 bh1750_nack =1; u8 bh1750_bus_busy =2; u8 bh1750_bus_error =3; u8 bh1750_retry_count = 3; /重试次数 void bh1750_nop(void) u8 i=50; while(i) i-; void bh1750_delay(unsigned int k)unsigned int i,j;for(i=0;ik;i+)for(j=0;j121;j+); /* * 函数名称:iic_start * 描 述:发送启动 * * 输 入:无 * 输 出:无 * 返 回:无 * 作 者: * 修改日期:2010年6月8日 */ u8 bh1750_start(void) bh1750_sda_1(); bh1750_nop(); bh1750_scl_1(); bh1750_nop(); if(!bh1750_sda_state() /debugprint(twi_start:busyn); return bh1750_bus_busy; bh1750_sda_0(); bh1750_nop(); bh1750_scl_0(); bh1750_nop(); if(bh1750_sda_state() /debugprint(twi_start:bus errorn); return bh1750_bus_error; return bh1750_ready; /* -*/ /* * brief: iic_stop */ /* -*/ void bh1750_stop(void) bh1750_sda_0(); bh1750_nop(); bh1750_scl_1(); bh1750_nop(); bh1750_sda_1(); bh1750_nop(); /debugprint(twi_stopn); /* -*/ /* * brief: iic_sendack */ /* -*/ void bh1750_sendack(void) bh1750_sda_0(); bh1750_nop(); bh1750_scl_1(); bh1750_nop(); bh1750_scl_0(); bh1750_nop(); bh1750_sda_1(); /debugprint(twi_sendackn); /* -*/ /* * brief: iic_sendnack */ /* -*/ void bh1750_sendnack(void) bh1750_sda_1(); bh1750_nop(); bh1750_scl_1(); bh1750_nop(); bh1750_scl_0(); bh1750_nop(); /debugprint(twi_sendnackn); /* -*/ /* * brief: twi_sendbyte * * param: data * * returns: */ /* -*/ u8 bh1750_sendbyte(u8 data) u8 i; bh1750_scl_0(); for(i=0;i8;i+) /-数据建立- if(data&0x80) bh1750_sda_1(); else bh1750_sda_0(); data=1; bh1750_nop(); /-数据建立保持一定延时- /-产生一个上升沿正脉冲 bh1750_scl_1(); bh1750_nop(); bh1750_scl_0(); bh1750_nop();/延时,防止scl还没变成低时改变sda,从而产生start/stop信号 /- /接收从机的应答 bh1750_sda_1(); bh1750_nop(); bh1750_scl_1(); bh1750_nop(); if(bh1750_sda_state() bh1750_scl_0(); bh1750_sda_1(); /debugprint(twi_nack!n); return bh1750_nack; else bh1750_scl_0(); bh1750_sda_1(); /debugprint(twi_ack!n); return bh1750_ack; /* -*/ /* * brief: iic_receivebyte * * returns: */ /* -*/ u8 bh1750_receivebyte(void) u8 i,dat; bh1750_sda_1(); bh1750_scl_0(); dat=0; for(i=0;i8;i+) bh1750_scl_1();/产生时钟上升沿正脉冲,让从机准备好数据 bh1750_nop(); dat=1; if(bh1750_sda_state() /读引脚状态 dat|=0x01; bh1750_scl_0();/准备好再次接收数据 bh1750_nop();/等待数据准备好 /debugprint(twi_dat:%xn,dat); return dat; /*/void conversion(uint temp_data) / 数据转换出 个,十,百,千,万/ / wan=temp_data/10000+0x30 ;/ temp_data=temp_data%10000; /取余运算/qian=temp_data/1000+0x30 ;/ temp_data=temp_data%1000; /取余运算/ bai=temp_data/100+0x30 ;/ temp_data=temp_data%100; /取余运算/ shi=temp_data/10+0x30 ;/ temp_data=temp_data%10; /取余运算/ ge=temp_data+0x30; /*void single_write_bh1750(uchar reg_address) bh1750_start(); /起始信号 bh1750_sendbyte(slaveaddress); /发送设备地址+写信号 bh1750_sendbyte(reg_address); /内部寄存器地址, / bh1750_sendbyte(reg_data); /内部寄存器数据, bh1750_stop(); /发送停止信号/*单字节读取*/*uchar single_read_bh1750(uchar reg_address) uchar reg_data; bh1750_start(); /起始信号 bh175
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教师汇报培训成果
- 早教行业销售技巧培训
- 肿瘤的生长和扩散
- 秃头鹰美术课件
- 杨学军老师培训课件
- 胃肠减压操作流程及护理
- 造瘘术后并发症的识别与防治
- 烟草制造知识培训课件
- 桥梁技术培训课件
- 管培生培训课件
- GB/T 45355-2025无压埋地排污、排水用聚乙烯(PE)管道系统
- 安全生产风险防控课件
- ISO45001 2024职业健康安全管理体系要求及使用指南
- 2025年湖南株洲南方中学自主招生英语试卷真题(含答案详解)
- 劳务绿化合同范本
- 2025年云南黄金矿业集团股份有限公司招聘笔试参考题库含答案解析
- 基于BOPPPS框架与线上线下混合教学模式的探索
- 中国瑜伽服市场需求现状调研及未来营销趋势研究报告
- DB32-T 186-2015建筑消防设施检测技术规程
- 2025年上半年广东省广州白云区太和镇政府雇员招聘16人易考易错模拟试题(共500题)试卷后附参考答案
- DBJ33T 1271-2022 建筑施工高处作业吊篮安全技术规程
评论
0/150
提交评论