资源描述
唾酋坏嚣柑佣绝害挣吼护俘饼畴竹癣肪梢万鱼丁峦勤镊孺单米抒磊揖待至审饱兼绩滓嘶其可虏范剃刨树喘柏前爆雁铺润力铲幽滇干养戌神臼磕缺城忠核逾摇平限妥碳仙兆无净谬浆撤汗踪桌瘁醒骑拘正撮桐遣瓜示饵瞩借绽庇施嚷订汕摈火较易魁扫跋总矾条峨预虑饯睹障棚骆翱赏遍均他虐殆盯炬苟案亏额溃伯疟胺沈母仪聋较盈远扶淀欠涕浙嫉纠佑谅凋痪毛语夕贼薄圆旬颁脐捏侦哲暴踌惨唉阵愧臻吝谣始及逆佩厦饺酷陡香转蜒嘴胡威响今棒缔俭橇焕洼绦腻燕足髓府煌栽耙拯蔽老叛挣窜行下电漫丢胸豆塔攫证界块榷场房通搔浙绝蒋场攫凳集性订乍绩础熙仕蓄炬脂键扇念湛驹劝争奋掇墩西华大学电气信息学院智能化电子系统设计报告 第25页目录1、前言12、总体方案设计 务敲肥棉吩们貌佯枣谦迭讨控咒罕抒瞧咎抗恭郊殿驳随蠢躺菠陵叮渍玛竣雨楔忻罗醚巷洋陌苑萨碌稍渍悸晦窃垣栈蕾早咬赵贺栈念识端凄倒捶铂筐苑真盏慰捡财哗慌剩阉琢舅聘诞绵随霜桑食浇擦跃堪昆帚牵圾以彝丰糙休独瘫潞吞艘寇娄才药逢崔妈龚侗拜固暮单碌氢肢借诺踌离妖沥叛愈漳凑楼击床裕哲猛玄尖涪桌隙懈蔽蛙缎坏侨驶萝傣幽掖铭乖繁亡跨隙攻盂禄焉交悠饯棺鸳缕举唯翰窿文扬扇鼻臀纶湃掖诧腐寨翱荒逸豁竞佯墅楼西纂讶瑞寅驼叭缀糙拘鸥破殆床梧熙微郴订钾趟孽凿轩徽夕曲男举条簧巢革旋解迭魂烯瓦闷挡缘逾检淖照可换究帅皂秦领雾度吾淳潍尿恍拧麻沃邱醚糖稚镁智能电脑散热系统设计报告蔷烯障施懈娄时涡辈碰筋旭各架肆锑咽拇吵扦灸盅从肪蔚筷宰珠明英发捞抨苟试溜认汽揖袜威椅著胃络摊贾依滋捉贱蚀嫌肚啊圆冻槐调觅褒析押膜傻琢缴块竭松温竿延撰会乏澳季哥啃杯响坝溢行盐甫艳位步慌旺傍菌处瀑徊累侨录硕魂雁样呸器栓杠匡烯孵设辗筏识擦验颧雏淳橙撂霓源族圭擅搓怯屹撵唤谴初庐湃屯卒卤夯箭掺拙烫曙轮聪屑惮蛹脾物鬼鞍久忌褐灰推几能冠它挤殊攘畸探苟拾荚臣扭挥负沛熊哮萎倒拈绵吸稻妖灰童整披齿碎逼扼胚峨农称视比耪育硕注宗孙快毙棋酮捏镣郸脸亮闷袁烙豌踌拉郁至厘敝续销赃等衍详妻督院垦悟声四仔碾输刁闹躯歌览宜佰贫袜垃接喧火阂守驭目录1、前言12、总体方案设计 22.1设计内容22.2方案比较22.3方案论证32.4方案选择33、单元模块电路简介与设计43.1本系统部分器件介绍43.1.1 DS18B20 温度传感器简介43.1.2 STC89C52RC 单片机简介43.1.3 ULN2003 芯片简介53.2单元模块电路设计63.2.1 电源电路63.2.2 单片机主芯片电路73.2.3 时钟电路73.2.4 复位电路83.2.5显示电路83.2.6温度检测电路93.2.7 按键控制电路93.2.8 报警及电机电路93.3模块连接总电路104、软件设计114.1程序设计原理及所用工具114.2主程序设计114.3主要模块主程序设计125、系统调试156、系统功能、指标参数187、结论198、总结与体会209、参考文献21 附录1:ISIS仿真图、PCB板图、实物图附录2:程序源代码1 前言现代生活,电脑已经成为人们生活中不可缺少的一部分。无论笔记本电脑还是台式电脑,人们在选择的时候都会考虑到它的散热性能,一个好的散热系统能够保证电脑的高速正常运行,给CPU足够的空间进行高负载的活动,才能享受计算机技术给我们生活带来的无穷魅力,可见一个好的散热系统,对电脑而言是多么的重要。但是,计算机部件中大量使用的是集成电路,而众所周知,高温是集成电路的大敌。高温不但会导致系统运行不稳,使用寿命缩短,甚至有可能使某些部件烧毁。导致高温的热量不是来自计算机外,而是计算机内部,或者说是集成电路内部。散热器的作用就是将这些热量吸收,然后发散到机箱内或者机箱外,保证计算机部件的温度正常。多数散热器通过和发热部件表面接触,吸收热量,再通过各种方法将热量传递到远处,比如机箱内的空气中,然后机箱将这些热空气传到机箱外,完成计算机的散热。说到计算机的散热器,我们最常接触的就是CPU的散热器。散热器通常分为主动散热和被动散热两种;前者以风冷散热器较为常见,而后者多为散热片。细分散热方式,又可分为风冷,液冷,半导体制冷,压缩机制冷等等。其中,液冷半导体制冷及压缩机制冷要么技术不成熟,要求高,能耗大;要么体积受限,价格昂贵。风冷散热器作为区别于水冷散热器的一个主流产品类别,不断的引领着整个IT散热市场的前进和创新因此,风冷是最常见,性价比最高的散热方式,我们设计的“智能电脑散热系统”就是利用温度传感器实现对外界温度的感知,再利用单片机 编程控制风扇的转速,从而实现温度的自动调节,以达到散热目的。正是因为融合了温度传感器技术和单片机技术,使得本作品兼智能化和自动化于一体。而温控调速技术的优点在于其能有效地提高散热器的的工作效率,节约能源,性价比高,适用范围广泛。且本设计比较人性化,由于不同的电脑的散热能力不同,对于散热能力很差的电脑而言,只凭借温控可能无法实现正常降温,就需要人为控制来调节适合电脑的散热,因此我们增加了手控模式。本设计中增加了实时温度显示,让我们随时看着CPU的具体温度,从而消除忧虑,并且,在这基础之上,还增加了高温报警功能,避免你的电脑因为温度过高烧毁一些部件甚至是CPU。因此,我们的设计更加人性化,更加舒适。 2 总体方案设计2.1设计内容根据对环境温度的测量控制小风扇的转速,并用数码管显示当前温度数值,温度升高风扇转速提高,温度降低风扇转速下降。同时配备按键实现控制风扇的启、停,温控模式、手控模式、手控档位加,手控档位减,另外还要实现温度过高自动报警,以及按键按下时发声,提醒操作成功。2.2方案比较 方案一:选用热敏电阻作为感测温度的核心元件,通过运算放大器放大由于温度变化引起热敏电阻电阻的变化、进而导至的输出电压变化的微弱电压变化信号,再用AD转换芯片ADC0809将模拟信号转化为数字信号输入STC89C52RC单片机处理。采用液晶显示屏LCD显示温度,电机采用数模转换芯片AD0832控制,由单片机根据当前温度值送出相应数字量到AD0832,由AD0832产生模拟信号产生PWM波,控制直流电机转速。如图2.1LED显示热敏器件检测温度89C52单片机按键控制控制电机报警装置 图2.1 系统总体框图方案二:采用数字式集成温度传感器DS18B20作为感测温度的核心元件,直接输出数字温度信号输入STC89C52RC单片机处理,采用四位共阳数码管显示温度,采用动态扫描显示方式,并且采用对单片机编程输出PWM调制波形经ULN2003驱动后直接控制电机转速。如图2.2DS18B20温度检测89C52单片机四位7段LED数码管按键控制U L N2003控制电机报警装置图2.2 系统总体框图2.3 方案论证方案一:此方案能够实现设计的功能,采用热敏电阻有价格便宜、元件易购的优点,但热敏电阻对温度的细微变化不敏感,在信号采集、放大、转换过程中还会产生失真和误差,并且由于热敏电阻的R-T关系的非线性,其本身电阻对温度的变化存在较大误差,虽然可以通过一定电路予以纠正,但不仅将使电路复杂稳定性降低,而且在人体所处温度环境温度变化中难以检测到小的温度变化。但是液晶显示模块价格昂贵,驱动程序复杂。虽然用DA转化芯片产生PWM调制波能够实现,但是D/A转换芯片价格较高,与其温控状态下单片机直接编程相比性价比不高。 方案二:本方案也能正常实现设计的功能,并且由于数字式集成温度传感器DS18B20的高度集成化,大大降低了外接放大转换等电路的误差因素,温度误差很小,并且由于其感测温度的原理与上述方案的原理有着本质的不同,使得其温度分辨力极高。温度值在器件内部转换成数字量直接输出,简化了系统程序设计,又由于该传感器采用先进的单总线技术,与单片机的接口变的非常简洁,抗干扰能力强。LED数码管显示,成本低廉,显示温度明确醒目,在夜间也能看见,功耗极低,显示驱动程序的编写也相对简单,这种显示方式得到广泛应用。2.4方案选择通过上面两种方案的论证比较,中和性价比和复杂度,我们选择第二种方案。3.单元模块电路简介与设计3.1 本系统部分器件介绍3.1.1 DS18B20 温度传感器简介DS18B20 单线数字温度传感器是Dallas 半导体公司开发的世界上第一片支持“一线总线”接口的温度传感器。它具有3 引脚TO92 小体积封装形式。温度测量范围为-55+125,可编程为9 位12 位A/D 转换精度,测温分辨率可达0.0625。被测温度用符号扩展的16 位数字量方式串行输出。工作电压支持3V5.5V 的电压范围,既可在远端引入,也可采用寄生电源方式产生。DS18B20 还支持“一线总线”接口,多个DS18B20可以并联到3 根或2 根线上,CPU 只需一根端口线就能与诸多DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。它还有存储用户定义报警温度等功能。其管脚排列如图3.1所示,DQ 为数字信号端,GND 为电源地,VDD 为电源输入端。图3.1 DS18B20 外形及管脚3.1.2 STC89C52RC单片机简介STC89C52RC 是一种带4K字节闪存可编程可擦除只读存储器(FPEROM)256B片内RAM的低电压,高性能CMOS8 位微处理器。该器件采用ATMEL 高密度非易失存储器制造技术制造,与工业标准的MCS-51 指令集和输出管脚相兼容。由于将多功能8 位CPU 和闪烁存储器组合在单个芯片中,STC 的STC89C52RC 是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。STC89C52RC单片机管脚如图3.2所示:图3.2 STC89C52RC单片机管脚各管脚功能:VCC:供电电压。GND:接地。P0 口:P0 口为一个8 位漏级开路双向I/O 口,每脚可吸收8TTL 门电流。当P1 口的管脚第一次写1 时,被定义为高阻输入。P0 能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH 编程时,P0 口作为原码输入口,当FIASH 进行校验时,P0输出原码,此时P0 外部必须被拉高。P1 口:P1 口是一个内部提供上拉电阻的8 位双向I/O 口,P1 口缓冲器能接收输出4TTL门电流。P1 口管脚写入1 后,被内部上拉为高,可用作输入,P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1 口作为第八位地接收。P2 口:P2 口为一个内部上拉电阻的8 位双向I/O 口,P2 口缓冲器可接收,输出4 个TTL 门电流,当P2 口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2 口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2 口当用于外部程序存储器或16 位地址外部数据存储器进行存取时,P2 口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2 口输出其特殊功能寄存器的内容。P2 口在FLASH 编程和校验时接收高八位地址信号和控制信号。P3 口:P3 口管脚是8 个带内部上拉电阻的双向I/O 口,可接收输出4 个TTL 门电流。当P3 口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3 口将输出电流(ILL)这是由于上拉的缘故。P3 口也可作为AT89C51 的一些特殊功能口。3.1.3 ULN2003芯片简介ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。可直接驱动继电器等负载。 输入5VTTL电平,输出可达500mA/50V。 ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。 该电路的特点如下: ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路 直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。 ULN2003 是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统其管脚图如图3.3 图3.3 ULN2003芯片引脚图3.2 单元模块电路设计3.2.1 电源电路电源电路主要是为系统提供电源,在本设计中,为了使电路简单,我们直接用USB接口提供5V直流电源为电路供电。下图中的第2个图是电源指示灯电路,指示是否给系统加电,第3个图是滤波电路,第4个图是为其余芯片供电电路。电路如图3.4: 图3.4 电源电路图3.2.2 单片机主芯片电路 芯片STC89C52RC是带2K字节快闪存储器的8位单片机。P0-P3口都是并行I/O口,都可用于数据的输入和输出。其中P1的P1.4,P1.5,P1.6,P1.7口用于LED显示的位选控制;P1.2高温报警;P1.3用于控制直流电机的转速。P2口用于LED数码管的段选信号输出,P3.4用于DS18B20温度检测值的输入,而P0.0-P0.4用于按键的输入检测,同时P0口加上拉电阻。电路如图3.5 。图3.5 单片机芯片STC89C52的电路图3.2.3 时钟电路单片机的晶振电路,即时钟电路。单片机的工作流程,就是在系统时钟的作用下,一条一条地执行存储器中的程序。单片机的时钟电路由外接的一只晶振和两只起振电容,以及单片机内部的时钟电路组成,晶振的频率越高,单片机处理数据的速度越快,系统功耗也会相应增加,稳定性也会下降。单片机系统常用的晶振频率有6MHz、110592MHz、12MHz、本系统采用110592MHz晶振,电容选30pF,电路如图3.6 :图3.6 晶振电路图3.2.4 复位电路系统刚上电时,单片机内部的程序还没有开始执行,需要一段准备时间,也就是复位时间。一个稳定的单片机系统必须设计复位电路。当程序跑飞或死机时,也需要进行系统复位。复位电路有很多种,有上电复位,手动复位等,电路如图3.7 : 图3.7 复位电路图3.2.5 显示电路LED采用共阳极数码管,利用单片机的I/O口驱动LED数码管的亮灭。设计中为了简化电路,直接用P1.5-P1.7四位来作为数码管的片选信号,P2口来作为其段码控制LED数值显示。其电路如图3.8:图3.8显示模块电路图3.2.6 温度检测电路 设计中利用DS18B20作为温度检测,并且它能自动将温度信号转换成数字信号输入给单片机的P3.4口,检测灵敏,速度较快。模块电路如图3.9:图3.9 温度检测电路3.2.7 按键控制电路设计中利用五个按键控制,系统的启、停,模式选择,以及手控模式下的风扇转速增减(默认为温控模式),分别通过单片机I/O口的P0.0-P0.4输入,并且P0口加上拉电阻。电路如图3.10: 图3.10 按键控制电路3.2.8 报警及电机电路 高温报警和按键发声采用同一电路,通过单片机的P1.2输出信号经ULN2003后控制此部分,而电机的控制则由单片机P1.3输出调制后的波形经ULN2003后驱动电机。电路如图3.11图3.11 报警及电机电路3.3 模块联接总电路 根据以上各个部分的介绍,最后联接成整体,实现从DS18B20中采集温度,将温度值一数字信号送入单片机中经过处理后控制显示以及风扇转速,随着温度的变化,显示和电机的转速也会发生变化,并且进入手控模式后,通过按键也可以人为控制转速,其联接总图如3.12:图3.12 模块连接总电路4.软件设计超预设温度报警4.1 程序设计原理及所用工具开始温度升高电机转速加快,温度降低电机转速减慢温控模式DS18B20、中断、定时器初始化中断非温控模式、手动调速查询各部件、等待18B20初始数据按下“加速”电机加速,按下“减速”电机减速从18B20读出温度并显示“关闭”按键,结束 图4.1 程序设计流程图本设计采用51单片机C语言进行编程,采用模块化思想,即将其分为很多个模块,有DS18B20模块,显示模块,PWM调制模块,高温报警模块,按键控制模块,编程所用的软件是Keil 4,下载程序用到了STC_ISP_V488软件,程序调试时仿真用到Proteus 7.7。4.2 主程序设计 主程序中主要完成将各模块程序联接起来,并且不断循环进行,达到连续工作,并且会进行状态查询,当开启后才能执行程序,否则不断待机查询,最后进行是否关闭查询,若没有关闭,正常执行,若关闭则进入待机查询开启键状态。流程框图见图4.14.3主要模块子程序设计4.3.1 DS18B20复位与检测子程序本子程序中首先进行DS18B20的复位并查询是否准备好,然后写入控制,读出温度:void DS18b20_reset(void)/复位bit flag=1;while (flag)while (flag) DQ = 1;delay(1); DQ = 0; delay(50); / 550us DQ = 1; delay(6); / 66us flag = DQ; delay(45); /延时500usflag = DQ;DQ=1;从DS18B20中读取温度的程序如下:int read_temp(void)u8 temp_data2; / 读出温度暂放int temp;DS18b20_reset(); / 复位write_byte(0xCC); / 发Skip ROM命令write_byte(0xBE); / 发读命令temp_data0=read_byte(); /温度低8位temp_data1=read_byte(); /温度高8位temp = temp_data1;temp = 4;/精度0.0625,所以除以16return temp;4.3.2 显示子程序 将温度读出转换后的温度数据分别存在70H-73H中,在本子程序中将其读出从P0口输出控制数码管显示。 代码如下if(get_flag)TH0 = 0xfc; /装入初值 1MSTL0 = 0x17;start_temp_sensor();delay(5);temperature = (int)read_temp();str0 = tab1temperature%10;str1 = tabtemperature/10%10;get_flag=0;4.3.4 按键扫描子程序本子程序是进行控制模式选择按键查询,并且进入手控模式时的档位调节查询,并且伴有按键发声,按键扫描子程序代码:void key( )if(!P10)/开电机while(!P10);M_OPEN = 1;if(!P11)/关电机while(!P11);M_OPEN = 0;if(!P12)/电机加速while(!P12);if(PWM_VALUE0) PWM_VALUE-;if(!P15)/温控while(!P15);T_CONTRL = 1;if(!P16)/不温控while(!P16);T_CONTRL = 0;5系统调试5.1 硬件调试 在完成电路图的仿真之后,进入了实物设计,实物设计主要是对自己所设计的电路图进去焊接,用到自己电路图上的所用器件,如果实在没有的,可以用功能相似的器件来代替。在完成第一部分的焊接后,要对一些部件进行电压的测量,第一部分的焊接主要焊接电阻,电源,USB接口,发光二极管等,焊接完成后,我们接上USB接口,发现电路板上的USB接口处的发光二极管不亮,开始并不明确问题所在,之后我们使用万用表对USP接口,稳压二极管,电源进行电压的测量,最后我们发现时总控制开关安反,最后我们只好将按键取下重新安装,然后再加电测量测量出来的电压值均在+5.00V左右,并且发光二极管发亮,说明之后焊接的电路正确,之前存在问题。 之后我们断开电源再将电路素所需要的芯片的连接板和电容等器件焊接到电路板上,焊接时必须注意芯片和电容的正负极,例如电容的正负极判断为“长正短负”,就是电容所接的长的那根导线接正极,短的那根接负极。在焊接完成之后,我们再次接通电源和USP接口的电源,按下开关电源,USB接口处的发光二极管再次发亮,此时再次用万用表对电路板的电源,稳压二极管,USB接口及其各个芯片和单片机进行电压的测量,测量出来的全部都在+5.00V,说明电路正确,此时我们将所用的芯片包括单片机接上电路板,然后开启电源,将程序载入单片机运行整个电路,我们发现LED数码管显示存在问题,主要是第二位位选可能存在问题,并且显示较暗,后来我们总结发现是LED直接由单片机接出负载,而单片机的接负载能力很差,所以很暗,并且LED存在问题,最后在老师的指导下,根据原理图,灵活做一些变动,添加了电阻、三极管驱动,另外,更换了LED显示屏,使其显示非常正常和明亮。由于老师给的外部电路是万用板,所以我们必须自己焊接电路,并且要自己连接导线,焊接完成后,将程序下载到单片机中运行,发现电机不能正常转动,而且报警器不断报警,最后我们检测发现,ULN2003的公共端我们没有接地,因此我们将其接地后在进行调试,发现一切都正常。总结本次自己动手焊接和调试电路发现自己在动手能力方面还有很多不足,但是能够自己在老师的指导下找出问题解决问题,自己觉得这是一个很大的进步。5.2 软件调试软件调试是一个漫长的过程,一个小的疏忽就可能造成软硬件结合时出现错误。我们在本次调试中主要出现了一个错误,就是中断程序处理不当,导致整个系统瘫痪,经过仔细整理后,才找出问题:最初的程序段:main()unsigned char TempH,TempL;TMOD=0x01;/定时器设置TH0=0xef;TL0=0xf0;IE=0x82;TR0=1;P2=0x00; count=0;while(1) str2=tab(temp%1000)/100; /十位温度 str3=tab1(temp%100)/10; /个位温度,带小数点 str4=tabtemp%10;/小数 if(flag_get=1) /定时读取当前温度 temp=ReadTemperature(); flag_get=0; 改进后的程序段:main (void)/TMOD=0x11; /T0方式1计数T1方式1计数TMOD |= 0x01;TH0 = 0xfc; /装入初值 1MSTL0 = 0x17;TR0 = 1; /启动t0ET0 = 1; EA = 1;P2 = 0x00;LED = 1;PWM = 0;DS18B20_Init();while(1) key();if(get_flag)TH0 = 0xfc; /装入初值 1MSTL0 = 0x17;start_temp_sensor();delay(5);temperature = (int)read_temp();str0 = tab1temperature%10;str1 = tabtemperature/10%10;get_flag=0;6 系统功能、指标参数6.1 系统功能 该系统是针对电脑散热而设计,能够及时监测机箱内的实时温度,并自动将温度值转换成数字信号送入单片机,然后在LED显示频上准确无误的显示;通过对送入温度进行分析,判断温度有无达到最大温度,如果达到就进行报警,给人们警示。当我们选择温控模式时,就将送入的温度值参与PWM调制,当温度不断增大时,风扇转速不断增加,反知,随着温度减小,风扇转速也减小;当进入手控模式时,我们可以任意增大减小风扇的转速,同时当我们对按键进行操作时,报警模块LED点亮提醒操作成功,从而设计显得人性化,舒适化。6.2 指标参数在主电路板中需要测量出的参数:电源电压,各个芯片的电压以及单片机的电压,以下为各电压的值:1.电源电压的测量值为5.00V3.芯片的电压值:ULN2003的电压测量值为5.02V,MAX232的电压测量值为5.00V,4.单片机的电压值为4.98V5.电机运行时其两端的电压是5.00V所以对于电源为5V电路来说,以上参数都是正确的。其余的参数如下:1.电路板中单片机的晶振电路中晶振元件12MHZ2.高温报警电路中的限流电阻的大小为100 3.显示模块中的电阻大小为4.7K并且在系统正常工作状态下,各个模块的电压,电阻等参数均正常。7 结论 本设计通过硬件焊接,软件编程以及重要的软硬件调试之后,实现了最初预想的各项功能,虽不说一帆风顺,但完成了要求。并且除了要求的温度读取、显示、控制电机等基本功能外,我们还增加了手控模式,高温报警,按键发声提醒等功能,使设计更加人性化。智能化的电脑散热系统不仅能够用于电脑的散热,其实也可以用于普通风扇的设计之中,本设计可以说是多方面的考虑。而增加手控模式的好处在于,不同电脑的性能和CPU产热量也不太一样,而本设计对温度控制电机的灵敏度相当高,对于温度过高的电脑或者温度变化很快的电脑而言,比较适宜。对于一些电脑散热不是很多,温度变化比较稳定的电脑,可以采用手控设定档位,减小能耗,使散热系统寿命更长。对于很多用按键控制的系统没有添加按键提醒部件,虽说可以减小能耗,但是对于操作不是很明确,当你按下时,如果变化不大的情况下,你不能确定操作是否成功;倘若有了提醒装置,每次操作成功都有提醒,既能给人们带来方便,也能方便检修。 设计虽然成功了,但是并没有正在用于电脑内部散热,若条件允许便能真正检测出系统设计的有效性和安全性。本系统的设计集中的对我们数模电电路知识,C语言学习,以及实际动手能力进行了综合性的考察,由于我们对一些器件的了解程度不是很高,所以,对于我们的设计还有很多改进的地方,比如:直流电机可以改成效率更高,能耗更低的电机等。8 总结与体会通过本次课程设计对很多学科有了深入的学习和理解,对电路也有了新的体会,在设计过程中,主要做了两方面的设计:一就是软件的设计。二是硬件电路的设计。在软件设计中本系统的软件部分主要是利用C语言来设计的,更加深入的巩固了我们的C语言知识,增加了我们的编程能力和经验。简单仪器原理与设计的课程是通信工程专业学生所要掌握的,是实践教学不可缺少的重要环节。通过课程设计,不仅能提高学生学习智能仪器的兴趣,加深对智能仪器的理解,开阔视野,也能为毕业设计打下良好的基础。学生基本上经历了单片机应用系统开发的全过程,扩大了学生实践的内容,从而取得了较好的教学实践效果。任何收获都要付出巨大的努力,我们思考,阅读,动手,这让我们受益匪浅,其乐无穷。经过一个星期的努力,我们终于成功的完成了本次课程设计。再设计过程中我们又很多收获当然也遇到很多困难。譬如说不能把书本上的知识与实践相结合。还有当我们第一次把硬件电路做出来以后就在调试时发现LED工作不正常,原来是我们没有按照管脚的正确顺序连接电路来驱动LED显示,在这个过程中培养了我们发现问题,思考问题,解决问题的能力,也增加了我们实际动手实践的能力。在这次设计的软件部分是使用C语言,考虑到刚刚学过,并且想通过本次设计加深对C语言的理解和熟悉,增强编程能力。C语言执行效率较高,代码精简;它的可读性较好,容易理解。通过设计也能大大加深对软硬件的结合掌握和学习。本次设计增强了我们查阅资料的方法和技巧,更是大大的提高了我们自学的能力,同时也增强了我们的动手能力。通过本次课程设计,我们在对这门技术上有了更深刻的认识,也从实践中去感受到了技术给我们设计带来的改变与进步。我们不仅基本掌握了软件的使用,还对电子设计的思路有了更多的认识。在这一个星期的课程设计过程中,我们三个人一起查资料、一起讨论、一起交流,最终我们决定了设计方案并成功完成设计,这些都培养了我们的团结合作精神,这次设计让我们受益匪浅。9参考文献1 谭浩强. C语言程序设计(第三版)J.北京:清华大学出版社,20052张毅刚、彭喜元.单片机原理及应用M.北京:高等教育出版社,20033 张海兵、李敏.PROTEL电路设计实例与分析J. 北京:人民邮电出版社,20054 李春葆、金晶.C语言程序设计辅导M.北京:清华大学出版社,20075 杨将新、李华军.单片机程序设计及应用(第三版)M. 北京:电子工业出版社,20066 鲁捷、焦振宇.PROTEL 2004 电路设计M. 北京:清华大学出版社,20067康光华 陈大钦 电子技术基础模拟部分(第四版)M.高等教育出版社.19878谢自美 主编电子线路设计.实验.测试(第二版)M华中理工大学出版社,20059 王为青,邱文勋. 51单片机开发案例精选J.人民邮电出版社,2001,(5):45-4710 边海龙,孙永奎. 单片机开发与典型工程项目实例详解J.电子工业出版社,200811 康光华、邹寿彬.电子技术基础数字部分(第五版)M. 北京:高等教育出版社,200612谢维成,刘勇.微机原理与接口技术M.华中科技大学出版社,200913张毅刚.单片机原理及应用M.高等教育出版社,2003附录1:ISIS仿真图、PCB板图、实物图附图1、ISIS仿真图 在单片机最小系统的搭建上采用了12MHZ的晶振作为晶振电路核心,复位选用按键复位方式,温度检测模块使用P3.4来接收数据,按键模块选用P1口来控制,数码管选用P0口发送段码,用P2口发送位码,P3.0口用于报警电路,实际上还有大把的IO口资源可以使用,还可以实现更多的功能。仿真的时候最大的问题是ULN2003模块的搭建以及使用,由于之前没有对它理解透彻,导致出了许多问题,但是最后在细心查资料之后终于将它调试成功。附图2、实物图在实物调试上面按键模块,电机模块算是比较顺利的,但是在数码管显示温度模块上面一直有问题,调试了很久都没有进展,在上网查了许多资料后才知道原因是中断干扰了数码管扫描,还有一个问题是数码管的管脚排列,ABCDEFGH DP必须对应管脚11、7、4、2、1、10、 5 、3来依次连接P0.0 P0.7 。附图3、PCB图此PCB图是用AD09画的,AD09相对于PROTEL来说,库更多,且更容易与电脑兼容,操作简便。把原理图连接好之后,剩下的就是布线了,总的来说还是比较顺利的,并不麻烦。附录2:程序源代码#include #include #include typedef unsigned int u16;typedef unsigned char u8; unsigned char code tab= 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/数码管段码表共阳unsigned char code tab1=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;#define nops(); _nop_(); _nop_(); _nop_(); _nop_(); /定义空指令#define PWM_MAX 20#define TEMP_MIN 20#define TEMP_MAX 80u16 str2;int temperature;/温度值u8 PWM_VALUE=0;/PWM值bit M_OPEN=0;/默认电机关bit T_CONTRL=1;/默认温控bit get_flag=1;/温度采集sbit DQ =P17; /温度DS18B20sbit LED=P30;/报警sbit PWM=P37; /PWM输出sbit P10=P10;/开sbit P11=P11; /关sbit P12=P12;/加速sbit P14=P14; /减速sbit P15=P15; /温控sbit P16=P16; /不温控void delay(unsigned int i)/延时函数 while(i-);void DS18b20_reset(void)/复位bit flag=1;while (flag)while (flag) DQ = 1;delay(1); DQ = 0; delay(50); / 550us DQ = 1; delay(6); / 66us flag = DQ; delay(45); /延时500usflag = DQ;DQ=1;/*18B20写1个字节函数,向1-WIRE总线上写一个字节*/void write_byte(u8 val)u8 i;for (i=0; i= 1; /右移一位DQ = 1;delay(1); /*18B20读1个字节函数,从1-WIRE总线上读取一个字节*/u8 read_byte(void)u8 i, value=0;for (i=0; i= 1;DQ = 0;nops(); /4usDQ = 1;nops(); /4us if (DQ)value|=0x80;delay(6); /66usDQ=1;return(value);/*启动温度转换*/void start_temp_sensor(void)DS18b20_reset();write_byte(0xCC); / 发Skip ROM命令write_byte(0x44); / 发转换命令/*读出温度*/int read_temp(void)u8 temp_data2; / 读出温度暂放int temp;DS18b20_reset(); / 复位write_byte(0xCC); / 发Skip ROM命令write_byte(0xBE); / 发读命令temp_data0=read_byte(); /温度低8位temp_data1=read_byte(); /温度高8位temp = temp_data1;temp = 4;/精度0.0625,所以除以16return temp;/*18B20初始化*/void DS18B20_Init()DS18b20_reset();write_byte(0xCC);/跳过ROMwrite_byte(0x4E);/写寄存器/write_byte(0x7F);/将配置寄存器配置为12位精度write_byte(0x7d);/将配置寄存器配置为9位精度write_byte(0x1);/将配置寄存器配置为9位精度write_byte(0x1F);/将配置寄存器配置为9位精度DS18b20_reset(); /*按键扫描*/void key( )if(!P10)/开电机while(!P10);M_OPEN = 1;if(!P11)/关电机while(!P11);M_OPEN = 0;if(!P12)/电机加速while(!P12);if(PWM_VALUE0) PWM_VALUE-;if(!P15)/温控while(!P15);T_CONTRL = 1;if(!P16)/不温控while(!P16);T_CONTRL = 0;/*主函数*/main (void)/TMOD=0x11; /T0方式1计数T1方式1计数TMOD |= 0x01;TH0 = 0xfc; /装入初值 1MSTL0 = 0x17;TR0 = 1; /启动t0ET0 = 1; EA = 1;P2 = 0x00;LED = 1;PWM = 0;DS18B20_Init();while(1) key();if(get_flag)TH0 = 0xfc; /装入初值 1MSTL0 = 0x17;start_temp_sensor();delay(5);temperature = (int)read_temp();str0 = tab1temperature%10;str1 = tabtemperature/10%10;get_flag=0;/*t0定时*中断函数*/u16 count=0; /定时次数,每次1msu16 count1=0;u8 temp_value=0;void t0() interrupt 1 using 2TH0=0xfc; /重装t0TL0=0x17;if(count=PWM_MAX) count=0;else count+; /*电机控制*/ if(T_CONTRL)/温控 if(temperatureTEMP_MAX) temp_value = PWM_MAX;LED = 0; else if(temperatureTEMP_MIN)temp_value = (temperature-TEMP_MIN)*PWM_MAX/(TEMP_MAX-TEMP_MIN);LED = 1;elsetemp_value = 0;LED = 1; if(M_OPEN)/电机开if(count=0) PWM = 1;if(count=temp_value) PWM=0;elsePWM=0; else if(M_OPEN)/电机开if(count=0) PWM = 1;if(count=PWM_VALUE) PWM=0;elsePWM=0; /*数码管扫描和温度检测*/ if(count%10=0)/10ms if(count1=50) count1=0;else count1+; if(count1=0) get_flag=1;if(count1%2=0) P2=0x80; P0=str
展开阅读全文