遥控控制智能电风扇.docx
- 文档编号:8795614
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:29
- 大小:785.32KB
遥控控制智能电风扇.docx
《遥控控制智能电风扇.docx》由会员分享,可在线阅读,更多相关《遥控控制智能电风扇.docx(29页珍藏版)》请在冰豆网上搜索。
遥控控制智能电风扇
温控智能电风扇
学院:
电气与电子信息工程学院
班级:
10级电气本一
姓名:
黄佳李凯龙周兵
摘要本设计是基于STC89C51单片机控制,遥控器手动调速,主要通过温度传感器DS18B20得到温度,单片机根据不同的温度自动调节电机工作的占空比从而自动调节转速。
关键词:
STC89C51单片机,温度传感器DS18B20,红外遥控,PWM
Abstract:
ThisdesignisbasedonSTC89C51single-chipmicrocomputercontrol,remotecontrolmanualcontrol,mainlythroughthetemperaturesensorDS18B20gettemperature,andsingle-chipmicrocomputerautomaticregulationaccordingtodifferenttemperature390vmotortoautomaticallyadjustthespeed.
Keywords:
STC89C51microcontroller,temperaturesensorDS18B20,infraredremotecontrol,PWM
1总体方案功能描述
功能描述——电风扇工作三种状态:
手动调速状态、自动调速状态、停止状态。
手动调速状态时可以用遥控器手动调节;自动调速状态通过单片机完成,如出现手动则变为手动状态;停止状态时可以被激活变为以上两种状态。
LCD1602液晶显示方面,通过温度传感器DS18B20显示气温。
系统图样如下所示,包括:
电机、传感、控制、输出四大部分5大功能模块。
2功能模块硬件简介与实现
2.1红外接收电路
(图2—1)
2.1.1红外接收原理简介
当遥控器的一个键按下超过36ms,此时振荡器使芯片激活,将发射一组108ms的编码脉冲,(这时引起单片机的外部中断)这108ms发射代码由一个引导码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。
如果键按下超过108ms仍未松开,接下来发射的代码(连发码)将仅由起始码(9ms)和结束码(2.25ms)组成。
单片机检测代码,并且将此此值保留。
2.2温度传感器
2.2.1温度传感器DS18B20简介
新型数字温度传感器DS18B20具有体积更小、精度更高、适用电压更宽、采用一线总线,在实际应用中取得了良好的测温效果。
DS18B20的主要特性
(1)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(2)测温度范围适宜:
-55℃~+125℃
(3)最高分辨率为0.0625℃
2.2.2DS18B20的一般操作过
(1)初始化
(2)跳过ROM(命令:
CCH);
(3)温度变换(命令:
44H);
(4)读暂存存储器(命令:
BEH)
另:
每次读起温度都要经过以上四个过程。
2.2.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
S
S
S
MSBYET
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
(DS18B20温度存储地址分配)
这是12位转化后得到的12为数据,存储在DS18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果册的温度大于0,这5位为0,只要将测到的数值乘以0.0625即可得到实际温度;如果温度小于0,这5位为1,测得的数值需要取反加1再乘以0.0625即可得到实际温度。
2.3LED显示电路
LED中文全称发光二极管,是半导体二极管的一种。
发光二极管的反向击穿电压为5V。
使用时常串联电阻用来控制流过的电流。
电阻的阻值计算表达式:
R=(E-U)/I
式中E为电源电压,U为LED的正向压降,I为LED的一般工作电流。
发光二极管的两根引线中较长的一根为正极,接电源正极。
发光二极管的特点是:
工作电压很低;工作电流很小;抗冲击和抗震性能好,可靠性高,寿命长;通过调制通过的电流强弱可以方便的调制发光的强弱。
基于以上特点,发光二极管在有些光电控制设备中用作电源,在许多电子设备中用作信号显示器。
我们的作品中就是用以上特性使发光二极管用作信号显示器,显示不同的档位的。
电路设计如下:
2.4LCD1602液晶显示电路
2.4.1LCD1602液晶简介
LCD1602液晶是每行显示16个字符,一共可以显示两行的显示器。
其接口信号说明如下所示:
主要技术参数如下:
基本操作时序如下:
2.4.2LCD1602液晶设置及工作图
(1)显示模式设置
(2)显示开/关及光标设置
(4)工作电路如下:
接口说明如下:
1、液晶端1,2为电源;15,16违背光电源并用电阻限流防止烧坏。
2、液晶4端为向液晶控制器写数据/写命令选择端,接单片机P3.5口。
3、液晶5端为读/写选择端,此端始终选择写状态,低电平接地。
4、液晶6端为使能信号,是操作时必须的信号,接单片机的P3.4口。
对比单片机I/O如下:
2.5复位电路晶振电路.
2.5.1复位电路
本设计采用的是上电复位电路,只要在RST复位输入引脚上接一电容至Vcc端,下接一个电阻到地即可。
复位期间,端口引脚处于随机状态,复位后,系统将端口置为全“l”态。
如(2.5.1)图所示:
2.5.2晶振电路
晶振作用是在电路产生震荡电流,发出时钟信号。
单片机的一切指令的执行都是建立在单片机晶振提供的时钟频率。
本设计使用的是11.0592MHZ频率的晶振。
如(2.5.2)图所示:
(图2.5.1)
(图2.5.2)
2.6电机工作电路和整体供电电路
2.6.1电机工作电路
(图2.6.1)
此处用的外接电源,主要是考虑到USB供电的电流最大为500mA,不能给电机提供正常的工作电压,所以用外接的方式来达到这个目的。
2.6.2整体供电电路
(图2.6.2)
采用的是USB供电方式,这样的供电线路简单,稳定性高
3软件设计与实现
3.1整体设计思路介绍
软件设计整体思路:
主程序部分进行一些初始化以及温度的读取;外部中断0进行红外遥控的检测;定时器1进行实时调节电机工作的占空比。
3.2主要部分流程图如下:
3.2.1主程序流程图
3.2.2外部中断流程图
3.2.3定时器0中断流程图
参考文献:
C程序设计(谭浩强)
新概念51单片机C语言教程(郭天祥)
附:
源程序如下
/**********************************************
***************智能风扇程序******************
**********************************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitE=P3^4;//液晶使能
sbitRS=P3^5;//液晶数据指令口
sbitDQ=P1^0;
sbitIRIN=P3^2;//外部中断,红外解码口
sbitDJ=P2^0;//电机口
sbitled1=P1^1;
sbitled2=P1^2;
sbitled3=P1^3;
sbitled4=P1^4;
ucharcodetable1[]="Happyeveryday!
";//液晶第一行显示的滚动的语句
ucharcodetable2[]="temperature00C";//在液晶第二行显示温度
ucharcodetable3[]="WindspeedA";//当风扇开始运行时在第一行显示风速等级
ucharcodetable4[]="WindspeedB";//当风扇开始运行时在第一行显示风速等级
ucharcodetable5[]="WindspeedC";//当风扇开始运行时在第一行显示风速等级
ucharcodetable6[]="autocontrol";//ucharcodetable6[]="autocontrol";;
uinttemp,shi,ge,e,count,tt,tt1;
uchara[4];
floatf_temp;
/*****延时毫秒**************/
voiddelayms(uintxms)
{
uinti,j;
for(i=0;i for(j=0;j<110;j++); } /**********微秒延时*********/ voiddelayus(uintxus) { uinti,j; for(i=0;i for(j=0;j<14;j++); } /***写指令和数据***********/ voidwrite_com(ucharcom) { RS=0; P0=com; delayms(5); E=1; delayms(5); E=0; } voidwrite_date(uchardate) { RS=1; P0=date; delayms(5); E=1; delayms(5); E=0; } /*********温度*****************/ voidinit_wd()//DS18b20init { uinta; DQ=0; a=103; while(a>0)a--; DQ=1; a=4; while(a>0)a--; } bittempreadbit() { uintb; bitdat; DQ=0;b++; DQ=1;b++;b++; dat=DQ; b=8; while(b>0)b--; return(dat); } uchartempread() { uinti,j,dat; dat=0; for(i=1;i<=8;i++) { j=tempreadbit(); dat=(j<<7)|(dat>>1); } return(dat); } voidtempwritebyte(uchardat) { uinti; ucharj; bittestb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) { DQ=0; i++;i++; DQ=1; i=8;while(i>0)i--; } else { DQ=0; i=8;while(i>0)i--; DQ=1; i++; i++; } } } voidtempchange() { init_wd(); delayms (1); tempwritebyte(0xcc); tempwritebyte(0x44); } uintget_temp() { uchara,b; init_wd(); delayms (1); tempwritebyte(0xcc); tempwritebyte(0xbe); a=tempread(); b=tempread(); temp=b; temp<<=8; temp=temp|a; f_temp=temp*0.0625; temp=f_temp*10+0.5; f_temp=f_temp+0.05; returntemp; } /***************写温度********************************/ voidwrite_wd(ucharshi,ucharge) { write_com(0x80+0x40+12); write_date(0x30+shi); write_date(0x30+ge); } /********************液晶初始化程序******************/ voidyinit()//液晶初始化 { E=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } /********************A级风速时显示程序******************/ voiddisplay()//A级风速 {uintnum; yinit(); write_com(0x80); for(num=0;num<15;num++)//第一行显示风速等级 { write_date(table3[num]); delayms(5); } write_com(0x80+0x40); for(num=0;num<15;num++) { write_date(table2[num]); delayms(10); } } /********************B级风速时显示程序******************/ voiddisplay1()//B疾风速 { uintnum; yinit(); write_com(0x80); for(num=0;num<15;num++)//第一行显示风速等级 { write_date(table4[num]); delayms(5); } write_com(0x80+0x40); for(num=0;num<15;num++) { write_date(table2[num]); delayms(10); } } /********************C级风速时显示程序******************/ voiddisplay2()//c疾风速 { uintnum; yinit(); write_com(0x80); for(num=0;num<15;num++)//第一行显示风速等级 { write_date(table5[num]); delayms(5); } write_com(0x80+0x40); for(num=0;num<15;num++) { write_date(table2[num]); delayms(10); } } /*******************液晶还原程序***********************/ voiddisplay3()//液晶显示还原 { uintnum; yinit(); write_com(0x80); for(num=0;num<16;num++) { write_date(table1[num]); delayms(5); } write_com(0x80+0x40); for(num=0;num<15;num++) { write_date(table2[num]); delayms(5); } } /*********************自动控制程序***********************/ voiddisplay4()//自动控速 { uintnum; yinit(); write_com(0x80); for(num=0;num<12;num++) { write_date(table6[num]); delayms(5); } write_com(0x80+0x40); for(num=0;num<16;num++) { write_date(table1[num]); delayms(5); } } /*********************************************** **************主函数************************** ***********************************************/ voidmain() { uintt,num,m; EA=1; IT0=1; EX0=1; DJ=1; TMOD=0X01; TH0=(65535-9216)/256; TL0=(65536-9216)%256; ET0=1; /****************液晶初始显示状态*************/ yinit(); write_com(0x80); for(num=0;num<16;num++) { write_date(table1[num]); delayms(5); } write_com(0x80+0x40); for(num=0;num<15;num++) { write_date(table2[num]); delayms(5); } init_wd();//温度初始化 /******************循环扫描红外和温度**********************/ while (1) { tempchange(); t=get_temp(); shi=t/100; ge=t%100/10; if(e! =4) write_wd(shi,ge); /***********选择A风速**************************************/ if((a[2]==0x01)&&(e==0)) { a[2]=0x00; display(); e=1;m=1; delayms(10); } /***********选择B风速**************************************/ if((a[2]==0x01)&&(e==1)) { a[2]=0x00; display1(); e=2;m=2; delayms(10); } /***********选择C风速**************************************/ if((a[2]==0x01)&&(e==2)) { a[2]=0x00; display2(); e=3;m=3; delayms(10); } /*****************显示还原*******************************/ if((a[2]==0x01)&&(e==3)) { a[2]=0x00; display3(); e=0;m=0;TR0=0; delayms(10); } /****************启动选择的风速*************************/ if((a[2]==0x02)&&(m! =0))//启动风扇 {e=4; TR0=1; led1=0; if(m==1){led2=0;count=7;} if(m==2){led3=0;count=9;} if(m==3){led4=0;count=10;} } /**************关闭风扇********************************/ if(a[2]==0x04) { a[2]=0x00; display3(); TR0=0; led1=1; led2=1; led3=1; led4=1; e=0; } /***************启动自动控制,即启动自然风************/ if(a[2]==0x05) {e=4; a[2]=0x00; display4(); TR0=1; tt=3; count=3; } DJ=1; } } /********************************************** **************外部中断*********************** ************************************************/ voidIR_IN()interrupt0 { uinti,j,tem=0,num=0; EX0=0; delayus(15); if(IRIN==1) { EX0=1; return; } while(! IRIN); while(IRIN); for(i=0;i<4;i++) { for(j=0;j<8;j++) { while(IRIN) ; while(! IRIN) ; while(IRIN==1) { delayus (1); num++; if(num>=15) { EX0=1; return; } } tem=tem>>1; if(num>=8) tem=tem|
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遥控 控制 智能 电风扇