路多智能温度测控系统设计课程设计毕业设计.docx

上传人:b****1 文档编号:160086 上传时间:2023-04-28 格式:DOCX 页数:28 大小:335.31KB
下载 相关 举报
路多智能温度测控系统设计课程设计毕业设计.docx_第1页
第1页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第2页
第2页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第3页
第3页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第4页
第4页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第5页
第5页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第6页
第6页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第7页
第7页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第8页
第8页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第9页
第9页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第10页
第10页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第11页
第11页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第12页
第12页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第13页
第13页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第14页
第14页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第15页
第15页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第16页
第16页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第17页
第17页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第18页
第18页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第19页
第19页 / 共28页
路多智能温度测控系统设计课程设计毕业设计.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

路多智能温度测控系统设计课程设计毕业设计.docx

《路多智能温度测控系统设计课程设计毕业设计.docx》由会员分享,可在线阅读,更多相关《路多智能温度测控系统设计课程设计毕业设计.docx(28页珍藏版)》请在冰点文库上搜索。

路多智能温度测控系统设计课程设计毕业设计.docx

路多智能温度测控系统设计课程设计毕业设计

电子技术课程设计

 

题目:

多路智能温度测控系统设计

 

学院计算机与通信工程学院

专业 通信工程

学号 20081672

姓名 ***

指导老师 ***

2011年5月

 

目录

摘要……………………………………………………………………3

关键字…………………………………………………………………3

前言……………………………………………………………………3

一.Proteus内容简介4

二、设计目的4

三、设计内容4

四、DS18B20简介5

五、单片机简介9

六、基本设计原理9

七、设计步骤10

八、Proteus设计图11

九、Proteus仿真调试11

十、软件设计13

结语总结………………………………………………………………14

参考文献………………………………………………………………14

附录115

附录217

 

摘要:

本文介绍了数字温度传感器DS18B20测温的基本原理以及基于DS18B20的多点温度测量系统的设计过程,包括软件设计和硬件设计两大部分。

软件部分给出了软件设计思想及软件流程图,硬件部分给出了单片机、测温电路、显示电路设计。

单片机使用AT89C52单片机,温度传感器使用美国DALLAS公司最新推出的DS18B20数字式温度传感器,显示模块采用LCD显示。

基于DS18B2O的多点测温系统在实际中应用广泛,测温系统简单、测温精度高、连接方便、占用口线少、转换速度快、给硬件电路设计工作带来极大的方便并且缩短了开发周期。

关键词:

DS18B20多点温度测量单片机Proteus仿真

前言

随着电子技术的快速发展,我们生活中的方方面面几乎都充斥着电子产品,我们也无时无刻不享受着电子技术带给我们的便利。

作为电子专业的大学生,我们应当在享受电子生活带给我们的便捷的同时,应该更多的理解与思考电子产品的设计过程,并能在已有的集成芯片和单片机等微控制器的基础上,自己动手亲身体验电子设计的过程,以便于将课本上的理论实践化,做到学以致用,更好的掌握单片机等元器件的应用,锻炼独立解决问题的能力。

本课程设计题目是基于DS18B20的多路智能温度测控系统设计,主要介绍了DS18B20的工作过程和原理,以及基于它的系统设计。

在这个设计里,根据要求设计了两个DS18B20与单片机之间的单端口通信,可以推广到多个DS18B20。

通过学习了解掌握了Proteus原理图设计及仿真方法,熟悉Keil开发环境。

在设计过程中参考或引用了《基于PROTEUS的电路及单片机系统设计与仿真》,DS18B20数据手册等参考资料以及网络上的相关资料。

在此,向这些技术资料的作者表示感谢。

由于设计者的学识水平有限,加之时间仓促,作品不够完善,不足之处在所难免,敬请老师指导和改正。

 

一.Proteus内容简介

Proteus软件是英国Labcenterelectronics公司出版的EDA工具软件。

它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。

它是目前最好的仿真单片机及外围器件的工具。

Proteus从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。

是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086、MSP430、Cortex和DSP系列处理器。

它是能进行模拟电路、数字电路、模数混合电路、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD、LED系统的设计与仿真的平台。

Proteus具备原理图设计、电路分析与仿真、PCB设计功能,可以通过调入程序的编译结果.hex或.cof文件来调试单片机程序,还可直接嵌入到Microchip公司的单片机调试软件MPLABIDE中,进行程序的调试和仿真。

二、设计目的

1、掌握单片机基本编程技术及外围电路的搭建

