因此,输出电阻的大小反映了放大电路带负载能力的大小。
3.3STC89C51单片机
由于单片机技术在各个领域正得到越来越广泛的应用,许多国家的集成电路的生产厂家也都相继推出各种类型的单片机,在众多单片机中,MCS系列单片机就其指令和运行速度而言,比以往的功能强大了很多,性能、技术、可靠性和性能价都十分的优秀,其中,C51系列单片机的优点是价钱便宜、I/O口多、程序空间大。
因此测控系统中,使用51系列单片机是最理想的选择,本设计就选择采用STC89C51。
TC89C51是一种低功耗、高性能CMOS8位微控制器,具有8K可编程Flash存储器。
使用高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在线可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
STC89C51具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,STC89C521可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM和定时器及串口和中断时继续工作。
这一模块以单片机为中心把程序代码烧进去然后外围接上复位电路、振荡电路、键盘控制、LED显示电路、报警电路等子模块。
下面对STC89C51各引脚的功能进行较为详细的介绍:
(1)电源引脚Vcc和Vss。
Vcc(40脚):
电源端为+5V。
Vss(20脚):
接地端。
(2)时钟电路引脚XTAL1和XTAL2。
XTAL2:
接芯片外部晶体引线端。
当使用芯片内部时钟时,这两个引线端接石英晶体和电容。
XTAL1:
接电容的一个端口。
在芯片内,它是振荡电路的反向放大器输入端。
当使用外部时钟时,用于接地。
(3)控制信号脚RSTALEPSEN和EA。
RST脚:
复位信号,只有高电平时才有效。
在此输入端保持两个机器周期(24个时钟振荡周期)的高电平时,就可以完成复位操作。
ALE/PROG(30引脚):
地址锁存允许信号端。
当STC89C51上电正常工作后,ALE引脚不断向外输出正脉冲信号。
此频率为振荡器频率fosc的1/6,可以做外部时钟或者外不定时脉冲信号。
在CPU访问片外数据存储时,每取值一次(一个机器周期)会丢失一个脉冲。
PSEN(29脚);外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期2次PSEN有效,但在访问外部数据存储器时,这2次有效的PSEN信号将不出现。
表3.3P3口的第二功能表
引脚
第二功能
P3.0
RXD(输入口)
P3.1
TXD(输出口)
P3.2
INT0(外部中断0)
P3.3
INT1(外部中断1)
P3.4
T0(定时器0外部中断)
P3.5
T1(定时器1外部中断)
P3.6
WR(存储器写选通)
P3.7
RD(存储器读写通)
EA/VPP(31脚):
当EA保持低电平时,外部程序存储器地址为(0000H-FFFFH)不管是否有内部程序存储器。
FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
对于无芯片内的ROM的8031或8032,须外扩ERROM,此时必须将EA的引脚接地。
如果使用有片内ROM的STC89C51,外扩ERROM也是可以的,但也要使EA接地。
(4)I/O(输入/输出端口,P0,P1,P2,P3)
P0口:
P0口是一个漏极开路的8位准双向I/O端口。
P1口:
8位准双向I/O端口。
P2口:
即可以做地址总线输出地址高8位,也可以做普通I/O用,(此时为准双向口)。
P3口:
双功能口,即可以做普通I/O口用(此时为准向口,也可以按每位定义实现第二功能操作)。
3.3.1单片机最小系统
要使单片机工作起来最基本的电路构成为单片机最小系统如图3.1示。
图3.1单片机最小系统
单片机最小系统包括单片机、复位电路、时钟电路构成。
单片机内部具有一个高增益反相放大器,用于构成振荡器。
通常在引脚XTALl和XTAL2跨接石英晶体和两个补偿电容构成自激振荡器,可以根据情况选择6MHz、8MHz或12MHz等频率的石英晶体,补偿电容通常选择20.30pF左右的瓷片电容。
单片机小系统采用上电自动复位和手动按键复位两种方式实现系统的复位操作。
上电复位要求接通电源后,自动实现复位操作。
手动复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位。
上电自动复位通过电容C3充电来实现。
手动按键复位是通过按键将电阻R2与VCC接通来实现。
系统利用P1口的P1.0.P1.3设置了4个独立按键S2~S5,当键按下时,P1口相应的引脚置为低电平,且与此键相连的发光二极管点亮。
时钟电路是单片机的内脏,它掌握着单片机工作节奏,时钟电路相当于振荡电路。
XTAL1和XTAL2分别为反向放大器的输入和输出,该反向放大器可以配置为片内振荡器。
如采用外部时钟源驱动器件,XTAL2应不接。
因为一个机器周期含有6个状态周期,而每个状态周期为2个振荡周期,所以一个机器周期共有12个振荡周期,如果外接石英晶体振荡器的振荡频率为12MHZ,一个振荡周期为1/12us。
本系统采用STC系统列单片机,相比其他系列单片机具有很多优点。
一般STC单片机资源比其他单片机要多,而且执行速度快;STC系列单片机使用串口对单片机进行烧写,下载程序较为方便;STC89C51单片机内部集成了看门狗电路;且具有很强抗干扰能力。
本系统采用内部方式的时钟电路和加电自复位的复位电路,如下图4.2所示:
图3.2复位、时钟电路图
由于单片机P0口内部不含上拉电阻,为高阻态,不能正常地输出高/低电平,因而该组I/O口在使用时必须外接上拉电阻。
3.4显示电路
图3.3数码管显示
显示采用4位共阳数码管,单片机控制数码管显示不同的四位数字,该模块主的任务就是利用数码管完成二氧化碳浓度的显示。
3.5风扇控制模块
风扇控制电路该电路采用双向晶闸管作为交流开关驱动交流电机,并采用光隔离晶闸管驱动器MOC3063实现交流220V单片机引脚之间电气隔离。
与继电器相比,该电路没有触点,使用寿命更长。
图3.4风扇控制电路图
4系统软件设计
4.1系统程序设计
系统的软件主要是采用C语言,对单片机编程实现各项功能。
其流程图如图4.1所示。
开始
Y
N
图4.1系统程序流程图
5总结
室内空气质量控制系统的设计主要分为硬件设计和软件设计。
根据设计前对该系统所要实现功能的要求,综合考虑采用AT89C51单片机为控制核心。
由于所学知识的限制,本系统实现的功能不是很健全,但在设计该系统的过程中,让我学会了系统设计的方法,和养成了系统思考的思维方式。
首先要了解系统所要实现的功能;其次根据功能去选择相应的硬件资源;再次将一个大的系统进行模块化划分,然后逐一去攻破。
最后把所有模块进行优化整合,便得到了一个完整的系统。
基于这样的思路,我完成了室内空气质量控制系统的基本设计。
系统的控制具有运行可靠、功能齐全、投资低等特点。
同时,利用单片自身的数据处理功能使整个控制系统的结构线路更为简单、控制更为方便、系统更易于维护。
在系统中,我们利用光电传感器对信号进行检测,并将经过信号处理模块单元处理后的信号送入单片机P1^0端进行单位时间内的计数。
再由单片机根据所检测的信号数量与二氧化碳比值关系进行数据处理和数据显示。
从而实现工作是否正常运行做出了一定的监测。
为系统能够安全、正常运行提供了基础。
本次设计当然还存在一些或多或少的问题,特别是与传感器的实际工作情况还有一定的差距还有很多现实性的干扰没能考虑进去。
由于时间有限,所设计的东西只能在理想状态下正常工作,这是我下来之后所要对自己设计的东西进行改进的地方。
6致谢
在本次课程设计过程中,郭老师对该设计的构思到最后定稿的各个环节给予细心指引与教导,使我和我的同伴最终得以顺利完成本次课程设计。
在此我致上诚挚的谢意。
在设计过程中所涉猎的各种软件(如visio、protel、protuse、keil)也使我的知识构架更为丰富。
同时,通过这次做课程设计我也及时发现自己知识点上的漏洞,真正起到了查漏补缺的效果。
这次课程设计能够顺利完成,我也非常感谢在我身边默默帮助与支持的朋友。
因为从他们身上我不仅学得了很多实用的专业知识,同时也学到了团队合作精神的重要性获得了更为坚实的友谊,学会了从不同的角度去思考和看待问题。
在学习中,郭老师严谨的治学态度、丰富渊博的知识、敏锐的学术思维、精益求精的工作态度以及侮人不倦的师者风范是我终生学习的楷模,导师的高深精湛的造诣与严谨求实的治学精神,将永远激励着我。
在此,感谢郭老师的支持和帮助,致以衷心的感谢和崇高的敬意。
7参考文献
[1]徐科军主编.传感器与检测技术.北京:
电子工业出版社,2008
[2]谭浩强主编.C程序设计(第三版).北京:
清华大学出版社,2005
[3]谢自美主编.电子线路设计·实验·测试.武汉:
华中科技大学出版社,2006.8
[4]张毅刚主编.单片机原理及应用.北京:
高等教育出版社.2009
[5]康华光主编.电子技术基础模拟部分.北京:
高等教育出版社,2006
[6]袁鹏平主编.Protel99电路设计实用教程.北京:
化学工业出版社.2006.10
[7]杨天怡主编.微机计算机控制技术.重庆:
重庆大学出版社
[8]刘靖编.单片机控制技术.北京:
北京理工大学出版社.2008.06
附录一:
相关程序
#include//调用外函数//
#include
#include
#include
#include#include
#include/**********初始化CPU************/
voidinit_cpu()//初始化cPu
{EA=1;
TR0=1;
TR1=1;
TMOD=0x11;
TH1=0x3c;
TL1=0xb0;
}
/*voidtime1(void)interrupt3using1
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
keyval=P1;
}*//初始化CPU结束//
voidmain_menu_initial()//LCD主菜单初始化.//
{
main1_menu[0].menu_count=4;//有4个菜单项.//main1_menu[0].display=measurearray;//定义一个”开始测量“数组//
main1_menu[0].subs=NULL;main1_menu[0].children_menus=measure_menu;//当前菜单子菜单的指针main1_menu[0].parent_menus=NULL;„„//还有“数据存储”、“时间设置”„„//
}
voidmeasure_menu_initial()//“开始测量”菜单设置//{
measure_menu[0].menu_count=2;
measure_menu[0].display=qr;//开始测量函数,确认.measure_menu[0].subs=start_measure_function;//开始测量函数measure_menu[0].children_menus=NULL;measure_menu[0].parent_menus=main1_menu;measure_menu[1].menu_count=2;
measure_menu[1].display=qx;//开始测量函数,取消.measure_menu[1].subs=NULL;
measure_menu[1].children_menus=NULL;measure_menu[1].parent_menus=main1_menu;
}
„„//还有voidstore_menu_initial()、voidtime_menu_initial()//voidled_menu_pro(){
max_item=menu_led->menu_count;
switch(keyval)
{
case0:
break;
case1:
//向上键.
if(user_choosen==0)
{
user_choosen=max_item;
}
shuaxin=1;
user_choosen--;
break;
}
„„//“向上”“向下”“确认”“取消”键//
if(shuaxin)//是否需要刷新LCD标志位.
{Clr_Scr();
shuaxin=0;
}
led_menu_show();
}
voidled_menu_show()
{
ucharn;
max_item=menu_led->menu_count;
if(max_item>=4)//菜单项为3则表示为主菜单.
{
for(n=0;n<4;n++)
{draw_bmp(n*2,20,96,0,menu_led[n].display);
}
select_item(user_choosen);//标记出当前菜单项.
}
else
{
switch(temp_choosen)
{case0:
draw_bmp(0,20,96,0,measurearray);//“开始测量”数组//
break;
„„
default:
break;
}
for(n=0;n{
draw_bmp((n+1)*2,20,32,0,menu_led[n].display);
}
select_item(user_choosen+1);}}
voidselect_item(ucharn)
{
draw_bmp(n*2,2,16,0,curflag);
}
voidstart_measure_function(void)//开始测量函数//{main