模拟电风扇控制系统课程设计报告.docx
《模拟电风扇控制系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《模拟电风扇控制系统课程设计报告.docx(28页珍藏版)》请在冰豆网上搜索。
![模拟电风扇控制系统课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-2/11/594b7f8c-c950-47f8-987a-92bf5bff5435/594b7f8c-c950-47f8-987a-92bf5bff54351.gif)
模拟电风扇控制系统课程设计报告
电气信息学院
单片机技术课程设计报告
课题名称电风扇模拟控制系统设计
专业班级11通信02班
学号
学生姓名廖振宇
指导教师易先军
评分
2014年6月17日至6月21日
课程设计量化评分标准
指标
分值
评分要素
得分
方案设计
20
方案选择合理,分析、设计正确,原理清楚,电路、程序流程图清晰,结构合理,程序简洁、正确。
设计报告
20
报告结构严谨,逻辑严密,论述层次清晰,语言流畅,表达准确,重点突出,报告完全符合规范化要求,用计算机打印成文。
调试与结果
20
过程清晰,调试方案设计合理,测试点选择适当,程序编写正确,调试步骤清楚。
电路及程序运行结果正确,达到预期效果。
工作态度
20
工作量饱满程度,题目难度;工作态度,按时完成设计任务,是否独立完成等。
答辩成绩
20
思路清晰;语言表达准确,概念清楚,论点正确;分析归纳合理,结论严谨;回答问题有理论根据,基本概念清楚。
总评成绩
指导老师评语:
答辩记录
1、例举设计过程中遇到的问题及其解决方法。
答:
(1)问题说明:
LED显示灯无法正常显示字符。
解决方法:
换了不同的LED进行试验发现都不能正常显示,所以考虑到是译码电路出现问题,检查电路发现是单片机P1口与RES-6器件的高地位接反了,改正后系统正常显示了。
(2)问题说明:
当按键按下后,仿真正常开始,但按下摇头键,电机有时反转,有时不反转,一直按住摇头键不放电机可正常反转。
解决方法:
验证程序无误后我判断是按键的问题,经过查阅知道了可以添加一个按键防抖环节,按键消抖可分为硬件消抖和软件消抖两种,在键数较少时可用硬件消除抖动,并采用了在I/O口上并接合适的电容来解决。
2、教师现场提的问题记录在此。
(1)能实现电子电路仿真的软件有很多,如Multisim、PSPICE、OrCAD、EWB等,Proteus相对这些软件来说有什么特点?
答:
Proteus不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具。
它从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台。
并且可以输出高质量的图纸,提供了各种仿真元器件,仪表等丰富资源。
(2)各风类是如何实现的?
说说你的实现方法。
答:
我采用的PWM来实现直流电动机的调速,由于直流电机的转速与加在其两端的平均电压成正比,所以在对直流电动机电枢电压的控制和驱动中,目前经常使用的是通过改变电机电枢电压接通时间与通电周期的比值来控制转速。
当自然风键按下时,输出占空比为1:
3的方波;当常风键按下时,输出占空比为3:
1的方波;当睡眠风键按下时,输出占空比为1:
5的方波。
摘要
电风扇是我们日常生活应用非常广泛的家用电器,具有使用方便,价格优惠等特点。
虽然目前空调已非常普及,但电风扇风力柔和,任收到大部分人群的喜爱。
本次课程设计通过keiluvision4和proteus软件设计一个电风扇模拟控制系统。
设计是基于AT89C52芯片实现用4位数码管实时显示电风扇的工作状态,包含风类的显示和定时时间的显示。
系统设计有风类选择功能,摇头功能和定时功能。
并设计有过热检测与保护功能。
结果表明整套系统操作方便,显示直观,具有较强的实用性。
关键词:
电风扇控制系统;AT89C52;proteus软件;keiluvision4
I
II
1设计任务
系统主要功能如下:
1、用4位数码管实时显示电风扇的工作状态,最高位显示风类:
“自然风”显示“1”、“正常风”显示“2”、“睡眠风”显示“3”。
后3位显示定时时间:
动态倒计时显示剩余的定时时间,无定时显示“000”。
2、设计“自然风”,“正常风”和“睡眠风”三个风类键用于设置风类;设计一个“定时”键,用于定时时间长短设置;设计一个“摇头”键用于控制电机摇头。
在整个定时状态下,电路具有允许用户随时自行选择使用“自然风”状态,也可选择使用“常风”和“睡眠风”状态。
设计过热检测与保护电路,若电风扇电机过热,则电机停止转动,电机冷却后电机又恢复转动。
2设计方案
2.1任务分析
电风扇模拟控制系统设计就是使用单片机来控制电机和一些LED、按键,模拟真实的电风扇的使用,通过设计使电风扇使用便捷更人性化。
风类,定时,摇头都是针对使用者不同需求的设计。
过热保护是对安全性要求的设计。
2.2方案设计
1.硬件方案
根据设计的要求可知,系统的硬件原理框图如图2.1所示。
档位及定时显示
电机控制模块
按键输入
单片机系统
过热检测模块
图2.1系统的硬件原理框图
本系统由五个模块组成,分别是输入模块、显示模块、电机控制模块、过热保护模块以及单片机控制系统。
其中单片机控制系统是核心,由AT89C52、晶振和复位电路组成。
它通过处理输入的各种数据信息来对其它模块发出指令,进行相应的操作。
输入模块由5个按键组成,分别控制电机的风速、正反转和定时时间。
显示模块由8位共阴数码管组成,显示定时时间和风速。
过热保护模块由ADC0809和外围电路组成,通过设定电压初始值使电机超值停转并且相应二极管发光报警。
电机控制模块由L298和其它的元器件组成,它主要是放大输入信号的倍数,用来驱动电机。
图3.1晶振电路图3.2复位电路
保护电路的选择:
选用ADC0809作为过热保护电路的核心部件,假设先设定一个标准电压值,通过0-5V模拟电压输入进行模数转换,如果数据超过标准值则单片机对电机进行相应操作,使电机启停。
控制核心的选择:
采用单片机作为控制核心,以软件编程的方式进行风速判断,并在端口输出控制信号。
显示电路的选择:
采用八位共阴数码管显示电机状态,动态扫描显示方式。
2.软件方案
系统软件设计包括主程序设计,A/D转换子程序设计和定时器T0中断程序设计。
3系统硬件设计
3.1过热检测模块的设计
ADC0809的工作原理是:
首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
当OE输入高电平时,输出三态门打开。
转换数据的传送A/D转换后得到的数据应及时传送给单片机进行处理。
数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。
为此可采用下述三种方式[4]。
(1)定时传送方式
对于一种A/D转换器来说,转换时间作为一项技术指标是已知的和固定的。
例如ADC0809转换时间为128μs,相当于6MHz的MCS-51单片机共64个机器周期。
可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换已经完成了,接着就可进行数据传送。
(2)查询方式
A/D转换芯片由表明转换完成的状态信号,例如ADC0809的EOC端。
因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。
(3)中断方式
把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。
3.2电机调速与控制模块设计
采用的PWM来实现直流电动机的调速,由于直流电机的转速与加在其两端的平均电压成正比,所以在对直流电动机电枢电压的控制和驱动中,目前经常使用的是通过改变电机电枢电压接通时间与通电周期的比值来控制转速,其优点:
控制原理简单输出波动小,线性好,对邻近电路干扰小,缺点是:
功率低,散热问题严重。
占空比示意图如图3.3所示:
T
t1
t2
U
t
图3.3占空比示意图
占空比表示了在一个周期T里开关管导通的时间与周期的比值,D的变化范围为0<=D<=1。
当电源电压UB不变的情况下,输出电压的平均值U取决于与占空比D的大小,改变D值也就改变了输出电压的平均值,从而达到控制电动机转速的目的,即实现了PWM调速。
根据硬件原理图连接好电路,A/D接入单片机上通过程序来控制L298输出控制直流电机的转动。
通过不同按键输出不同的占空比,使直流电机转动。
当自然风键按下时,输出占空比为1:
3的方波;当常风键按下时,输出占空比为3:
1的方波;当睡眠风键按下时,输出占空比为1:
5的方波;当摇头键按下时,电机反转,同时保持原先的风速。
3.3显示与控制模块设计
本系统设计采用4位共阴数码管显示电路,在设计4位LED显示时,为了简化电路,降低成本,采用动态显示的方式,4个LED显示共用一个8位的I/O,4个LED数码管的位选线分别由相应的P2.0-P2.3控制,而将其相应的段选线并联在一起,由一个8位的I/O口控制,即P0口。
译码显示电路将档位和定时时间的输出状态经显示译码器译码,通过4位LED七段显示器显示出来。
到达定时时间电机停止转动同时定时时间变为0。
P2.5口接一个发光二极管,当电压值超压时二极管灯亮实现报警,此状态下,无论定时时间和风速键是否按下,电机都处于停止状态。
3.4键盘模块设计
本系统使用简单的键盘和数码显示器件来完成输入\输出操作的人机界面。
键盘输入信息的主要过程是:
1、CPU判断是否有键按下。
2、确定哪一个键被按下。
3、把此键代表的信息翻译成计算机所识别的代码,如ASCII或者其他代码。
键盘上有很多键,每一个键对应一个键码,以便根据键码转到相应的子程序,进一步实现数据输入和命令处理的功能。
键盘识别的流程如图3.1所示:
键盘识别
确定按键物理位置
计算键码
等待释放
返回
N
有键按下?
Y
图3.4键盘识别流程图
4系统软件设计
4.1主程序流程图设计
软件所要实现的功能有:
按键响应,对ADC0809的控制,对数据的处理和传送显示的数据。
主程序包含初始化、调用A/D转换子程序和调用显示程序,其流程图如图4.1所示:
摇头?
Y
开始
显示
初始化
Y
占空比1:
3
自然风?
N
常风?
N
Y
占空比3:
1
Y
占空比1:
5
睡眠风?
N
Y
进入定时程序
定时?
开摇头
N
N
电机过热?
关电机
关中断
显示过热
N
图4.1主程序流程图
主程序经初始化后,开始四位数码管显示的是“0000”电机停转。
然后进入按键扫描程序,依次对自然风、常风、睡眠风进行扫描,单片机I/O口输出相应的占空比方波,当为自然风时,数码管最高位显示“1”,当为常风时,数码管最高位显示“2”,当为睡眠风时,数码管最高位显示为“3”。
当有定时键按下时,转到定时器T0中断程序进行。
当有摇头键按下时,高低电平翻转,电机开始反转。
4.2定时器T0中断程序流程图设计
定时器T0是用来对定时时间进行控制的,结合数码管动态显示,首先给T0设置工作方式和初始值,由于它不可重装,所以在主程序中必须再次定义它的初始值。
其流程图如图4.2所示:
Y
定时时间减一秒
定时到了吗?
Y
置初值
置初值
中断返回
数码显示
电机停
关中断
N
1s到了吗?
N
开中断
图4.2定时器T0中断程序流程图
4.3A/D转换测量子程序流程图设计
由于ADC0809在进行A/D转换时要用到CLK信号,而此时的ADC0809的CLK是接在AT89C52单片机的P2.4端口上,也就是要求从P2.4输出CLK信号供ADC0809使用。
因此产生CLK信号的方法就的使用软件来产生了;由于ADC0809的参考电压VREF=VCC,所以转换之后的数据要经过数据处理。
然后和设定的参考值比较,而实际显示的电压值的关系为。
其流程图如图4.3所示。
Y
地址数小于8?
N
A/D转换结束?
结束
N
开始
ADC0809地址加一
取数据
Y
启动测试(TESTART)
图4.3A/D转换测量子程序流程图
在主程序中,ADC0809的转换程序也是无限循环的,它主要是检测电机是否过热。
本系统中,运用定时器T1作为CLOCK的脉冲信号,由于它的工作方式为2,且初始值216,足以满足ADC0809所转换一次所需要的时间。
设定电机过热电压初始值为1.95V,当模拟电压输入量超过这个值时,发光二极管点亮,表示电机过热此时L298使能端变低电平,电机停转。
5仿真与性能分析
1、系统仿真过程
(1)进入KeilCμVision4开发集成环境,创建一个新项目(Project),并为该项目选定单片机CPU器件(AT89C52)。
并为该项目加入KeilC源程序(代码见附录)。
(2)单击“Project菜单/OptionsforTarget”选项或者点击工具栏的“optionfortarget”按钮,弹出窗口,点击“Debug”按钮, 在出现的对话框里在右栏上部的下拉菜单里选中“ProteusVSMDriver”。
并且还要点击一下“Use”前面表明选中的小圆点。
再点击“Setting”按钮,设置通信接口,在“Host”后面添上“127.0.0.1”,如果使用的不是同一台电脑,则需要在这里添上另一台电脑的IP地址(另一台电脑也应安装Proteus)。
在“Port”后面添加“8000”。
设置好的情形如图所示,点击“OK”按钮即可。
最后将工程编译,进入调试状态,并运行。
(3)进入Proteus的ISIS,鼠标左键点击菜单“Debug”,选中“useromotedebugermonitor”,如图所示。
此后,便可实现KeilC与Proteus连接调试。
图5.1模拟电风扇控制系统的设计原理图
2仿真结果与分析
图5.2是自然风键按下时状态,数码管显示为1,无定时时间。
ADC0809显示电压值为1.95V,电机不发热,正常转动。
为了表示哪个按键被按下,仿真图上对应的按键均为闭合状态,下面的仿真图也同上,这里不在阐述。
图5.2
图5.3是常风键按下时状态,数码管第一位显示为2,无定时时间。
ADC0809显示电压值为1.95V,电机不发热,正常转动。
图5.3
图5.4是睡眠风键按键按下时状态,数码管第一位显示为3,无定时时间。
图5.4
图5.5是自然风按键按下时状态,数码管第一位显示为3,定时时间为15ms。
ADC0809显示电压值为1.95V,电机不发热,正常转动。
图5.5
图5.6是睡眠风按键按下时状态,数码管第一位显示为3,定时时间为0ms。
ADC0809测得的显示电压值为2.0V,超过设定的初始值,则表示电机发热,电机停止转动。
6心得体会
本次设计,使我学到了许多书本上无法学到的知识,也使我深刻体会到单片机技术应用领域的广泛。
不仅让我对学过的单片机知识有了很多的巩固,同时也对单片机这一门课程产生更大的兴趣。
在本次设计过程中,我学会了在网络上查找有关设计的个硬件的资源,其中包括:
直流电机PWM调速·AT89C52的脚图的资料等。
此设计系统是以单片机AT89C52芯片为核心部件,实现了电风扇系统控制功能,此次课程在软件上是花费时间最多的,花费大量时间查阅学习代码。
这次设计,使我得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。
使我在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步。
总的感受有以下几方面:
1、通过本次设计,我不但对单片机有了更深的了解,对一个课题如何画流程图,编程序等有了一定的认识。
2、进一步加强了我的动手能力和运用专业知识的奴隶,从学习到如何去思考和解决问题,以及如何灵活地改变方法实现设计方案。
3、让我了解到单片机技术对当今人们生活的重要性。
同时这次设计的经历也使我受益匪浅,让我知道做任何事情都应脚踏实地,刻苦努力地去做,只有这样,才能做好。
参考文献
[1]谢维成.单片机原理与应用及C51程序设计[M].清华大学出版社,2009.7
[2]谢自美.电子线路设计.实验.测试[M].华中科技大学出版社,2002.6
[3]马忠梅等.单片机的C语言应用程序设计[M].北京航空航天大学出版社,2003.11
[4]楼然苗等.单片机课程设计指导[M].北京航空航天大学出版社,2007.7
[5]张永枫.单片机应用实训教程[M].西安电子科技大学出版社,2005.2
附录1系统原理图
附录2系统proteus图
附录3程序清单
#include
#defineuintunsignedint
#defineucharunsigndechar
sbitkey1=P3^0;
sbitkey2=P3^1;
sbitkey3=P3^2;
sbitkey4=P3^3;
sbitkey5=P3^4;
sbitA=P2^6;//电机驱动端口
sbitD=P2^7;
sbitwei1=P2^0;
sbitwei2=P2^3;
sbitwei3=P2^2;
sbitwei4=P2^1;
sbitwxout=P2^5;//温度太高报警灯
sbitclock=P2^4;
sbitstart=P3^5;
sbiteoc=P3^6;//adc0809驱动端口定义
sbitoe=P3^7;
unsignedcharwxin=100;//定义初始值为100,转换成实际电压值为1.95V
unsignedintgetdata,ss;//温度过高标志位
intnum=0,count=0,se=1,flag=1;//定时标志位;电机正反转标志位
intshou_num,di_num,gao_num,le,bai,shi,ge;//电机占空比标志位
voiddisplay();//声明显示函数
voiddelay(uintx);//声明延时函数
voidqudong();//声明电机驱动函数
unsignedchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管
charseg[3]={0};
//延时函数
voiddelay(uintx)
{
uinti;
while(x--)
for(i=122;i>0;i--);
}
//数码管显示函数
voiddisplay()
{
bai=num/100;//百位
shi=num%100/10;//十位
ge=num%10;//个位
seg[0]=bai;
seg[1]=shi;
seg[2]=ge;
wei1=0;
P1=table[shou_num];
delay
(1);
wei1=1;
wei2=0;
P1=table[seg[0]];
delay
(1);
wei2=1;
wei3=0;
P1=table[seg[1]];
delay
(1);
wei3=1;
wei4=0;
P1=table[seg[2]];
delay
(1);
wei4=1;
}
//按键扫描函数
voidscan()
{
if(key1==0)
{
if(key1==0)
display();
le=1;
}
else
{
le=0;A=0;D=0;
}
if(key2==0)
{
if(key2==0)
{
le=2;
display();
}
else
{le=0;A=0;D=0;
}}
if(key3==0)
{
if(key3==0)
{
le=3;
display();
}
else
{
le=0;A=0;D=0;
}}
if(key4==0)//定时键按下
delay(5);
{if(key4==0)
{
TR0=1;
num=num+10;
if(num==1000)
num=990;
while(key4==0)
display();
}}
if(key5==0)//电机正反转按键
{
delay(5);
if(key5==0)
{
flag=!
flag;
while(key5==0)
display();
}}}
//电机驱动函数
voidqudong()
{
inti;
if(ss!
=0)//电机是否发热?
{
if(se!
=0)//定时到了吗?
{if(flag)//是否正转?
{
D=0;
for(i=0;i{A=0;
display();//用显示函数做延时函数,一举两得
}
for(i=0;i{A=1;
display();
}
display();
}
else//电机反转
{A=0;
for(i=0;i{
D=0;
display();
}
for(i=0;i{
D=1;
display();
}}}
else
{
A=0;
D=0;
}}
//按键处理函数
voiddispose()
{
switch(le)
{
case1:
shou_num=1;
gao_num=1;
di_num=3;
break;
case2:
shou_num=2;
gao_num=3;
di_num=1;
break;
case3:
shou_num=3;
gao_num=1;
di_num=5;
break;
default:
break;
}}
//定时器T1中断函数
voidtime1()interrupt3
{
clock=!
clock;//clock信号取反
}
//AD转换函数
voidadc0809()
{
start=0;
start=1;
display();
start=0;
while(eoc==0)//转换成功
oe=1;
getdata=P0;
oe=0;
if(getdata>wxin)//如果转换值大于100则发光二极管灯亮,电机停止
{
wxout=0;
ss=0;
display();
}
else
{
ss=1;
wxout=1;
display();
}}
//主函数
voidmain()
{
TMOD=0x21;//定义T1和T0的工作方式风别为方式2和方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=216;
TL1=216;
EA=1;
ET1=1;
TR1=1;
ET0=1;
A=0;D=0;//刚开机电机不转
wh