基于单片机的温度监控系统.doc_第1页
基于单片机的温度监控系统.doc_第2页
基于单片机的温度监控系统.doc_第3页
基于单片机的温度监控系统.doc_第4页
基于单片机的温度监控系统.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机课程设计论文论文题目 基于单片机的温度监控系统 姓 名 学 号 学 院 电气工程学院 专业班级 2008级通信工程3班 1.概述- 2 -2.题目及意义- 3 -2.1 题目及基本要求- 3 -2.2 设计的目的与意义- 3 -3.设计方案- 3 -3.1设计思路- 4 -3.2 设计方案框图- 4 -3.3 设计原理图- 5 -4.芯片简介- 6 -4.1 DS18B20的介绍- 6 -4.1.1 DS18B20主要特性:- 6 -4.1.2 DS18B20引脚功能:- 7 -4.1.3工作原理- 7 -4.1.4 DS18B20的写操作- 7 -4.1.5 DS18B20的读操作- 8 -4.2 DS1302的介绍- 8 -5.程序设计- 9 -5.1 程序设计思路- 9 -5.1.1 对应用系统的需求分析- 9 -5.1.2 程序模块设计- 9 -5.2主程序流程图- 9 -6.基于proteus的仿真- 10 -6.1 仿真结果- 10 -6.2仿真结果分析- 11 -7.总结- 11 -8.源程序- 12 -1.概述单片机的出现是近代计算机技术发展史上的重要里程碑。单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。近年来随着电子技术和微型计算机技术的迅速发展,单片机档次的不断提高,其应用领域也在不断扩大,在工业测控、尖端科学、智能仪器仪表、日用家电、汽车电子系统、办公自动化设备、个人通信终端及通信产品中得到了广泛应用,已成为现代电子系统中最重要的智能化核心部件。随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。2.题目及意义2.1 题目及基本要求1. 基于单片机的温度监控系统;2.测温范围是-20-70;3.分辨率小于0.5;4.所测的温度值可以由LCD液晶直接显示;5.可以任意设置上下限温度的报警功能;6.显示日期和时间到LCD液晶;7.使用proteus,protel软件的功能仿真和画原理图;2.2 设计的目的与意义本课程设计是在学习了单片机的基本原理的基础上进行的,综合利用所学单片机知识完成一个单片机应用系统设计并仿真实现,从而加深对单片机软硬知识的理解,获得初步的应用经验;进一步熟悉和掌握单片机的内部结构和工作原理,了解单片机应用系统设计的基本方法和步骤。本设计的目标是用单片机和温度传感器及相关部件实现温度的测量和数字显示,测量精度小于0.5,可以设置温度测量的上下限,超出测温范围可以由蜂鸣器报警,并且显示日期和时间。本设计首先是确定目标,接下来是各个功能模块的设计和相应程序的编写。再在proteus软件上进行仿真,若结果满足要求,则本设计达到了预期的目标。有条件的话可以焊接硬件,若不满足继续修改,最终完成数字温度计的整个设计任务。 3.设计方案3.1设计思路总体设计大致可分为两部分组成:一温度采集模块。二实时时钟电路模块。温度测量部分用数字温度芯片DS18B20 测量温度,输出信号全数字化,DS18B20采用了单总线的数据传输。由数字温度计DS18B20和单片机构成的温度测量装置,它直接输出温度的数字信号。采用单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。该系统利用芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限温度。该系统扩展性非常强。该测温系统电路简单、精确度较高、实现方便、软件设计也比较简单。时间显示电路采用由美国DALLAS公司推出的实时时钟芯片DS1302。它可以对年、月、日、周、日、时、分、秒进行计时,且具有闰年补偿等多种功能。传统的数据记录方式是隔时采样或定时采样,没有具体的时间记录,因此,只能记录数据而无法准确记录其出现的时间;若采用单片机计时,一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且,某些测控系统可能不允许。但是,如果在系统中采用时钟芯片DS1302,则能很好地解决这个问题。3.2 设计方案框图采用8051单片机控制温度传感器DS18B20、时钟芯片DS1302和16*4的LCD完成基于单片机的库房温度监控系统。系统框图如下所示。图a3.3 设计原理图图 b4.芯片简介4.1 DS18B20的介绍DS18B20数字温度传感器由美国的DALLAS生产,它具有体积小,硬件开销低,抗干扰能力强,附加功能强的优点。4.1.1 DS18B20主要特性:全数字温度转换及输出。l先进的单总线数据通信。l最高12位分辨率,精度可达土0.5摄氏度。l12位分辨率时的最大工作周期为750毫秒。l可选择寄生工作方式。l检测温度范围为55C +125C (67F +257F)l内置EEPROM,限温报警功能。l64位光刻ROM,内置产品序列号,方便多机挂接。l多样封装形式,适应不同硬件系统。4.1.2 DS18B20引脚功能:GND 电源地DQ 单数据总线 数字信号输入/输出端VDD 外接供电电源输入端4.1.3工作原理DS18B20内部有两个晶振,分别是低温度系数晶振和高温度系数晶振低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振 随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在55所对应的一个基数值。计数器1对 低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。4.1.4 DS18B20的写操作(1) 数据线先置低电平“0”。 (2) 延时确定的时间为15微秒。 (3) 按从低位到高位的顺序发送字节(一次只发送一位)。 (4) 延时时间为45微秒。 (5) 将数据线拉到高电平。 (6) 重复上(1)到(6)的操作直到所有的字节全部发送完为止。 (7) 最后将数据线拉高。 4.1.5 DS18B20的读操作 (1)将数据线拉高“1”。 (2)延时2微秒。 (3)将数据线拉低“0”。 (4)延时15微秒。 (5)将数据线拉高“1”。 (6)延时15微秒。 (7)读数据线的状态得到1个状态位,并进行数据处理。 (8)延时30微秒。4.2 DS1302的介绍DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个318的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。5.程序设计5.1 程序设计思路单片机开发最重要的工作是程序设计,其思路就是利用单片机的指令系统,根据应用系统的要求编写单片机的应用程序。5.1.1 对应用系统的需求分析改温度计可以实现数字显示被测温度,测量温度范围是-55100,分辨率可以达到0.1,并且利用时钟电路显示时间,有高低两路限温控制功能,限温控制点可以在范围内自由设置,温度超过要求的温度,会自动报警。5.1.2 程序模块设计1.编写单片机接受温度数据和向温度传感器写命令的函数。2编写单片机向LCD写数据和写命令的函数。3.编写单片机向时钟电路读数据和写命令的函数。4.主函数设计。5.把这些模块再进一步分解为具体的小目标,把每一个小目标采用自顶向下,逐步求精设计方法。5.2主程序流程图6.基于proteus的仿真6.1 仿真结果6.2仿真结果分析本设计达到了预期要求(1)能数字显示被测温度,测量温度范围可以达到0100 (2)分辨率不低于0.5 ; (3)带有计时和时间显示功能; (4)高、低两路限温控制点可在0100 范围内独立设置 ; (5)当温度达到高、低限温控制点发出声光报警。7.总结 通过这次对数字温度计的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才实际接线的。我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我这次课程设计中的最大收获。8.源程序/DS1302头文件/#ifndef _REAL_TIMER_DS1302_2003_7_21_sbit DS1302_CLK = P16; /实时时钟时钟线引脚 sbit DS1302_IO = P17; /实时时钟数据线引脚 sbit DS1302_RST = P15; /实时时钟复位线引脚sbit ACC0 = ACC0;sbit ACC7 = ACC7;typedef struct _SYSTEMTIME_unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char DateString9;unsigned char TimeString9;SYSTEMTIME;/定义的时间类型#define AM(X) X#define PM(X)(X+12) / 转成24小时制#define DS1302_SECOND0x80#define DS1302_MINUTE0x82#define DS1302_HOUR0x84 #define DS1302_WEEK0x8A#define DS1302_DAY0x86#define DS1302_MONTH0x88#define DS1302_YEAR0x8C#define DS1302_RAM(X)(0xC0+(X)*2) /用于计算DS1302_RAM 地址的宏 void DS1302InputByte(unsigned char d) /实时时钟写入一字节(内部函数) unsigned char i; ACC = d; for(i=8; i0; i-) DS1302_IO = ACC0; /相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC 1; unsigned char DS1302OutputByte() /实时时钟读取一字节(内部函数) unsigned char i; for(i=8; i0; i-) ACC = ACC 1; ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302地址, ucData: 要写的数据 DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; unsigned char Read1302(unsigned char ucAddr)/读取DS1302某地址的数据 unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); / 地址,命令 ucData = DS1302OutputByte(); / 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);void DS1302_SetProtect(bit flag) /是否写保护if(flag)Write1302(0x8E,0x10);elseWrite1302(0x8E,0x00);void DS1302_SetTime(unsigned char Address, unsigned char Value) / 设置时间函数DS1302_SetProtect(0);Write1302(Address, (Value/10)Second = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MINUTE);Time-Minute = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time-Hour = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time-Day = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time-Week = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time-Month = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time-Year = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);void DateToStr(SYSTEMTIME *Time)Time-DateString0 = Time-Year/10 + 0;Time-DateString1 = Time-Year%10 + 0;Time-DateString2 = -;Time-DateString3 = Time-Month/10 + 0;Time-DateString4 = Time-Month%10 + 0;Time-DateString5 = -;Time-DateString6 = Time-Day/10 + 0;Time-DateString7 = Time-Day%10 + 0;Time-DateString8 = 0;void TimeToStr(SYSTEMTIME *Time)Time-TimeString0 = Time-Hour/10 + 0;Time-TimeString1 = Time-Hour%10 + 0;Time-TimeString2 = :;Time-TimeString3 = Time-Minute/10 + 0;Time-TimeString4 = Time-Minute%10 + 0;Time-TimeString5 = :;Time-TimeString6 = Time-Second/10 + 0;Time-TimeString7 = Time-Second%10 + 0;Time-DateString8 = 0;void Initial_DS1302()unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80) DS1302_SetTime(DS1302_SECOND,0);#endif/LCD1602头文件/#ifndef LCD_CHAR_1602_2005_4_9#include /Port Definitions*sbit LcdRs= P20;sbit LcdRw= P21;sbit LcdEn = P22;sfr DBPort = 0xB0;/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/内部等待函数*unsigned char LCD_Wait()LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_();LcdEn=0;return DBPort;/向LCD写入命令或数据*#define LCD_COMMAND0 / Command#define LCD_DATA1 / Data#define LCD_CLEAR_SCREEN0x01 / 清屏#define LCD_HOMING 0x02 / 光标返回原点void LCD_Write(bit style, unsigned char input)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();/注意顺序LcdEn=1;_nop_();/注意顺序LcdEn=0;_nop_();LCD_Wait();/设置显示模式*#define LCD_SHOW0x04 /显示开#define LCD_HIDE0x00 /显示关 #define LCD_CURSOR0x02 /显示光标#define LCD_NO_CURSOR0x00 /无光标 #define LCD_FLASH0x01 /光标闪动#define LCD_NO_FLASH0x00 /光标不闪动void LCD_SetDisplay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND, 0x08|DisplayMode);/设置输入模式*#define LCD_AC_UP0x02#define LCD_AC_DOWN0x00 / default#define LCD_MOVE0x01 / 画面可平移#define LCD_NO_MOVE0x00 /defaultvoid LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COMMAND, 0x04|InputMode);/初始化LCD*void LCD_Initial()LcdEn=0;LCD_Write(LCD_COMMAND,0x38); /8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC递增, 画面不动void GotoXY(unsigned char x, unsigned char y)if(y=0)LCD_Write(LCD_COMMAND,0x80|x);if(y=1)LCD_Write(LCD_COMMAND,0xC0|x);if(y=2)LCD_Write(LCD_COMMAND,0x90|x);if(y=3)LCD_Write(LCD_COMMAND,0XD0|x);void Print(unsigned char *str)while(*str!=0)LCD_Write(LCD_DATA,*str);str+;#endif/C文件/#include#include#include#define uchar unsigned char#define uint unsigned intsbit DQ=P26; sbit RS=P20;sbit RW=P21;sbit EN=P22;sbit alarm=P13;unsigned char code str1=H:30C L:10C;char t,f1;uchar data disdata10=0,0,0,0x2e,0,0x43,0x20,0x20,0x20,0x20;uint tvalue,temp1; uchar tflag; /温度正负标志uchar flagdat;void delay1ms(uint ms) uint i; while(ms-) for(i=0;i0;i-) DQ = 0; dat=1; DQ=1; if(DQ) dat|=0x80;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论