1、智能散热系统单片机原理及接口课程设计报告题 目: 智能散热系统 专业名称: 通信工程 班 级: 创新142 学 号: 201411403128 姓 名: 刘小杰 2015年 12月课程设计报告首页院、系(部)信息工程学院专业通信工程班级创新142学号201411403128姓名刘小杰任课教师陈玮课程名称单片机原理及接口成绩评语签字:年 月 日复核人意见签字:年 月 日课程设计报告的要求:首先应先介绍课程设计的基本内容(包括设计目标)、设计的背景及意义。其次是方案论证:说明设计的原理并进行方案选择,再然后进行硬件电路的设计 及原理说明,和软件的流程说明。第三是过程(设计或实验)论述:对设计调试工
2、作的详细表述。最后是结论或总结:对整个研究工作进行归纳和综合、包括心得体会。大致内容按上面要求來写,也可以参考网上“单片机课程设计报告”来扩充。文章中的格式规定:图:图的名称采用中文,图名在图片下面格式为:图1-1,后接图名。 表格:表名在表格上面。正文五号字一级标题四号加粗二级标题小四加粗行距:1.5倍附录的程序:两列页边距:上下2. 5厘米 左右2. 8厘米不要目录需要中文摘要排版参考毕业设计论文格式(见下页)参考文献若有可写打印的报告里面不需要附录程序电子版里面需要报告里面应该有各模块电路图调试现象图刻盘要求:最后,除了打印的,全班把每个人的程序(keil项目及hex文件)、电路(pro
3、teus 文件或硬件的照片及电路原理图)和报告打包压缩后命名为“班级名-学号-姓名” (如电信091-123456-陈玮)刻盘。散热系统刘小杰信息工程学院摘要:由于单片机体积小、成本低、使用方便,所以被广泛地应用于仪器仪表、现 场数据的采集和控制。通过本次课程设计掌握单片机硬件和软件方面的知识,更深 入的了解单片机的实际应用。关键词:单片机,程序,DS18B20温度传感器,LCD1602液晶显示屏,定时器,直 流电机等等1课程设计的基本内容为实现系统能釆集当前环境温度,当温度达到一定值时触发直流风扇的转动进行主动散 热,并且随着温度的变化而改变风力人小,风力与温度成正比,本系统设置了三个档来控
4、制 风力的大小,20C 22C0为一档,22C -24C为二档,24C 26C0为三档(为了演示 方便而设计的三档,在实际用途中可依据要求来设置)。本智能散热系统根据坏境温度智能 调控风力的功能可以放置在一些硬件中以达到降温的功能。2方案论证2.1设计原理及方案选择通过DS18B20温度传感器来采集当前坏境的温度,通过LCD1602液晶显示屏来显示 温度以及工作时间,CPU根据当前温度来控制电机的速度。2.2硬件电路设计及原理说明使用Pl. 1 I 1来连接电机,P0 口连接LCD 1602, P2. 5 I I为读/写选择端,P2. 6为 命令/数据选择端,P2. 7为使能端,P3. 7 I
5、 1为数据总线,P3.4 I I为定时器0, P3. 5为定时 器1.温度GNDj|图为DS18B20原理图LCD1602RJI图为LCD1602原理图图为外部电路接线图3设计过程论述3.1 DS18B20温度传感器DS18b20采用单总线的结构,单总线的特点就是只有一根数据线,系统中的数据交换都由这 根线进行。DS18B20的一线工作协议流程是:初始化f ROM操作指令一存储器操作指令一数据传输。其工作时序包括:1、 初始化时序2、 写时序3、 读时序DS18B20的初始化主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480 微秒时间内对总线进行检测,如果
6、有低电平出现说明总线上有器件已做出应答。若无低电平 出现一直都是高电平说明总线上无器件应答。做为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平 出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出 响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待初始化时序图初始化过程和花在脉冲缱型含义:DS182OIS 电平 电阻上竝息錢I?制器徳电平总线控制器和仍1820同 为低电平初始化程序unsigned char Dsl8b20Iiut()unsigned mt i;DSIO=0; 将总线拉低480us960us
7、1=70;while(i);/延时 642usDSIO=1;/然后拉高总线,若DS18B2O做出反应会将在15us60us后将总线拉低1=0;wlule(DSIO) 等待 DS18B20 拉低总线i+;1 坦 50000)/ 等待 50MSremni 0;初始化失败return 1;/初始化成功主机发出各种操作命令都是向DS18B20写0和写1组成的命令字节,接收数据时也是从 DS1SB20读取0或1的过程。写周期最少为60微秒,最长不超过120微秒。写周期一开始做为主机先把总线拉低1微秒 表示写周期开始。随后若主机想写0,则将总线置为低电平,若主机想写1,则将总线置为 高电平,持续时间最少6
8、0微秒直至写周期结束,然后释放总线为高电平至少1微秒给总线 恢复。而DS18B20则在检测到总线彼拉底后等待15微秒然后从15us到45us开始对总线 采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。写操作时序图向DS18B20写入一个字节void Dsl 8b20WriteByte(unsigned char dat)unsigned mt ij;for(j=0j0j-)DSIO=0;先将总线拉低lusi+;DSIO=1;然后释放总线i+;i+;延时6us等待数据稳定bi=DSIO; 读取数据,从最高位开始读取byte=(bytel)|(bi7); /*将byte右移一位,
9、然后或上左移7位后的bi,注意移动之后移掉那位补0。*/1=4; 读取完之后等待48us再接着读取下一个数while(i);retinn bvte;J 7DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温 度报警触发器TH和TL、配置寄存器。光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序 列码。64位光刻ROM的排列是:开始8位(地址:28H )是产品类型标号,接着的48 位是该DS18B20自身的序列号,并且每个DS18B20的序列号都不相同,因此它可以看作 是该DS18B20的地址序列码;最后8位则是前面56位的循环冗余校验
10、码 (CRC=X8+X5+X4+1 )。由于每一个DS18B20的ROM数据都各不相同,因此微控制 器就可以通过单总线对多个DS18B20进行寻址,从而实现一根总线上挂接多个DS18B20 的目的。晰側 CRC 48时列号 Sbil irftR(lOH)MSB LSB MSB LSB MSB LSBDS18B20的存储器由一个高速暂存RAM和一个非易失性、电可擦除(E2) RAM组成。THTL8 & CRCI 別(0) MSB (8)O温度的低八位数据5保留(全工)Z温度的高八位数据G保留2高温阀值7保留3低位阀值8前八位CRC效验值4配置寄存器DS18B20经转换所得的温度值以二字节补码形式
11、存放在高速暂存存储器的第0和第1个字 节。所以当我们只想简单的读取温度值的时候,只用读取暂存器中的第0和第1个字节就可 以了。简单的读取温度值的步骤如下:1、 跳过ROM操作2、 发送温度转换命令3、 跳过ROM操作4、 发送读取温度命令5、 读取温度值抠令名称指令代码擋令功能温度熒埶44H启动DS18曰20进行温度转换,转换时间最 长垢500ms (典型光200ms )结果有 入内咅F 9宇节RAM中OBEH读内和RAM中9手节的内容写暂存器4EH发出向内咅b RAM 的第 3 , 4宇节写上,F限温康数据命令.紧跟谚命令之后.是传 送两宇节的数垢熄制哲存器48HIS RAM中第3 , 4字
12、苹的内容复制到EEPR0M中垂凋EEPROM0B8HEEPROM中的内容恢毘到 RAM中的第3 , 4字节淒供电方式OB4H读DS18B2O的供电模式,寄生供电时DS 18日20 发送 “0”,夕卜疾电源供电 DS18B 0 W 指令名称指令代码指令功能读ROM33H渎 DS18B20ROM中的编碍(即读64位地址)ROM匹酉己(符合ROM )55H笈出此命令之后,授着发出64位ROM编碍,访 问单总銭上与编码相对应 DS18B20使之作出响 应为下一步对该DS18B20的读写作准备搜素ROMOFOH用于确定挂接在同一总线上DS1 8B20的个数和 识别64位ROM地址为操作各器件作好准备跳过
13、ROM0CCH紹略 创位 ROM地址,直接向DS18B20发温度 吏换命令上适用于单片机工作譬根役索OECH该指令执行后,只有温度超过设定值上限或下限的 片子才做出响应DS18B20 fit ROM 指令集开始转换温度void Ds 18b20ChangTemp()Dsl8b20Imt0;Delavlnis(l);Ds 18b20WiiteBvte(0xcc); 跳过 ROM 操作命令Ds 18b20WiiteBvte(0x44); 温度转换命令Delavlnis(lOO);炖读取as命令void Ds 18b20ReadTempCom()Dsl8b20Imt0;Delavlnis(l);Ds
14、 18b20WiiteBvte(0xcc); 跳过 ROM 操作命令Ds 18b20WnteByte(0xbe); 发送读取温度命令读取温度mt Ds 18b20ReadTemp()unsigned mt temp=O;unsigned char tnilijnil;Dsl8b2OChaiigTempO; 先写入转换命令 Dsl8b20ReadTenipCom()y/然后等待转换完后发送读取温度命令 tnil=Dsl8b20ReadByteQ; 读取温度值共16位,先读低字节 tnili=Ds 18b20ReadByteQ; 再读高字节temp=tnih;temp=8;temp|=tml;re
15、turn temp;3.2 LCD 1602液晶显示屏LCD 1602的引脚编号符号引脚说明编号符号引脚说明1VSS电源地9D2Data I/O2VDD电源正极10D3Data I/O3VL液晶显示偏压信号11D4Data I/O4RS数据/命令选择端(H/L)1205Data I/O5R/W读/写选择端(H/L)1306Data I/O6E使能信号14D7Data I/O7D0Data I/O15BLA背光源正极8D1Data I/O16BLK背光源负极操作步骤:1、 初始化2、 写命令(RS=L)设置显示坐标3、 写数据(RS=H)时序参数符号极限值单位最小值典型值最大值E信号周期tc40
16、0nsE脉冲宽度tpw150nsE上升沿/下降沿时间tR, tF25ns地址建立时间tspi30ns地址保持时间tHDI10ns数据建立时间(读操作)tD100ns数据保持时间(读操作)tHD220ns数据建立时间(写操作)tSP240ns数据保持时间(写操作)tHD210ns写入一个字节命令void LcdWriteCom(unsigned chai com) 写入命令 RS=0;RW=0;GPIO_LCD=com;Delay lnis(10);LCDE=1;Delay lnis( 10);LCDE=0; 写入一个字节数据RS=1;RW=0;GPIO_LCD=dat;Delay lnis(
17、10);LCDE=1;Delay lnis( 10);LCDE=0;初始化void Lcdliiit() /LCD 初始化子程序 _LcdWiiteCom(0x3 8); 设置显示模式LcdWiiteCom(OxOc); 开显示不显示光标,光标不闪烁LcdWnteCom(0x06); 写一个指针加 1LcdWiiteCom(0x01); 清屏LcdWiiteCom(OxSO); 设置数据指针起点1602的指令码指令功観指令编码usRSR/WDB7DB6DBSDBHDB3DB2DB1功能设定i0101HFXXMBDL:0时:选择4位数据总线模式。1时:选择8位数据总线模式。N:0时:选择显示一行
18、。1时:选择显示两行。F: 0选择5*7模式,1选择5勺0模式。一般只有5*7模式。显示开/关及按键显示指令码功能00001DCBD=1C=1B=1开显示;D=0关显示显7F光标;C二0不显光标 光标闪烁:A0光标不显示000001NSN二1当读或写一个字符后地址指针加 ,且光标加一N二0当读或写一个字符后地址指针减 一,且光标减一S=1当写一个字符,整屏显示左移(N=1) 或右移(N=0),以得到光标不移动而屏 幕移动的效果。s=o当写一个字符,整屏显示不移动数据指针设置I指令码mg I80H+ 地址码(0=27H ,40H-67H)设萱数据地址指针 其他设置.指令码功能.01 HI显示清屏
19、:1 数据指针清零2,所有显亦清零3.3编程调试过程出现的问题当控制电机速度的程序放在定时器1的中断中则会导致液晶显示屏出现闪烁,这是因为每中断一次就进入中断程序,则读取温度的程序就没有运行,所欲显示就会出错,而当控制电机 的程序放在主程序中,则电机的速度则无法控制,只有转或不转。这个问题无法突破就无法 实现调节风力人小以及正确显示温度的功能,尝试了多种办法后发现在读取温度的时候先将 定时器关闭,读取温度结束后就开启定时器。4、程序清单# iiicludevoid TimelCoiifigQ;/*相关字符的重定义*/#define uchai unsigned char#define umt
20、unsigned mt#define LCD1602_DATAPINS POsbit LCD1602_E=P2A7; 定义 P2.7 I I为使能端sbit LCD1602_RW=P2 人 5;定义P2.5丨1为读/写选择端(H,L)sbit LCD1602_RS=P2、6;定义P2.6 1 1为数据/命令选择端(H.L)sbit DSPORT=P3A7;sbit PWM=P1T;定义P3.7 口为总线定义P1.1为电机电压输出端严定义一些相关变量引unsigned char timer 1;float tp;mt temp.speed;unsigned chai tabh=O,T,2,3丁4
21、丁5丁6;7,8;9;hit il=0,nl=0jl=0,al,kl=04iil=0,flag=0.ol=0,pl=0,zl=0;误差Ous严LCD1602延时函数*/void Led 1602_Delavlnis(umt c) uchar a.b;for (; c0; c)for (b=199;b0;b)fdr(a=l;a0;a); 严向LCD 1602写入一个字节命令*/void LcdWriteCom(uchar com) 写入命令LCD1602_E = 0; 使能LCD1602_RS = 0; 选择发送命令LCD1602_RW = 0; 选择写入LCD1602.DATAPINS = c
22、om; 放入命令Led 1602_Delay 1 ms( 1); /等待数据稳定LCD1602_E = 1; 写入时序Led 1602_Delaylms(5); /保持时间LCD1602_E = 0;严向LCD 1602写入一个字节数据引写入数据void LcdWriteData(uchai dat)LCD1602_E = 0; 使能清零LCD1602_RS= 1; 选择输入数据LCD1602_RW = 0;/选择写入LCD1602.DATAPINS = dat; /写入数据 Led 1602_Delaylms( 1);LCD1602_E = 1; 写入时序Led 1602_Delaylms(
23、5); /保持时间LCD1602_E = 0;严初始化LCD屏*/void Lcdliut() /LCD初始化子程序 _LcdWiiteCom(0x3 8); 开 显示LcdWiiteCom(OxOc); 开显 示不显示光标LcdWnteCom(0x06); 写一个指针加 1LcdWiiteCom(0x01); 清屏LcdWiiteCom(OxSO); 设置数据指针起点 严DS18E20的延时函数*/ void Delaylms(umt y) uiiit x;M; yo; y-)for(x=110; x0; x-);/*DS18B20的初始化*/ uchai Dsl8b20Lut()uchai
24、 i;DSPORT = 0; 将总线拉低 480us960usi = 70;while(i);/延时 642usDSPORT = 1; 然后拉高总线,如果DS18B20做出反应会将在15us60us后总线拉低i = 0;while(DSPORT) 等待 DS 18B20 拉低总线i+;if(i5)/ 等待 5MSremni 0;/初始化失败Delavlnis(l);remin 1#初始化成功/*向DS18B20写入一个字节*/void Dsl 8b20WriteByte(uchar dat)uinti,j;for(j=0;j0;j-)DSPORT = 0先将总线拉低lusi+;DSPORT =
25、iy/然后释放总线i+;i+;延时6us等待数据稳定bi = DSPORT; 读取数据,从最高位开始读取/*将byte右移一位,然后与上左移7位后的bi,注意移动之后移掉那位补0。*/ byte = (byte 1) | (bi 7);1 = 4; 读取完之后等待48us再接着读取下一个数while(i);retuin byte;/*开始转换温度*/void Ds 18b20ChangTempQDsl8b20Imt0;Delavlnis(l);Ds 18b20WiiteBvte(0xcc); 跳过 ROM 操作命令Ds 18b20WiiteBvte(0x44); /温度转换命令/Delaylms(lOO); 等待转换成功,而如果你是一直刷着的话,就不用这个延时了 /*发送读取温度命令*/void Ds 18 b2 ORe adTempC om()Dsl8b20Init();Delavlnis(l);Ds 18b20WiiteBvte(0xcc); 跳过 ROM 操作命令Ds 18b20WnteByte(0xbe)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1