基于STC89c52RC单片机的智能风扇设计1.docx
《基于STC89c52RC单片机的智能风扇设计1.docx》由会员分享,可在线阅读,更多相关《基于STC89c52RC单片机的智能风扇设计1.docx(40页珍藏版)》请在冰点文库上搜索。
![基于STC89c52RC单片机的智能风扇设计1.docx](https://file1.bingdoc.com/fileroot1/2023-7/9/83b05879-de5e-42ee-bef4-86089f45c6fe/83b05879-de5e-42ee-bef4-86089f45c6fe1.gif)
基于STC89c52RC单片机的智能风扇设计1
基于STC89C52RC单片机的智能风扇设计
摘要
本小组选择的题目为D题——“智能风扇设计”,实际完成了所有题设要求部分,以及具有实用的创意设计。
本文介绍了一台以STC89C52为控制核心,集调速,多模式,定时,液晶显示,红外遥控功能一体的智能风扇控制器设计过程。
将传统的风扇用单片机来控制后极大增加了其智能化和实用化,同时也增强了功能性。
关键字:
STC89C52单片机,智能风扇
ABSTRACT
OurteamchosethesubjectDcalled"intelligentfandesign",andwehaveachievedalltherequirementsinthissubject.Besides,weaddourownideasandcreativitytomakeourdesignmorefunctional.
ThisreportmainlyintroducesthatweusetheSTC89C52asthecentralcontroller,todesignaintelligentfunintegratedwithspeedsetting,multi-mode,timer,LCDdisplayandinfraredremotecontrol.AfterusingtheMCUtocontrolthetraditionalfan,wehavegreatlyimproveditsintelligence,practicability,andalso,thefunctionality.
Keywords:
STC89C52SinglechipmicrocomputerIntelligentfan
一总体方案和功能设计
1.1功能详细描述
本设计以STC89C52单片机为控制核心,通过PWM控制直流电机3档调速,通过定时器实现对风扇3种模式的模拟,外部按键检测输入或者红外遥控输入指令,LED指示风扇速度和模式,LCD1602同步显示风扇速度(S),模式(M),提供定时功能,蜂鸣器按键发声。
功能详细描述:
1、控制器面板为:
按钮5个,分别为风速、类型、停止、定时选时、启动定时,LED指示灯六个,指示风速强、中、弱,类型为睡眠、自然和正常。
2、电扇处于停转状态时,所有指示灯不亮,只有按下“风速”键时,才会响应,进入起始工作状态;电扇在任何状态,只要按停止键,则进入停转状态。
3、处于工作状态时,有:
初始状态为:
风速-“弱”,类型-“正常”;
按“风速”键,其状态由“弱”→“中”→“强”→“弱”……往复循环改变,每按一下按键改变一次;
按“类型”键,其状态由“正常”→“睡眠”→“自然”→“正常”……往复循环改变;
4、风速的弱、中、强对应于电扇的转动由慢到快。
类型的不同选择,分别为:
正常电扇连续运转;
自然电扇模拟自然风,即转4s,停8s;
睡眠电扇慢转,产生轻柔的微风,运转8s,停转8s;
5、红外遥控器按键1到5分别对应按键1到5。
按键1为调速,按键2为调整模式,按键3为停止,按键4为定时选时,按键5为启动定时(重复按键会取消定时)。
6、当按键被按下或者接收到红外指令时蜂鸣器发声。
7、LCD1602同步显示。
当系统关闭时显示“Welcome!
”,系统启动后显示“SYSTEMRUN!
”
8、定时功能,提供10s(测试),30分钟,1小时,2小时,3小时定时功能
1.2设计思路
整体电路采用模块化设计制作,整体框图如下:
二详细电路设计
2.1电机调速电路
电机调速是整个控制装置中的一个相当重要的方面。
对于电机的转速调整,我们是采用脉宽调制(PWM)办法,控制电机的时候,电源并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。
不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变输入方波的占空比就能改变加在电机两端的电压大小,从而改变
了转速。
通过控制PWM输出占空比控制输出,可以实现对电机的无极调速。
2.2按键检测和LED指示
设计中用到的按键数目不多,所以可以直接用STC89C51的通用IO端口且选用SYC89C51的P1口(内部有上拉电阻)作为按键扫描接口。
对于按键只需一端接地另一接P1口即可。
LED选用共阳接法,对应于P2.0至P2.5
2.3蜂鸣器模块
蜂鸣器工作原理简介:
当控制端口通以不同频率及不同占空比的信号时蜂鸣器将发出不同强度及不同频率的声音。
由于其具有比传统的喇叭体积小格低等优点,所以此次提示音电路选用蜂鸣器。
具体电路见下图:
2.4LCD1602显示部分
通过1602同步显示各参数。
采用P0口8位并行数据传输,液晶屏对比度加入电位器可调。
2.5红外接收模块
外接收电路通常被厂家集成在一个元件中,成为一体化红外接收头。
内部电路包括红外监测二极管,放大器,限幅器,带通滤波器,积分电路,比较器等。
红外监测二极管监测到红外信号,然后把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。
交流信号进入带通滤波器,带通滤波器可以通过30khz到60khz的负载波,通过解调电路和积分电路进入比较器,比较器输出高低电平,还原出发射端的信号波形。
注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。
三系统软件设计
3.1主程序流程图
3.2速度选择程序框图
3.3模式选择框图
3.4定时器0程序框图
3.5定时器1程序框图
3.6定时功能框图
3.7LCD显示框图
结束语
首先,通过这次应用系统设计,在很大程度上提高了自己的独立思考能力和团队协作能力以及单片机的专业知识,也深刻了解制作电路的步骤和方法,有过这样的一次训练,相信在接下来的日子我们都会了,而且会做得更好。
我所写的系统主要根据竞赛题目要求,采用了单片机控制自动化的结构形式,实现对电风扇转速的自动控制。
系统以单片机STC89C52为核心部件,单片机系统完成对外界输入采集、处理、显示等功能;由Protues软件绘制电路图并进行仿真测试,利用C语言编制,运行程序该系统的主要特点是:
●适用性强,用户只需对界面参数进行设置并启动系统正常运行便可实现传统风扇各种功能。
●系统成本低廉,操作非常简单方便,随时可以根据软件编写新的功能加入产品。
操作界面可扩展性强,只要稍加改变,即可增加其他按键的使用功能。
●具有非常强的使用价值。
附录1:
源程序
#include
#defineKeyPortP1//按键扫描
#defineCYCLE10
#defineuintunsignedint
#defineucharunsignedchar
sbitPWM=P3^7;//定义pwm端口
sbitled1=P2^0;//速度1
sbitled2=P2^1;//速度2
sbitled3=P2^2;//速度3
sbitled4=P2^3;//正常
sbitled5=P2^4;//自然
sbitled6=P2^5;//睡眠
sbitDSPORT=P3^6;
sbitspk=P3^5;//蜂鸣器
sbitlcden=P2^6;//1602
sbitlcdrs=P2^7;
sbitIR=P3^2;//红外接口
/*变量声明区*/
ucharPWM_ON;//定义高电平时间
ucharnum,num2,key,beep_time,time3;//定时器1计时
uinttime1,time2;//tim是定时的时间,单位秒,为60的倍数
uchartiming_flag=0;
uinttim=0;//定时时间
bitrun_flag,r_flag,timing_run,timing_on,timing_r=1;//启动标志
bitmode2_flag=0,mode3_flag=0,beep_on;
bitp;//pwm开关uchari=0,j=0,a;//速度和模式切换标志
unsignedcharirtime;//红外用全局变量
bitirpro_ok,irok;
unsignedcharIRcord[4];
unsignedcharirdata[33];
ucharcodetable_1[]="Welcome!
";
ucharcodetable_21[]="S:
";
ucharcodetable_22[]="M:
";
/*变量声明区*/
/*函数声明区*/
unsignedcharKeyScan(void);//键盘扫描
voidDelayus(uintt);
voidDelayms(uintt);//us延迟
voidInit_timer(void);//定时器初始化
voidInit_all(void);
voidrun(void);
voidstart(void);
voidstop(void);
voidchange_speed(void);
voidchange_mode(void);
voidled(uchari,ucharj);
voidfan_normal(void);
voidfan_natural(void);
voidfan_sleep(void);
voidwrite_com(ucharcom);
voidwrite_data(ucharData);
voidInit_1602(void);
voidTiming(void);
voiddisplay2(void);
voidwrite_string(unsignedcharx,unsignedchary,unsignedchar*s);
voidwrite_char(unsignedcharx,unsignedchary,unsignedcharData);
voidchange_display2(void);
voidIr_work(void);
voidIrcordpro(void);
voidbeep();
/*函数声明区*/
voidmain(void)
{
Init_all();
while
(1)
{
key=KeyScan();
if(irok)//如果接收好了进行红外处理
{
Ircordpro();
irok=0;
}
if(irpro_ok)//如果处理好后进行工作处理,如按对应的按//键后显示对应的数字等
{
Ir_work();
}
switch(key)
{
case1:
run_flag=1;beep();if(i==3)i=0;i++;start();break;
case2:
beep();if(j==3)j=0;if(run_flag)++j;mode2_flag=0;mode3_flag=0;break;
case3:
beep();if(run_flag)stop();break;
case4:
beep();if(run_flag)timing_flag++;break;
case5:
beep();if(run_flag){timing_run=~timing_run;timing_on=~timing_on;}
}
if(timing_flag)
Timing();
run();
change_display2();
if(time2==0&&timing_on)
stop();
}
}
voidInit_all(void)//全局初始化
{
PWM_ON=0;
Init_timer();
Init_1602();
display2();
led(4,4);//关闭所有led
}
voidstart(void)
{
if(run_flag==1&&r_flag==0)
{
PWM_ON=2;
fan_normal();
j=1;i=1;
led(0,1);
r_flag=1;
p=1;
}
}
voidrun(void)
{
change_speed();
change_mode();
}
//停止系统
voidstop(void)
{
p=0;PWM_ON=0;
run_flag=0;
r_flag=0;
Init_all();
i=0,j=0,a=0;
mode2_flag=0;
mode3_flag=0;
timing_flag=0;
tim=0;timing_run=0;
timing_on=0;
write_string(11,1,"OFF");
}
//速度切换
voidchange_speed(void)
{
switch(i)
{
case1:
PWM_ON=2;led(1,0);break;
case2:
PWM_ON=4;led(2,0);break;
case3:
PWM_ON=8;led(3,0);break;
}
}
//模式切换
voidchange_mode(void)
{
switch(j)
{
case1:
led(0,1);fan_normal();break;
case2:
led(0,2);fan_natural();break;
case3:
led(0,3);fan_sleep();break;
}
}
//.....................................led控制函数
voidled(ucharo,ucharp)
{
switch(o)
{
case0:
break;
case1:
led1=0;led2=1;led3=1;break;
case2:
led1=1;led2=0;led3=1;break;
case3:
led1=1;led2=1;led3=0;break;
case4:
led1=1;led2=1;led3=1;break;
}
switch(p)
{
case0:
break;
case1:
led4=0;led5=1;led6=1;break;
case2:
led4=1;led5=0;led6=1;break;
case3:
led4=1;led5=1;led6=0;break;
case4:
led4=1;led5=1;led6=1;break;
}
}
/*模式函数*/
voidfan_normal(void)
{
p=1;
}
voidfan_natural(void)
{
if(mode2_flag==0)
{
time1=0;
p=1;
mode2_flag=1;
}
if(time1==4)
{
p=0;
}
if(time1==12)
{
p=1;
time1=0;
}
}
voidfan_sleep(void)
{
if(mode3_flag==0)
{
i=1;
time1=0;
p=1;
mode3_flag=1;
}
if(time1==8)
{
p=0;
}
if(time1==16)
{
p=1;
time1=0;
}
}
/*模式函数*/
voidDelayus(uintt)
{
while(--t);
}
voidDelayms(uintn)
{
while(--n)
{
Delayus(245);
Delayus(245);
}
}
/*.........................初始化定时器................................*/
voidInit_timer(void)
{
TMOD=0x11;
TH1=0X00;
TL1=0X00;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
irtime++;//外部中断
EA=1;
IT0=1;//指定外部中断0下降沿触发,INT0(P3.2)
EX0=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
/*-----------------------------------------------外部中断0初始化------------------------------------------------*/
//定时器1pwm
voidTimer1(void)interrupt3using1
{
staticucharcount;
TH1=(65536-256)/256;
TL1=(65536-256)%256;
irtime++;
time3++;
if(time3==255
{
time3=0;
}
if(beep_on==1)
{
spk=!
spk;
}
if(beep_time==1)
{
beep_on=0;
}
if(p)
{
if(count==PWM_ON)
{
PWM=0;
}
count++;
if(count==CYCLE)
{
count=0;
if(PWM_ON!
=0)
PWM=1;
}
}
}
//定时器0
voidTimer0(void)interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==1)
{
beep_time=1;
}
if(num==20)
{
num=0;
time1++;
if(time2)
time2--;
}
}
/*.............按键扫描..............
.....................................*/
unsignedcharKeyScan(void)
{
unsignedcharkeyvalue;
if(KeyPort!
=0xff)
{
Delayms(3);
if(KeyPort!
=0xff)
{
keyvalue=KeyPort;
while(KeyPort!
=0xff);
switch(keyvalue)
{
case0xfe:
return1;break;
case0xfd:
return2;break;
case0xfb:
return3;break;
case0xf7:
return4;break;
case0xef:
return5;break;
case0xdf:
return6;break;
case0xbf:
return7;break;
case0x7f:
return8;break;
default:
return0;break;
}
}
}
return0;
}
/*..........................................
定时功能定时器2
.............................................*/
voidTiming(void)
{
switch(timing_flag)
{
case1:
tim=10;if(timing_on==0)write_string(11,1,"00010");break;
case2:
tim=1800;if(timing_on==0)write_string(11,1,"01800");break;//30min
case3:
tim=3600;if(timing_on==0)write_string(11,1,"03600");break;//60min
case4:
tim=7200;if(timing_on==0)write_string(11,1,"07200");break;//120min
case5:
tim=10800;if(timing_on==0)write_string(11,1,"10800");break;//180min
case6:
tim=0;timing_flag=0;write_string(11,1,"");//定时取消
}
if(timing_on==0)
{
timing_r=1;
time2=0;
}
if(timing_run&&timing_r&&timing_on)
{
time2=tim;
timing_r=0;
timing_flag=0;
}
}
/*.........................................1602部分.............................................*/
voidwrite_com(ucharcom)
{
Delayms(5);
lcdrs=0;
lcden=1;
P0=com;
lcden=0;
}
voidwrite_data(ucharData)
{
Delayms(5);
lcdrs=1;
lcden=1;
P0=Data;
;
lcden=0;
}
//写入1602字符串
voidwrite_string(ucharx,uchary,uchar*s)
{
if(y==0)
{
write_com(0x80+x);
}
else
{
write_com(0xC0+x);
}
while(*s)
{
write_