2024年2月7日发(作者:)

目录

(一)温度传感器及发展状况………………… 2

(二)课程设计主要内容及技术指标…………

(三)程序流程图和电路仿真 ……………… 8

(四)实验过程以及数据分析…………………

(五)成品与效果 ……………………………

(六)个人体会…………………………………

(七)参考论文和文献…………………………

(八)程序清单…………………………………

1

6

10

1112

13

14

温度传感器及发展状况

随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,一种数字式温度计以数字温度传感器作感温元件,它以单总线的连接方式,使电路大大的简化;传统的温度检测大多以热敏电阻为传感器,这类传感器可靠性差,测量温度准确率低且电路复杂。因此,本温度计摆脱了传统的温度测量方法,利用单片机对传感器进行控制。这样易于智能化控制。

(一) 温度传感器发展现状:

温度传感器是利用物质各种物理性质随温度变化的规律把温度转换为电量的传感器。这些呈现规律性变化的物理性质主要有半导体。

温度传感器是温度测量仪表的核心部分,品种繁多。

国际上新型温度传感器正从模拟式向数字式、由集成化向智能化、网络化的方向发展。在20世纪90年代中期最早推出的智能温度传感器,采用的是8位A/D转换器,其测温精度较低,分辨力低。国外已相继推出多种高精度、高分辨力的智能温度传感器。

进入21世纪后,智能温度传感器正朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展。目前,数字温度传感器的总线技术也实现了标准化、规范化,所采用的总线主要有单线(1-Wire)总线、I2C总线、SMbus总线和spl总线。温度传感器作为从机可通过专用总线接口与主机进行通信。

2

(二)主要内容及基本要求:

此次课程设计主要是以STC89C52RC单片机与DS18B20温度传感器相结合的实测环境温度的测温仪。

(1)STC89C52RC单片机简介

STC89C52RC单片机是宏晶科技推出的新一代高速、低功耗、超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟机器周期和6时钟机器周期可以任意选择。

主要特性如下:

 工作电压:5.5v ~3.3v(5v单片机)/3.8v ~2.0v(3v单片机)

 工作频率范围:0~40MHZ,相当于8051的0~80MHZ,实际工作频率可大48MHZ。

 用户应用程序空间为8K字节

 片上集成512字节RAM

 通用I/O口(32个),复位后为:P1/P2/P3/P4是准双向口/弱上拉,P0是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口使用时,需加上拉电阻。

 具有EEPROM功能与看门狗功能

 具有3个16位的定时器/计数器。及定时器T0.T1.T2。

工作模式:

 掉电模式:典型功耗小于0.1uA,可由外部中断唤醒,中断返回后,继续执行原程序。

 正常工作模式:典型功耗4mA~7mA

3

 空闲模式:典型功耗2mA

(2)DS18B20简介:

美国Dallas半导体公司的数字化温度传感器DS18B20是世界上第一片支持 “一线总线”接口的温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。全部传感元件及转换电路集成在形如一只三极管的集成电路内。“一线总线”独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。与前一代产品不同,新的产品支持3V~5.5V4

的电压范围,使系统设计更灵活、方便。而且新一代产品更便宜,体积更小。

DS18B20优缺点如下:

独特的一线接口,只需要一条口线通信 多点能力,简化了分布式温度传感应用 无需外部元件 可用数据总线供电,电压范围为3.0 V至5.5 V 无需备用电源 测量温度范围为-55 ° C至+125 ℃ 。

显然DS18B20具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:

 较小的硬件开销需要相对复杂的软件进行补偿,由于DS18B20与微处理器间采用串行数据传送,因此 ,在对DS18B20进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。在使用PL/M、C等高级语言进行系统程序设计时,对

DS18B20操作部分最好采用汇编语言实现。

 在DS18B20的有关资料中均未提及单总线上所挂DS18B20数量问题,容易使人误认为可以挂任意多个 DS18B20,在实际应用中并非如此。当单总线上所挂DS18B20超过8个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时 要加以注意。

 连接DS18B20的总线电缆是有长度限制的。试验中,当采用普通信号电缆传输长度超过50m时,读取的 测温数据将发生错误。当将总线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达150m,当采用每米绞合次数更多的双绞线带屏蔽电缆时,5

正 常通讯距离进一步加长。这种情况主要是由总线分布电容使信号波形产生畸变造成的。

因此,在用DS18B20进行长距离测温系统设计时要充分考 虑总线分布电容和阻抗匹配问题。

 在DS18B20测温程序设计中,向DS18B20发出温度转换命令后,程序总要等待DS18B20的返回信号,一旦 某个DS1820接触不好或断线,当程序读该DS18B20时,将没有返回信号,程序进入死循环。这一点在进行DS18B20硬件连接和软件设计时也要给予 一定的重视。 测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接地。

