51单片机课程设计智能电风扇.docx
《51单片机课程设计智能电风扇.docx》由会员分享,可在线阅读,更多相关《51单片机课程设计智能电风扇.docx(34页珍藏版)》请在冰豆网上搜索。
![51单片机课程设计智能电风扇.docx](https://file1.bdocx.com/fileroot1/2023-4/16/064c6473-bf72-4923-a5d4-22a44752fce1/064c6473-bf72-4923-a5d4-22a44752fce11.gif)
51单片机课程设计智能电风扇
智能电风扇的设计
学院计算机与控制工程学院
专业班级自动化073班
学生姓名冯文科
指导教师白晓乐夏康伟
2010年6月25日
引言
随着人们生活水平及科技水平的不断提高,现在家用电器在款式、功能等方面日益求精,并朝着健康、安全、多功能、节能等方向发展。
过去的电器不断的显露出其不足之处。
电风扇作为家用电器的一种,同样存在类似的问题。
现在电风扇的现状:
大部分只有手动调速,再加上一个定时器,功能单一。
存在的隐患或不足:
比如说人们常常离开后忘记关闭电风扇,浪费电且不说还容易引发火灾,长时间工作还容易损坏电器。
再比如说前半夜温度高电风扇调的风速较高,但到了后半夜气温下降,风速不会随着气温变化,容易着凉。
之所以会产生这些隐患的根本原因是:
缺乏对环境的检测。
如果能使电风扇具有对环境进行检测的功能,当房间里面没有人时能自动的关闭电风扇;当温度下降时能自动的减小风速甚至关闭风扇,这样一来就避免了上述的不足。
本次设计就是围绕这两点对现有电风扇进行改进。
1.总体方案设计及功能描述
本设计是以AT89C51单片机控制中心,主要通过提取热释电红外传感器感应到的人体红外线信息和温度传感器DS18B20得到的温度以及内部定时器设定时间长短来控制电风扇的开关及转速的变化。
功能描述:
电风扇工作在四种状态:
手动调速状态、自动调速状态、定时状态、停止状态。
手动状态时可以手动调节速度;自动状态时通过温度高低自动调节速度,如果出现手动现象则变为手动状态;定时状态时可以调节定时时间,并设定是否启动定时,之后可以手动退出,也可以在不操作6秒后自动退出进入手动状态;停止状态时可以被唤醒并进入自动状态。
当没有检测到人体存在超过3分钟或定时完毕时进入停止状态。
在数码管显示方面,当没有定时时,只显示气温,当定时启动时气温和定时剩余时间以3秒的速度交替显示。
系统方框图如下图所示,主要包括:
输入、控制、输出三大部分8个功能模块。
图1-1系统方框图
2.功能模块硬件简介与实现
2.1键盘输入电路
由于设计中用到的按键数目不多,所以可以直接用AT89C51的通用IO端口且选用AT89C51的P1口(内部有上拉电阻)作为键盘接口。
对于按键只需一端接地另一端接P1口即可。
见下图(2-1):
图2-1
2.2热释电红外传感器模块
2.2.1热释电红外线传感器原理简介
人体辐射的红外线中心波长为9~10um,而探测元件的波长灵敏度在0.2~20um范围内几乎稳定不变。
在传感器顶端开设了一个装有滤光镜片的窗口,这个滤光片可通过光的波长范围为7~10um,正好适合于人体红外辐射的探测,而对其它波长的红外线由滤光片予以吸收,这样便形成了一种专门用作探测人体辐射的红外线传感器。
实质上热释电传感器是对温度敏感的传感器。
它由陶瓷氧化物或压电晶体元件组成,在元件两个表面做成电极,如图2所示。
在环境温度有ΔT的变化时,由于有热释电效应,在两个电极上会产生电荷ΔQ,即在两电极之间产生一微弱的电压ΔV。
2.2.2热释电红外线传感器应用
热释电红外线传感器有三个端口,如图2-2所示:
一个接电源、一个接地、一个信号端口,当有人进入其检测区域时,信号端口便产生一个电平跳变,并维持数秒钟,我们就是利用这个跳变来判断是否有人在这个检测区域。
图2-2
2.3温度传感器
2.3.1温度传感器DS18B20简介
新型数字温度传感器DS18B20具有体积更小、精度更高、适用电压更宽、采用一线总线,在实际应用中取得了良好的测温效果。
DS18B20的主要特性:
(1)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(2)测温温范围-55℃~+125℃
(3)最高分辨率为0.0625℃。
2.3.2DS18B20的一般操作过程
(1)、初始化;
(2)、跳过ROM(命令:
CCH);
(3)、温度变换(命令:
44H);
(4)、读暂存存储器(命令:
BEH);
注:
每次读取温度都要经过上面四个过程。
2.3.3DS18B20的温度存储方式即温度计算
DS18B20是用12位存储温度,最高位为符号位,下图为它的温度存储方式:
2^3
2^2
2^1
2^0
2^-1
2^-2
2^-3
2^-4
LSBYTE
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
S
S
S
S
S
2^6
2^5
2^4
MSBYTE
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
表2-1DS18B20温度存储地址分配
这是12位转化后得到的12位数据,存储在DS18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
2.4数码管显示电路
2.4174ls164简介
移位寄存器是一类应用很广的时序逻辑电路,在时钟脉冲的作用下,低位寄存器的数码送给高位寄存器,作为高位寄存器的次态输出。
在时钟脉冲的作用下,高位寄存器的数码送给低位寄存器,作为低位寄存器的次态输出;移位寄存器:
除具寄存器的功能外,所存储的数码在时钟脉冲的作用下还可以移位。
74ls164是八位串入并出移位寄存器,其工作电压范围4.75~5.25V,大于2V的高电平输入、小于0.8V的低电平输入,clock最高响应频率为25MHZ,八位并行输出可以直接驱动八段数码管。
74ls164的引脚图及功能图如下所示:
图2-374ls164的引脚图及功能图
2.4.2共阴极八段数码管简介
共阴极八段数码管是将八段发光二极管封装在一起且二极管的阴极连在一起,原理图如下图所示,公共端接低电平,其它八个端口高电平点亮相应的二极管,低电平相反。
图2-4
2.4.3显示电路设计
此显示电路采用两位静态数码管显示,用八位串入并出移位寄存器74LS164作为驱动电路,采用共阴极八段数码管原理图示意图如下:
图2-5
从图中可以看出控制线只有两条:
1、数据线;2、移位脉冲线。
它只占用很少的IO口。
2.5发光二极管电路
发光二极管简称为LED,它是半导体二极管的一种。
发光二极管的反向击穿电压约5伏。
它的正向伏安特性曲线很陡,使用时必须串联限流电阻以控制通过管子的电流。
限流电阻R可用下式计算:
R=(E-Uf)/If
式中E为电源电压,Uf为LED的正向压降,If为LED的一般工作电流。
发光二极管的两根引线中较长的一根为正极,应按电源正极。
与小白炽灯泡和氖灯相比,发光二极管的特点是:
工作电压很低(有的仅一点几伏);工作电流很小(有的仅零点几毫安即可发光);抗冲击和抗震性能好,可靠性高,寿命长;通过调制通过的电流强弱可以方便地调制发光的强弱。
由于有这些特点,发光二极管在一些光电控制设备中用作光源,在许多电子设备中用作信号显示器。
由于AT89C51的P0口是开漏输出,所以此电路可以设计位如下简单形式:
图2-6
2.6蜂鸣器电路
蜂鸣器工作原理简介:
当控制端口通以不同频率及不同占空比的信号时蜂鸣器将发出不同强度及不同频率的声音。
由于其具有比传统的喇叭体积小,价格低等优点,所以此次提示音电路选用蜂鸣器。
具体电路见下图:
图2-7
2.7继电器控制电路
2.7.1继电器简介
继电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。
故在电路中起着自动调节、安全保护、转换电路等作用。
它有几个重要指标:
1、额定工作电压:
正常工作时线圈所需要的电压。
2、直流电阻:
继电器中线圈的直流电阻。
3、吸合电流:
继电器能够产生吸合动作的最小电流。
4、释放电流:
继电器产生释放动作的最大电流。
5、触点切换电压和电流:
继电器允许加载的电压和电流。
2.7.2继电器驱动电路设计及工作原理简介
采用晶闸管也可以用于小电流控制大电流电路,但是其控制电路比较复杂,而采用继电器其控制电路就比较简单,且具有电气隔离作用。
虽然其响应速度没有晶闸管快但在低频情况下采用继电器控制电路较为方便。
其电路图如下所示:
图2-8
电路工作原理简介:
当控制端口为低电平时,三极管导通继电器吸合,常闭触电断开,常开触点闭合。
当控制端口为高电平时三极管关断,继电器线圈通过二极管放电并断开,常闭、常开触电复位。
3.软件设计与实现
3.1整体设计思路介绍
软件设计整体思路:
主程序部分进行一些初始化以及温度的读取;外部中断0进行红外线感应延时时间的重新加载;定时器0进行键盘的扫描及相关操作;定时器1进行显示、温控速度、以及相关需要延时(如倒计时等等)的操作。
在显示方面,进行了一些改善----要显示的值有变化才进行重新刷新,否则不刷新。
这样就大大提高了效率及最终的显示效果(不会出现不该亮的部分还有亮的现象)。
3.2主要部分流程图如下:
3.2.1主程序流程图
图3-1
3.2.2外部中断流程图
图3-2
3.2.3定时器0中断流程图
图3-3
3.2.4定时器1中断流程图
图3-4
结束语
早在《单片机原理及接口技术》这门课还未结束的时候,陆仲达老师就给我们布置了基于51单片机的课程设计。
我从最初的茫然,到慢慢的进入状态,再到对思路逐渐的清晰,整个写作过程难以用语言来表达。
关于51的应用设计,从上课开始我就不满足于那些诸如电子钟、交通灯控制等司空见惯的设计,我希望能把主题定位得更新颖、更具挑战性,正好夏天也到了,于是把题目定为:
智能电风扇的设计。
题目确定下来,我便立刻着手资料的收集工作中,当时面对浩瀚的书海真是有些茫然,不知如何下手。
在导老师的指导及同学的帮助下,我终于对自己的工作方向和方法有了初步掌握。
资料已经查找完毕,我开始着手论文的写作。
在写作过程中遇到困难我就及时和导师联系,并和同学互相交流,请教专业课老师。
在大家的帮助下,困难一个一个解决掉,论文也慢慢成型。
当我终于完成了所有打字、绘图、排版、校对的任务后整个人都很累,但同时看着电脑荧屏上的课程设计稿件我的心里是甜的,我觉得这一切都值了。
这次课程设计论文的制作过程是我的一次再学习,再提高的过程。
在论文中我充分地运用了大学期间所学到的知识。
本设计最终实现了电风扇的手动调速、温控自动调速、定时、温度显示、人体检测等预期功能,其中定时在1到99分钟连续可调,人体检测范围角度120度、距离6米,人体检测延时时间3分钟,定时器自动退出时间6秒。
存在不足之处就是人体检测抗干扰方面不够好,需要提高。
我不会忘记这难忘的半个月的时间。
课程设计论文的制作给了我难忘的回忆。
在我徜徉书海查找资料的日子里,面对无数书本的罗列,最难忘的是每次找到资料时的激动和兴奋;亲手用protel99se设计电路图的时间里,记忆最深的是每一步小小思路实现时那幸福的心情;为了论文我曾赶稿到深夜,但看着亲手打出的一字一句,心里满满的只有喜悦毫无疲惫。
这段旅程看似荆棘密布,实则蕴藏着无尽的宝藏。
在今后的日子里,我仍然要不断地充实自己,争取在所学领域有所作为。
在这次课程设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。
在此更要感谢我的指导老师和专业老师,是你们的细心指导和关怀,使我能够顺利的完成课程设计。
附录:
程序清单
/***********************************************************************
touwenjian.h
***********************************************************************/
typedefunsignedcharbyte;
typedefunsignedintword;
//以下管脚配置
//ds18b20部分
sbitDQ=P3^4;
//显示部分
sbitDB=P2^0;
sbitCP=P2^1;
//发光显示部分
sbitLED_dingshi=P0^0;
sbitLED_shoudong=P0^1;
sbitLED_zidong=P0^2;
sbitLED_kuai=P0^3;
sbitLED_zhong=P0^4;
sbitLED_man=P0^5;
//键盘定义部分
#definewujian0x3f
sbitKEY1=P1^0;//状态转换/启动
sbitKEY2=P1^1;//+10/1
sbitKEY3=P1^2;//-10/2
sbitKEY4=P1^3;//3
sbitKEY5=P1^4;//0确定
//继电器控制部分
sbitJDQ1=P2^4;//0表示开通,1表示关断
sbitJDQ2=P2^5;
sbitJDQ3=P2^6;
//蜂鸣器部分
sbitcall=P2^7;//低电平鸣叫
/***********************************************************************
ds18b20.c
***********************************************************************/
#include
#include"touwenjian.h"
/*****************************************************
延时子程序
*****************************************************/
externvoiddelay(worduseconds)
{
for(;useconds>0;useconds--);
}
/*****************************************************
复位子程序
******************************************************/
staticbyteow_reset(void)
{
bytepresence;
EA=0;
DQ=0;//pullDQlinelow
delay(45);//leaveitlowfor480us//551us
DQ=1;//allowlinetoreturnhigh
delay(4);//waitforpresence//61us
presence=DQ;//getpresencesignal
delay(40);//waitforendoftimeslot//491us
EA=1;
return(presence);//presencesignalreturned
}//0=presence,1=nopart
/*******************************************************
从1-wire总线上读取一个字节子程序
********************************************************/
staticbyteread_byte(void)
{
bytei;
bytevalue=0;
EA=0;
for(i=8;i>0;i--)
{
value>>=1;
DQ=0;//pullDQlowtostarttimeslot
DQ=1;//thenreturnhigh
{unsignedchari;
for(i=0;i<2;i++);}//11us
if(DQ)value|=0x80;
delay(6);//waitforrestoftimeslot
}
EA=1;
return(value);
}
/********************************************************
向1-WIRE总线上写一个字节
*********************************************************/
staticvoidwrite_byte(charval)
{
bytei;
EA=0;
for(i=8;i>0;i--)//writesbyte,onebitatatime
{
DQ=0;//pullDQlowtostarttimeslot
DQ=0;
DQ=val&0x01;//6US
delay(5);//holdvalueforremainderoftimeslot//74us
DQ=1;
val=val>>1;
}
EA=1;
delay(5);
}
/*******************************************************
读取温度
*******************************************************/
wordRead_Temperature(void)
{
union{
bytec[2];
wordx;
}temp;
ow_reset();
write_byte(0xCC);//SkipROM
write_byte(0xBE);//ReadScratchPad
temp.c[1]=read_byte();
temp.c[0]=read_byte();
ow_reset();
write_byte(0xCC);//SkipROM
write_byte(0x44);//StartConversion
returntemp.x;
}
/***************************************************************
求解温度
***************************************************************/
externbyteReal_Tem(void)
{
wordwen;
wen=Read_Temperature();
return((wen>>4)&0x00ff);
}
/***********************************************************************
Main.c
***********************************************************************/
#include
#include"touwenjian.h"
//数据区
#definetime_default41
bytedingshi_time=time_default;//存放定时时间''''''
bitflag_dingshi=0;//0表示没有定时
worddingshi_jishu3=1000;//1000*60=1分钟
//
bitflag_dingshi_delay=0;//1表示有
bytedingshi_delay=100;
//
#definehwx_delay_const3//人体感应延时时间
bytehwx_delay=hwx_delay_const;//用于保存红外线触发延长时间
wordhwx_jishu1=0;
//
bytewendu=0;//用于存放温度值''''''
//
#definelow_wen18
#definemid_wen20
#definehig_wen24
#definevhi_wen28
//
bytetime_stor=100;//存储主观时间//触发显示
bytewendu_stor=low_wen;//存储主观温度//触发显示
//
enumstation0{zidong,dingshi,shoudong,weak}state;
//函数说明区
externbyteReal_Tem(void);
externvoiddelay(worduseconds);
voidmingjiao(void);
voiddisplay(byteinput,bitkkl);
voidauto_speed(void);
voidweak_default(void);
/*******************************************************************
主程序
*******************************************************************/
voidmain()
{
//定时器0用于键盘扫描
TMOD=0x01|TMOD;//定时器0的1方式
TH0=0xd8;TL0=0xf0;//定时器0初始化10ms扫描一次
//定时器1用于显示
TMOD=0x10|TMOD;//定时器1的1方式
TH1=0x15;TL1=0xA0;//定时器1初始化60ms中断一次
//外部中断
TCON=TCON|0x01;//外部中断0都下降沿触发
//以下为开启部分
IP=0X01;//两个定时器同等优先级
IE=0x8b;//开启定时器0,1,外部中断0中断
//
while(Real_Tem()==85);
auto_speed();
LED_zidong=0;//刚开始为自动方式
P1=P1|0X7C;//拉高五个键盘
wendu_stor=100;//两个不可能值//用于启动显示
time_stor=100;//两个不可能值//用于启动显示
//
TR0=1;//开启定时器0
TR1=1;
while
(1)
{
wendu=Real_Tem();
}
}
/****************************************************************************