智能散热系统.docx
《智能散热系统.docx》由会员分享,可在线阅读,更多相关《智能散热系统.docx(33页珍藏版)》请在冰豆网上搜索。
智能散热系统
《单片机原理及接口》
课程设计报告
题目:
智能散热系统
专业名称:
通信工程
班级:
创新142
学号:
201411403128
姓名:
刘小杰
2015年12月
课程设计报告首页
院、系(部)
信息工程学院
专业
通信工程
班级
创新142
学号
201411403128
姓名
刘小杰
任课教师
陈玮
课程名称
单片机原理及接口
成绩
评
语
签字:
年月日
复
核
人
意
见
签字:
年月日
课程设计报告的要求:
首先应先介绍课程设计的基本内容(包括设计目标)、设计的背景及意义。
其次是方案论证:
说明设计的原理并进行方案选择,再然后进行硬件电路的设计及原理说明,和软件的流程说明。
第三是过程(设计或实验)论述:
对设计调试工作的详细表述。
最后是结论或总结:
对整个研究工作进行归纳和综合、包括心得体会。
大致内容按上面要求來写,也可以参考网上“单片机课程设计报告”来扩充。
文章中的格式规定:
图:
图的名称采用中文,图名在图片下面格式为:
图1-1,后接图名。
表格:
表名在表格上面。
正文五号字
一级标题四号加粗
二级标题小四加粗
行距:
1.5倍
附录的程序:
两列
页边距:
上下2.5厘米左右2.8厘米
不要目录
需要中文摘要排版参考毕业设计论文格式(见下页)
参考文献若有可写
打印的报告里面不需要附录程序电子版里面需要
报告里面应该有各模块电路图调试现象图
刻盘要求:
最后,除了打印的,全班把每个人的程序(keil项目及hex文件)、电路(proteus文件或硬件的照片及电路原理图)和报告打包压缩后命名为“班级名-学号-姓名”(如电信091-123456-陈玮)刻盘。
散热系统
刘小杰
信息工程学院
摘要:
由于单片机体积小、成本低、使用方便,所以被广泛地应用于仪器仪表、现场数据的采集和控制。
通过本次课程设计掌握单片机硬件和软件方面的知识,更深入的了解单片机的实际应用。
关键词:
单片机,程序,DS18B20温度传感器,LCD1602液晶显示屏,定时器,直流电机等等
1课程设计的基本内容
为实现系统能釆集当前环境温度,当温度达到一定值时触发直流风扇的转动进行主动散热,并且随着温度的变化而改变风力人小,风力与温度成正比,本系统设置了三个档来控制风力的大小,20C°—22C0为一档,22C°--24C°为二档,24C°—26C0为三档(为了演示方便而设计的三档,在实际用途中可依据要求来设置)。
本智能散热系统根据坏境温度智能调控风力的功能可以放置在一些硬件中以达到降温的功能。
2方案论证
2.1设计原理及方案选择
通过DS18B20温度传感器来采集当前坏境的温度,通过LCD1602液晶显示屏来显示温度以及工作时间,CPU根据当前温度来控制电机的速度。
2.2硬件电路设计及原理说明
使用Pl.1I1来连接电机,P0口连接LCD1602,P2.5II为读/写选择端,P2.6为命令/数据选择端,P2.7为使能端,P3.7I1为数据总线,P3.4II为定时器0,P3.5为定时器1.
温度
GNDj|
图为DS18B20原理图
LCD1602
RJI
图为LCD1602原理图
图为外部电路接线图
3设计过程论述
3.1DS18B20温度传感器
DS18b20采用单总线的结构,单总线的特点就是只有一根数据线,系统中的数据交换都由这根线进行。
DS18B20的一线工作协议流程是:
初始化fROM操作指令一存储器操作指令一数据传输。
其工作时序包括:
1、初始化时序
2、写时序
3、读时序
DS18B20的初始化
主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。
若无低电平出现一直都是高电平说明总线上无器件应答。
做为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。
若没有检测到就一直在检测等待
初始化时序图
初始化过程和花在脉冲"
缱型含义:
DS182OIS电平
电阻上竝
息錢I?
制器徳电平
总线控制器和仍1820同为低电平
初始化程序
unsignedcharDsl8b20Iiut()
{
unsignedmti;
DSIO=0;〃将总线拉低480us〜960us
1=70;
while(i—);//延时642us
DSIO=1;//然后拉高总线,若DS18B2O做出反应会将在15us~60us后将总线拉低
1=0;
wlule(DSIO)〃等待DS18B20拉低总线
{
i++;
1坦>50000)//等待>50MS
remni0;〃初始化失败
}
return1;//初始化成功
}
主机发出各种操作命令都是向DS18B20写0和写1组成的命令字节,接收数据时也是从DS1SB20读取0或1的过程。
写周期最少为60微秒,最长不超过120微秒。
写周期一开始做为主机先把总线拉低1微秒表示写周期开始。
随后若主机想写0,则将总线置为低电平,若主机想写1,则将总线置为高电平,持续时间最少60微秒直至写周期结束,然后释放总线为高电平至少1微秒给总线恢复。
而DS18B20则在检测到总线彼拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。
写操作时序图
向DS18B20写入一个字节
voidDsl8b20WriteByte(unsignedchardat)
{
unsignedmtij;
for(j=0j<8j++)
{
DSIO=0;//每写入一位数据之前先把总线拉低lus
i++;
DSIO=dat&0x01;//然后写入一个数据,从最低位开始
1=6;
while(i-);〃延时68ust持续时间最少60us
DSIO=1;〃然后释放总线,至少lus给总线恢复时间才能接着写入第二个数值dat»=l;
}
}
读周期是从主机把单总线拉低1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。
作为从机DS1SB20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。
若要送出1则释放总线为高电平。
主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微
秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。
采样期内总线为高电平则确认为完成一个读时序过程,至少需要60微秒才能完成
读操作时序图
读取一个字节
unsignedcharDs18b20ReadBvte()
{
unsignedcharbyte.bi;
unsignedmti,j;
for(j=8j>0j-)
{
DSIO=0;〃先将总线拉低lus
i++;
DSIO=1;〃然后释放总线
i++;
i++;〃延时6us等待数据稳定
bi=DSIO;〃读取数据,从最高位开始读取
byte=(byte»l)|(bi«7);/*将byte右移一位,然后或上左移7位后的bi,注意移动
之后移掉那位补0。
*/
1=4;〃读取完之后等待48us再接着读取下一个数
while(i—);
}
retinnbvte;
J7
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。
64位光刻ROM的排列是:
开始8位(地址:
28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,并且每个DS18B20的序列号都不相同,因此它可以看作是该DS18B20的地址序列码;最后8位则是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。
由于每一个DS18B20的ROM数据都各不相同,因此微控制器就可以通过单总线对多个DS18B20进行寻址,从而实现一根总线上挂接多个DS18B20的目的。
晰側CRC48时列号SbilirftR(lOH)
MSBLSBMSBLSBMSBLSB
DS18B20的存储器由一个高速暂存RAM和一个非易失性、电可擦除(E2)RAM组成。
TH
TL
8&CRC
I別(0)MSB(8)
O
温度的低八位数据
5
保留(全工)
Z
温度的高八位数据
G
保留
2
高温阀值
7
保留
3
低位阀值
8
前八位CRC效验值
4
配置寄存器
DS18B20经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
所以当我们只想简单的读取温度值的时候,只用读取暂存器中的第0和第1个字节就可以了。
简单的读取温度值的步骤如下:
1、跳过ROM操作
2、发送温度转换命令
3、跳过ROM操作
4、发送读取温度命令
5、读取温度值
抠令名称
指令代码
擋令功能
温度熒埶
44H
启动DS18曰20进行温度转换,转换时间最长垢500ms(典型光200ms)・结果有入内咅F9宇节RAM中
OBEH
读内和RAM中9手节的内容
写暂存器
4EH
发出向内咅bRAM的第3,4宇节写上,
F限温康数据命令.紧跟谚命令之后.是传送两宇节的数垢
熄制哲存器
48H
ISRAM中第3,4字苹的内容复制到EEPR
0M中
垂凋EEPROM
0B8H
EEPROM中的内容恢毘到RAM中的第3,4
字节
淒供电方式
OB4H
读DS18B2O的供电模式,寄生供电时DS18日20发送“0”,夕卜疾电源供电DS18B
■■•0W••••••••
指令名称
指令代码
指令功能
读ROM
33H
渎DS18B20ROM中的编碍(即读64位地址)
ROM匹酉己(符合ROM)
55H
笈出此命令之后,授着发出64位ROM编碍,访问单总銭上与编码相对应DS18B20使之作出响应'为下一步对该DS18B20的读写作准备
搜素ROM
OFOH
用于确定挂接在同一总线上DS18B20的个数和识别64位ROM地址'为操作各器件作好准备
跳过ROM
0CCH
紹略创位ROM地址,直接向DS18B20发温度吏换命令上适用于单片机工作
譬根役索
OECH
该指令执行后,只有温度超过设定值上限或下限的片子才做出响应
DS18B20fit]ROM指令集
开始转换温度
voidDs18b20ChangTemp()
{
Dsl8b20Imt0;
Delavlnis(l);
Ds18b20WiiteBvte(0xcc);〃跳过ROM操作命令
Ds18b20WiiteBvte(0x44);〃温度转换命令
Delavlnis(lOO);
}
炖读取as命令
voidDs18b20ReadTempCom()
{
Dsl8b20Imt0;
Delavlnis(l);
Ds18b20WiiteBvte(0xcc);〃跳过ROM操作命令
Ds18b20WnteByte(0xbe);〃发送读取温度命令
读取温度
mtDs18b20ReadTemp()
{
unsignedmttemp=O;
unsignedchartnilijnil;
Dsl8b2OChaiigTempO;〃先写入转换命令Dsl8b20ReadTenipCom()y/然后等待转换完后发送读取温度命令tnil=Dsl8b20ReadByteQ;〃读取温度值共16位,先读低字节tnili=Ds18b20ReadByteQ;〃再读高字节
temp=tnih;
temp«=8;
temp|=tml;
returntemp;
}3.2LCD1602液晶显示屏
LCD1602的引脚
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
DataI/O
2
VDD
电源正极
10
D3
DataI/O
3
VL
液晶显示偏压信号
11
D4
DataI/O
4
RS
数据/命令选择端(H/L)
12
05
DataI/O
5
R/W
读/写选择端(H/L)
13
06
DataI/O
6
E
使能信号
14
D7
DataI/O
7
D0
DataI/O
15
BLA
背光源正极
8
D1
DataI/O
16
BLK
背光源负极
操作步骤:
1、初始化
2、写命令(RS=L)设置显示坐标
3、写数据(RS=H)
时序参数
符号
极限值
单位
最小值
典型值
最大值
E信号周期
tc
400
—
—
ns
E脉冲宽度
tpw
150
—
—
ns
E上升沿/下降沿时间
tR,tF
—
—
25
ns
地址建立时间
tspi
30
—
—
ns
地址保持时间
tHDI
10
—
—
ns
数据建立时间(读操作)
tD
—
—
100
ns
数据保持时间(读操作)
tHD2
20
—
—
ns
数据建立时间(写操作)
tSP2
40
—
—
ns
数据保持时间(写操作)
tHD2
10
—
—
ns
写入一个字节命令
voidLcdWriteCom(unsignedchaicom)〃写入命令{
RS=0;
RW=0;
GPIO_LCD=com;
Delaylnis(10);
LCDE=1;
Delaylnis(10);
LCDE=0;
}写入一个字节数据
RS=1;
RW=0;
GPIO_LCD=dat;
Delaylnis(10);
LCDE=1;
Delaylnis(10);
LCDE=0;
}
初始化
voidLcdliiit()//LCD初始化子程序
{_
LcdWiiteCom(0x38);〃设置显示模式
LcdWiiteCom(OxOc);〃开显示不显示光标,光标不闪烁
LcdWnteCom(0x06);〃写一个指针加1
LcdWiiteCom(0x01);〃清屏
LcdWiiteCom(OxSO);〃设置数据指针起点
}
1602的指令码
指令功観
指令编码
✓us
RS
R/W
DB7
DB6
DBS
DBH
DB3
DB2
DB1
功能设定
■
■
i
0
1
01
H
F
X
X
MB
DL:
0时:
选择4位数据总线模式。
1时:
选择8位数据总线模式。
N:
0时:
选择显示一行。
1时:
选择显示两行。
F:
0选择5*7模式,1选择5勺0模式。
一般只有5*7模式。
显示开/关及按键显示
指令码
功能
0
0
0
0
1
D
C
B
D=1
C=1
B=1
开显示;D=0关显示
显7F光标;C二0不显光标光标闪烁:
A0光标不显示
0
0
0
0
0
1
N
S
N二1当读或写一个字符后地址指针加—,且光标加一
N二0当读或写一个字符后地址指针减一,且光标减一
S=1当写一个字符,整屏显示左移(N=1)或右移(N=0),以得到光标不移动而屏幕移动的效果。
s=o当写一个字符,整屏显示不移动
■数据指针设置
I指令码
mgI
■80H+地址码(0=27H,
■40H-67H)
设萱数据地址指针]
■其他设置
.指令码
功能
.01HI
显示清屏:
1•数据指针清零
2,所有显亦■清零
3.3编程调试过程出现的问题
当控制电机速度的程序放在定时器1的中断中则会导致液晶显示屏出现闪烁,这是因为每中
断一次就进入中断程序,则读取温度的程序就没有运行,所欲显示就会出错,而当控制电机的程序放在主程序中,则电机的速度则无法控制,只有转或不转。
这个问题无法突破就无法实现调节风力人小以及正确显示温度的功能,尝试了多种办法后发现在读取温度的时候先将定时器关闭,读取温度结束后就开启定时器。
4、程序清单
#iiiclude
voidTimelCoiifigQ;
/*相关字符的重定义*/
#defineuchaiunsignedchar
#defineumtunsignedmt
#defineLCD1602_DATAPINSPO
sbitLCD1602_E=P2A7;〃定义P2.7II为使能端
sbitLCD1602_RW=P2人5;
〃定义P2.5丨1为读/写选择端(H,,L)
sbitLCD1602_RS=P2'、6;
〃定义P2.611为数据/命令选择端(H.L)
sbitDSPORT=P3A7;
sbitPWM=P1T;
〃定义P3.7口为总线
〃定义P1.1为电机电压输出端
严定义一些相关变量引
unsignedchartimer1;
floattp;
mttemp.speed;
unsignedchaitabh[]={O,T,2,3丁4丁5丁6;7,'8;9};
hitil=0,nl=0jl=0,al,kl=04iil=0,flag=0.ol=0,pl=0,zl=0;
〃误差Ous
严LCD1602延时函数*/
voidLed1602_Delavlnis(umtc){
uchara.b;
for(;c>0;c—)
{
for(b=199;b>0;b—)
{
fdr(a=l;a>0;a—);}
}
}
严向LCD1602写入一个字节命令*/
voidLcdWriteCom(ucharcom)〃写入命令
{
LCD1602_E=0;〃使能
LCD1602_RS=0;〃选择发送命令
LCD1602_RW=0;〃选择写入
LCD1602.DATAPINS=com;〃放入命令
Led1602_Delay1ms
(1);//等待数据稳定
LCD1602_E=1;〃写入时序
Led1602_Delaylms(5);//保持时间
LCD1602_E=0;
}
严向LCD1602写入一个字节数据引
〃写入数据
voidLcdWriteData(uchaidat)
{
LCD1602_E=0;〃使能清零
LCD1602_RS=1;〃选择输入数据
LCD1602_RW=0;//选择写入
LCD1602.DATAPINS=dat;//写入数据Led1602_Delaylms
(1);
LCD1602_E=1;〃写入时序
Led1602_Delaylms(5);//保持时间
LCD1602_E=0;
}
严初始化LCD屏*/
voidLcdliut()//LCD初始化子程序
{_
LcdWiiteCom(0x38);〃开显示
LcdWiiteCom(OxOc);〃开显示不显示光标
LcdWnteCom(0x06);〃写一个指针加1
LcdWiiteCom(0x01);〃清屏
LcdWiiteCom(OxSO);〃设置数据指针起点
}严DS18E20的延时函数*/voidDelaylms(umty){
uiiitx;
M;y>o;y-)
for(x=110;x>0;x-);
/*DS18B20的初始化*/uchaiDsl8b20Lut()
{
uchaii;
DSPORT=0;〃将总线拉低480us〜960us
i=70;
while(i—);//延时642us
DSPORT=1;〃然后拉高总线,如果DS18B20做出反应会将在15us〜60us后总
线拉低
i=0;
while(DSPORT)〃等待DS18B20拉低总线
{
i++;
if(i>5)//等待>5MS
{
remni0;//初始化失败
}
Delavlnis(l);
}
remin1#初始化成功
}
/*向DS18B20写入一个字节*/
voidDsl8b20WriteByte(uchardat)
{
uinti,j;
for(j=0;j<8;j++)
{
DSPORT=0;〃每写入一位数据之前先把总线拉低lus
i++;
DSPORT=dat&0x01;〃然后写入一个数据,从最低位开始
1=6;
while(i—);//延时68us,持续时间最少60us
DSPORT=1;〃然后释放总线,至少lus给总线恢复时间才能接着写入第二个数值dat»=1;
}
}
/*读取一个字节*/
uchaiDs18b20ReadByte()
ucharbyte,bi;
umtij;
for(j=8;j>0;j-)
{
DSPORT=0〃先将总线拉低lus
i++;
DSPORT=iy/然后释放总线
i++;
i++;〃延时6us等待数据稳定
bi=DSPORT;〃读取数据,从最高位开始读取
/*将byte右移一位,然后与上左移7位后的bi,注意移动之后移掉那位补0。
*/byte=(byte»1)|(bi«7);
1=4;〃读取完之后等待48us再接着读取下一个数
while(i—);
}
retuinbyte;
}
/*开始转换温度*/
voidDs18b20ChangTempQ
{
Dsl8b20Imt0;
Delavlnis(l);
Ds18b20WiiteBvte(0xcc);〃跳过ROM操作命令
Ds18b20WiiteBvte(0x44);//温度转换命令
//Delaylms(lOO);〃等待转换成功,而如果你是一直刷着的话,就不用这个延时了}
/*发送读取温度命令*/
voidDs18b2OReadTempCom()
Dsl8b20Init();
Delavlnis(l);
Ds18b20WiiteBvte(0xcc);〃跳过ROM操作命令
Ds18b20WnteByte(0xbe)