基于51单片机的温度检测系统.docx

上传人:b****1 文档编号:10395110 上传时间:2023-05-25 格式:DOCX 页数:39 大小:578.77KB
下载 相关 举报
基于51单片机的温度检测系统.docx_第1页
第1页 / 共39页
基于51单片机的温度检测系统.docx_第2页
第2页 / 共39页
基于51单片机的温度检测系统.docx_第3页
第3页 / 共39页
基于51单片机的温度检测系统.docx_第4页
第4页 / 共39页
基于51单片机的温度检测系统.docx_第5页
第5页 / 共39页
基于51单片机的温度检测系统.docx_第6页
第6页 / 共39页
基于51单片机的温度检测系统.docx_第7页
第7页 / 共39页
基于51单片机的温度检测系统.docx_第8页
第8页 / 共39页
基于51单片机的温度检测系统.docx_第9页
第9页 / 共39页
基于51单片机的温度检测系统.docx_第10页
第10页 / 共39页
基于51单片机的温度检测系统.docx_第11页
第11页 / 共39页
基于51单片机的温度检测系统.docx_第12页
第12页 / 共39页
基于51单片机的温度检测系统.docx_第13页
第13页 / 共39页
基于51单片机的温度检测系统.docx_第14页
第14页 / 共39页
基于51单片机的温度检测系统.docx_第15页
第15页 / 共39页
基于51单片机的温度检测系统.docx_第16页
第16页 / 共39页
基于51单片机的温度检测系统.docx_第17页
第17页 / 共39页
基于51单片机的温度检测系统.docx_第18页
第18页 / 共39页
基于51单片机的温度检测系统.docx_第19页
第19页 / 共39页
基于51单片机的温度检测系统.docx_第20页
第20页 / 共39页
亲,该文档总共39页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于51单片机的温度检测系统.docx

《基于51单片机的温度检测系统.docx》由会员分享,可在线阅读,更多相关《基于51单片机的温度检测系统.docx(39页珍藏版)》请在冰点文库上搜索。

基于51单片机的温度检测系统.docx

基于51单片机的温度检测系统

 

单片机C语言课题设计报告

设计题目:

温度检测

指导老师:

设计人:

 

学号:

班级:

设计时间:

 

摘要

本课题以51单片机为核心实现智能化温度测量。

利用18B20温度传感器获取温度信号,将需要测量的温度信号自动转化为数字信号,利用单总线和单片机交换数据,最终单片机将信号转换成LCD可以识别的信息显示输出。

基于STC90C516RD+的单片机的智能温度检测系统,设计采用18B20温度传感器,其分辨率可编程设计。

本课题设计应用于温度变化缓慢的空间,综合考虑,以降低灵敏度来提高显示精度。

设计使用12位分辨率,因其最高4位代表温度极性,故实际使用为11位半,而温度测量范围为-55℃~+125℃,则其分辨力为0.0625℃。

设计使用LCD1602显示器,可显示16*2个英文字符,显示器显示实时温度和过温警告信息,传感器异常信息设。

计使用蜂鸣器做警报发生器,当温度超过设定值时播放《卡农》,当传感器异常时播放嘟嘟音。

 

一、设计功能

·由单片机、温度传感器以及液晶显示器等构成高精度温度监测系统。

·温度显示精确到小数点后四位。

·按键设定过温值,过温在液晶屏提示并响铃卡农一次,直到温度正常。

·设计传感器状态检测函数,传感器工作不正常在液晶屏警告提示,响警告铃,

直到故障排除。

·proteus做系统硬件电路设计并仿真。

二、系统设计

 

三、器件选择

3.1温度信号采集模块

传统的温度检测大多以热敏电阻为传感器,采用热敏电阻,可满足40℃度至90℃测量范围,但热敏电阻可靠性差,测量温度准确率低,对于1℃的信号是不适用的,还得经过专门的接口电路转换成数字信号才能由微处理器进行处理。

目前常用的微机与外设之间进行的数据通信的串行总线主要有

总线,SPI总线等。

其中

总线以同步串行2线方式进行通信(一条时钟线,一条数据线)。

SPI总线则以同步串行3线方式进行通信(一条时钟线,一条数据输入线,一条数据输出线)。

