基于单片机的多点温度检测系统设计.doc_第1页
基于单片机的多点温度检测系统设计.doc_第2页
基于单片机的多点温度检测系统设计.doc_第3页
基于单片机的多点温度检测系统设计.doc_第4页
基于单片机的多点温度检测系统设计.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

集成电路课程设计集成电路课程设计 课课 题:题:基于基于 AT89C51 单片机的多点温度测量系统设计单片机的多点温度测量系统设计 姓姓 名:名: 韩颖韩颖 班班 级:级: 测控测控 12-112-1 学学 号:号: 120123107073120123107073 指导老师:指导老师: 汪玉坤汪玉坤 日日 期:期: 2014-112014-11 目目 录录 一、一、绪论 二、总体方案设计二、总体方案设计 三、硬件系统设计硬件系统设计 1 主控制器 2 显示模块 3 温度采集模块 (1)DS18B20 的内部结构 (2) 高速暂存存储器 (3) DS18B20 的测温功能及原理 (4)DS18B20 温度传感器与单片机的连接 (5)单片机最小系统总体电路图 四、系统软件设计四、系统软件设计 五、系统仿真五、系统仿真 六、设计总结六、设计总结 七、参考文献七、参考文献 八、附源程序代码八、附源程序代码 一、绪论一、绪论 在现代工业控制中和智能化仪表中,对于温度的控制,恒温等有较高的要求,如对食品 的管理,冰箱的恒温控制,而且现在越来越多的地方用到多点温度测量,比如冰箱的保鲜 层和冷冻层是不同的温度这就需要多点的测量和显示可以让用户直观的看到温度值,并根 据需要调节冰箱的温。它还在其他领域有着广泛的应用,如:消防电气的非破坏性温度检 测,电力、电讯设备之过热故障预知检测,空调系统的温度检测。 。 。 。 。 。温度检测系统应用 十分广阔。 本设计采用 DALLAS 最新单线数字温度传感器 DS18B20 简介新的“一线器件“体积更小、 适用电压更宽、更经济 DALLAS 半导体公司的数字化温度传感器 DS18B20 是世界上第一片 支持“一线总线“,测量温度范围为-55C+125C,在-10+85C 范围内,精度为0.5 二、设计过程及工艺要求二、设计过程及工艺要求 1、基本功能 (1)检测两点温度 (2)两秒间隔循环显示温度 2、主要技术参数 测温范围:-30到+99 测量精度:0.0625 显示精度:0.1 显示方法:LCD 循环显示 3、系统设计 系统使用 AT89C51 单片机对两个 DS18B20 进行数据采集,并通过 1602LCD 液晶显示 器显示所采集的温度。 DS18B20 以单总线协议工作,51 单片机首先分别发送复位脉冲,使信号上所有的 DS18B20 芯片都被复位,程序先跳过 ROM,启动 DS18B20 进行温度变换,再读取存储器 的第一位和第二位读取温度,通过 I/O 口传到 1602LCD 显示。 DS18B 20 1 2 3 图(1)DS18B20 引脚图 引脚定义如图(1): (1) GND 为电源地; (2) DQ 为数字信号输入/输出端; (3) Vcc 为外接供电电源输入端(在寄生电源接线方式时接地) 。 4、设计原理框图 DS18B20(1 ) DS18B20(2 ) 1620LCD 图(2)原理框图 三、硬件设计三、硬件设计 1 1、主控制器(单片机)、主控制器(单片机) 基于设计的要求要使用 AT89C51 单片机作为本系统设计的核心器件。 由于 AT89C51 单片机是一种带 4K 字节闪烁可编程可擦除只读存储器的低电压, 高性能 cMOS8 位微处理器。该器件采用 ATMEL 高密度非易失存储器制造技术 制造,与工业标准的 MCS-51 指令集和输出管脚相兼容。由于将多功能 8 位 CPU 和闪烁存储器组合在单个芯片中,ATMEL 的 AT89C51 是一种高效微控制器, 为很多嵌入式控制系统提供了一种灵活性高且价廉的方案,所以本系统采用 AT89C51 单片机作为系统的主控制器。其特点如下: 4K 字节可编程闪速程序存储器:1000 次循环写/擦 全静态工作:OHz-24MHz 三级程序存储器锁定 128 X 8 位内部数据存储器,32 条可编程 I/0 线 两个十六位定时器/计数器,六个中断源 可编程串行通道,低功耗闲置和掉电模式 2.2. 显示模块显示模块 本设计要求用 LCD 显示器来显示测出的温度。LCD 系列中 LM016L 型号的为 2 行 16 列液晶,可显示 2 行 16 列英文字符,有 8 位数据总线 D0- D7,RS,R/W,EN 三个控制端口(共 14 线) ,工作电压为 5V。没背光,和常用 的 1602B 功能和引脚一样(除了调背光的二个线脚) 。可以完全实现本设计的显 示功能。 3.3.温度采集模块温度采集模块 本设计用的是 DS18B20 温度传感器,它是美国 DALLAS 半导体公司最新 推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能 直接读出被测温度,并且可根据实际要求通过简单的编程实现 912 位的数字 值读数方式。 DS18B20DS18B20 内部结构内部结构 (1) DS18B20 的内部结构如下图所示。 最小 AT89 C51 系统 图(3) DS18B20 内部结构图 DS18B20 有 4 个主要的数据部件: 64 位激光 ROM。64 位激光 ROM 从高位到低位依次为 8 位 CRC、48 位序列号和 8 位家族 代码(28H)组成。 温度灵敏元件。 非易失性温度报警触发器 TH 和 TL。可通过软件写入用户报警上下限值。 配置寄存器。配置寄存器为高速暂存存储器中的第五个字节。DS18B20 在 0 工作时按此 寄存器中的分辨率将温度转换成相应精度的数值,其各位定义如图(4)所示。 TMR1R011111 MSB DS18B20 配置寄存器结构图 LSB 图(4) 其中,TM:测试模式标志位,出厂时被写入 0,不能改变;R0、R1:温度计分辨率设 置位,其对应四种分辨率如下表所列,出厂时 R0、R1 置为缺省值:R0=1,R1=1(即 12 位 分辨率),用户可根据需要改写配置寄存器以获得合适的分辨率。 配置寄存器与分辨率关系表 : R0R1 温度计分辨率/bit最大转换时间/us 00993.75 0110187.5 1011375 1112750 图(5) (2) 高速暂存存储器 高速暂存存储器由 9 个字节组成,其分配如下图所示。当温度转换命令发布后,经转 换所得的温度值以二字节补码形式存放在高速暂存存储器的第 0 和第 1 个字节。单片机可 通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如图所示。对应的温度 计算:当符号位 S=0 时,直接将二进制位转换为十进制;当 S=1 时,先将补码变为原码, 再计算十进制值。 温度低位温度高位 THTL 配置保留保留保留8 位 CRC LSB DS18B20 存储器映像图 MSB 图(6) (3) DS18B20 的测温功能及原理 温度值格式图 DS18B20 温度数据表: 23232222212120202-12-12-22-22-32-32-42-4 MSBMSBLSBLSB S SS SS SS SS S262625252424 图(7) 典型对应的温度值表: 温度/二进制表示十六进制表示 +125 +25.0625 +10.125 +0.5 0 -0.5 -10.125 -25.0625 -55 00000111 11010000 00000001 10010001 00000000 10100010 00000000 00001000 00000000 00000000 11111111 11111000 11111111 01011110 11111110 01101111 11111100 10010000 07D0H 0191H 00A2H 0008H 0000H FFF8H FF5EH FE6FH FC90H 图(8)典型对应的温度值表 (4)DS18B20 温度传感器与单片机的连接 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 X1 12MHz C1 22pF C2 22pF GND C3 20uF R1 1k +5V GND 图(9)单片机最小系统 LCD 显示屏电路: +5V D7 14 D6 13 D5 12 D4 11 D3 10 D2 9 D1 8 D0 7 E 6 RW 5 RS 4 VSS 1 VDD 2 VEE 3 LCD1 LM016L 2 3 4 5 6 7 8 9 1 RP1 10K +5V 图(10)LCD 显示屏电路 (5)具体总体电路图如下: XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 30.8 DQ 2 VCC 3 GND 1 FIRST DS18B20 +5V D7 14 D6 13 D5 12 D4 11 D3 10 D2 9 D1 8 D0 7 E 6 RW 5 RS 4 VSS 1 VDD 2 VEE 3 LCD1 LM016L X1 12MHz C1 22pF C2 22pF GND C3 20uF R1 1k +5V GND 2 3 4 5 6 7 8 9 1 RP1 10K +5V 17.2 DQ 2 VCC 3 GND 1 SECOND DS18B20 图(11)总体硬件图 四、软件设计四、软件设计 1、主程序方案 主程序调用了 4 个子程序和一个欢迎开机画面的程序,4 个子程序分别是液晶初始化、 DS18B201 的初始化、DS18B202 的初始化、和液晶显示数据的程序。 (1)液晶初始化程序:8 位数据端口,2 行显示,5*7 点阵、开启显示, 无光标、清屏、AC 递增, 画面不动。 (2)分别对两个 DS18B20 温度传感器初始化程序:初始化,读写一个字节, (3)液晶显示的子程序:确定液晶字符的输入位置,将字符输出到液晶显示 (4)液晶显示温度程序:先读 DS18B20 当前温度,将温度转化成液晶字符显示。 将各个功能程序以子程序的形式写好,当写主程序的时候,只需要调用子程序调用指令 使得程序结构清晰,无论是修改还是维护都比较方便。将功能程序段写成子程序的形式, 除了方便调用之外,还有一个好处那就是以后写程序的时候如果要用到,就可以直接调用 这个单元功能模块。 2、流程图 主程序流程图: 开始 液晶初始化 两个 DS18B20 初始化 显示开机画面 延时 2 秒 显示第一个温度 延时 2 秒 显示第二个温度 延时 2 秒 图(11)主程序流程图 开始 功能设置(0x38) 16*2 显示 8 位数据、5*7 点阵 不忙检测,执行三次 延时 5ms 开显示,无光标 (0xc0) 延时 5ms 设置输入模式 (0x06) 延时 5ms 清除显示器 (0x01) 延时 5ms 退出返回 图(12)液晶初始化流程图 DS18B20 初始化 发跳过 ROM 命令 发温度读取命令 清 DQ 准备发送 延时 1us 以上 读一位数据 延时 #include #include #define uint unsigned int #define uchar unsigned char uchar temp_value; /温度值 uchar TempBuffer7; void show_time(); /液晶显示程序 uchar temp_value1; /温度值 uchar TempBuffer17; char xiaoshu=0; char xiaoshu1=0; void show_time1(); /*1602 液晶显示部分子程序*/ char done,count,temp,flag,up_flag,down_flag; /Port Definitions* sbit LcdRs= P20; sbit LcdRw= P21; sbit LcdEn = P22; sfr DBPort = 0x80;/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口 sbit DQ = P17; /温度传送数据 IO 口 sbit DQ1=P16; /内部等待函数 * unsigned char LCD_Wait(void) LcdRs=0; LcdRw=1;_nop_(); LcdEn=1;_nop_(); LcdEn=0; return DBPort; /向 LCD 写入命令或数据 * #define LCD_COMMAND0 / Command #define LCD_DATA1 / Data #define LCD_CLEAR_SCREEN 0x01 / 清屏 #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 /default void 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,0x80|(x-0x40); /将字符输出到液晶显示 void Print(unsigned char *str) while(*str!=0) LCD_Write(LCD_DATA,*str); str+; /*ds18b20 子程序*/ /*ds18b20 延迟子函数(晶振 12MHz )*/ void delay_18B20(unsigned int i) while(i-); /*ds18b20 初始化函数*/ void Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ 复位 delay_18B20(8); /稍做延时 DQ = 0; /单片机将 DQ 拉低 delay_18B20(80); /精确延时 大于 480us DQ = 1; /拉高总线 delay_18B20(14); x=DQ; /稍做延时后 如果 x=0 则初始化成功 x=1 则初始化失败 delay_18B20(20); /*ds18b20 读一个字节*/ unsigned char ReadOneChar(void) uchar i=0; uchar dat = 0; for (i=8;i0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); return(dat); /*ds18b20 写一个字节*/ void WriteOneChar(uchar dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat delay_18B20(5); DQ = 1; dat=1; /*读取 ds18b20 当前温度*/ void ReadTemp(void) unsigned char a=0; unsigned char b=0; char t; long tt; Init_DS18B20(); WriteOneChar(0xCC); / 跳过读序号列号的操作 WriteOneChar(0x44); / 启动温度转换 delay_18B20(100); / this message is wery important Init_DS18B20(); WriteOneChar(0xCC); /跳过读序号列号的操作 WriteOneChar(0xBE); /读取温度寄存器等(共可读 9 个寄存器) 前两个就是温度 delay_18B20(100); a=ReadOneChar(); /读取温度值低位 b=ReadOneChar(); /读取温度值高位 temp_value=b4; t=a tt=t*625; xiaoshu=tt/1000; void temp_to_str() /温度数据转换成液晶字符显示 TempBuffer0=temp_value/10+0; /十位 TempBuffer1=temp_value%10+0; /个位 TempBuffer2=.; TempBuffer3=xiaoshu+0; TempBuffer4=0xdf; TempBuffer5=C; TempBuffer16=0; void Delay1ms(unsigned int count) unsigned int i,j; for(i=0;i0;i-) DQ1 = 0; / 给脉冲信号 dat=1; DQ1 = 1; / 给脉冲信号 if(DQ1) dat|=0x80; delay_18B20(4); return(dat); /*ds18b201 写一个字节*/ void WriteOneChar1(uchar dat) unsigned char i=0; for (i=8; i0; i-) DQ1 = 0; DQ1 = dat delay_18B20(5); DQ1 = 1; dat=1; /*读取 ds18b201 当前温度*/ void ReadTemp1(void) unsigned char a=0; unsigned char b=0; unsigned char t=0; long tt; Init_DS18B201(); WriteOneChar1(0xCC); / 跳过读序号列号的操作 WriteOneChar1(0x44); / 启动温度转换 delay_18B20(100); / this message is wery important Init_DS18B201(); WriteOneChar1(0xCC); /跳过读序号列号

温馨提示

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

评论

0/150

提交评论