课程设计智能电风扇Word文档下载推荐.docx
《课程设计智能电风扇Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《课程设计智能电风扇Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。
![课程设计智能电风扇Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-1/30/686adb67-0396-4198-8154-8fcb5a7a6cfc/686adb67-0396-4198-8154-8fcb5a7a6cfc1.gif)
采用SPCE061A单片机
采用凌阳16位的SPCE061A单片机,处理速度较慢,内置2KSRAM,32KFLASH,要实现稍大的存储量受到限制,而如果扩展大量的外围电路的话,则降低了系统的可靠性,消耗了大量的CPU资源。
采用STC89C52
此方案采用STC89C52八位单片机实现。
单片机软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制。
而且体积小,硬件实现简单,安装方便。
可以实现对DS18B20和直流电机的控制工作,编程技术及外围功能电路的配合使用都很成熟。
综合考虑,选择STC89C52作为主控制器。
2.3调速方式的选择
采用PWM控制
PWM是利用数字输出对模拟电路进行控制的一种有效技术,尤其是在对电机的转速控制方面,可大大节省能量。
PWM具有很强的抗噪性,且有节约空间、比较经济等特点。
采用可控硅控制
实际中通过控制双向可控硅的导通角,使输出端电压发生改变,从而使施加在电风扇的输入电压发生改变,以调节风扇的转速,实现各档位风速的无级调速。
从本设计要求综合考虑实际中选择方案一。
2.4温度控制模块设计
采用红外遥控器+红外遥控解码:
红外遥控器的使用大大方便了用户,使他们可以在一定范围内实现对本系统的远程控制,符合当代人的生活习惯,而且红外遥控器的技术已经相当成熟,使用也比较方便。
选用键盘:
假如使用键盘,用户就只能走进本控制系统去控制该系统已完成自己想要的操作。
此方案设计与制作比较简单,且能完全完成既定功能。
综合各方面因素,采用方案二。
2.5显示电路的设计
LCD1602液晶屏:
LCD1602液晶屏是16*2的字符型液晶,可以显示英文26个字母的大小写,阿拉伯数字0—9,及一些简单的符号。
该液晶屏操作简单,显示功能强大。
数码管:
虽然数码管的显示位数有限,且只能显示一些简单的字符。
但是在本课程设计中,所需要的数码管不多,少量数码管即可符合设计要求,估可采用。
方案三:
LCD12864液晶屏:
该液晶屏是比LCD1602液晶屏更先进的液晶,可以显示图片信息,同样可以完成本设计系统的需要。
但是该液晶屏相对比较贵。
综上所述,我们选择了数码管作为显示模块。
3系统简述
本系统由集成温度传感器、单片机、LED数码管、发光二极管、ULN2803驱动芯片、直流电机及一些其他外围器件组成。
使用具有价廉易购的AT89S52单片机编程控制,通过修改程序可方便实现系统升级。
系统的框图结构如下:
人工控制
图1系统原理框图
4硬件设计
系统主要部件包括DS18B20温度传感器、AT89S52单片机、ULN2803驱动芯片、四位LED数码管和直流电机。
辅助元件包括发光二极管、电阻、晶振、电源、按键等。
4.1、本系统各器件简介
4.1.1、DS18B20单线数字温度传感器简介
DS18B20单线数字温度传感器是Dallas半导体公司开发的世界上第一片支持“一线总线”接口的温度传感器。
它具有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为电源输入端。
4.1.2AT89C52单片机简介
AT89C52是一种带4K字节闪存可编程可擦除只读存储器(FPEROM)256B片内RAM的低电压,高性能CMOS8位微处理器。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C52是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
AT89C52单片机管脚
AT89C52单片机管脚如图3所示。
图3AT89C52单片机管脚
各管脚功能:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地接
收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口。
P3.0:
RXD(串行输入口);
P3.1:
TXD(串行输出口);
P3.2:
/INT0(外部中断0);
P3.3:
/INT1(外部中断1);
P3.4:
T0(记时器0外部输入);
P3.5:
T1(记时器1外部输入);
P3.6:
/WR(外部数据存储器写选通);
P3.7:
/RD(外部数据存储器读选通)。
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;
当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
4.1.3八段LED数码管
本系统使用四个七段LED数码管作为温度和风扇档位显示,公共阳极。
4.1.4驱动芯片ULN2803
ULN2803,8个NPN达林顿晶体管,连接在阵列非常适合逻辑接口电平数字电路(例如TTL,CMOS或PMOS上/NMOS)和较高的电流/电压,如电灯,电磁阀,继电器,打印锤或其他类似的负载,广泛的使用范围:
计算机,工业和消费应用。
所有设备功能由集电极输出和钳位二极管瞬态抑制。
该ULN2803是专为符合标准TTL,而制造ULN2804适合6至15V的高级别CMOS或PMOS上。
该电路为反向输出型,即输入低电平电压,输出端才能导通工作。
4.2各部分电路设计
4.2.1电源电路
电源电路采用LM7805集成稳压器作为稳压器件,用典型接法,220V电源整流滤波后送入LM7805稳压,在输出端接一个470U和0.1U电容进一步滤除纹波,得到5V稳压电源。
电路如图4所示。
图4电源
4.2.2数码管显示电路
数码管显示电路采用共阳极四位数码管以及9012三极管作为驱动数码管发亮。
其连接方式如下:
应用单片机P0口连接八段数码管,用P1口的P1.0—P1.3四个端口作为数码管的片选信号输出端口,其中要用9012(PNP型)三极管做驱动。
为了防止烧坏数码管,所以给数码管各段各加一个50k的限流电阻。
要显示的数据通过P0口送给数码管显示,通过P1口的P1.0—P1.3四个端口分别对数码管进行位选,事实上数码管是间断被点亮的,只是其间断时间十分短,扫描周期在20ms以下,利用人眼视觉暂留,我们基本看不出它们的闪烁。
图5数码管显示电路
4.2.3温度采集、控制模式设定以及复位电路
电路如图6所示,这一部分主要是由DS18B20,四个按键。
温度采集电路主要是由DS18B20构成,它可以把采集的温度数据转化成二进制数,经过单片机处理后输出送数码管显示。
图6温度采集、控制模式设定以及复位电路
开关设定主要是通过按键K1来设定的。
模式转换键由K2来完成,可以实现温度控制风速和手动设定风速的功能。
手动设定风扇档位由K3、K4来完成,按一下K3键可以实现档位增一,而按下K4键可以实现档位减一。
4.2.4电机驱动电路
驱动模块主要采用驱动芯片ULN2803,PWM脉冲信息通过I\O口P3^4输出,然后经过ULN2803时由1B—7B输入至7C输出以驱动电机转动。
电路如图7电机驱动电路
4.2.5开关、模式指示灯电路
分别通过P1^0—P1^2作为开关、两个模式指示灯,按下开关键K1时,开关指示灯亮,表明DS18B20一开始工作,此时后三位显示相应温度;
若此时按下模式一键K2,转为到温度控制风速功能,当达到相应温度范围,电机转速作相应改变;
若按下模式二键K3,转为手动控制风速,此时可以分别按K3或者K4键,以控制档位。
图8开关、模式指示灯电路
本系统的总电原理图为:
图9总电原理图
5软件设计
程序实现的功能是按下开关键是,只有DS18B20工作,并在四位数码管中的三位显示实时温度,精确度为小数点后一位。
按下模式模式转换键K2时,开始运行温度自动控制风速功能,小于25度时电机不转,25度至27度时为一档,27至30度时为二档,30度至32度时为三档,32度以上时为四档。
温度和档位对应的电机转速可以根据具体情况再作调整。
温度显示由display_temp()子程序来完成。
要实现根据当前温度实时的控制风扇的状态,需要在程序中不时的判断当前温度值是否超过设定的动作温度值范围,此部分功能由比较控制子程序DEAL(TEMP)来完成。
由于单片机的工作频率高达12MHz,在执行程序时不断将当前温度和设定动作温度进行比较判断,当超过设定温度值范围时及时的转去执行相应子程序,控制电机转速。
显示驱动程序以查七段码取得各数码管应显数字,逐位扫描显示。
而手动设置功能通过KEY()以及QUDONG()两个子程序来实现,先由KEY()程序来检测按下键位,转而检测到NUM记录的按键次数,次数又与相应档位对应,由档位控制QUDONG()程序,改变PWM占空比,控制电机转速。
6安装调试
将本电路用硬件做出来,用编程器将KEIL软件对源程序编译生成的.HEX文件烧入AT89C52单片机,将单片机插入到目标板中,连好线。
将“控制模式”开关选择在“温控”,打开电源,风扇工作在3档,数码管正常显示当前的温度31.6摄氏度,第四位数码管闪烁显示档位“3”,表示当前温度在30和32值之间,没有欠温或超温。
按手动设置键及“加”“减”键,档位能够相应作出变化,在1至4档之间自由转换,PWM占空比也相应发生变化,电机转速改变。
测试结果表明,本系统实现了预期功能。
附录1程序流程图
主程序流程图
进入手动模式
图11主程序流程图
附录2源程序
智能电风扇程序
/*温控变速部分*/
#include<
reg52.h>
stdio.h>
#defineuintunsignedint
#defineucharunsignedchar
floatf_temp;
uinttemp;
ucharbai,shi,ge;
//温度显示百、十、个位;
ucharnum=0,show_num=1,gao_num=1,di_num=3;
uintwarnl1=270;
//温度警示值;
uintwarnl2=250;
uintwarnh1=300;
uintwarnh2=320;
uintflag,mode;
//开关、模式转换标志;
sbitwx1=P1^0;
//温度显示位选;
sbitwx2=P1^1;
sbitwx3=P1^2;
sbitwx_dang=P1^3;
//风扇档位显示数码管位选;
sbitled0=P2^0;
//相关模式指示灯;
sbitled1=P2^1;
sbitled2=P2^2;
sbitled3=P2^3;
sbitmodeswitch=P3^0;
//模式转换标志;
sbiton_off=P3^1;
//开关;
sbitjia_key=P3^2;
//档位增;
sbitjian_key=P3^3;
//档位减;
sbitdianji=P3^4;
//电机驱动端;
sbitds=P3^5;
//DS18B20的DQ端;
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[]=//风扇档位数码管;
{0xc0,0xcf,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,
0x90};
voiddelay(uintz)//延时函数;
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=20;
y>
y--);
}
voiddsreset(void)//DS18B20复位,初始化函数
uinti;
ds=0;
i=103;
while(i>
0)i--;
ds=1;
i=4;
bittempreadbit(void)//读一位数据函数
bitdat;
i++;
dat=ds;
i=8;
return(dat);
uchartempread(void)//读1个字节数据函数
uchari,j,dat;
dat=0;
for(i=1;
i<
=8;
i++)
{
j=tempreadbit();
dat=(j<
<
7)|(dat>
>
1);
//读出的数据最低位在最前面,这样刚好一个字节在dat里
}
voidtempwritebyte(uchardat)//写入温度字节;
ucharj;
bittestb;
for(j=1;
j<
j++)
testb=dat&
0x01;
dat=dat>
1;
if(testb)
{
ds=0;
i++;
ds=1;
i=8;
while(i>
}
else
}
voidtempchange(void)//DS18B20开始获取温度并转换
dsreset();
delay
(1);
tempwritebyte(0xcc);
//写跳过读ROM指令
tempwritebyte(0x44);
//写温度转换指令
uintget_temp()//读取寄存器中存储的温度数据
uchara,b;
tempwritebyte(0xbe);
a=tempread();
//读取低8位
b=tempread();
//读取高8位
temp=b;
temp<
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
returntemp;
voiddisplay_dang()//档位显示函数;
{
//wx_dang=1;
P1=0x07;
P0=table_dang[show_num];
delay
(2);
display(uinttemp)//显示温度‘;
bai=temp/100;
shi=temp/10%10;
ge=temp%10;
//wx1=1;
P1=0x01;
P0=~table[bai];
//显示百位;
delay(3);
wx1=0;
P1=0x02;
//wx2=1;
P0=table_dot[shi];
//显示十位;
wx2=0;
P1=0x04;
//wx3=1;
P0=~table[ge];
//显示个位;
wx3=0;
voiddispose()//根据键盘按下情况决定档位数;
switch(num)
case0:
display(get_temp());
show_num=1;
//一档,电机最慢;
gao_num=0;
di_num=4;
break;
case1:
display(get_temp());
show_num=2;
gao_num=2;
di_num=2;
break;
case2:
show_num=3;
gao_num=3;
d