这些总线至少需要两条或两条以上的信号线。

而单总线(1-wirebus),采用单根信号线,既可传输数据,而且数据传输是双向的,CPU只需一根端口线就能与诸多单总线器件通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。

单总线具有广阔的应用前景,是值得关注的一个发展领域。

单总线即只有一根数据线,系统中的数据交换,控制都由这根线完成。

主机或从机通过一个漏极开路或三态端口连接到数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线。

单总线通常要求外接一个约为4.7K的上拉电阻,这样,当总线闲置时其状态为高电平。

3.1.1DS18B20数字式温度传感器

DS18B20数字式温度传感器使用集成芯片,采用单总线技术,其能够有效的减小外界的干扰,提高测量的精度,同时,它可以直接将被测温度转化成串行数字信号供微机处理,接口简单,使数据传输和处理简单化。

部分功能电路的集成,使总体硬件设计更简洁,能有效地降低成本,搭建电路和焊接电路时更快,调试也更方便简单化,大大缩短了开发的周期。

3.1.2DS18B20特性

采用单总线的接口方式,与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。

(1)适应电压范围更宽,电压范围:

3.0~5.5V,在寄生电源方式下可由数据线供电。

(2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。

(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。

(5)温范围-55℃~+125℃。

(6)可编程的分辨率为9~12位,对应的分辨力分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。

(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。

(8)测量结果直接输出数字温度信号,以"1-wirebus"串行传送给CPU,可选择同时传送CRC校验码,具有极强的抗干扰纠错能力。

(9)负压特性:

电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。

3.1.3DS18B20结构

 

DS18B20的内部结构

3.1.4DS18B20测温原理

 

DS18B20测温原理框图

图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。

高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入.

计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。

图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。

3.1.5DS18B20的读写功能

DS18B20温度值格式表

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

例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FE6FH,-55℃的数字输出为FC90H。

DS18B20温度数据表

 

DS18B20温度传感器的存储器DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。

TM

R1

R0

1

1

1

1

1

配置寄存器结构

 

低五位一直都是"1",TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。

在DS18B20出厂时该位被设置为0,用户不要去改动。

R1和R0用来设置分辨率,如下表所示:

(DS18B20出厂时被设置为12位)

 

R1

R0

分辨率

温度最大转换时间

0

0

9位

93.75ms

0

1

10位

187.5ms

1

0

11位

375ms

1

1

12位

750ms

温度分辨率设置表

 

寄存器内容

字节地址

温度值低位(LSByte)

0

温度值高位(MSByte)

1

高温限值(TH)

2

低温限值(TL)

3

配置寄存器

4

保留

5

保留

6

保留

7

CRC校验值

8

DS18B20暂存寄存器分布

根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:

每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。

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

指令

约定代码

功能

读ROM

33H

读DS1820温度传感器ROM中的编码(即64位地址)

符合ROM

55H

发出此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS1820使之作出响应,为下一步对该DS1820的读写作准备。

搜索ROM

0FOH

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

为操作各器件作好准备。

跳过ROM

0CCH

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

适用于单片工作。

告警搜索命令

0ECH

执行后只有温度超过设定值上限或下限的片子才做出响应。

温度变换

44H

启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75ms)。

结果存入内部9字节RAM中。

读暂存器

0BEH

读内部RAM中9字节的内容

写暂存器

4EH

发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据。

复制暂存器

48H

将RAM中第3、4字节的内容复制到EEPROM中。

重调EEPROM

0B8H

将EEPROM中内容恢复到RAM中的第3、4字节。

读供电方式

0B4H

读DS1820的供电模式。

寄生供电时DS1820发送“0”,外接电源供电DS1820发送“1”。

ROM指令表

3.2液晶显示器1602LCD

 

显示容量:

16×2个字符,芯片工作电压:

4.5—5.5V,工作电流:

2.0mA(5.0V),模块最佳工作电压:

5.0V,字符尺寸:

2.95×4.35(W×H)mm。

3.2.1引脚功能说明

1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如图

编号

符号

引脚说明

编号

符号

引脚说明

1

VSS

电源地

9

D2

数据

2

VDD

电源正极

10

D3

数据

3

VL

液晶显示偏压

11

D4

数据

4

RS

数据/命令选择

12

D5

数据

5

R/W

读/写选择

13

D6

数据

6

E

使能信号

14

D7

数据

7

D0

数据

15

BLA

背光源正极

8

D1

数据

16

BLK

背光源负极

3.2.21602LCD的指令说明及时序

序号

指令

RS

R/W

D7

D6

D5

D4

D3

D2

D1

D0

1

清显示

0

0

0

0

0

0

0

0

0

1

2

光标返回

0

0

0

0

0

0

0

0

1

*

3

置输入模式

0

0

0

0

0

0

0

1

I/D

S

4

显示开/关控制

0

0

0

0

0

0

1

D

C

B

5

光标或字符移位

0

0

0

0

0

1

S/C

R/L

*

*

6

置功能

0

0

0

0

1

DL

N

F

*

*

7

置字符发生存贮器地址

0

0

0

1

字符发生存贮器地址

8

置数据存贮器地址

0

0

1

显示数据存贮器地址

9

读忙标志或地址

0

1

BF

计数器地址

10

写数到CGRAM或DDRAM)

1

0

要写的数据内容

11

从CGRAM或DDRAM读数

1

1

读出的数据内容

1602液晶模块内部的控制器共有11条控制指令,如图

3.2.31602LCD的一般初始化过程

延时15mS

写指令38H(不检测忙信号)

延时5mS

写指令38H(不检测忙信号)

延时5mS

写指令38H(不检测忙信号)

以后每次写指令、读/写数据操作均需要检测忙信号

写指令38H:

显示模式设置

写指令08H:

显示关闭

写指令01H:

显示清屏

写指令06H:

显示光标移动设置

写指令0CH:

显示开及光标设置

四、软件设计

4.11602LCD程序设计流程图

4.2DS18B20程序设计流程图

 

4.3主程序设计流程图

 

五、设计总结

在这课题设计中我学到了很多东西,获益匪浅。

本次课题以51单片机为核心实现了智能化温度测量,过温警告,传感器异常警报功能。

利用温度传感器获取被控对象指标,通过温度传感器将需要测量的温度信号转化为数字电信号,通过单总线与MCU进行传输,再经单片机转换成显示器可以识别的信息,最后显示输出。

在一开始,我制订了合理的规划,绘制了与课题相关的硬件原理图,分析了单片机的各I/O端口。

然后进行程序设计的分析,设计绘制流程图,并按照流程图,进行程序段的编写。

接下来把所有的程序段组合在一起综合分析,最后烧录到单片机上进行硬件调试。

在这整个过程当中,我遇到了重重困难。

(1)高位为零时消隐;

(2)18B20上电温度误判;(3)LCD显示闪烁;(4)18B20修复温度误判;(5)LCD查表写坐标混合显示。

通过一次次的反复分析和调试,查阅互联网资料最终成功解决。

这其中的苦泪和欢笑只有自己知道。

通过程序的编写我收获了很多,并总结到大多数故障问题源于程序里括号及分号的错误。

通过这次课题设计,我深深意识到学习单片机不是只要学好怎样写程序就够了,还要对硬件有所了解,要把软件与硬件相结合才,期间还要经过多次的失败,需要相当的耐心和细致的思考来排除一切困难,一步一步地解决问题。

在此,我要特别施芸老师给提供给我这次自我锻炼,自我提升的机会。

我定会把这次课题设计积累的经验落实到以后的学习中去。

姓名:

钟乾鹏

学号:

201112020247

班级:

2011级通信技术1班

六、参考文献

【1】马忠梅等编著.单片机的C语言应用程序设计(第4版).北京[M]:

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

【2】樊明龙等编著.单片机原理与应用.北京[M]:

北化学工业出版社,2005

【3】周志德.单片机原理级应用.北京[M]:

高等教育出版社,2001

鸣谢

 

七、硬件原理图及仿真

7.1系统硬件原理图

7.2开机滚动显示界面

7.3临界温度设置界面

7.4传感器异常警告界面

八、程序清单

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitDQ=P3^7;//定义DS18B20端口DQ

sbitK5=P2^3;

sbitK6=P2^2;

sbitK7=P2^1;

bitpresence;//初始化标志位

sbitlcdrs=P2^6;//加按键

sbitlcdrw=P2^5;//减按键

sbitlcden=P2^7;//确定

uintT,Temp;//T包含两个单元,用来存储16位温度信息

ucharcodecdis1[]={"WELCOMTOUSE!

"};//正常测温显示界面

ucharcodecdis2[]={"TEMP:

.C"};

ucharcodecdis3[]={"DS18B20ERR0R"};

ucharcodecdis4[]={"PLEASECHECK"};

ucharcodecdis5[]={"ZhongQianPeng"};//开始滚动界面

ucharcodecdis6[]={"Communication1"};

ucharcodecdis7[]={"!

!

!

!

Warning!

!

!

!

"};//过温语句

ucharcodecdis8[]={"---OVERTEMP---"};

ucharcodecdis9[]={"Pleasesettemp!

"};//设定温度

ucharcodecdis10[]={"MaxTempC"};//可设两位

ucharbai,shi,ge,xiaoshu1,xiaoshu2,xiaoshu3,xiaoshu4,fuhao,th_temp,tl_temp;

charset=30;//set存有设定的温度,设初值为30

#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};

 

/*******************************************************************

*两个延时函数*

*******************************************************************/

//<----------1us----------->

voidDelay(unsignedintnum)

{

while(--num);

}

//<----------1ms----------->

voiddelay1(intms)

{

unsignedchary;

while(ms--)

{

for(y=0;y<250;y++)

{

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

voidwarning()//蜂鸣器发声

{speaker=1;delay1

(1);speaker=0;delay1

(1);}

/******************************************************************

*检查LCD忙状态*

*lcd_busy为1时,忙,等待。

lcd-busy为0时,闲,可写指令与数据。

*

******************************************************************/

bitlcd_busy()

{

bitresult;

lcdrs=0;

lcdrw=1;

lcden=1;

delayNOP();

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

lcden=0;

return(result);

}

 

/******************************************************************

*写指令数据到LCD*

*RS=L,RW=L,E=高脉冲,D0-D7=指令码。

*

******************************************************************/

voidlcd_wcmd(ucharcmd)

{

while(lcd_busy());

lcdrs=0;

lcdrw=0;

lcden=0;

_nop_();

_nop_();

P0=cmd;

delayNOP();

lcden=1;

delayNOP();

lcden=0;

}

/*******************************************************************

*闪动子程序,闪动1次*

*******************************************************************/

voidflash()

{

delay1(600);//控制停留时间

lcd_wcmd(0x08);//关闭显示

delay1(200);//延时

lcd_wcmd(0x0c);//开显示

delay1(200);

}

/*******************************************************************

*写显示数据到LCD*

*RS=H,RW=L,E=高脉冲,D0-D7=数据。

*

*******************************************************************/

voidlcd_wdat(uchardat)

{

while(lcd_busy());

lcdrs=1;

lcdrw=0;

lcden=0;

P0=dat;

delayNOP();

lcden=1;

delayNOP();

lcden=0;

}

/*************************************

/*LCD初始化设定*

/*************************************/

voidlcd_init()

{

delay1(15);

lcd_wcmd(0x01);//清除LCD的显示内容

lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据

delay1(5);

lcd_wcmd(0x38);

delay1(5);

lcd_wcmd(0x38);

delay1(5);

lcd_wcmd(0x0c);//显示开,关光标

delay1(5);

lcd_wcmd(0x06);//移动光标

delay1(5);

lcd_wcmd(0x01);//清除LCD的显示内容

delay1(5);

}

/*********************

*设定显示位置*

*********************/

voidlcd_pos(ucharpos)

{

lcd_wcmd(pos|0x80);//数据指针=80+地址变量

}

 

/******************************************

*初始化ds1820*

/******************************************/

Init_DS18B20()

{

DQ=1;//DQ复位

Delay(8);//稍做延时

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

Delay(90);//精确延时大于480us

DQ=1;//拉高总线

Delay(8);

presence=DQ;//如果=0则初始化成功=1则初始化失败

Delay(100);

DQ=1;

return(presence);//返回信号,0=presence,1=nopresence

}

/****************************************************

/*向DS18B20读和写一个字节*

/**

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

当前位置:首页 > 经管营销 > 经济市场

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

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