根据温度传感器总体发展趋势,DS18B20的未来应该沿着高精度,高分辨率,高可靠性和安全性像高智能化和网络化方向发展。

课程设计主要内容及技术指标

本组成员根据所学知识与学习任务要求,查阅相关资料结合书本知识,讨论决定制作一个基于DS18B20的温度传感器测温仪,以实现将知识转化为能力,将理论付诸于实践的最终目的。达到测量温度,同时熟悉单片机与传感器的知识。

(一) 设计达到的技术要求指标:

测量范围:-55℃~+125℃

测量精度:在-10~+85℃时精度为±0.5℃

6

反应时间:小于或等于500ms

(二) DS18B20工作原理:

由DS18B20构成的智能测温装置由三部分组成:

温度检测模块:温度检测模块主要使用的是DS18B20为传感器。该芯片性价比很高,可达到精度11位的精度,即最小分辨率可达0.0625摄氏度,测温范围为(-55,125)。

信号控制模块:STC89C52RC单片机,是整个系统的核心文件,用来存储和控制输出温度信号。

液晶显示模块:显示模块主要用来显示是测得的当前的温度值,选用1602;

DS18B20测温原理如下图所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。

7

(DS18B20测温原理框图)

DS18B20把温度转换为带符号的数字信号,经单片机输出显示在LCD上。

程序流程图和电路仿真

此阶段是整个设计中的关键,现将流程图画出如下:

IS到?

调用显示子程序

N O

初始化

DS18B20复位

延 迟

读取温度值温度计算处理显示数据刷初次上电

DS18B20

没准备好

发读取温度指令

读取、校验

移入温度暂存器

结束

(主程序) (温度读取子程序)

8

电路在PROTEUS上的仿真:

DS18B20的DQ端与STC89C52单片机的外部中断1相连接,另外的VCC与GND端分别接电源的输出端与地端。液晶显示屏的D0~D7端口分别与单片机的P0~P7口相连接,仿真图上未予显示的BLA和BLK端分别接地与电源,而显示屏的第三个接口可以悬空,也可以外接电阻调试显示屏的背光与亮度。在单片机的18脚与19脚端用22PF的电容接上12MHZ的晶振,持续给单片机提供振荡周期。单片机的EA接口外接高电平。整体的电路在PROTUES上仿真如下图,因为在仿真库中没有STC89C52RC这一元件,所以用AT89C51予以替代。

9

实验过程以及数据分析

一、实验过程:

 查阅资料、调研:通过查阅有关书籍、论文,最终确定课题为基于DS18B20的温度传感器测温仪;

 编写有关程序,并且仿真调试通过;

 按照所设计电路图连线,在面包板上反复测试,检查各元件,连线,检验程序,最终通过;

 完成在万用板上的焊接,课程设计完成。

由于课程设计在面包板上经过多次连线,检查终于通过,一般是组员一个连线,另一个检查,一次不成功,经试验分析后,由另一个组员来重新连线。验证程序亦是如此,焊接是分部分完成,以使每个组员都有足够的机会来参与设计。工作多有反复,总体是一个人大家协调分工合作的过程。

二、数据分析:

在面包板上连接成功测温后,一天内测得一组温度数据如下:

时间

温度

一天中不同的时间段环境中的温度不同,我们所设计的温度传感器在一天的不同时间下取样进行测量,大致测得结果符合温度曲线,精确度达到0.1。

9点

31.9℃

10点

32.5℃

15点

35.3℃

16点

34.7℃

10

成品与效果

为了证实此次实验的真实性以及数据采样过程中的温度显示,我将用成品工作下的几张照片向大家展示此次实验的成果。

(一)

(此张照片是在早上九时整记录下来的温度数值)

(二)

(焊接工艺与排线布局)

11

个人体会

经过本次传感器课题的设计与研究,深入的学习了除课本以外的很多附件的内容,掌握了许多实验室操作技能。在实际设计中遇到许多题,但结合所学知识以及参考资料,不断地尝试, 有了一套解决问题的方案。

单片机与传感器在日常生活中应用广泛,其实我们设计的成品只是生活中很普通的一种测温工具,在实际应用中,有各个公司生产的不同型号的、针对不同功能设计的、以及根据用户的需要和发展自主研发设计的还有很多,能够亲身的进行自我实践,并进行实际的应用,能够提升我们将来在学习工作解决此类设计问题的能力。

在程序设计中,我们更加深入了解了中断的使用与本质,合理利用这些,会使程序简化而不会出错。对于传感器芯片的使用,我们查找了它的datasheet,并查阅了各种关于其硬件连接和软件设计的资料,同时发现了理论资料与实践上的区别,通过多次尝试,成功完成了硬件和软件的设计。在这次课题设计过程中,我们合理的分工,适宜的规划进度的进展,不仅仅暗示完成了预先设计的内容。

