当前位置:文档之家› DS18B20温度测量设计实验报告2

DS18B20温度测量设计实验报告2

信息工程学院成绩课程设计说明书(论文)题目: 温度测量课程名称: 单片机课程设计专业: 电子信息工程班级: 电信0901学生姓名:学号: 31 16 10设计地点: 3#北603指导教师:设计起止时间:2012年5月2日至2012年5月22日目录一、设计功能要求: (3)二、系统总体设计方案: (5)1、基本设计思想: (5)2、实施方案论述: (6)三、系统分析与设计: (6)1、程序流程图及说明 (6)2、温度计的的电路设计 (9)四、源码清单: (12)五、改进意见与收获体会: (18)六、主要参考资料: (19)一、设计功能要求:本次的设计主要是利用了数字温度传感器DS18B20测量温度信号,计算后可以在LCD数码管上显示相应的温度值。

其温度测量范围为-55~125℃,精确到0.5℃。

本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。

数字温度计所测量的温度采用数字显示,控制器使用单片机89C51,测温传感器使用DS18B20,用LCD1602实现温度显示。

从温度传感器DS18B20可以很容易直接读取被测温度值,进行转换即满足设计要求。

本次使用的单片机89C51和MCS-51是完全兼容的,是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压、高性能CMOS8位微处理器。

其主要特点如下:•8位CPU。

•工作频率最高为24M。

•128B数据存储器。

•4KB程序存储器。

•程序存储器的寻址空间为64KB。

•片外数据存储器的寻址空间为64KB。

•128个用户位寻址空间。

•21个字节特殊功能寄存器。

•4个8位的并行I/O接口:P0、P1、P2、P3。

•两个16位定时/计数器。

•两个优先级别的5个中断源。

•1个全双工的串行I/O接口,可多机通信。

•111条指令,喊乘法指令和除法指令。

•较强的位处理能力。

•采用单一+5V电源。

对于89C52而言,不同之处在于:有256B的数据存储器、8K的程序存储器、全双工串行I/O接口、6个中断源、3个16位定时/计数器,工作频率可升直33Mhz。

比51拥有更高的性能。

单片机要对DS18B20进行读写,主要通过如下子程序进行驱动。

(1)复位:在使用DS18B20时,首先需要对单片机进行复位。

复位时,单片机给DS18B20的单总线至少480us的低电平信号。

当DS18B20检测到此复位信号后会在15-60us内给出一个一个存在脉冲。

该存在脉冲是是一个60-240us的低电平信号。

为了能够接收到此低电平,需要单片机在复位电平结束之后将总线拉高。

(2)ROM指令:包括读ROM指令,指定匹配芯片、跳跃ROM、芯片搜索、报警芯片搜索。

ROM指令为8位长度,功能是对片内的64位光刻ROM 进行操作。

其主要目的是为了分辨总线上的多个器件。

不过,在本系统中由于只有一个DS18B20,所以不需要进行ID辨识,所以可以采用一条特殊的跳过指令。

具体指令可以参看其datasheet。

(3)发送存储器操作指令:在ROM指令发送给DS18B20后,紧接着需要向它发送存储器操作指令,操作指令同样为8位,共六条,分别是写RAM 数据、读RAM数据、将RAM数据复制到EEPROM、温度转换、将EEPROM 中的报警值复制到RAM、工作方式切换。

(4)执行和读写操作:一个存储器操作指令结束后则将进行指令执行或数据读写。

如果是进行温度转换,需要等待DS18B20执行其指令,转换时间一般为500us。

DS18B20温度值格式默认的12位转化后得到的12位数据,存储在18B20的两个8比特的RAM 中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。

如图:DS18B20常用ROM指令:指令约定代码功能二、系统总体设计方案1、基本设计思想基本设计方案:根据DS18B20的通讯协议,单片机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM 指令,最后发送RAM 指令,这样才能对DS18B20进行预定的操作。

复位要求主CPU 将数据线下拉500微秒,然后释放,当DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU 收到此信号表示复位成功。

于是,给DS18B20不同的时序,可以读取温度传感器的值,根据温度算法算出当时的温度值,在给显示部分,通过LCD 显示出来。

