智能电风扇模拟控制系统设计(9页).doc
-智能电风扇模拟控制系统设计-第 9 页金陵科技学院电子竞赛设计报告参赛题目:智能电风扇模拟控制系统设计 参赛选手:严飞、王俊参赛地点:金陵科技学院参赛时间:2014.11.15-2014-11.25智能电风扇模拟控制系统设计报告摘要:本设计以STC公司的MCU STC89C52处理器为核心,实现了按键和安卓客户端同步控制风扇转动,利用DS18B20检测温度并有自动调节风速的模式,通过液晶和安卓客户端实时显示出风扇当前的状态。也可通过按键和安卓客户端来控制风扇的摇头功能。以该系统以丰富的功能和精准的控制完成了比赛的要求。关键词:STC89C52 电机驱动模块 直流电机 蓝牙模块 一、系统框图 本次实验利用STC89C52单片机接收由按键和蓝牙模块传回的控制数据,控制智能风扇的总开关,风力的大小,和摇头功能,并通过液晶实时返回当前的模式,风速大小,定时,和当前温度。(本设计的硬件实物图见附录一),系统总体结构框图如下:按键安卓客户端 驱动模块风扇STC89C52单片机蓝牙模块液晶显示 二、方案论证1、风扇驱动选择: 方案一:采用台式计算机散热风扇,该风扇的额定电压为5V,实验过程中发现它的风力太小,不易控制。故选择放弃该方案。 方案二:采用步进电机作为风扇驱动,因为每转过一个步距角的实际值与理论值存在着误差,不同运行拍数其值不同,四拍运行时应在5%之内,八拍运行时应在15%以内。因此步进电机的转速很难精准的确定下来,因此,若选择该方案的话,对后面角度的计算将产生很大误差,故选择放弃该方案。 方案三:采用外转子无刷电机作为风扇驱动,外转子无刷电机转速的可控性强,从每分钟几转到每分钟几万转都可以很容易实现,而且变速平稳、转速稳定、转速的线性度好。外转子无刷电机的转动可以通过软件编程调整它的转速,而且外转子无刷电机带动风扇转动的风力大,实验过程中,发现它的风量较为合适,稳定度也比较高。故选择采用这种方案,来完成风扇控制系统。2、单片机最小系统MCU选择:方案一:采用STM32微控制器,STM32是一款功能强大32位的单片机,但由于本次设计要实现的功能较少,STM32的代码操作比较繁琐,对于简单的设计用STM32会性能过剩,也由于stm32价格比较贵,所以放弃该方案。方案二:采用ATMEGAl6单片机,它是一款低功耗8位单片机,虽然它的性能比较好,并且也能完成实验要求,但他的价格比较贵,性价比不高。经综合考虑,放弃该方案。方案三:采用80C52单片机,它是一款八位单片机,具有32个I/O引脚,2个定时、计数器,5个中断源等等优点,对于本次设计来说,使用80C52系列单片机,节约成本并且电路结构简单,最终选择该方案。3、 蓝牙模块选择方案一:采用全模式蓝牙模块,这种蓝牙需要软件方面进行设置,设置主从模式传输速率和连接密码,模块功能较为强大,但由于本次设计用到的功能单一,所以放弃该方案。方案二:采用单模式蓝牙模块,这种蓝牙模块功能较为单一,但是操作起来方便,使用简单,价格便宜,考虑到种种因素最终选择该方案。4、 温度检测模块选择方案一:采用温湿度传感器,这种模块可以传回温湿度,满足了产品所需的要求,但是由于该温湿度传感器体积较大,价格稍贵所以放弃该方案。方案二:采用DS18b20,该款温度传感器口碑较好,精确度高,集成度高,且价格低廉,考虑到整体设计,代码的简洁程度,最终选择该方案。 三、系统硬件电路与程序设计(1)温度检测部分通过DS18B20来读取空气中温度的值,并且实时返回该数据,单片机根据得到的数据有效地进行精准的控制和显示,极大地满足了用户对于温度的要求。(2)温度、电机转速和定时显示部分 通过风速按键来改变单片机I/O口所输出的PWM信号,驱动电机调速,通过定时按键实现定时关机功能,通过自动模式按键实现对温度的实时操作,当温度大于25度时切换到自然风,当温度在20度和25度之间时切换到常风,当温度在20度以下时切换到睡眠风。(3) 按键循环读取键值部分每隔一段时间扫描一次按键,这样可以定时得到所需的键值。然后通过单片机实时对电机进行操作。(4) 蓝牙手机客户端部分如图所示,这是我们自己制作的客户端,界面简单大方,简洁明了,画面友好,功能丰富强大,可以随时远距离进行对电风扇的风速的操作,并且可以随时打开关闭摇头功能,还有定时功能,可以设定任意时间的数值,可以设定模式选择,设定自动模式下可以使风扇根据温度的大小而改变风速。我们还设定了总开关,可以随时关机和开机。五、软件设计 本系统中单片机起到检测输入和控制输出等显示作用,所以软件设计比较复杂,启动后进入输入扫描,通过按键和安卓客户端来控制单片机给外转子无刷电机驱动力的大小,最后通过单片机控制液晶显示出来,整个软件设计形成一个循环的控制系统。(软件流程图见附录三,软件主要代码见附录四)六、 测试方法与过程打开电源,模拟电风扇处于关机状态,在这个状态下按下按键1,开机。发现电机自动到了自然风状态开始转动,温度也开始实时显示,说明按键和电机还有温度传感器功能良好。然后按下摇头按键,摇头功能也正常,满足本次题目的要求。然后测试定时功能,按下定时按键,液晶显示从10秒递减,当递减到0时关机,此时摇头和电机功能均失效,所有按键都失效。再次开机,选择自动模式,此时用手触摸ds18b20,当温度升高时,会自动改变风速。最后测试蓝牙客户端的功能,打开蓝牙客户端,依次按下各个按键,发现电机能按照本次设计要求进行转动,说明各项功能完好,本次设计圆满成功。七、总结综合上述的测试结果,本设计不仅圆满地完成了题目的基本要求,还完美的完成了发挥部分的要求。经过几天的艰苦奋斗和不懈努力,我和我的队友成功的调试出了各个模块并且联调成功,期间我们学到了很多也收获了很多,最重要的是我们锻炼出了坚持不懈的品格和在遇到困难时永不服输的精神,感谢学校给我们这次锻炼的机会。八、附录 附录一:硬件实物图 附录二:电路原理图附录三:程序流程图附录四:void main (void) /主程序int temp;float temperature;char displaytemp16;/定义显示区域临时存储数组char displaytime4="000" /定义显示定时时间的存储数组char key;DCOUT = 1; LCD_Init(); /初始化液晶DelayMs(20); /延时有助于稳定yaotoutingzhi();LCD_Clear(); /清屏Init_Timer();Lcd_User_Chr(); /写入自定义字符LCD_Write_String(0,0,"speed:");LCD_Write_String(8,0,"time:000");xianshiguanji();LCD_Write_Char(13,1,0x01);/写入温度右上角点LCD_Write_Char(14,1,'C'); /写入字符CDCOUT=0;while (1) /主循环 /循环调用按键扫描 key=KeyScan(); if(key=3&&yunxingmoshi=0)/第一个按键,速度等级增加/ if(PWM_ON=10|PWM_ON=0)/ PWM_ON=20;/xianshiziranfen();/ else if(PWM_ON=20)/ PWM_ON=5;/xianshishuimianfen();/ else if(PWM_ON=5)/ PWM_ON=10;/PWM_ON=58;/xianshichangfen();if(PWM_ON=0)PWM_ON=20;zongkaiguan=1; xianshiziranfen(); else if(PWM_ON=20) PWM_ON=10;zongkaiguan=1;xianshichangfen(); else if(PWM_ON=10) PWM_ON=5;zongkaiguan=1;xianshishuimianfen(); else if(PWM_ON=5) PWM_ON=0;/PWM_ON=58;zongkaiguan=0;xianshiguanji();yaotoumoshi=0;yaotoutingzhi(); if(key=4&&zongkaiguan)/ dingshimoshi=1; xianshichangfen(); PWM_ON=10; shijian+=10; if(shijian>990) shijian=990; if(key=5&&zongkaiguan) /3 if(yaotoumoshi=0) yaotoumoshi=1; zhenzhuanfanzhuan=1;yaotouzhengzhuan();else yaotoumoshi=0;yaotoutingzhi(); /yaotou1=1;/yaotou2=1;if(key=6&&zongkaiguan) /4 if(yunxingmoshi=0) yunxingmoshi=1; else yunxingmoshi=0;if(readtimeflag=1)readtimeflag=0;if(shijian>0)shijian-;if(shijian=0&&zongkaiguan&&dingshimoshi)PWM_ON=0; zongkaiguan=0;dingshimoshi=0;yaotoumoshi=0;yaotoutingzhi();xianshiguanji();sprintf(displaytime,"%d",shijian);/打印时间值if(shijian>=100 ) LCD_Write_String(13,0,displaytime);/else if(shijian>=10) LCD_Write_Char(13,0,'0'); /写入字符C LCD_Write_String(14,0,displaytime);/ else LCD_Write_Char(13,0,'0'); /写入字符CLCD_Write_Char(14,0,'0'); /写入字符C LCD_Write_String(15,0,displaytime);/if(flag_REC=1) /flag_REC=0;if(bufff0='O'&&bufff1='N')/第一个字节为O,第二个字节为N,第三个字节为控制码switch(bufff2)case 'A' :/自然风 if(zongkaiguan)PWM_ON=20;xianshiziranfen(); break;case 'B':if(zongkaiguan)/常风 PWM_ON=10; xianshichangfen(); break;case 'C':/睡眠风if(zongkaiguan)PWM_ON=5; xianshishuimianfen(); break; case 'D':/打开摇头 if(zongkaiguan) yaotoumoshi=1; zhenzhuanfanzhuan=1;yaotouzhengzhuan();break;case 'E':yaotoumoshi=0;yaotoutingzhi(); /yaotou1=1;/yaotou2=1; break; case 'F':/自动 if(zongkaiguan) yunxingmoshi=1; break;case 'G':if(zongkaiguan) yunxingmoshi=0;/ 右转 /bee=0; break; case 'J':if(zongkaiguan) dingshimoshi=1; xianshichangfen(); PWM_ON=10; shijian=(int)(bufff3-'0')*(int)100+(int)(bufff4-'0')*(int)10+(int)(bufff5-'0'); if(shijian>990) shijian=999;break;case 'H':zongkaiguan=1;break;case 'I':PWM_ON=0; zongkaiguan=0;dingshimoshi=0;yaotoumoshi=0;yaotoutingzhi(); xianshiguanji();break;if(ReadTempFlag=1) ReadTempFlag=0; temp=ReadTemperature(); temperature=(float)temp*0.0625; sprintf(displaytemp,"Temp % 7.3f",temperature);/打印温度值 if(temperature>10.0&&temperature<40.0) LCD_Write_String(0,1,displaytemp);/显示第二行if(yunxingmoshi=1&&zongkaiguan)if( temperature<20.0) PWM_ON=5;xianshishuimianfen();else if(temperature<=25.0) PWM_ON=10;xianshichangfen();else if(temperature>25.0) PWM_ON=20;xianshiziranfen();/ SendStr(displaytemp);