人体感应智能风扇结题报告.doc
《人体感应智能风扇结题报告.doc》由会员分享,可在线阅读,更多相关《人体感应智能风扇结题报告.doc(18页珍藏版)》请在冰点文库上搜索。
大学生科技创新
“人体感应智能电风扇”结题报告
项目名称:
人体感应智能电风扇
负责人:
张祥
学号:
2010401020102
学院专业:
电信学院·10电气工程及其自动化
联系电话:
18772738128
电子信箱:
184542248@
指导教师:
郑笔耕
联系电话:
18608690969
人体感应智能电风扇
一:
引言:
在激烈的市场竞争下,虽然电风扇具有广阔的市场空间,但不断新生产品的出现,要使产品更具市场优势,仅仅是靠传统型的电风扇是远远不够的,因此要对传统的电风扇根据市场的需要进行不断的更新,不断的改进,以使自己的产品立于不败之地。
传统的电风扇较为突出的缺点是:
①风扇的风力大小不能根据温度的变化自动的调节风速,对于那些昼夜温差比较大的地区,这个自动调节风速就显得优其的重要了,特别是人们在熟睡时常常没有觉察到夜间是温度变化,那样既浪费电资源又容易引起感冒。
②传统的风扇是用机械式的定时方式,机械式的定时方式常常会伴随着很大的机械运动的声音,特别是在夜间影响人们的睡眠质量,另个机械式的定时有一定的局限性,定时范围有限,而且机械式的容易坏。
③传统的电风扇没有单片机控制电风扇的功能,对平时调节风扇风速或其它对风扇的调节,而又不想走近风扇带来很多的不便。
鉴于以上方面的考虑,我们需要设计一种智能电风扇控制系统来解决这些问题
本设计为一种人体感应温控风扇系统,具有灵敏的温度感测和人体感应功能,系统stc89C52单片机作为控制平台对风扇转速进行控制。
人体红外感应可感知人的存在,自动开关风扇。
可由用户设置高、低档位,测得温度值在高低温度之间时打开风扇强弱风档,当温度升高超过所设定的温度时自动切换到大风档,当温度小于所设定的温度时自动降低风扇档位,控制状态随外界温度而定。
同时,能够由人工设定风扇档位不受温度控制,灵活性强。
所设高低温值保存在温度传感器DS18B20内部E2ROM中,掉电后仍然能保存上次设定值,性能稳定,控制准确。
关键词:
自动控制人体感应单片机温控手控风扇
二:
实验过程
本设计是以51单片机为主要控制核心,用51单片机系统对用户设定信号数据的采集以及分析,能过各种可控型电子元器件对电风扇各种工作状态的控制,以达到用户需求。
设计的功能要求
①风速从高到低设置4个档位,并且每个档位都可以由用户设置或者根据温度自动调节。
②风扇可以自动的根据环境的温度调节风扇风速的档位,温度上升2℃自动上升一个档位,温度每降低2℃自动下降一个档位。
③设置数码管显示当前的工作状态以及温度,使其更具人性化。
④自动模式时,感应人的存在而自动控制风扇的开关。
方案论证
1传感器部分
方案一:
采用热敏电阻
采用热敏电阻,可满足40摄氏度至90摄氏度测量范围,但热敏电阻精度、重复性、可靠性较差,对于检测1摄氏度的信号是不适用的。
而且在温度测量系统中,采用单片温度传感器,比如AD590,LM35等.但这些芯片输出的都是模拟信号,必须经过A/D转换后才能送给计算机,这样就使得测温装置的结构较复杂.另外,这种测温装置的一根线上只能挂一个传感器,不能进行多点测量.即使能实现,也要用到复杂的算法,一定程度上也增加了软件实现的难度。
方案二:
采用DS18B20
温度传感器采用DS18B20数字温度传感器。
DS18B20数字温度传感器芯片是以9位数字量的形式反映器件的温度值。
DS18B20数字温度传感器通过一个单线接口发送或接受信息,因此在中央微处理器和DS18B20之间仅需一条连接线(加上地线)。
用语读写和温度转换的电源可以从数据线本身获得,无需外部电源。
它可以直接将模拟温度信号转化为数字信号,降低了电路的复杂程度,提高了电路的运行质量。
综合考虑,选择方案DS18B20进行温度测量。
2调速方式的选择
方案一:
采用PWM控制
PWM是利用数字输出对模拟电路进行控制的一种有效技术,尤其是在对电机的转速控制方面,可大大节省能量。
PWM具有很强的抗噪性,且有节约空间、比较经济等特点。
方案二:
采用可控硅控制
实际中通过控制双向可控硅的导通角,使输出端电压发生改变,从而使施加在电风扇的输入电压发生改变,以调节风扇的转速,实现各档位风速的无级调速。
从本设计要求综合考虑实际中选择方案一。
3温度控制模块设计
方案一:
采用红外遥控器+红外遥控解码:
红外遥控器的使用大大方便了用户,使他们可以在一定范围内实现对本系统的远程控制,符合当代人的生活习惯,而且红外遥控器的技术已经相当成熟,使用也比较方便。
方案二:
选用键盘:
假如使用键盘,用户就只能走进本控制系统去控制该系统已完成自己想要的操作。
此方案设计与制作比较简单,且能完全完成既定功能。
综合各方面因素,采用方案二。
4显示电路的设计
方案一:
LCD1602液晶屏:
LCD1602液晶屏是16*2的字符型液晶,可以显示英文26个字母的大小写,阿拉伯数字0—9,及一些简单的符号。
该液晶屏操作简单,显示功能强大。
方案二:
数码管:
虽然数码管的显示位数有限,且只能显示一些简单的字符。
但是在本课程设计中,所需要的数码管不多,少量数码管即可符合设计要求,估可采用。
综上所述,我们选择了数码管作为显示模块。
系统简述
本系统由人体红外感应、集成温度传感器、单片机、LED数码管、发光二极管、驱动芯片、直流电机及一些其他外围器件组成。
辅助元件包括发光二极管、电阻、晶振、电源、按键等。
使用具有价廉易购的stc89S52单片机编程控制,通过修改程序可方便实现系统升级。
主程序流程图
进入手动模式
根据温度驱动电机
开关
初始化
检测DS18B20
温度转换命令
读温度
温度BCD码处理
显示温度
等待模式转换键
进入温控模式
Y
K2
K2
温度处理函数
检测加减档位键
根据档位调整电机风速
人体感应红外
系统各器件简介
1、DS18B20单线数字温度传感器简介
有3引脚TO-92小体积封装形式。
温度测量范围为-55℃——+125℃,可编程为9位——12位A/D转换精度,测温分辨率可达0.0625℃。
被测温度用符号扩展的16位数字量方式串行输出。
工作电压支持3V——5.5V的电压范围,既可在远端引入,也可采用寄生电源方式产生。
DS18B20还支持“一线总线”接口,多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信。
DS18B20内部结构及管脚
DS18B20内部结构如图3所示,主要由4部分组成:
64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
其管脚排列如图4所示,DQ为数字信号端,GND为电源地,VDD为电源输入端。
2stc89C52单片机简介
stc89C52是一种带4K字节闪存可编程可擦除只读存储器(FPEROM)256B片内RAM的低电压,高性能CMOS8位微处理器。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,stc89C52是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
引脚接法:
P0口作为数码管段选,
P1.1到P1.3作为数码管位选,
P2.0到P2.3作为led显示,
P3.0到P3.3作为动合触点开关,
P3.4作为直流电机PWM驱动,
P3.5接DS18B20温度感应,
P3.6接红外人体感应。
3人体红外感应HC-SR501
1.感应模块通电后有一分钟左右的初始化时间,在此期间模块会间隔地输出
0-3次,一分钟后进入待机状态。
2.应尽量避免灯光等干扰源近距离直射模块表面的透镜,以免引进干扰信号产生误动作;使用环境尽量避免流动的风,风也会对感应器造成干扰。
3调节距离电位器顺时针转,感应距离增大(约7米),反之感应距离减小(约3米)。
调节延时电位器顺时针转,感应延时加长(约300S),反之,感应延时减短(约5S)
产品型号
HC--SR501人体感应
工作电压范围
直流电压4.5-20V
静态电流
<50uA
电平输出
高3.3V/低0V
触发方式
L不可重复触发/H重复触发(默认重复触发)
延时时间
0.5-200S(可调)可制作范围零点几秒-几十分钟
封锁时间
2.5S(默认)可制作范围零点几秒-几十秒
电路板外形尺寸
32mm*24mm
感应角度
<100度锥角
工作温度
-15-+70度
感应透镜尺寸
直径:
23mm(默认)
4八段LED数码管
本系统使用四个八段LED数码管作为温度和风扇档位显示,前三位显示温度,最后一位显示档位。
公共阳极。
5驱动芯片ULN2803
ULN2803,8个NPN达林顿晶体管,连接在阵列非常适合逻辑接口电平数字电路(例如TTL,CMOS或PMOS上/NMOS)和较高的电流/电压,如电灯,电磁阀,继电器,打印锤或其他类似的负载,广泛的使用范围:
计算机,工业和消费应用。
所有设备功能由集电极输出和钳位二极管瞬态抑制。
该ULN2803是专为符合标准TTL,而制造ULN2804适合6至15V的高级别CMOS或PMOS上。
该电路为反向输出型,即输入低电平电压,输出端才能导通工作。
各部分电路设计
1电源电路
电源电路采用LM7805集成稳压器作为稳压器件,用典型接法,220V电源整流滤波后送入LM7805稳压,在输出端接一个470U和0.1U电容进一步滤除纹波,得到5V稳压电源。
电路如图4所示。
2数码管显示电路
数码管显示电路采用共阳极四位数码管以及9012三极管作为驱动数码管发亮。
其连接方式如下:
应用单片机P0口连接八段数码管,用P1口的P1.0—P1.3四个端口作为数码管的片选信号输出端口,其中要用9012(PNP型)三极管做驱动。
为了防止烧坏数码管,所以给数码管各段各加一个50k的限流电阻。
要显示的数据通过P0口送给数码管显示,通过P1口的P1.0—P1.3四个端口分别对数码管进行位选,事实上数码管是间断被点亮的,只是其间断时间十分短,扫描周期在20ms以下,利用人眼视觉暂留,我们基本看不出它们的闪烁。
3温度采集、控制模式设定以及复位电路
这一部分主要是由DS18B20,四个按键。
开关设定主要是通过按键K1来设定的。
模式转换键由K2来完成,可以实现温度控制风速和手动设定风速的功能。
手动设定风扇档位由K3、K4来完成,按一下K3键可以实现档位增一,而按下K4键可以实现档位减一。
4电机驱动电路
驱动模块主要采用驱动芯片ULN2803,PWM脉冲信息通过I\O口P3^4输出,然后经过ULN2803时由1B—7B输入至7C输出以驱动电机转动。
5开关、模式指示灯电路
分别通过P1^0—P1^2作为开关、两个模式指示灯,按下开关键K1时,开关指示灯亮,表明DS18B20一开始工作;若此时按下K2选择模式一,转为到温度控制风速功能,当达到相应温度范围,电机转速作相应改变;若按下K2选择模式二,转为手动控制风速,此时可以分别按K3或者K4键,以控制档位。
三:
结果与讨论
将本电路用硬件做出来,用编程器将KEIL软件对源程序编译生成的.HEX文件烧入stc89C52单片机,将单片机插入到目标板中,连好线。
理想和现实总是很大差距,出了液晶显示可以正常显示外,其他功能都无法正常工作,接下来的事就是最关键的也是最难的,调试程序。
我们小组成员分块进行了每个模块的功能实现,然后在整合到一起,过然不出所料,离结果越来越近,最终在查资料,问老师,问同学之后。
结果终于出来了。
四:
参考文献
[1]郭天祥,51单片机c语言教程,电子工业出版社,
[2]张毅刚,单片机原理及应用,高等教育出版社,
[3]胡汉才.单片机原理及其接口技术.北京:
清华大学出版社,
[4]吴金戍,沈庆阳,郭庭吉.8051单片机实践与应用.北京:
清华大学出版社,
[5]王化详,张淑英.传感器原理.天津:
天津大学出版社,
[6]荣俊昌.新型电风扇原理与维修.北京:
高等教育出版社。
参考网站:
百度,电子发烧友网,单片机论坛,51单片机之家等。
五:
心得
大约在去年的这个时候,在无意间听到同学说,学校现在在弄什么科技创新,当时就比较感兴趣,听到这个消息后我就想,如果我也能参加就好了,于是班上问了下,大家都很想做这个,但是没有行动起来,听到这个消息后我就想自己组个队,来做一些小作品,就算是对大学无聊生活的一种慰藉吧。
说做就做,再联系了好多同学后,终于确定了人选,我,张月,黄业,操镭,吕超。
我们五个组成的小组就开始了我们即将为期一年的创新之旅,可能是初生牛犊不怕虎,尽管我们什么都不懂,当时也不知道51单片机是什么,但我们还是义无反顾了……
队员是有了,可是,我们做什么呢?
困扰了我,由于我们班之前有同学参加过全国大学生电子设计大赛,所以我就打算做一个和51单片机这一块相似的东西,至少在不懂的情况下还可以问一下他们,当时我就在心里默默这么定了,尽管都没争取组员的同意。
大体范围是有了,可是,具体做什么还是没方向,那几天我就想热锅上的蚂蚁,记得团团转,心里非常烦躁,回到宿舍打开风扇就趴在椅子上小睡了,睡到一半被冻醒了,我想,哎要是能自动调节温度就好了。
“自动调节温度”突然这几个词在我脑海中浮现,为何我不自己做一个自动调节温度的风扇呢,对,就这么搞。
经过酝酿,讨论,人体感应只能风扇就这样出来了……
购买材料,焊接板块,集中学习单片机,c语言……我们小组每位成员都忙的如火如荼,从将开发板上的每一个LDE灯点亮到数码管的动态显示,从ds18b20的温度读取到电机的占空比调转。
我们一直忙碌着,从来不敢怠慢。
尽管我们遇到很多困难,尽管一次次的失败,我们依然在前线。
记得刚开始学习定时器计数器一块时候,我总是搞不清楚为什么可以通过寄存器的通知可以决定选什么,该怎样工作,直到后来秦昌研把电路图拿给我看时候,我才恍然大悟,此事深刻感觉到了原理的重要性,我们学习只是应该扎实,不能只知道其表面,不知其根本。
在学习温度感应模块时候,我们之前已经把郭天祥书上的类似程序看的很明白了,可是移植到自己的程序上时候,还是不知道为什么,温度显示不出来,后来查了好久才发现是参数设置问题,由此可见,相同的东西,我们不能照搬照抄,要有自己的独立性。
另外,每个细节都是很重要的,细节决定成败,不是嘴上说说。
在经历和查资料,学软件,分析程序,调试。
最终的成品看起来却只有巴掌大,就这巴掌大的东西里面却蕴含着很多心血,真是台上一分钟,台下十年功。
当初,学校给我们一年的时间我觉得蛮长的,现在想起来不仅不长,还是挤挤的,要是还有时间,我得要做的更好。
设计得更优化,功能更多。
在这里我想感谢我们的指导老师郑笔耕老师,记得有好几次遇到困难了,我都有想放弃的冲动,这个时候,郑老师总能给我正能量。
例如上次中期检查时候,我有种不想接着做下去的冲动,老师还是给了我继续的动力。
很多事情老师都事先替我想好了,我想,如果没有老师的教导和监督,我们小组也就胎死腹中了。
不仅是学习了很多东西,最重要的一点就是合作,我们小组的成员都有同感,合作和分工是成功的必备法则。
很多东西在书上看了后不以为然,可是每当自己经历后才深刻体会到了他的真谛。
总之,本次科技创新将是我人生的一大财富。
感谢学校给了我们这次机会,感谢郑老师的帮助,还得感谢帮助我们小组的秦昌研同学。
有人说成功男人后一定有一个贤惠的女人,我想说,成功的小组背后少不了一群人的帮助……
六:
图片
七:
程序
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
floatf_temp;
uinttemp;
ucharbai,shi,ge; //温度显示百、十、个位;
ucharnum;
uintwarn1=200; //温度警示值;
uintwarn2=220;
uintwarn3=240;
uintwarn4=260;
uintpower,mode,flag; //开关、模式转换标志;
sbitwx1=P1^0; //温度显示位选;
sbitwx2=P1^1;
sbitwx3=P1^2;
sbitwx_dang=P1^3; //风扇档位显示数码管位选;
sbitled0=P2^7; //相关模式指示灯;
sbitled1=P2^6;
sbitled2=P2^5;
sbitled3=P2^4;
sbiton_off=P2^3; //开关;
sbitmodeswitch=P2^2; //模式转换标志;
sbitjia_key=P2^1; //档位增;
sbitjian_key=P2^0; //档位减;
sbitds=P3^5; //DS18B20的DQ端;
sbitren=P3^6; //红外
sbitdianji=P3^7; //电机驱动端;
ucharcodetable[]= //共阴数码管;
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
ucharcodetable_dot[]={ //带小数点共阳数码管
0x40,0x79,0x24,0x30,
0x19,0x12,0x02,0x78,
0x00,0x10};
ucharcodetable_dang[]= //风扇档位数码管;
{0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,
0x90};
voiddelay(uintz) //延时函数;
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddsreset(void)//DS18B20复位,初始化函数
{
uinti;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bittempreadbit(void) //读一位数据函数
{
uinti;
bitdat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;
while(i>0)i--;
return(dat);
}
uchartempread(void) //读1个字节数据函数
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里
}
return(dat);
}
voidtempwritebyte(uchardat) //写入温度字节;
{
uinti;
ucharj;
bittestb;
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++;
}
}
}
voidtempchange(void) //DS18B20开始获取温度并转换
{
dsreset();
delay
(1);
tempwritebyte(0xcc); //写跳过读ROM指令
tempwritebyte(0x44); //写温度转换指令
}
uintget_temp() //读取寄存器中存储的温度数据
{
uchara,b;
dsreset();
delay
(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread(); //读取低8位
b=tempread(); //读取高8位
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
f_temp=f_temp+0.05;
returntemp;
}
voiddisplay_dang() //档位显示函数;
{
wx_dang=0;
P0=table_dang[num];
delay(3);
wx_dang=1;
}
display(uinttemp) //显示温度 ;
{
bai=temp/100;
shi=temp/10%10;
ge=temp%10;
wx1=0;
P0=~table[bai]; //显示百位;
delay(3);
wx1=1;
wx2=0;
P0=table_dot[shi]; //显示十位;
delay(3);
wx2=1;
wx3=0;
P0=~table[ge]; //显示个位;
delay(3);
wx3=1;
}
voidallot(uintt)
{
if((t>warn1)&&(t<=warn2)) //大于25度小于27度
{ num=0;
}
elseif(t<=warn1) //小于25度
{
num=0;
}
elseif((t=warn3))//小于32度大于30度
{ num=2;
}
elseif(t>=warn4) //大于32度
{ num=3;
}
else //在27度和30度之间时是调用显示函数延时
{ n