读ROM 33H 读DS1820温度传感器ROM 中的编码(即64位地址符合 ROM 55H 发出此命令之后,接着发出 64 位 ROM 编码,访问单总线上与该编码相对应的 DS1820 使之作出响应,为下一步对该 DS1820 的读写作准备。

搜索 ROM 0FOH 用于确定挂接在同一总线上 DS1820 的个数和识别 64 位 ROM 地址。

为操作各器件作好准备。

跳过 ROM 0CCH 忽略 64 位 ROM 地址,直接向 DS1820 发温度变换命令。

适用于单片工作。

告警搜索命令0ECH执行后只有温度超过设定值上限或下限的片子才做出响应。

2、实施方案论述这个课题主要实现温度的检测以及通过数码管显示这两个大功能,以及读取这个相对较为容易的功能。

因此在温度检测这一模块上,利用DS18B20这一目前比较先进的温度传感器,可以很精确地感测实时温度,对于DS18B20的通讯协议的控制,读取测量的温度值,经过一定的算法,可以把温度转化为十进制,分别为高位和低位,先暂存起来。

经显示模块调用,最终在LCD 上显示。

电路方框图二、系统分析与设计1、程序流程图及说明主函数完成对DS18B20的初始化,读取温度的转换值,调用数据处理的子程序然后再生成显示代码,再将温度显示出来,然后根据温度显示的代码判断温度值可以判断它的值是否超出了预设的范围。

然后返回到主函数开始的位置,无论温度值是否超出预设值,程序都会返回开始的位置,重复循环。

时钟电路C51主控电路 DS18B20复位电路 显示电路开始始初始化、设置常量调用DS18B20初始化子程序读温度转换值调用数据处理子程序生成显示码显示温度值主函数流程图DQ置1DS18B20复位FLAG=?1发送OCCH 命令,跳过ROM 匹配发送温度转换命令44H延时750us以上DS18B20初始化跳过ROM匹配发送温度命令OBEH调用读数据子程序返回DS18B20复位子程序DQ置1DQ置0延时至少573msDQ置1短延时等待DS18B20回应DQ=?0F L A G置0FLAG置1延时DQ置1温度值子程序2、温度计的的电路设计温度计采用AT89C51单片机作为微处理器,温度计系统的外围接口电路由晶振、LCD显示电路、复位电路、温度检测电路、LCD驱动电路。

温度计系统的的硬件电路图如下图所示。

温度计的工作过程是:初始化其接收需要检测的温度,并一直处于检测状态,并将检测到的温度值读取,并转化为十进制数值,通过LCD显示出来,再显示温度,方便用户来读数使用记录数据。

具体实现方法是:单片机将从P2.2管脚读进来的数据进行处理,P0.1到P0.7为数码管的段选端口,通过RP1的驱动对LCD进行驱动。

硬件电路原理图时钟电路复位电路显示电路温度检测电路三、源码清单#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}sbit DQ = P3^3;sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;uchar code Temp_Disp_Title[]={"Current Temp : "}; uchar Current_Temp_Display_Buffer[]={" TEMP: "};uchar code Temperature_Char[8] ={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};uchar CurrentT = 0;uchar Temp_Value[]={0x00,0x00}; uchar Display_Digit[]={0,0,0,0};bit DS18B20_IS_OK = 1;void DelayXus(uint x){uchar i;while(x--){for(i=0;i<200;i++);}}bit LCD_Busy_Check(){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0&0x80);LCD_EN=0;return result;}void Write_LCD_Command(uchar cmd) {while(LCD_Busy_Check());LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_();P0 = cmd;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}void Write_LCD_Data(uchar dat) {while(LCD_Busy_Check());LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}void LCD_Initialise(){Write_LCD_Command(0x01);DelayXus(5);Write_LCD_Command(0x38);DelayXus(5);Write_LCD_Command(0x0c);DelayXus(5);Write_LCD_Command(0x06);DelayXus(5);}void Set_LCD_POS(uchar pos){Write_LCD_Command(pos|0x80); }void Delay(uint x){while(--x);}uchar Init_DS18B20() {uchar status;DQ = 1;Delay(8);DQ = 0;Delay(90);DQ = 1;Delay(8);DQ = 1;return status;}uchar ReadOneByte() {uchar i,dat=0;DQ = 1;_nop_();for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;_nop_();_nop_();if(DQ)dat |= 0X80;Delay(30);DQ = 1;}return dat;}void WriteOneByte(uchar dat){uchar i;for(i=0;i<8;i++){DQ = 0;DQ = dat& 0x01;Delay(5);DQ = 1;dat >>= 1;}}void Read_Temperature(){if(Init_DS18B20()==1)DS18B20_IS_OK=0;else{WriteOneByte(0xcc);WriteOneByte(0x44);Init_DS18B20();WriteOneByte(0xcc);WriteOneByte(0xbe);Temp_Value[0] = ReadOneByte();Temp_Value[1] = ReadOneByte();DS18B20_IS_OK=1;}}void Display_Temperature(){uchar i;uchar t = 150, ng = 0;if((Temp_Value[1]&0xf8)==0xf8){Temp_Value[1] = ~Temp_Value[1];Temp_Value[0] = ~Temp_Value[0]+1;if(Temp_Value[0]==0x00)Temp_Value[1]++;ng = 1;}Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4); Display_Digit[3] = CurrentT/100;Display_Digit[2] = CurrentT%100/10;Display_Digit[1] = CurrentT%10;Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';Current_Temp_Display_Buffer[10] = '.';Current_Temp_Display_Buffer[9] = Display_Digit[1] + '0';Current_Temp_Display_Buffer[8] = Display_Digit[2] + '0';Current_Temp_Display_Buffer[7] = Display_Digit[3] + '0';if(Display_Digit[3] == 0)Current_Temp_Display_Buffer[7] = ' ';if(Display_Digit[2] == 0&&Display_Digit[3]==0)Current_Temp_Display_Buffer[8] = ' ';if(ng){if(Current_Temp_Display_Buffer[8] == ' ')Current_Temp_Display_Buffer[8] = '-';else if(Current_Temp_Display_Buffer[7] == ' ')Current_Temp_Display_Buffer[7] = '-';elseCurrent_Temp_Display_Buffer[6] = '-';}Set_LCD_POS(0x00);for(i=0;i<16;i++){Write_LCD_Data(Temp_Disp_Title[i]);}Set_LCD_POS(0x40);for(i=0;i<16;i++){Write_LCD_Data(Current_Temp_Display_Buffer[i]);}Set_LCD_POS(0x4d);Write_LCD_Data(0x00);Set_LCD_POS(0x4e);Write_LCD_Data('C');}void main(){LCD_Initialise();Read_Temperature();Delay(50000);Delay(50000);while(1){Read_Temperature();if(DS18B20_IS_OK)Display_Temperature();DelayXus(100);}}五、改进意见与收获体会:可以加入自动报警系统,方便用于实际的用途,可以在实际的应用中达到自动检测报警的效果,方便人们对于温度的检测。

相关主题