在这一过程中,我们充分发挥我们的主观能动性,想象创造性,攻克了很多之前都没有想过的难关,真的受益匪浅。这将是我们在程序设计以及大学学习过程中的宝贵经验和财富。

12

参考论文和文献

(一) 参考论文:

目前关于温度传感器的误差研究大多从温度传感器硬件自身角度出发进行分析,单片机控制的温度传感器测温系统,绝大多数采用独立的片外温度传感器进行设计,成本较高,对测量误差的分析针对的是片外温度传感器,而单片机片内温度传感器虽然成本较低,但其检测到的是单片机的芯片温度,如用其测量外部环境温度,误差较大。C8051F系列单片机价格低廉,开发简单,因其自带片内温度传感器,如用于测量外部环境温度,可以实现单片机开发的低成本化。本文对C8051F系列单片机的片内温度传感器测量环境温度的误差进行了分析,对补偿方法作了探讨,提出了低功耗的硬件与软件相结合的设计方法,并在此基础上力求提高ADC测量精度,为测量外部环境温度提供减小误差的方法以供参考。文章针对单片机自热效应及其它原因引起的误差进行了分析,对于自热效应,主要从功耗方面入手对供电电源、频率、高功耗的模拟设备、数字设备等进行了分析,并对ADC转换的误差进行了分析,继而从供电设计、硬件系统的低功耗设计、硬件系统提高测量精度的设计、软件程序设计、补偿算法等方面提出了综合的解决方案,探讨用单片机片内温度传感器的更为精确的测量环境温度的方法,对于实现用C8051F等系列的片内温度传感器测量环境温度的低成本化,有一定启发意义。

作者:黄颖琦

学科专业:计算机控制技术

授予学位:硕士

学位授予单位:贵州大学

导师姓名:姚凯学

研究方向:C8051片内温度传感器测量环境温度误差分析

学位年度:2008

(二) 参考文献

 刘迎春编著.新型传感器及应用.长沙:国防科技大学出版社,1989

 张道德编著.单片机接口技术.北京:中国水利水电出版社.2007

 胡伟.单片机C程序设计.北京:人民邮电出版社.2003

13

 王毅.单片机器件应用手册.北京:人民邮电出版社

 张福学.传感器的功能化与集成化.传感器技术

程序清单

附件:

#include

#include

#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)

14

{uchar i;

}

bit LCD_Busy_Check()

{ bit result;

}

void Write_LCD_Command(uchar cmd)

{while(LCD_Busy_Check());

}

void Write_LCD_Data(uchar dat)

{while(LCD_Busy_Check());

15

while(x--)

{for(i=0;i<200;i++);

}

LCD_RS = 0;

LCD_RW = 1;

LCD_EN = 1;

delayNOP();

result = (bit)(P0&0x80);

LCD_EN=0;

return result;

LCD_RS = 0;

LCD_RW = 0;

LCD_EN = 0;

_nop_();

_nop_();

P0 = cmd;

delayNOP();

LCD_EN = 1;

delayNOP();

LCD_EN = 0;

}

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);

}

void Set_LCD_POS(uchar pos)

{ Write_LCD_Command(pos|0x80);

}

void Delay(uint x)

{while(--x);

}

uchar Init_DS18B20()

{ uchar status;

DelayXus(5);

Write_LCD_Command(0x38);

DelayXus(5);

Write_LCD_Command(0x0c);

DelayXus(5);

Write_LCD_Command(0x06);

DelayXus(5);

DQ = 1;

Delay(8);

DQ = 0;

16

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;

17

}

}

dat >>= 1;

void Read_Temperature()

{if(Init_DS18B20()==1)

}

void Display_Temperature()

{

uchar i;

uchar t = 150, ng = 0;

if((Temp_Value[1]&0xf8)==0xf8)

{ Temp_Value[1] = ~Temp_Value[1];

}

Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];

Temp_Value[0] = ~Temp_Value[0]+1;

if(Temp_Value[0]==0x00)

Temp_Value[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;

}

ng = 1;

CurrentT=((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);

18

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] == ' ')

}

Set_LCD_POS(0x00);

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

{ _LCD_Data(Temp_Disp_Title[i]);

}

Set_LCD_POS(0x40);

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

{ Write_LCD_Data(Current_Temp_Display_Buffer[i]);

}

Current_Temp_Display_Buffer[8] = '-';

else if(Current_Temp_Display_Buffer[7] == ' ')

Current_Temp_Display_Buffer[7] = '-';

else

Current_Temp_Display_Buffer[6] = '-';

Set_LCD_POS(0x4d);

Write_LCD_Data(0x00);

19

}

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);

20