1、智能散热系统课程设计报告单片机原理及接口课程设计报告题 目: 智能散热系统 专业名称: 通信工程 班 级: 创新 142 学 号: 201411403128 姓 名: 刘小杰 2015年 12月课程设计报告首页院、系(部)信息工程学院专业通信工程 班级创新142学号201411403128姓名刘小杰任课教师陈玮课程名称单片机原理及接口成绩评语 签字: 年 月 日复核人意见 签字: 年 月 日课程设计报告的要求:首先应先介绍课程设计的基本内容(包括设计目标)、设计的背景及意义。其次是方案论证:说明设计的原理并进行方案选择,再然后进行硬件电路的设计及原理说明,和软件的流程说明。第三是过程(设计或实
2、验)论述:对设计调试工作的详细表述。最后是结论或总结:对整个研究工作进行归纳和综合、包括心得体会。大致内容按上面要求来写,也可以参考网上“单片机 课程设计报告”来扩充。文章中的格式规定:图:图的名称采用中文,图名在图片下面格式为:图1-1,后接图名。表格:表名在表格上面。正文五号字一级标题 四号 加粗二级标题 小四 加粗行距:1.5倍附录的程序:两列页边距:上下2.5厘米 左右2.8厘米不要目录需要中文摘要 排版参考毕业设计论文格式(见下页)参考文献若有可写打印的报告里面不需要附录程序 电子版里面需要报告里面应该有各模块电路图 调试现象图刻盘要求:最后,除了打印的,全班把每个人的程序(keil
3、项目及hex文件)、电路(proteus文件或硬件的照片及电路原理图)和报告打包压缩后命名为“班级名-学号-姓名”(如电信091-123456-陈玮)刻盘。散热系统刘小杰信息工程学院摘要:由于单片机体积小、成本低、使用方便,所以被广泛地应用于仪器仪表、现场数据的采集和控制。通过本次课程设计掌握单片机硬件和软件方面的知识,更深入的了解单片机的实际应用。关键词:单片机,程序,DS18B20温度传感器,LCD1602液晶显示屏,定时器,直流电机等等1课程设计的基本内容为实现系统能采集当前环境温度,当温度达到一定值时触发直流风扇的转动进行主动散热,并且随着温度的变化而改变风力大小,风力与温度成正比,本
4、系统设置了三个档来控制风力的大小,20C-22C为一档,22C-24C为二档,24C-26C为三档(为了演示方便而设计的三档,在实际用途中可依据要求来设置)。本智能散热系统根据环境温度智能调控风力的功能可以放置在一些硬件中以达到降温的功能。2 方案论证2.1 设计原理及方案选择通过DS18B20温度传感器来采集当前环境的温度,通过LCD1602液晶显示屏来显示温度以及工作时间,CPU根据当前温度来控制电机的速度。2.2 硬件电路设计及原理说明 使用P1.1口来连接电机,P0口连接LCD1602,P2.5口为读/写选择端,P2.6为命令/数据选择端,P2.7为使能端,P3.7口为数据总线,P3.
5、4口为定时器0,P3.5为定时器1. 图为DS18B20原理图 图为LCD1602原理图 图为外部电路接线图 3 设计过程论述3.1 DS18B20温度传感器DS18b20采用单总线的结构,单总线的特点就是只有一根数据线,系统中的数据交换都由这根线进行。DS18B20的一线工作协议流程是:初始化ROM操作指令存储器操作指令数据传输。其工作时序包括:1、初始化时序2、写时序3、读时序DS18B20的初始化主机首先发出一个480960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上
6、无器件应答。做为从器件的DS18B20在一上电后就一直在检测总线上是否有480960微秒的低电平出现,如果有,在总线转为高电平后等待1560微秒后将总线电平拉低60240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待 初始化时序图初始化程序unsigned char Ds18b20Init() unsigned int i; DSIO=0; /将总线拉低480us960us i=70; while(i-);/延时642us DSIO=1;/然后拉高总线,若DS18B20做出反应会将在15us60us后将总线拉低 i=0; while(DSIO) /等待DS18B2
7、0拉低总线 i+; if(i50000)/等待50MS return 0;/初始化失败 return 1;/初始化成功主机发出各种操作命令都是向DS18B20写0和写1组成的命令字节,接收数据时也是从DS18B20读取0或1的过程。写周期最少为60微秒,最长不超过120微秒。写周期一开始做为主机先把总线拉低1微秒表示写周期开始。随后若主机想写0,则将总线置为低电平,若主机想写1,则将总线置为高电平,持续时间最少60微秒直至写周期结束,然后释放总线为高电平至少1微秒给总线恢复 。而DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1
8、,若采样期内总线为低电平则为0。写操作时序图向DS18B20写入一个字节void Ds18b20WriteByte(unsigned char dat) unsigned int i,j; for(j=0;j=1; 读周期是从主机把单总线拉低1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。作为从机DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认
9、为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60微秒才能完成读操作时序图读取一个字节unsigned char Ds18b20ReadByte() unsigned char byte,bi; unsigned int i,j; for(j=8;j0;j-) DSIO=0;/先将总线拉低1us i+; DSIO=1;/然后释放总线 i+; i+;/延时6us等待数据稳定 bi=DSIO; /读取数据,从最高位开始读取 byte=(byte1)|(bi7); /*将byte右移一位,然后或上左移7位后的bi,注意移动之后移掉那位补0。*/ i=4; /读取完之后等待48us
10、再接着读取下一个数 while(i-); return byte; DS18B20 内部结构主要由四部分组成: 64 位光刻 ROM 、温度传感器、非挥发的温度报警触发器 TH 和 TL 、配置寄存器。光刻 ROM 中的 64 位序列号是出厂前被光刻好的,它可以看作是该 DS18B20 的地址序列码。 64 位光刻 ROM 的排列是:开始 8 位(地址: 28H )是产品类型标号,接着的 48 位是该 DS18B20 自身的序列号,并且每个 DS18B20 的序列号都不相同,因此它可以看作是该 DS18B20 的地址序列码;最后 8 位则是前面 56 位的循环冗余校验码( CRC=X8+X5+
11、X4+1 )。由于每一个 DS18B20 的 ROM 数据都各不相同,因此微控制器就可以通过单总线对多个 DS18B20 进行寻址,从而实现一根总线上挂接多个 DS18B20 的目的。DS18B20的存储器由一个高速暂存RAM和一个非易失性、电可擦除(E2)RAM组成。DS18B20经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。所以当我们只想简单的读取温度值的时候,只用读取暂存器中的第0和第1个字节就可以了。简单的读取温度值的步骤如下:1、跳过ROM操作2、发送温度转换命令3、跳过ROM操作4、发送读取温度命令5、读取温度值开始转换温度void Ds18b20Cha
12、ngTemp() Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); /跳过ROM操作命令 Ds18b20WriteByte(0x44); /温度转换命令 Delay1ms(100);发送读取温度命令void Ds18b20ReadTempCom() Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); /跳过ROM操作命令 Ds18b20WriteByte(0xbe); /发送读取温度命令读取温度int Ds18b20ReadTemp() unsigned int temp=0; unsig
13、ned char tmh,tml; Ds18b20ChangTemp(); /先写入转换命令 Ds18b20ReadTempCom();/然后等待转换完后发送读取温度命令 tml=Ds18b20ReadByte(); /读取温度值共16位,先读低字节 tmh=Ds18b20ReadByte(); /再读高字节 temp=tmh; temp=8; temp|=tml; return temp;3.2 LCD1602液晶显示屏LCD1602的引脚操作步骤:1、初始化2、写命令(RS=L)设置显示坐标3、写数据(RS=H)写入一个字节命令void LcdWriteCom(unsigned char
14、com) /写入命令 RS=0; RW=0; GPIO_LCD=com; Delay1ms(10); LCDE=1; Delay1ms(10); LCDE=0;写入一个字节数据void LcdWriteData(unsigned char dat) /写入数据 RS=1; RW=0; GPIO_LCD=dat; Delay1ms(10); LCDE=1; Delay1ms(10); LCDE=0;初始化void LcdInit() /LCD初始化子程序 LcdWriteCom(0x38); /设置显示模式 LcdWriteCom(0x0c); /开显示不显示光标,光标不闪烁 LcdWriteC
15、om(0x06); /写一个指针加1 LcdWriteCom(0x01); /清屏 LcdWriteCom(0x80); /设置数据指针起点1602的指令码DL:0时:选择4位数据总线模式。1时:选择8位数据总线模式。N:0时:选择显示一行。1时:选择显示两行。F:0选择5*7模式,1选择5*10模式。一般只有5*7模式。显示开/关及按键显示RAM地址映射图3.3编程调试过程出现的问题当控制电机速度的程序放在定时器1的中断中则会导致液晶显示屏出现闪烁,这是因为每中断一次就进入中断程序,则读取温度的程序就没有运行,所欲显示就会出错,而当控制电机的程序放在主程序中,则电机的速度则无法控制,只有转或
16、不转。这个问题无法突破就无法实现调节风力大小以及正确显示温度的功能,尝试了多种办法后发现在读取温度的时候先将定时器关闭,读取温度结束后就开启定时器。4、程序清单#includevoid Time1Config();/*相关字符的重定义*/#define uchar unsigned char#define uint unsigned int#define LCD1602_DATAPINS P0sbit LCD1602_E=P27; /定义P2.7口为使能端sbit LCD1602_RW=P25; /定义P2.5口为读/写选择端(H/L)sbit LCD1602_RS=P26; /定义P2.6口
17、为数据/命令选择端 (H/L)sbit DSPORT=P37; /定义P3.7口为总线sbit PWM=P11; /定义P1.1为电机电压输出端/*定义一些相关变量*/unsigned char timer1;float tp;int temp,speed;unsigned char table=0,1,2,3,4,5,6,7,8,9;int i1=0,n1=0,j1=0,a1,k1=0,m1=0,flag=0,o1=0,p1=0,z1=0;/*LCD1602延时函数*/ void Lcd1602_Delay1ms(uint c) /误差 0us uchar a,b; for (; c0; c
18、-) for (b=199;b0;b-) for(a=1;a0;a-); /*向LCD1602写入一个字节命令*/void LcdWriteCom(uchar com) /写入命令 LCD1602_E = 0; /使能 LCD1602_RS = 0; /选择发送命令 LCD1602_RW = 0; /选择写入 LCD1602_DATAPINS = com; /放入命令 Lcd1602_Delay1ms(1); /等待数据稳定 LCD1602_E = 1; /写入时序 Lcd1602_Delay1ms(5); /保持时间 LCD1602_E = 0;/*向LCD1602写入一个字节数据*/ vo
19、id LcdWriteData(uchar dat) /写入数据 LCD1602_E = 0; /使能清零 LCD1602_RS = 1; /选择输入数据 LCD1602_RW = 0; /选择写入 LCD1602_DATAPINS = dat; /写入数据 Lcd1602_Delay1ms(1); LCD1602_E = 1; /写入时序 Lcd1602_Delay1ms(5); /保持时间 LCD1602_E = 0; /*初始化LCD屏*/ void LcdInit() /LCD初始化子程序 LcdWriteCom(0x38); /开显示 LcdWriteCom(0x0c); /开显示不
20、显示光标 LcdWriteCom(0x06); /写一个指针加1 LcdWriteCom(0x01); /清屏 LcdWriteCom(0x80); /设置数据指针起点/*DS18B20的延时函数*/void Delay1ms(uint y) uint x; for( ; y0; y-) for(x=110; x0; x-); /*DS18B20的初始化*/uchar Ds18b20Init() uchar i; DSPORT = 0; /将总线拉低480us960us i = 70; while(i-);/延时642us DSPORT = 1; /然后拉高总线,如果DS18B20做出反应会将
21、在15us60us后总线拉低 i = 0; while(DSPORT) /等待DS18B20拉低总线 i+; if(i5)/等待5MS return 0;/初始化失败 Delay1ms(1); return 1;/初始化成功/*向DS18B20写入一个字节*/void Ds18b20WriteByte(uchar dat) uint i, j; for(j=0; j= 1; /*读取一个字节*/uchar Ds18b20ReadByte() uchar byte, bi; uint i, j; for(j=8; j0; j-) DSPORT = 0;/先将总线拉低1us i+; DSPORT
22、= 1;/然后释放总线 i+; i+;/延时6us等待数据稳定 bi = DSPORT; /读取数据,从最高位开始读取 /*将byte右移一位,然后与上左移7位后的bi,注意移动之后移掉那位补0。*/ byte = (byte 1) | (bi 7); i = 4; /读取完之后等待48us再接着读取下一个数 while(i-); return byte;/*开始转换温度*/void Ds18b20ChangTemp() Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); /跳过ROM操作命令 Ds18b20WriteByte(0x44);
23、/温度转换命令 /Delay1ms(100); /等待转换成功,而如果你是一直刷着的话,就不用这个延时了 /*发送读取温度命令*/void Ds18b20ReadTempCom() Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); /跳过ROM操作命令 Ds18b20WriteByte(0xbe); /发送读取温度命令/*读取温度*/int Ds18b20ReadTemp() int temp = 0; uchar tmh, tml; TR1=0; Ds18b20ChangTemp(); /先写入转换命令 Ds18b20ReadTempCo
24、m(); /然后等待转换完后发送读取温度命令 tml = Ds18b20ReadByte(); /读取温度值共16位,先读低字节 tmh = Ds18b20ReadByte(); /再读高字节 temp = tmh; temp 100) /PWM周期为100*0.5ms timer1=0; if(timer1 speed) /直流电机的速度与speed的变化成正比 PWM=1; else PWM=0; /*设置定时器1*/void Time1Config() TMOD|= 0x10; /设置定时计数器工作方式1为定时器 /-定时器赋初始值,12MHZ下定时0.5ms-/ TH1 = 0xfe;
25、 TL1 = 0x0c; ET1 = 1; /开启定时器1中断 EA = 1; TR1 = 1; /开启定时器 /*LCD显示读取到的温度*/void LcdDisplay(int temp) /lcd显示 unsigned char datas = 0, 0, 0, 0, 0; /定义数组 if(temp=2000 & temp=2200 & temp2400) speed=70; else speed=0; /留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 /后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 /算加上0.5,还是在小数点后面。 datas0 = temp / 10000
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1