笔记本智能散热底座的毕业设计说明.docx
《笔记本智能散热底座的毕业设计说明.docx》由会员分享,可在线阅读,更多相关《笔记本智能散热底座的毕业设计说明.docx(26页珍藏版)》请在冰点文库上搜索。
笔记本智能散热底座的毕业设计说明
笔记本电脑智能散热底座设计
一、摘要
笔记本电脑,便于携带,体积小,而且它的功能满足大多数人的需要,随着科学技术的近步带来的成本下降,笔记本的价格也为大多数人所接受。
随着使用笔记本人数的增加,笔记本的各种问题也暴露出来,除了性价比之外,最关心的莫过于散热。
笔记本在性能与便携性对抗中,散热成为最关键的因素,笔记本散热一直是笔记本核心技术中的瓶颈。
有时笔记本电脑会意外的死机,一般就是系统温度过高导致。
为了解决这个问题,人们设计了散热底座,可以使笔记本产生的热量尽快的扩散到电脑外部,不影响笔记本的使用功能,不会使电脑的线路出现腐蚀现象,保证笔记本电脑的正常工作。
好的底座可以很大的延长笔记本电脑使用寿命。
本设计针对散热问题做了深入的探讨,并设计出一套基于单片机控制的智能散热底座,综合了成本和性能等相关因素,采用了宏晶公司的STC89C52RC为核心搭建了该系统。
在本着成本控制和推向市场的前提下,文中的电路简约而易于批量生产,在完成散热功能和最少成本的前提下达到了节能和智能
关键词:
散热底座;单片机;智能控制
二、笔记本散热底座的设计
2.1、散热底座的材料
当前市场主要产品使用的材料有两种:
金属或者塑料。
金属的导热性好,但现在任何一款笔记本的底部都有防滑胶垫,和金属散热底座不可能紧贴在一起,所以金属的导热性能不能完全发挥出来。
当然,金属底座还是可以更好地将笔记本散发出来热量吸收并扩散出去。
另外金属一般比较重,而且由于制造时工艺要求较高,一旦做工不够精细,极易伤人。
塑料材质一般比较轻便,硬度也较高,很多工程塑料的强度甚至超过金属。
出于成本与轻便的考虑,重量较轻、发热小的笔记本可以选用设计较好的塑料散热底座。
但是如果是重量较大,发热较高的笔记本还是得使用金属材质的做工良好的散热底座。
2.2、散热底座的结构
风扇型的散热底座构造,一般是由金属或者塑料外壳加上置的2--4个风扇构成,风扇的供电方案有通过笔记本USB接口供电以与外置电源供电两种。
大多数笔记本电脑的散热底座的风扇均采用吸风式设计,因为这样可以最大限度的减少空气扰动造成的影响,提高散热效率。
散热底座风扇的数量和布局也非常重要,现在的笔记本后部往往是电池,而一些主要发热部件如:
中央处理器和硬盘等位置相对靠中间,特别是硬盘,大多设计在手托下面,而这些部位很多散热底座往往没有设计风扇。
所以在设计散热底座前,先弄清笔记本底座几个主要部件的位置,确定最热的几个位置。
三、系统方案设计
3.1、系统框架图(如图3-1)
图3-1系统框架图
3.2、各模块方案论证
3.2.1、控制器的选择(STC89C52RC)
STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟机器周期可以任意选择。
主要特性如下:
1.增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051。
2.工作电压:
5.5V~4.5V(5V单片机)/3.8V~2.8V(3.3V单片机)。
3.工作频率围:
0~40MHZ,相当于普通8051的0~80MHZ,实际工作频率可达48MHZ。
4.用户应用程序空间为8K。
5.片上集成512字节RAM。
6.无需专用编程器,无需专用仿真器,可通过串口直接下载用户程序。
7.具有EEPROM功能和看门狗功能。
8.工作温度-40~+80℃(工业级)/0~75℃(商业级)(本系统中使用的单片机如图3-1所示)
图3-1STC89C52RC
3.2.2、温度传感器的选择(DS18B20)
DS18B20是DALLAS公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、搞干扰能力强、易配处理器等优点,特别适用于构成多点温度测控系统,可直接将温度转化成串行数字信号(提供9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片。
它具有3引脚TO-92小体积封装形式,温度测量围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
以上特点使DS18B20非常适用于远距离多点温度检测系统。
引脚定义图如图3-2所示:
图3-2DS18B20引脚定义图
在TO-92和SO-8的封装中引脚有所不同,具体差别请查阅PDF手册,在TO-92封装中引脚分配如下:
1(GND):
地
2(DQ):
单线运用的数据输入输出引脚
3(VDD):
可选的电源引脚
DS18B20工作过程一般遵循以下协议:
初始化——ROM操作命令——存储器操作命令——处理数据
这个命令读取暂存器的容。
读取将从字节0开始,一直进行下去,直到第9(字节8,CRC)字节读完。
如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。
3.2.3、显示模块的选择(LCD1602)
1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形
n1602LCD是指显示的容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
引脚图如图3-3所示:
图3-3LCD1602引脚图
1602采用标准的16脚接口,其中:
第1脚:
VSS为电源地
第2脚:
VDD接5V电源正极
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,可以通过串联一个电阻来调整亮度)。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
第6脚:
E(或EN)端为使能(enable)端。
第7~14脚:
D0~D7为8位双向数据端。
第15~16脚:
空·116脚背光负极。
3.2.4、电机驱动芯片选择(ULN2003)
ULN2003是高电压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。
ULN2003A电路是美国TexasInstruments公司和Sprague公司开发的高电压大电流达林斯顿晶体管阵列电路。
ULN2003部结构图如图3-4所示。
图3-4ULN2003部结构图
本系统中使用的是DIP16封装的,引脚说明如下:
第1~7脚:
输入端
第8脚:
接地
第9脚:
接电源
第10~16脚:
输出端,对应1~7脚的输入
四、电路设计
4.1、系统原理图
图4-1系统原理图
五、程序设计
5.1编程语言简介
C语言是一种计算机程序设计语言。
它既有高级语言的特点,又具有汇编语言的特点。
它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。
因此,它的应用围广泛。
C语言对操作系统和系统使用程序以与需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。
C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。
它是数值计算的高级语言。
其特点为:
1.语言简洁、紧凑、使用方便、灵活。
2.运算符丰富。
3.数据结构丰富,具有现代化语言的各种数据结构。
4.具有现代化的控制语句。
5.语法限制不太严格,程序设计自由度大。
6.能实现汇编语言的大部分功能,可以直接对硬件进行操作。
7.生成目标代码质量高,程序执行效率高。
8.程序可移植性好。
5.2程序流程图
图5-1程序流程图
六、系统调试与测试
6.1调试过程和遇到的问题
系统的调试主要分为硬件调试、软件调试等两大部分。
经过初步的分析设计后,在制作硬件电路的同时,调试也在穿插进行。
这样有利于问题的分析和解决,不会造成问题的积累,而且不会因为一个小问题而进行整体电路的检查,从而可以节约大量的调试时间。
软件编程中,首先完成单元功能模块的调试,然后进行系统调试,整体上与硬件调试的方法差不多。
在调试的过程中遇到了很多的麻烦,电机驱动第一次没有驱动上,因为P1.0没有接上拉电阻,在软件调试时也遇到很多问题,温度读取出错,电机驱动无效,进入死循环等等,但是我没有泄气,在指导老师的建议下,不断的改进,最终完成了这项设计。
七、总结
经过一个寒假的努力和指导老师的意见,终于完成了此次任务,这个设计不仅可以用于散热底座系统,还可以用于小型的USB电风扇,非常的实用,制作成本也很低,可以大批量的生产。
八、参考文献
[1]谭浩强《C程序设计(第三版)》清华大学
[2]贾金玲、娅川《单片机原理与应用》电子科技大学
[3]田立、马鸣鹤《51系列单片机开发实例精解》中国电力
[4]辉、渠丽岩《ProtelDXP电路设计与应用教程》清华大学
[5]阎石《数字电子技术基础》高等教育
附录:
程序
1.DS18B20.h
#ifndef_DS18B20_H_
#define_DS18B20_H_
#defineucharunsignedchar
#defineuintunsignedint
/********IO引脚定义*************************/
sbitDS=P2^3;//定义DS18B20接口
/*************延时子函数*******************/
voiddelayb(uintcount)
{
uinti;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
/*************DS18B20初始化*****************/
voiddsreset(void)
{
uinti;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
/*************读一位************************/
bittmpreadbit(void)
{
uinti;
bitdat;
DS=0;
i++;//小延时一下
DS=1;
i++;i++;
dat=DS;
i=8;
while(i>0)i--;
return(dat);
}
/*************读一个字节*******************/
uchartmpread(void)
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好//一个字节在DAT里
}
return(dat);//将一个字节数据返回
}
/*************写一个字节*******************/
voidtmpwritebyte(uchardat)
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写1部分
{
DS=0;
i++;i++;
DS=1;
i=8;
while(i>0)i--;
}
else
{
DS=0;//写0部分
i=8;
while(i>0)i--;
DS=1;
i++;i++;
}
}
}
/***********发送温度转换命令****************/
voidtmpchange(void)
{
dsreset();//初始化DS18B20
delayb
(1);//延时
tmpwritebyte(0xcc);//跳过序列号命令
tmpwritebyte(0x44);//发送温度转换命令
}
/***********获得温度*************************/
inttmp()
{
inttemp;
uchara,b;
dsreset();
delayb
(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);//发送读取数据命令
a=tmpread();//连续读两个字节数据
b=tmpread();
temp=b;
temp<<=8;
temp=temp|a;//两字节合成一个整型变量。
returntemp;//返回温度值
}
#endif
2.LCD1602.h
#ifndef_lcd1602_H_
#define_lcd1602_H_
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitE=P2^5;//1602使能引脚
sbitRW=P2^6;//1602读写引脚
sbitRS=P2^7;//1602数据/命令选择引脚
/***************延时,延时时间大概5US*****************/
voiddelay_5()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/**********这个是一个读状态函数,读出函数是否处在忙状态*********/
bitBusy(void)
{
bitbusy_flag=0;
RS=0;
RW=1;
E=1;
delay_5();
busy_flag=(bit)(P0&0x80);
E=0;
returnbusy_flag;
}
/***********1602命令函数**************/
voidwcmd(uchardel)
{
while(Busy());
RS=0;
RW=0;
E=0;
delay_5();
P0=del;
delay_5();
E=1;
delay_5();
E=0;
}
/********1602写数据函数*********/
voidwdata(uchardel)
{
while(Busy());
RS=1;
RW=0;
E=0;
delay_5();
P0=del;
delay_5();
E=1;
delay_5();
E=0;
}
/*******************1602初始化***************/
voidL1602_init(void)
{
wcmd(0x38);
wcmd(0x0c);
wcmd(0x06);
wcmd(0x01);
}
/****************改变液晶中某位的值,如果要让第一行,第五个字符显示"b",调用该函数如下L1602_char(1,5,'b')********************/
voidL1602_char(ucharhang,ucharlie,charsign)
{
uchara;
if(hang==1)a=0x80;
if(hang==2)a=0xc0;
a=a+lie-1;
wcmd(a);
wdata(sign);
}
/****************改变液晶中某位的值************/
voidL1602_string(ucharhang,ucharlie,uchar*p)
{
uchara,b=0;
if(hang==1)a=0x80;
if(hang==2)a=0xc0;
a=a+lie-1;
while
(1)
{
wcmd(a++);
b++;
if((*p=='\0')||(b==16))break;
wdata(*p);
p++;
}
}
#endif
3.PWM.C
#include
#include"LCD1602.h"
#include"DS18B20.H"
#defineucharunsignedchar
#defineuintunsignedint
floatwarm=40;//高于此温度报警
floathigh=36;//高温
floatlow=33;//低温
sbitKEY0=P3^2;//手动自动切换
sbitKEY1=P3^5;//调速按键
sbitKEY2=P3^3;//
sbitKEY3=P3^4;//
sbitPWM=P1^0;//直流电机控制端口
ucharCYCLE;//定义周期
PWM_ON;//定义低电平时长
bitchange1;//切换变量
voiddelay(uintdel)//延时del毫秒
{
ucharx,j;
for(x=0;xfor(j=0;j<148;j++);
}
voidtime_init()//定时器0初始化
{
TMOD=0X01;//选用方式
TH0=(65536-1000)/256;//赋高八位定时1ms
TL0=(65536-1000)%256;//低八位
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
}
voidhandmove()
{
floattemp;
intltemp;
time_init();//定时器初始化
PWM=0;
CYCLE=10;
L1602_string(1,1,"temp:
");//第一行第一个字符开始显示
L1602_string(1,9,".");//小数点位置
L1602_string(1,12,"C");//摄氏度的符号C
L1602_string(1,16,"H");//手动标志
L1602_string(2,1,"gear:
");//第二行开始显示的,暂时不用
L1602_string(2,6,"1");
PWM_ON=0;
while
(1)
{
if(change1)
{
break;
}
EA=0;
tmpchange();//温度转换
temp=tmp()*0.0625;//获取温度十进制值
ltemp=10*temp+0.5;//扩大10倍温度值,
L1602_char(1,6,ltemp/1000+48);
ltemp=ltemp%1000;
L1602_char(1,7,ltemp/100+48);
ltemp=ltemp%100;
L1602_char(1,8,ltemp/10+48);
L1602_char(1,10,ltemp%10+48);
wdata(0xdf);//摄氏温度的小圆圈°
EA=1;
time_init1();
if(KEY1==0)
{
delay(10);
if(KEY1==0)
{
PWM_ON=0;
L1602_string(2,6,"1");
}
}
if(KEY2==0)
{
delay(10);
if(KEY2==0)
{
PWM_ON=3;
L1602_string(2,6,"2");
}
}
if(KEY3==0)
{
delay(10);
if(KEY3==0)
{
PWM_ON=5;
L1602_string(2,6,"3");
}
}
if(temp{
L1602_string(2,10,"");
}
if(temp>=warm)
{
L1602_string(2,10,"WARMING");
}
}
}
voidautom()
{
floattemp;
intltemp;
time_init();//定时器初始化
PWM=0;
CYCLE=10;//液晶屏初始化
L1602_string(1,1,"temp:
");//第一行第一个字符开始显示
L1602_string(1,9,".");//小数点位置
L1602_string(1,12,"C");//摄氏度的符号C
L1602_string(1,16,"A");//自动标志
L1602_string(2,1,"gear:
");//第二行开始显示的,暂时不用
while
(1)
{
if(!
change1)
{
break;
}
EA=0;
tmpchange();//温度转换
temp=tmp()*0.0625;//获取温度十进制值
ltemp=10*temp+0.5;//扩大10倍温度值,
L1602_char(1,6,ltemp/1000+48);
ltemp=ltemp%1000;
L1602_char(1,7,ltemp/100+48);
ltemp=ltemp%100;
L1602_char(1,8,ltemp/10+48);
L1602_char(1,10,ltemp%10+48);
wdata(0xdf);//摄氏温度的小圆圈°
EA=1;
time_init1();
if(temp>warm)
{
PWM_ON=0;
L1602_string(2,6,"1");
L1602_string(2,10,"WARMING");
}
if(temp>=high&&temp