基于51单片机的智能温控电扇设计文档格式.docx
《基于51单片机的智能温控电扇设计文档格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的智能温控电扇设计文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
![基于51单片机的智能温控电扇设计文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/6/c4825c5d-e569-4b30-8952-548393280efa/c4825c5d-e569-4b30-8952-548393280efa1.gif)
4.7.1LCD显示程序的问题23
4.7.2DS18B20的显示程序问题23
5硬件调试23
5.1按键电路的调试24
5.2温度传感器电路的调试24
5.3电机电路的调试24
5.4红外感应电路的调试24
5.5硬件调试遇到的问题24
6结论24
参考文献:
26
摘要:
风扇是人们日常生活中必不可缺的工具,尤其是在夏天,作为一种使用频率很高的电器,备受人们喜爱。
本文将以AT89S51为主控芯片,辅以DS18B20温度传感器,结合红外探测装置,来实现一种智能温控电扇的设计。
此风扇通过液晶显示器来显示温度和风速,配备2个温度设定按键,由DS18B20读取外界温度,红外探头探测是否有人,通过设定的温度配合程序来调节风速,最后通过L298N来驱动电机。
经过调试,风扇可以按照温度智能变速,无人自动关闭,实现了智能温控的目标。
关键词:
DS18B20;
AT89S51;
红外探头;
液晶显示器1602;
L298N
1引言
电扇是人们日常生活中常用的降温工具,从开始的吊扇到现在的USB风扇,无处不见电扇的踪迹。
虽然如今空调已经走进千家万户,但是电扇的低位还是无可取代,作为一种节能环保,并且廉价简单的降温工具,电扇还在很多人家发挥着自己独特的作用。
顺应时代潮流,各种多功能的风扇逐渐在取代传统风扇。
单片机作为一种智能化程度高,控制精度高,操作简单,廉价易得,抗干扰能力强等特点,越来越多的应用于智能化产品之中。
市场上智能风扇产品相继问世,制作方法也多种多样,功能也逐渐完善,普遍都具有了手动变速和定时关闭等功能,相对而言,具备人性化,智能化的风扇还是很少,使用也并不广泛,而且在电子工艺高度发展的今天,智能化的步伐也越来越快,尤其是中国这个高速发展的国家,电扇的智能化也该向前迈进一个步伐。
在中国市场上风扇还是有一定的市场份额的,几乎每个家庭都有风扇,具备价格便宜,摆放轻便,体积灵巧等特点,使得风扇在中小城市以及乡村将来一段时间内仍然会占有市场的大部分份额,为提高风扇的市场竞争力,使之在技术含量上有所提高,满足智能化的要求,智能风扇很具竞争力。
大学四年即将结束,为了检验自己的学习情况,我决定使用之前所学习到的硬件只是结合相关的软件基础来制作一个基于单片机的智能温控风扇。
基于对人性化与智能化相结合的考虑,同时基于对价格的考虑,本设计决定制作一个基于51单片机的智能温控风扇,该风扇具有随温度自动调节风速的功能,并且在无人时可以自动关闭,而且可以根据每个人的不同情况来设定基准温度,从而实现了人性化与智能化的双重目标。
2方案设计
2.1系统整体设计
本设计的整体思路是:
利用温度传感器DS18B20来检测环境温度,并直接输出数字温度给51单片机进行处理,并将实时温度、设置温度、风速显示在液晶1602上。
设置温度辅以2个可调按键,一个提高设置温度,一个降低设置温度,设置温度只能是整数型式,检测到的环境温度可以精确到小数点后一位。
本系统还配备一个红外探头,探测出风范围内是否有人,若无人则自动关闭风扇。
同时采用单片机模拟PWM脉宽调制方式来改变直流电扇电机的转速。
系统整体结构框图1所示:
图1 整体系统结构图
2.2方案论证
本设计要求实现在温度变化的情况下风扇直流电机转速随之改变,并且能够在无人的情况和温度低于设定温度的时候自行停止,需要比较高的温度分辨率和稳定的探测工具以及可靠的电机控制部件。
2.2.1温度传感器的选择
在本设计中,温度传感器的方案有以下两种:
方案一:
采用热敏电阻。
热敏电阻的特性就是阻值可以随温度的变化而变化,采用热敏电阻作为检测温度的核心部件,然后通过放大电路放大信号,经过AD0809数模转换讲放大的微弱电压变化信号转化了数字信号输入单片机处理。
方案二:
单总线数字温度计DS18B20。
作为一款优秀的数字集成温度传感器,DS18B20可以直接检测并输出数字信号给单片机进行处理。
对于方案一,如若采用热敏电阻作为温度检测元件,则价格方面比较便宜,元件易得,但是热敏电阻的缺点显而易见,对于温度细微变化反应不敏感,而且在后续的放大和转换电路中还会造成失真和误差,并且热敏电阻的变化曲线非线性,每个热敏电阻都不同,还需要单独测试描绘出曲线,虽然可以通过软件来实现误差的修正,但是这会使得电路的复杂性增加,并且在人体所在实际环境中难以检测到小的温度变化。
所以这个方案在本设计中难以胜任。
对于方案二,DS18B20测量范围从-55℃到+125℃,增量值为0.5℃,人体所处的环境温度包括其中,分辨率较高,所获取的温度误差小,并且对温度变化反应灵敏。
DS18B20最具优势的是其温度值在器件内部直接转化成数字信号输出,简化了系统设计,又由于该温度传感器采用了单总线技术,使得其接口与单片机接口变得非常简洁,抗干扰能力也得到了提高,所以本系统采用这个方案。
2.2.2红外探测的选择
热释电红外探测模块。
作为一款应用很广的红外探测模块,具有灵敏度高,可靠性高,低电压工作模式等特点,被广泛的应用与各种场合中。
但是与本设计却有一个冲突,该模块使用环境应尽量避免流动的风,流动的风也会对感应器造成干扰。
所以方案一不适用。
对射式光电开关。
对射式光电开关是一款有红外线发射管跟红外线接收管配对使用的光电开关。
对射式光电开关在电路中起到了通过光来传播电路,当有物体阻挡着红外线发射管跟接受管时,电路会停止工作。
使用这个特性,我们就能判断是否有人,外界干扰就没有了,非常适合这个系统,所以就采用这种方案。
2.2.3控制核心的选择
本设计采用AT89S51单片机作为控制核心,通过软件编程的方法进行温度的实时检测与判断,并在I/O口上输出控制信号,控制电机工作。
AT89S51具有较大的存储空间,工作电压低,性能高,片内含4K字节的只读程序存储器ROM和128字节的随即数据存储器RAM,兼容标准MCS-51指令系统,价格便宜,与本系统的设计相符合。
2.2.4显示器件的选择
LED共阴极数码显示管。
LCD液晶显示屏1602。
对于方案一,成本相对低廉,功耗也低,在黑暗空间也可以看的清楚,可视距离较远,同时显示温度的程序也相对而言简单,所以这种显示方式也得到了广泛应用。
但是它采用的显示方式是动态扫描,各个LED逐个点亮,会产生闪烁,在这个温度实时变化的环境中闪烁可能太快,数据可能不能很好的展示出来,故此方案不采用。
对于方案二,液晶显示屏显示字符清晰,自带背光,还能显示符号,并且不会不断闪烁,显示性能一流,并且考虑到此设计不只是要显示温度,还要显示电机和红外的状态,所以从设计完善的角度来考虑,选择此方案更有优势。
2.2.5调速方式的选择
采用数模转化芯片DAC0832来控制,有单片机根据当前环境温度输出数值到DAC0832中,再由DAC0832产生相应的模拟信号控制晶闸管的导通脚,从而采用无级调速电路实现电扇电机转速的调节。
采用单片机软件模拟PWM调速的方法。
PWM是一种按照一定的规律改变脉冲序列的脉冲宽度,以调节输出量和波形的一种调节方式,在PWM驱动控制的调节系统中,最常用的是矩形波PWM信号,在控制时调节PWM波的占空比。
占空比是指高电平在一个周期时间内的百分比。
在控制电机的转速时,占空比越大,转速就越快,若全为高电平时占空比为100%,此时转速达到最大。
用单片机的I/O口输出PWM信号时,有如下三种方法:
(1)利用软件延时。
当高电平延时时间到时,对I/O口电平取反,使其变成低电平,再延时一定时间,反之在低电平延时到时,对I/O口电平取反,如此循环即可得到PWM信号。
本设计就是采用了这种方法。
(2)利用定时器。
控制方法与
(1)相同,只是在该方法中利用单片机的定时器来进行高低电平的转变,而不是利用软件的延时。
应用此方法时编程相对复杂,故不予以采用。
(3)利用单片机自带的PWM控制器。
STC系列单片机自带PWM控制器,但本系统使用的AT89系列单片机没有此功能,所以不能使用。
对于方案一,该方案能实现对直流电机的无级调速,速度变化灵敏,但是D/A转换芯片价格较高,性价比不高,不采用。
对于方案二,相对于其他方案来说,采用软件模拟PWM实现调速的过程,具有个高的性价比与灵活性,充分的发挥了单片机自身的性能,对本系统的实现又提供了一条有效的途径。
所以综合考虑还是选择方案二的第一种。
2.2.6驱动方式选择
达林顿反向驱动器ULN2803。
电桥驱动电路L298N。
对于方案一,作为一款反向驱动器,ULN2803应用广泛,驱动效果也很好,与TTL信号兼容性很好,但是在后续的硬件电路中表现不佳,风扇转速改变不明显,而且在最高档出现断档的情况,风扇不转,在修改硬件电路,修改程序后依旧效果不佳,驱动力明显不足,故方案一中途停用。
对于方案二,由于之前已经有使用过,对L298N这个桥式驱动模块的应用上手快速,驱动能力也比ULN2803好很多,驱动风扇5档变速的实际效果明显,故采用方案二。
3硬件设计
系统主要器件包括温度传感器DS18B20、AT89S51单片机、液晶显示屏LCD1602、桥式驱动模块L298N、对射式光电开关开关和风扇。
辅助元件包括电容电阻、晶振、电源、按键、变压器等。
3.1系统各器件简介
3.1.1单线程数字温度传感器DS18B20
此温度传感器是美国DALLAS半导体公司继DS1820之后推出的一种改进型智能温度传感器DS18B20。
作为新一带数字检测元件,DS1820是世界上第一片支持"
一线总线"
接口的温度传感器,在其内部使用了在板(ON-BOARD)专利技术。
全部传感元件及转换电路集成在形如一只三极管的集成电路内。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
现在,新一代的DS18B20体积更小、更经济、更灵活。
使你可以充分发挥“一线总线”的优点。
DS18B20可以程序设定9~12位的分辨率,精度为±
0.5°
C。
可选更小的封装方式,更宽的电压适用范围。
分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
测温范围为-55~125℃,最大分辨率可达0.0625℃。
DS18B20减少了外部的硬件电路,直接输出数字信号,具有低成本和易使用的特点。
图2 温度传感器DS18B20
3.1.2AT89S51单片机简介
AT89S51是一个低功耗,高性能COMS8位单片机,片内含4KbytesISP的反复可读写1000次的Flash只读程序储存器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了8位中央处理器和IPSFlash存储单元,AT89S51在众多嵌入式系统中得到了广泛的应用。
AT89S51具有完整的输入输出和控制端口、以及内部程序存储空间。
与我们通常意义上的微机原理类似,可以通过外接A/D,D/A转换电路及运放芯片实现对传感器传送信息的采集,且能够提供以点阵或LCD液晶及外接按键实现人机交互,能对内部众多I/O端口连接步进电机对外围设备进行精确操控,具有强大的工控能力。
AT89S51系列单片机编写程序简单。
其语法结构与我们常用的计算机C语言基本相同,不同之处在于增加了控制具体引脚工作的语句和命令,相对于计算机C语言,单片机C语言更简练和明确,可以控制每个引脚的输入输出状态。
其主要语句集中在例如:
“ifelse”、“while”、“for”等循环与判断语句上,相比计算机C语言更简单。
使用AT89S51系列单片机编程,可以在没有实物单片机的情况下在普通电脑上进行程序编写甚至是调试工作。
一般工作中使用Keil公司开发的51单片机编程软件进行编程,它采用目前流行的开发环境,集编辑,编译和仿真于一体。
在该软件上用户可以编写汇编语言或C语言源程序,并利用该软件生成单片机能运行的程序。
AT89S51价格便宜,适合对大批量的计量仪器进行规模化改造,其单片售价不超过5元。
图3 AT89S51引脚图DIP封装
3.1.3桥式驱动电路L298N简介
本系统要用单片机控制风扇直流电机,需要加驱动电路,为直流电机提供足够大的驱动电流,并能在模拟PWM波的情况下实现风扇转速的改变。
在本系统驱动电路中,选用桥式驱动电路L298N来驱动风扇直流电机。
L298N在使用时接口简单,操作方便,可为电机提供稳定的驱动电流,可以同时驱动两台直流电机,可以在模拟PWM波的情况下很好的输出信号,实现风扇转速的平滑改变。
L298N是专用驱动集成电路,属于H桥集成电路,与L293D的差别是其输出电流增大,功率增强。
其输出电流为2A,最高电流4A,最高工作电压50V,可以驱动感性负载,如大功率直流电机,(二相、三相、四相)步进电机,伺服电机,电磁阀等,特别是其输入端可以与单片机直接相联,从而很方便地受单片机控制。
当驱动直流电机时,可以直接控制两路电机,并可以实现电机正转与反转,实现此功能只需改变输入端的逻辑电平。
模块接口说明:
+5V:
芯片电压+5V。
VCC:
电机电压,最大可接50V。
GND:
共地接法。
EN1、EN2:
高电平有效,EN1、EN2分别为IN1和IN2、IN3和IN4的使能端。
IN1~IN4:
输入端,输入端电平和输出端电平是对应的。
图4 L298N模块
3.1.4LCD1602简介
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。
一般1602字符型液晶显示器实物如图:
图5 LCD1602
LCD1602主要技术参数:
显示容量:
16×
2个字符
芯片工作电压:
4.5—5.5V
工作电流:
2.0mA(5.0V)
模块最佳工作电压:
5.0V
字符尺寸:
2.95×
4.35(W×
H)mm
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
3.1.5对射式光电开关简介
图6 对射式光电开关
光电开关E18的技术参数:
1、输出电流DC/SCR/继电器Controloutput:
100mA/5V供电
2、消耗电流DC<
25mA
3、响应时间<
2ms
4、指向角:
≤15°
有效距离3-50CM可调
5、检测物体:
透明或不透明体
6、工作环境温度:
-25℃~+55℃
7、标准检测物体:
太阳光10000LX以下白炽灯3000LX以下
8、外壳材料:
塑料
电气特性:
U:
5VDC
I:
100mA
Sn:
3-50CM
3.2各部分电路设计
3.2.1开关复位与晶振电路
单片机系统中,有两个非常重要的电路,一个是开关复位电路,用来对单片机本身和其外部扩展I/O接口电路进行复位,还有一个是晶振电路,用于产生谐振,使单片机得以工作。
电路图如图7所示:
图7 晶振电路与复位电路
单片机的XTAL1和XTAL2用来外界石英晶体和微调电容,连接单片机内OSC的定时反馈电路。
如图所示,当按下按键开关是,系统复位一次。
其中电容C1、C2为20pF,C3为10uF,电阻R1为10k,晶振为12MHz。
3.2.2独立控制键盘电路
本设计还有两个独立按键,分别连接单片机的P3.2口和P3.3口,如图8所示:
图8 按键电路
独立按键S1和S2一端与单片机相连,另一端接地,当按下时,P3口读取低电平有效。
系统上电进入工作后,扫描按键子程序,此时可以设定温度。
其中S1为加按键,S2为减按键,每按下一次后,都会使对应的预设值加一或者减一。
3.2.3LCD显示电路
本设计采用的是LCD1602A作为显示模块,它与单片机的连接如图9所示。
其中第一行显示温度与红外探测结果,温度显示到小数点后2位。
第二行显示设定温度与风扇的风力等级。
图9 LCD连接电路
3.2.4红外探测电路
红外光电开关一共有三个接口,一个接+5V,一个接地,还有一端与单片机相连,输出高电平或者低电平信号,在电路中直接用按键开关代替了,就是按键电路中的开关S3。
3.2.5温度采集电路
DS18B20数字温度传感器通过其内部计数时钟周期来的作用,实现了特有的温度测量功能。
低温系数振荡器输出的时钟信号通过由高温度系数振荡器产生的门周期而被计数,计数器预先置有与-55℃相对应的一个基权值。
如果计数器计数到0时,高温度系数振荡周期还未结束,则表示测量的温度值高于-55℃,被预置在-55℃的温度寄存器中的值就增加1℃,然后这个过程不断重复,直到高温度系数振荡周期结束为止。
此时温度寄存器中的值即为被测温度值,这个值以16位二进制形式存放在存储器中,通过主机发送存储器读命令可读出此温度值,读取时低位在前,高位在后,依次进行。
由于温度振荡器的抛物线特性的影响,其内用斜率累加器进行补偿。
DS18B20由于直接可以输出数字信号,所以可以直接输出给单片机,但是需要在输出口上接一个上拉电阻来确保工作,连接图如图10所示:
图10 DS18B20连接电路
3.2.6风扇驱动电路
本设计采用单片机模拟PWM波的方式通过I/O口输出TTL信号,再通过一个电机驱动模块L298N来驱动12V直流无刷电机工作,从而实现电扇转速的调节。
红外探测控制电机开关,键盘改变设置的温度,然后和预设的温度进行比较,通过软件判断后由单片机的P3.4口输出脉冲信号,经由L298N驱动风扇直流电机电路,实现电机的启动和转速的改变。
当环境温度改变时,电机的转速会按照设定的程序相对进行改变,温度升高转速变快,温度降低,转速变慢,温度过低时自动停止,无人状态下也会自动停止。
当有人出现后,并且温度高于预设温度,电机重新开始工作。
如图12所示:
图11 L298N驱动电路
图12 直流电机连接电路
4软件设计
软件编写有C语言和汇编语言两种,这两种语言我都有所了解,两种语言各有特点。
C语言具有编写简单,容易上手的特点,而且看起来条理清晰,便于修改,能够快速准确的找到错误并进行改正。
相对于汇编语言,作为一种低级的机器语言,读程序相对繁琐,但程序写好后意思明了,效率也要高于C语言编写的程序,具有很好的开发功能。
结合自身实际,我还是选择了C语言,容易上手,可以更好的调试与编译程序。
4.1主程序流程图
图13 主程序流程图
主程序如下:
voidmain(void)
{//初始化
uintltemp;
//初始化温度
dianji=0;
//初始化电机
int1=0;
int2=0;
init();
//初始化液晶显示屏
read_temp();
//读取测温子程序,读取温度数值
delay(1000);
//延时
while
(1)//循环开始
{
delay
(2);
ltemp=read_temp();
//温度赋值
write_com(0x80+2);
//将温度显示到液晶屏
write_data(0x30+ltemp%10000/1000);
write_data(0x30+ltemp%1000/100);
write_data(0x2e);
write_data(0x30+ltemp%100/10);
write_data(0x30+ltemp%10);
write_data(0xdf);
keyscan();
//读取键盘子程序
write_com(0x80+0x40+4);
//将设定温度显示到液晶屏
write_data(0x30+set%100/10);
write_data(0x30+set%10);
deal(ltemp/100);
//运行温度判断子程序
dianjik();
//运行电机控制子程序
write_com(0x80+0x40+15);
//将风扇转速显示到液晶屏
write_data(0x30+h);
write_com(0x80+15);
//将红外探测结果显示到液晶屏
write_data(0x30+r);
}
}
4.2液晶显示子程序
液晶LCD1602的子程序要按照说明上的时序图来完成。
要想让LCD显示的话,首先要对LCD进行初始化。
在完成LCD的初始化后,还需要定义字符的位置,并且定义写数据的函数。
其第一行的地址是40H~4FH,第二行的地址是从80H~8FH,然后才能根据要显示字符的ASCⅡ码对该字符进行显示。
其流程图14所示:
图14 液晶显示程序流程图
子程序如下:
//*******初始化函数***************
voidinit(void)
{uinti;
E=0;
RW=0;
RS=0;
delay(10);
//延时10ms
write_com(0x01);
//清屏
delay(5);
write_com(0x38);
//设显示模式
write_com(0x0c);
//开显示不显光标光标不闪
write_com(0x06);
//地址自动加一光