2、熟练掌握DS18B20的基本操作并了解其工作原理

3、熟练掌握Proteus原理图设计及仿真

三、设计内容

1、单片机最小系统设计

2、DS18B20与单片机的单口通信设计

3、Proteus原理图的绘制与仿真

4、单片机程序编写

四、DS18B20简介

DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。

因此用它来组成一个测温系统,可以节约硬件资源,而且使用较为方便。

DS18B20产品的特点

(1)只要求一个端口即可实现通信。

(2)在DS18B20中的每个器件上都有独一无二的序列号。

(3)实际应用中不需要外部任何元器件即可实现测温。

(4)测量温度范围在-55°C到+125°C之间。

(5)数字温度计的分辨率用户可以从9位到12位选择。

(6)内部有温度上、下限告警设置。

DS18B20的引脚介绍

TO-92封装的DS18B20的引脚排列见下图

DS18B20的使用方法

由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。

由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。

DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。

该协议定义了几种信号的时序:

初始化时序、读时序、写时序。

所有时序都是将主机作为主设备,单总线器件作为从设备。

而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。

数据和命令的传输都是低位在先。

(此图为以下时序图的图例)

DS18B20的复位时序

DS18B20的读时序

对于DS18B20的读时序分为读0时序和读1时序两个过程。

对于DS18B20的读时隙是从主机把单总线拉低之后,在15us之内释放单总线,以让DS18B20把数据传输到单总线上。

DS18B20进行一个读时序过程,至少需要60us才能完成。

(下图左边为读“0”时序,右边为读“1”时序)

DS18B20的写时序

对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。

对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。

(下图左边为读“0”时序,右边为读“1”时序)

单片机检测到DS18B20的存在,即可向其发送ROM操作命令

每一片DS18B20在其ROM中都存有其唯一的64位序列号,在出厂前已写入片内ROM中,主机在进入操作程序前必须逐一接入18B20用读ROM(33H)命令将该18B20的序列号读出并登陆。

当主机需要对众多在线18B20进行操作是,首先要发出匹配ROM命令(55H)之后的操作就是针对该18B20的。

而所谓跳过ROM命令即为:

之后的操作是对所有18B20的框图中先有跳过ROM,即是启动所有18B20进行温度变换之后,通过匹配ROM再逐一地读回每个18B20的温度数据。

在18B20组成的测温系统中,主机在发出跳过ROM命令之后,再发出统一的温度转换启动码44H就可以实现所有18B20的统一转换,再经过1s后,就可以用很少的时间去逐一读取。

64-bitROM数据结构图:

低8位为产品类型编码(DS18B20均为10h),中间48位为每个器件唯一的序号,高8位为CRC(循环冗余校验)码。

DS18B20中有用于存储测得的温度值的两个8位RAM存储器,编号为0号到1号。

1号存储器存放温度值的符号,如果温度为负,则1号存储器8位全为1,否则全为0。

0号存储器用于存放温度值的补码,LSB(最低位)的“1”表示0.5摄氏度。

将存储器中的二进制数求补再转化成十进制数并处以2就得到被测温度值(-55摄氏度—125摄氏度)。

温度/数据转换关系

转换示例

五、单片机简介

单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。

单片微型计算机简称单片机,是典型的嵌入式微控制器(MicrocontrollerUnit),常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。

六、基本设计原理

单片机在本设计中充当了重要的角色,是整个温度测控系统的核心,作为控制中心而存在,与本设计中的另一个重要部分DS18B20进行数据通信并控制LCD液晶屏显示输出,完成了整个多点温度的测控任务,DS18B20、AT89C52单片机、LCD液晶屏构成了整个多点温度测控系统。

本设计共采用了2片DS18B20芯片并接于P1.1口采用AT89C52作为控制中心与DS18B20完成单口通信,读取DS18B20采集的温度信息,并经过处理交由1602LCD显示。

本设计出于只阐述说明原理考虑只使用了2片DS18B20芯片,并外接了一个开关用于这2片芯片温度数据之间的切换。

系统框图如下所示。

 

系统框图

 

七、设计步骤

1、查阅DS18B20芯片datasheet,熟悉其工作原理

2、在Proteus环境下绘制系统原理图

3、在Keil开发环境下编写程序

4、将程序导入Proteus下仿真

5、根据仿真结果改写程序

6、撰写设计报告

八、Proteus设计图

说明:

左下角为两个DS18B20芯片,DQ端同接于AT89C52的P1.1口,右上角为1602LCD,P3.3口接开关,通过它的开关切换两片DS18B20之间的温度显示。

