重庆三峡学院
专业综合课程设计报告
题 目 智能遥控电风扇
系 别 电子与信息工程学院
专 业 电子信息工程
班 级 2011级1班
姓 名
学 号 201107014134
2014年 12 月 26 日
智能遥控电风扇
1、设计目的
实现对直流电机的控制来模拟风扇控制器;掌握单片机硬件和软件的综合设计方法。
二、设计方案
2.1信号调制及红外信号方案
这部分的主要问题是载波的产生以及信号与载波的调制的方式。
时下许多行业中的专业人士曾预言,软件无线电在不久的将来将成为一种无信通信的一种新的实现手段,它可以采用同一套通用的硬件设备,配备不同的软件即可实现不同模式,不同通信方式的通信,灵活性强,成本大大降低,维护方面也大部分只是软件方面的维护,从而双可借助网络的力量进而发展出远程维护等一系列新 的维护方式和手段,可见其前景是如些之广。因此,在这种背景之下,本系统尝试将这种先进的设计理念注入本系统信号调制的实现手段中。可以使用单片机作为发射方的主控中心,载波的产生,信号的采集,信号编码,信号与载波的调制,可都由单片机完成,输出的调制波经外接的整形放大电路后发射出去。这种方式成本稍高,不过设计灵活,保密性也好,可扩展性也强,所以本系统采用此方案。本系统采用软件调制的方式,在硬件上,只需完成信号的保持及功率放大,信号的载波产生及载波与信号的调制则全部由软件完成。所以,由程序产生信号与载波调制后的信号由微控制器引脚输出,采用CD40106进行缓冲放大并整形,经过三极管9013进行放大驱动红外发射管,使其发射红外光。
2.2 电机调速方案
此部分主要问题是电机的选择,调速方式的选择。
采用单片机控制可控硅的导通角来调节电机速度,同时要用光耦将强电隔离开来,使电路更安全,这种方法可以实现无级调速,而且可以采用多种算法,比如直接PWM,svpwm算法等,同时也可以达到很精确的控制,便于显示控制。如图2-3。成本可能稍高。本系统采用此方案。
2.3人机交互界面的选择
人机交互界面主要有输入与输出,输入可以为键盘或红外遥控器,输出可以选择数码管或者液晶,数码管成本低,但显示信息较少,外观不是很好,可以用在一些低端场合。液晶成本高,但显示信息量较多,外观较好,可以用在一些高端的场合,提高产品的附加值。因此,本系统采用液晶作为显示器件。
3、设计内容
遥控发射部分
为了能远离距的控制电风扇,采用了红外遥控器。通常红外遥控器由发射和接收两部分组成,发射部分由单片机 80C2051等构成。接收部分由单片机89C51等构成。
1 工作原理及组成部分
(1)CPU 采用STC89C52RC单片机,STC89C52RC的功能: 和 MCS-8051产品兼容、2KB可重编程闪速存储器、耐久性:1000写/擦除周期、2.7V~6V的操作范围、全静态操作:0Hz~24MHz、两级加密程序存储器、128×8位内部RAM、15根可编程I/O引线、6个中断源、可编程串行UART通道、直接LED驱动输出、片内模拟比较器、低耗空载和掉电方式。
(2)电源采用5v电源来提供电源。
(3)发射部分原理见图3-1所示。
图3-1遥控发射原理框图
2.遥控发射部分具体功能
发射部分包括键盘、编码调制、红外发送器。使用89C2051芯片 将按键信号调制在 38KHz 的载波信号上通过三极管放大后发射出去。红外编码为: 全码 =引导码+系统码+数据码。89C2051 的 P1口构成键盘,用T1产生定时中断,产生一个38K的方波,作为红外线的调制基波。将发送的数据和载波进行逻辑与后,经过40106整形,用三极管驱动红外发射管发射。
1.工作原理及组成部分: 红外接收部分包括光电转换放大器、解调、解码电路。
(1)CPU板将单片机、控制、键盘组合在一起完成了人机对话。 用 AT89C51单片机来作主芯片控制,采用红外HS0038B接收头,用双向可控硅MOC3025控制电机调速,具有红外遥控功能。
(2)电源部分:交流220V经变压器降压为16V,经整流桥整流后再由三端稳压器LM7805稳压,供给接收控制板。
(3) 电风扇控制板框图3-2
图3-2电风扇控制板框图
2.设计方案
(1)工作方式:分为手动和遥控两种方式。有四种吹风模式。
(1)红外遥控输入在 P3.2(INT0),面板按键在P3.3(INT1)。液晶和LED指示灯显示状态信息,
四、电路设计与描述
1.电路分析和设计
发射部分整体电路连接图,如图4-1
图4-1发射部分整体电路连接图
电路大概可分为七部分组成,分别是最小系统电路、电源电路、单片机与数码管电路、直流电机驱动电路、红外接收电路、LED接收指示电路以及按键电路。
2.电路虚拟仿真图4-2至图4-6
图4-2打开开关不工作仿真图
图4-3一级风仿真图
图4-4二级风仿真图
图4-5三级风仿真图
图4-6四级风仿真图
五、程序设计
5.1遥控发射部分软件设计
遥控发射部分主要功能是有按键按下,将按键值发送到接收方,这当中要完成键盘读取,载波的产生,编码调制,最终输出调制波。
采用中断的处理程序完成整个系统的操作,当有按键按下时,产生外中断0,外中断0处理完成键盘读取,接着定时器0中断服务子程序负责编码,定时器1中断服务子程序负责产生载波并且将载波与信号调制,调制波经引脚输出。主程序只负责延时10s,若无按键按下,则进入休眠状态,以节省电能。
主程序和外中断0服务子程序流程,见图5-1:
图5-1主程序和外中断0服务子程序流程图
定时器0和定时器1中断服务子程序流程,见图5-2
图5-2定时器0和定时器1中断服务子程序流程图
5.2 接收控制部分软件设计
这部分的程序设计主要有液晶的显示驱动,电机调速算法的实现,红外接收,及键盘读取。
5.2.1.红外接收和键盘读取都采用外中断来响应输入,这样可以简化程序设计。当有红外输出或者键盘输入时,外中断0和外中断1响应输入,当有红外输入时,配合定时器0完成接收工作,当有键盘输入时,在外中断0中完成键盘读取。
5.2.2液晶驱动程序设计
(1)1602LCD 的指令说明及时序:
1602 液晶模块内部的控制器共有11 条控制指令,如表5-3所示:
表5-3 控制命令表
1602 液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1 为高电平、0 为低电平)
指令1:清显示,指令码01H,光标复位到地址00H 位置。
指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。
指令6:功能设置命令 DL:高电平时为4 位总线,低电平时为8 位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7 的点阵字符,高电平时显示5x10 的点阵字符。
指令7:字符发生器RAM 地址设置。
指令8:DDRAM 地址设置。
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。
指令11:读数据。
(2)LCD1602的时序操作 读写操作时序分别如图5-4,图5-5所示
图5-4读操作时序图
图5-5写操作时序图
(3)1602LCD 的一般初始化(复位)过程
延时15mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
以后每次写指令、读/写数据操作均需要检测忙信号
写指令38H:显示模式设置
写指令08H:显示关闭
写指令01H:显示清屏
写指令06H:显示光标移动设置
写指令0CH:显示开及光标设置
(4)液晶显示程序流程图可以这样设计,如图5-6;详细代码参见附录。
图5-6液晶显示操作流程图
5.2.3.电机调速程序实现
电机调速采用直接PWM算法,在程序中的实现大致方法就是,产生一个基本频率的方波,配合定时器控制方波的占空比来控制可控硅的导通角,从而达到调节电机转速的目的。
实现的流程框图如下:
图5-7电机调速程序实现流程框图
采用直接PWM算法控制电机转速,再配合定时器,可以产生出多种多样的吹风模式,比如上文提到的自然风,睡眠风等模式;可以自己设计什么时候吹什么样的风,同时也实现了电机的无级调速。
5.2.4.主程序流程图,见图5-8:
图5-8主程序流程图
5.2.5.外中断0(键盘输入)和外中断1(红外接收)服务子程序流程,其他主要功能是根据输入(红外输入或键盘输入),控制系统的一些控制参量比如风量,吹风模式,开关机。
图5-9.外中断0和外中断1子程序流程图
程序代码:
#include
#define uchar unsigned char
#define uint unsigned int
/********定义IO端口********/
#define Key1 P3_2 //调速按键(停止,1级风,2级风,3级风,4级风)
#define SMG_XS P0 //数码管显示
#define IA P2_5 //直流电机控制端口
#define IB P2_4 //直流电机控制端口
#define IR1 P3_3 //红外接收端口
#define LED P1_0 //定义接收指示灯
uchar AddData=0; //定义自增变量
uchar HeardData=0; //定义接收到数据的高位变量
bit ExeFlag=0; //定义可执行位变量
uchar flag=0; //风量等级标志位(0:停止、1:1级风、2:2级风、3:3级风、4:4级风)
uchar code Data[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//数码管 0 1 2 3 4 5 6 7 8 9
void delay_anjian(uint time) //延时去抖
{
uint x,y;
for(x=time;x>0;x--)
for(y=110;y>0;y--);
}
void Init() //系统初始化
{
/***定时器工作方式**/
TMOD=0x11; //T0和T1:工作方式1
EA=1; //打开总开关
/***定时器0初始化(红外)***/
ET0=1; //打开定时器0中断
TH0=0xff; //时间大约为25uS
TL0=0x19;
TR0=1; //同意开始定时器0
PT0=1; //T0高优先级
/*定时器1初始化(产生PWM控制电机转速)*/
ET1=1; //使能T1中断
TH1=0xf8; //定时2ms
TL1=0xcc;
TR1=0; //关闭定时器1
/****外部中断1初始化******/
EX1=1; //同意开启外部中断1
IT1=1; //设定外部中断1为低边缘触发类型
PX1=1; //外部中断1 高优先级
}
void Key_cl() //按键处理
{
if(Key1==0) //调速按键按下
{
delay_anjian(5);//延时去抖
if(Key1==0) //再判断按键是否按下
{
while(Key1==0); //等待按键松开
flag++; //风量等级标志位加1
if(flag==5) {flag=0;}//让flag值控制在0到4之间
}
}
}
void Out_cl() //风量输出处理
{
switch(flag)
{
case 0: SMG_XS=Data[flag]; IA=0; IB=0; TR1=0; break; //停止
case 1: SMG_XS=Data[flag]; TR1=1; break; //1级风
case 2: SMG_XS=Data[flag]; TR1=1; break; //2级风
case 3: SMG_XS=Data[flag]; TR1=1; break; //3级风
case 4: SMG_XS=Data[flag]; IA=1; IB=0; TR1=0; break; //4级风
default: break;
}
}
void IR1_cl() //红外接收处理
{
static uint i=3000; //定义变量i=3000
while(i--) //i为0到3000之间的一段时间
{
if(IR1==0) //判断延时期间是否有红外信号输入
{
ExeFlag=1; //将可执行标志位置1
}
}
i=3000; //i设置3000
if(ExeFlag==0) //判断可执行标志位
{
EX1=1; //开启外部中断1
}
ExeFlag=0; //可执行标志位置0
}
void main() //主函数入口
{
Init(); //系统初始化
while(1) //主循环
{
IR1_cl(); //红外接收处理
Key_cl(); //按键处理
Out_cl(); //风量输出处理
}
}
void Time1() interrupt 3 //调速定时器1中断服务函数
{
static uchar a=1; //定义变量a=1
TH1=0xf8; //定时2ms
TL1=0xcc;
switch (flag)
{
case 1: if(a==1) {IA=1; IB=0;}
else {IA=0; IB=0;} break; //25%转(1级风)
case 2: if(a<=2) {IA=1; IB=0;}
else {IA=0; IB=0;} break; //50%转(2级风)
case 3: if(a<=3) {IA=1; IB=0;}
else {IA=0; IB=0;} break; //75%转(3级风)
default:break;
}
a++; //a加1
while(a==5) {a=1;} //a保持在1到4之间
}
void Timer0_IR1() interrupt 1 //红外定时器0中断服务函数
{
TH0=0xff; //时间大约为25uS
TL0=0x19;
AddData++; //自增变量加1
}
void Int1_IR1() interrupt 2 //红外接收外部中断1服务函数
{
static uint RecvData=0; //定义接收红外数据变量
static uchar CountData=0; //定义红外个数计数变量
LED=1; //接收指示灯置1(熄灭)
if(4==AddData)//0 //判断接收到的数据是0
{
RecvData=RecvData | 0; //判断到0就将当前位写0
RecvData=RecvData << 1; //将当前位向左移动1位
}
else if(8==AddData)//1 //判断接收到的数据是1
{
RecvData=RecvData | 1; //将当前位写1
RecvData=RecvData << 1; //将当前位向左移动1位
}
CountData++; //将红外接收位计数器加1
if(CountData==8) //判断是否接收到8位数据
{
HeardData=RecvData; //是8位数据时,则将数据暂存到高位变量中
}
else if(CountData==16) //判断是否接收到16位数据
{
ET0=0; //关闭红外定时器0
EX1=0; //关闭红外外部中断1
AddData=0; //定时时间间隔变量清零
if(HeardData==226 || HeardData==112)//判断用户码是否正确
{
LED=0; //用户码正确,接收指示灯置0(点亮)
HeardData=RecvData; //取出接收到的低八位数据
switch(HeardData) //判断低八位数据的值下列那一位
{
case 32: //电源 //说明按下了电源键
{
flag=0; //风量等级标志位为0 (停止)
break; //返回
}
case 0: //1 //说明按下数字1键
{
flag=1; //风量等级标志位为1 (1级风)
break; //返回
}
case 8: //2 //说明按下了数字2键
{
flag=2; //风量等级标志位为2 (2级风)
break; //返回
}
case 4: //3 //说明按下了数字3键
{
flag=3; //风量等级标志位为3 (3级风)
break; //返回
}
case 12: //4 //说明按下了数字4键
{
flag=4; //风量等级标志位为4 (4级风)
break; //返回
}
}
}
RecvData=0; //将接收到的数据清零
CountData=0; //将接收计数器清零
HeardData=0; //将接收高低数据变量清零
return; //返回
}
AddData=0; //将定时器计数器清零
ET0=1; //打开定时器0中断
}
六、系统运行、调试和结果分析
1.软件仿真调试
软件仿真调试有两种仿真调试方式,一是在用开发工具KEIL自带的仿真器来仿真调试,在编译连接完成后,单击或者“DEBUG”——“START/STOP DEBUG SESSION”或者按CTRL+F5即可进入KEIL的仿真调试环境,如图6-1
图6-1用KEIL调试程序图
在这个仿真环境中,它的结构大概是这样的,它提供很多的观察工具以窗口的形式呈现给用户,比如左边的寄存器察看窗口可以察看寄存的值,下左方的窗口可以输入命令行,可以观察变量值,也可以中途改变变量值,这相当于仿真过程中的输入等变化。右下的窗口可以观察内存的变化,正中的窗口是程序运行的主窗口,可以运用软件调试常用的手段,比如单步调试,设置断点等方法控制程序的运行。此外还有其他的一些工具,比如定时器,IO口的察看工具,可以观察也可以改变相应寄存器的值,如图6-2,
图6-2 在KEIL里调试运行图
总之,具有强大开发能力的KEIL,在它的仿真环境中,即具备了软件调试各种手段,同时又融合了窗口形式的硬件仿真平台,将这两者无缝地结合在一起,为用户构建了一个虚拟的软硬件协同仿真调试的平台。
另一种方法是软件仿真与系统仿真同时完成的方法,这里用到两个工具,一个是上面提到的强大的KEIL,另一个是PROTEUS电路分析实物仿真软件。
3.系统安装与调试
最后的安装与调试要从电源部分开始,首先要将电源安装调试完成。在这过程中要注意安全,因为这是和强电直接打交道的。发射部分和接收部分的各部分调试可以分割开来一个模块一个模块地调试,在这过程中可以分别编写测试这些模块的测试代码以验证电路是否正常工作,到最后确定每个模块都已经工作正常了,再一起调试整个系统。同样接收控制部分的电机驱动模块因为与强电有关系同样也要多加小心,可以做一个电机的开关,需要时再将电机接入系统中调试。最后再将它们整合在一起综合调试。在经过了软件仿真调试和系统仿真调试等步骤后,软件的逻辑应该已经大部分正确,这时大部分问题会出现在硬件的板子上。这个过程得耐心检测与查找。
我在焊接完实物后,经过了两遍的检查认真核对电路,才上的电,没出现问题,一次性成功了。
七、设计总结
本系统针对市场上流行的电风扇系统进行详细分析,对现行的电风扇系统提出了相应的改进方案,并将方案的实现进行探讨与尝试,最终付诸实践。本系统相对于其他市面上的风扇的亮点主要有:红外遥控发射与接收功能,多种吹风模式。我觉得做这个实物还比较实用,夏天在不需要太大的风的情况下,可以用它来降温,还可以作为电脑的散热器,直接接到电脑上面,比较方便。通过这个实践,我掌握了利用单片机控制技术,以及相关开发工具的应用 ,采用C语言编程控制技术解决生产、生活中的实际问题,自己的动力能力和实践能力在本次实践过程中得到了一定程序的提高。
八、参考文献
[1]蔡元宇 《电路与磁路》第三版 高等教育出版社 2008年 23-29页
[2]胡宴如 《模拟电子技术》第四版 高等教育出版社 2013年 50-62 页
[3]王延才 《电子线路CAD》第二版 机械工业出版社 2013年 78-123页
[4]陈方 《C语言程序设计》 机械工业出版社 2005年 51-112页
[5]廖哲智 《微机原理与应用技术》 高等教育出版社 2001年 45-83页
[6]赵先仲 《机电一体化系统》 高等教育出版社 2004年 123-150页
[7]周绍英 《交流调速系统》 机械工业出版社 2000年 48-62页
[8]傅新年 单相电机调速电路 电子世界2004 年8 期 2-5页
[9]魏乘国 魏永钦 谈单相电机的调速 家电检修技术2002年第6 期 3-4页
[10]陈建国 单片机在单相电机调速中的应用 2004年第5期福建电脑6页
本文来源:https://www.2haoxitong.net/k/doc/b7a51608a417866fb94a8e00.html
文档为doc格式