九、Proteus仿真调试

在Proteus中使用多个DS18B20时,必须改变器件的属性,使仿真中的每个器件序列号各不相同。

具体做法:

右击DS18B20,选中EditProperties选项,在其中改变ROMSerialNumber的值(在该对话框下还可以改变Granularity的数值,即改变每次调整温度的额度)。

在Proteus中,可以人为改变3个字节的器件序列号。

要想得到全部8个字节,一个简单的方法就是每一次总线上只连接一个器件,利用0x33读器件序列号的命令在程序中得到完整的器件序列号。

将测试序列号的程序烧入Proteus下AT89C51中,程序中定义通信端口为P1.1只需将DS18B20依次与单片机连接即可。

并在运行中点击菜单项debug,选中watchwindow,按alt+A,即出现图1所示对话框,在Name项中输入a,在Address项中输入0x08,点击add,在WatchWindow窗口中即可看到序列号低八位的值。

然后依次输入0x09—0x0f,再点击done键,即可获得所有64位序列号。

所得序列号如图2所示(本设计共用了两个DS18B20)。

测试程序详见附录1

程序中包含向DS18B20发送一个字节,读取一个字节,以及DS18B20的初始化等子程序。

 

 

图1

 

图2

十、软件设计

1、软件流程图

主程序流程图DS18B20读取温度流程图

 

 

2、关键模块说明

本程序由主函数main.c、头文件ds18b20.h、lcd1602.h(为便于调用特将其编为.h文件)三部分组成。

主函数main.c中处理了由DS18B20采集的温度信息并交由1602LCD显示,并设置了

一个开关,当打开开关显示1ST的温度,闭合开关显示2ND的温度。

ds18b20.h是DS18B20的驱动程序,包含了DS18B20的初始化函数、读写一个字节的函数、匹配ROM函数、温度读取函数。

Lcd1602.h是1602LCD的驱动程序,包含了LCD初始化等程序,使用时只需在主程序中调用GotoXY()函数即可让LCD1602显示字母数字等信息。

具体程序见附录2。

结语总结

在本次课程设计中,我对于芯片的学习能力有了一定了提高,对于初次接触的DS18B20芯片能通过阅读它的数据手册了解其使用方法,并付诸于软件编程思想。

在设计中碰到了一些困难,如在实现多个DS18B20的单总线通信时,遇到了编程上的瓶颈,接着又在Proteus仿真中遇到了不会读取DS18B20的序列号的困难,幸而被一一克服,才得以完成本设计最终的仿真实现。

第一次亲自动手编写此类较为冗长的程序,将所学的C语言运用到实际,才发现实践总是高于理论的,在实际应用中总会出现困难。

在完成本设计后,本人感觉工程设计能力有较大的提升,培养了系统的思维能力,总之得到了很好的锻炼。

参考文献

1、唐颖.单片机原理与应用及C51程序设计.北京:

北京大学出版社,2008

2、周润景.张丽娜.基于Proteus的电路及单片机系统设计与仿真.北京:

北京航空航天大学出版社,2006

附录1

DS18B20ROM系列号测试程序

#include

sbitDQ=P1^1;//定义通信端口

unsignedchara[8];

//延时程序

voiddelay_18B20(unsignedinti)

{

while(i--);

}

//初始化函数

Init_DS18B20(void)

{

unsignedcharx=0;

DQ=1;//DQ复位

delay_18B20(4);//稍做延时

DQ=0;//单片机将DQ拉低

delay_18B20(100);//精确延时大于480us

DQ=1;//拉高总线

delay_18B20(40);

}

//读一个字节

ReadOneChar(void)

{

unsignedchari=0;

unsignedchardat=0;

for(i=8;i>0;i--)

{

DQ=0;//给脉冲信号

dat>>=1;

DQ=1;//给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(10);

}

return(dat);

}

//写一个字节

WriteOneChar(unsignedchardat)

{

unsignedchari=0;

for(i=8;i>0;i--)

{

DQ=0;

DQ=dat&0x01;

delay_18B20(10);

DQ=1;

dat>>=1;

}

}

 

voidmain(void)

{

unsignedchari;

Init_DS18B20();

WriteOneChar(0x33);

for(i=0;i<8;i++)

a[i]=ReadOneChar();//将Rom序列号存入a[]中

}

附录2

主程序

1、main.c

#include

#include

#include

unsignedcharTempBuffer[6];

sbitk=P3^0;

voiddelay(unsignedinti)

{

while(i--);

}

voidmain(void)

{

unsignedinttemp;

Init_DS18B20();

delay(5000);

while

(1)

{if(k==1)//打开开关显示1STDS18B20

{temp=ReadTemperature

(1);

if(flag_Negative_number)TempBuffer[0]='-';

elseTempBuffer[0]='+';

TempBuffer[1]=temp/1000+'0';//百位数

TempBuffer[2]=temp%1000/100+'0';//十位数

TempBuffer[3]=temp%100/10+'0';//个位数

TempBuffer[5]=temp%10+'0';//小数位

TempBuffer[4]='.';//小数点

LCD_Initial();

GotoXY(0,0);

Print("1stDS18B20");

GotoXY(0,1);

Print("temp:

");

GotoXY(5,1);

Print(&TempBuffer[0]);

GotoXY(11,1);

Print("cent");

delay(50000);

}

else//闭合开关显示2NDDS18B20

{

temp=ReadTemperature

(2);

if(flag_Negative_number)TempBuffer[0]='-';

elseTempBuffer[0]='+';

TempBuffer[1]=temp/1000+'0';//百位数

TempBuffer[2]=temp%1000/100+'0';//十位数

TempBuffer[3]=temp%100/10+'0';//个位数

TempBuffer[5]=temp%10+'0';//小数位

TempBuffer[4]='.';//小数点;

LCD_Initial();

GotoXY(0,0);

Print("2ndDS18B20");

GotoXY(0,1);

Print("temp:

");

GotoXY(5,1);

Print(&TempBuffer[0]);

GotoXY(11,1);

Print("cent");

delay(50000);

}

}

}

2、ds18b20.h

#ifndef__DS18B20_H__

#define__DS18B20_H__

sbitDQ=P1^1;//定义通信端口

unsignedcharflag_Negative_number=0;//负数标志

unsignedcharcodestr1[]={0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e};

unsignedcharcodestr2[]={0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9};

//晶振11.0592MHz

voiddelay_18B20(unsignedinti)

{

while(i--);

}

//初始化函数

Init_DS18B20(void)

{

unsignedcharx=0;

DQ=1;//DQ复位

delay_18B20(4);//稍做延时

DQ=0;//单片机将DQ拉低

delay_18B20(100);//精确延时大于480us

DQ=1;//拉高总线

delay_18B20(40);

}

//读一个字节

ReadOneChar(void)

{

unsignedchari=0;

unsignedchardat=0;

for(i=8;i>0;i--)

{

DQ=0;//给脉冲信号

dat>>=1;

DQ=1;//给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(10);

}

return(dat);

}

//写一个字节

WriteOneChar(unsignedchardat)

{

unsignedchari=0;

for(i=8;i>0;i--)

{

DQ=0;

DQ=dat&0x01;

delay_18B20(10);

DQ=1;

dat>>=1;

}

}

//匹配ROM

MatchRom(unsignedchara)

{

charj;

WriteOneChar(0x55);//发送匹配ROM命令

if(a==1)

{

for(j=0;j<8;j++)

WriteOneChar(str1[j]);//发送18B20的序列号,先发送低字节

}

if(a==2)

{

for(j=0;j<8;j++)

WriteOneChar(str2[j]);//发送18B20的序列号,先发送低字节

}

}

//读取温度

ReadTemperature(unsignedcharz)

{

unsignedchara=0;

unsignedcharb=0;

unsignedintt=0;

Init_DS18B20();

WriteOneChar(0xCC);//跳过读序号列号的操作

Init_DS18B20();

if(z==1)

{

MatchRom

(1);//匹配ROM1

}

if(z==2)

{

MatchRom

(2);//匹配ROM2

}

WriteOneChar(0x44);//*启动温度转换*/

delay_18B20(5);

Init_DS18B20();

WriteOneChar(0xcc);//读序列号

Init_DS18B20();

if(z==1)

{

MatchRom

(1);//匹配ROM1

}

if(z==2)

{

MatchRom

(2);//匹配ROM2

}

WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度

a=ReadOneChar();

b=ReadOneChar();

//启动下一次温度转换

Init_DS18B20();

WriteOneChar(0xCC);//跳过读序号列号的操作

WriteOneChar(0x44);//启动温度转换

t=b;

t<<=8;

t=t|a;

flag_Negative_number=0;

if(t>0x0fff)

{

t=~t+1;

flag_Negative_number=0xff;

}

 

t=t*0.625;//有效位到小数点后2位

return(t);

}

#endif

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2