您好,欢迎来到刀刀网。
搜索
您的当前位置:首页51 单片机温度测量 18b20

51 单片机温度测量 18b20

来源:刀刀网


温度测量系统报告

实习器材:

硬件:PC机一台、AM-51H学习板、电源线、串口线、DS18B20温度传感器、电烙铁及骨架;

软件: KEIL C51编程软件、STC_ISP_V479.程序下载软件。 实习目的:

1、熟知51单片机的硬件结构及工作原理; 2、了解DS18B20的工作机制; 3、掌握KEIL C51的使用方法;

4、提升运用51单片机实际开发能力; 5、提升运用KEIL C51编程能力。 实习内容:

本次校内实习我们会用到的主要器件是51单片机和DS18B20温度传感器以及数码管,主要就是通过温度传感器的检测,把实际测得的温度值转换成二进制,再传回单片机处理,然后通过数码管显示出温度值。 Ⅰ─硬件部分

一、51单片机简介

MCS-51系列单片机是美国Intel公司在1980年推出的高性能8位单片机,它包含51和52两个子系列。单片机由于体积小、功耗低、易于产品化,面向控制,抗干扰能力强,适用温度范围宽,可以方便地实现和分布式控制等优点,因而被广泛地应用于各种控制系统和分布式系统中。

C51和MCS-51是完全兼容的,是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压、高性能CMOS8位微处理器。 其主要特点如下:

• 8位CPU。

• 工作频率最高为24M。 • 128B数据存储器。 • 4KB程序存储器。

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

• 片外数据存储器的寻址空间为KB。 • 128个用户位寻址空间。 • 21个字节特殊功能寄存器。

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

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

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

• 1个全双工的串行I/O接口,可多机通信。 • 111条指令,喊乘法指令和除法指令。 • 较强的位处理能力 。 • 采用单一+5V电源。

对于C52而言,不同之处在于:有256B的数据存储器、8K的程序存储器、全双工串行I/O接口、6个中断源、3个16位定时/计数器,工作频率可升直33Mhz。比51拥有更高的性能。图1-1是51单片机的接口硬件分布图。

图1-1是51单片机的接口硬件分布图

我们此次采用的是AM-51H学习板(如图1-2),板载的芯片是C52芯片,拥有丰富功能模块及外接电路,如图的标注。此外,还有众多的板载程序可以演示。

图1-2 AM-51H开发板

二、DS18B20温度传感器简介

DS18B20是DALLAS公司生产的单总线数字温度传感器芯片,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程为9-12为A/D转换精度,测量分辨率可达0.0625℃,被测温度用16位补码方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生;多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少。可广泛用于工业、民用、军事等领域的温度测量及控制仪器、测控系统和大型设备中。 ㈠DS18B20的主要特性如下:

1、适应电压范围宽:3.0V-5.5V,在寄生电源方式可有数据线共电。 2、在使用中不需要任何外围元件。

3、独特的单线接口方式:DS18B20与微处理器连接时仅需要一条信号线既可实现微处 理器与DS18B20的双向通信。

4、温度范围:-55℃~+125℃,在-10℃-+85℃时精度为±0.5℃。

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

6、 在9位分辨率时最多在93.75ms内把温度值转换为数字,12位分辨率时最多在750ms内把温度值转换为数字。

7、支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。 8、用户可自设定非易失性的报警上下限值。

9、负压特性:电源极性接反时,温度计不会因发热而烧坏,但不能正常工作。 DS18B20的外部机构图和内部结构图(如图1-3、1-4)

图1-4 DS1820内部结构

图1-3 TQ-92封装及8脚SOIC封装 ㈡DS18B20温度值格式

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

图1-5 DS18B20温度值格式表 ㈢DS18B20常用ROM、RAM指令(如表1、表2) 指 令 约定代码 功 能 读ROM 符合 ROM 33H 55H 读DS1820温度传感器ROM中的编码(即位地址) 发出此命令之后,接着发出 位 ROM 编码,访问单总线上与该编码相对应的 DS1820 使之作出响应,为下一步对该 DS1820 的读写作准备。 用于确定挂接在同一总线上 DS1820 的个数和识别 位 ROM 地址。为操作各器件作好准备。 忽略 位 ROM 地址,直接向 DS1820 发温度变换命令。适用于单片工作。 搜索 ROM 0FOH 跳过 ROM 0CCH 告警搜索命令 0ECH 执行后只有温度超过设定值上限或下限的片子才做出响应。 表1 ROM指令表 指 令 约定代码 44H 功 能 温度变换 启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75ms)。结果存入内部9字节RAM中。 读内部RAM中9字节的内容 读暂存器 写暂存器 复制暂存器 重调 EEPROM 读供电方式 0BEH 4EH 发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据。 将RAM中第3 、4字节的内容复制到EEPROM中。 48H 0B8H 将EEPROM中内容恢复到RAM中的第3 、4字节。 0B4H 读DS1820的供电模式。寄生供电时DS1820发送“ 0 ”,外接电源供电 DS1820发送“ 1 ”。 表2 RAM指令表 ㈣DS18B20操作时序

DS18B20的时序有着严格的要求,每个操作之间的电平时间必须按照资料上面的进行,不然就不能对温度传感器正确的操作,一般有芯片初始化操作、读操作和写操作。详细的操作参照DS18B20手册。 三、数码管 此系统采用的是共阳极性的LED数码管。如图1-6

图1-6 数码管极性及端口分布 不过,我们此次

是采用的四合一的数码管。如图1-7

图1-7 四合一数码管

Ⅱ─软件部分

一、KEIL C51

㈠、KEIL C51编程软件简介

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面,包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。可以完成编辑、编译、连接、调试、仿真等整个开发流程。 ㈡、KEIL C51的使用方法

1、项目文件的建立

KEIL C51软件现在常用的是第三版本的(KEIL Uv3),所以打开的界面如图2-1。

图2-1 KEIL Uv3 主界面 选择Project菜单下的New Project命令,弹出如图2-2对话框。

图2-2 Create New Project 对话框

在键入“18B20温度测量”过后弹出图2-3芯片选择对话框,在这里选择使用的Atmel 公司的ATC52芯片如图2-4。此时会提醒用户是不是添加启动代码,这里选“是”。

图2-3 Select Devicr for Target‘Target1’对话框

图2-4 选择ATC52 2、给工程添加源文件

单击右图所标的

,弹出图

2-5对话框,在标注的‘1’可以添加分组,‘2’是添加工程源文件。这里再我们建一个用户组,用于添加源文件。添加源文件点击图2-5中标注‘2’,在弹出的对话框中添加一个源文件后缀名为“*.C”的文件,我们这里添加“18B20温度测量.C”文件,如图2-6所示。

图2-5 Components,Environment and Books对话框

图2-6 添加工程源文件 不过,在刚开始建立的工程中一般没有源文件的,所以我们要新建一个源文件。我们可以点击右面标注所以的图标温度测量.C”

,再保存、命名。如2-7所示,这里我们命名为“18B20

图2-7 保存对话框 3、编译、连接项目,形成目标文件 把保存了的工程源文件添加到工程当中过后,我们就可以编程、连接、调试了。在编译之前我们设置一下,在通过过后会生成“*.HEX文件”,这就是单片机所需的程序文件。设置如图2-8.

图2-8 工程设置 编译、连接时,如果程序有错,则编译不成功,并在下面的信息窗口给出相应的提示信息,以便用户修改。如图2-9,这个是编译成功的情况。

图2-9 编译成功

二、STC-ISP ㈠、STC-ISP软件简介 STC-ISP 是一款单片机下载编程烧录软件,是针对STC系列单片机而设计的,可下载STC系列、12C2052系列和12C5410等系列的STC单片机,使用简便,现已被广泛使用。 ㈡、STC-ISP的使用方法 现目前使用的是STC-ISP的版本是V4.7.9的版本。打开软件,出现如图2-10所示的界面。

图2-10 STC-ISP V4.7.9 主界面

在程序下载之前要先设置,要选择对应的芯片、COM口、波特率(一般可以默认不变)。 设置好过后再用串口线把电脑和开发板连接好就可以下载程序到芯片当中了,点击主界面的“OpenFile/打开文件”,弹出如图2-11的对话框,选择需要的“*.HEX或者是*.BIN”文件。 在下载时候,开发板需要重新复位一次,可用对开发板重新上电的办法。

图2-11 Open file 对话框 Ⅲ─测温系统设计 一、硬件电路部分 硬件电路部分是使用AM-51H开发板上的器件,其硬件电路原理图如图3-1和3-2所示。

图3-1 温度系统测量原理图─1

3-1 温度系统测量原理图─2 二、程序设计部分 硬件结构构思好后,就可对系统进行编程实现功能了。此系统的关键问题也就是对DS18B20操作问题。因此,清楚DS18B20工作原理对温度测量就有很大的帮助。 在经过查阅DS18B20资料过后,清楚其工作原理后,大概的主体构思也就出来了。通过对DS18B20温度传感器的对温度测量、转换,把得到的二进制的温度数据经过单片机内部运算过后,再用LED数码管显示出来。 系统结构图: 主程序流程图:

具体程序见附件。

Ⅳ─总结 在本周的实习里,根据要求,在老师的指导下顺利的完成了要求的内容。作为电气专业的学生,专业涉及的学科知识就比较多,例如:电力电子技术、数电、模电计算机技术、电机电器技术信息与网络控制技术、机电一体化技术等诸多领域。而且是强弱电结合,机电结合,软硬件结合,对于本周实习内容就是关于计算机技术方面的基本训练。经过以前的实习学习,再加上本学期的实习锻炼,提升了我们对51单片机掌握,让我们不仅学到了硬件方面的知识,在软件运用方面有了更多的了解和编程、动手能力上也有很大的提升。

此外,对于我们工科的学生,思维方面就应该要快,在此类型的实习当中,对我们的思维能力有很好的锻炼。单片机应用系统所具备的就是要有清晰的思路,尤其是逻辑方面的思考, 而且,在数电、模电方面的知识必须要有良好的基础。 所以,我觉得此实习意义在于我们对所学知识的综合运用的一个考验,不仅锻炼了我们综合运用能力,还培养了学习兴趣,使学习不会那么枯燥,提高了教学质量,对学生的理解有着很大的帮助,对我们以后的工作、学习、生活起到了积极作用。

附1:温度测量系统程序如下:

//DS18B20的读写程序,数据脚P1.0 // //温度传感器18B20汇编程序,采用器件默认的12位转化 // //最大转化时间750微秒,显示温度-55到+125度,显示精度 // //为0.1度,显示采用4位LED共阳显示测温值 // //P0口为段码输入,P2.0~P2.3为位选 // /***************************************************/ #include \"reg52.h\"

#include \"intrins.h\" //_nop_();延时函数用 #define Disdata P0 //段码输出口 #define discan P2 //扫描口 #define uchar unsigned char #define uint unsigned int

sbit DQ=P1^0; //温度输入口

sbit DIN=P0^7; //LED小数点控制 uint h; uint temp;

//**************温度小数部分用查表法***********// uchar code ditab[16]=

{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};

//共阳LED段码表 \"0\" \"1\" \"2\" \"3\" \"4\" \"5\" \"6\" \"7\" \"8\" \"9\" \"不亮\" \"-\" uchar code scan_con[4]={0xf7,0xfb,0xfd,0xfe}; //列扫描控制字 uchar data temp_data[2]={0x00,0x00}; //读出温度暂放

uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用

/*****************11us延时函数*************************/

void delay(uint t) {

for (;t>0;t--); }

/****************显示扫描函数***************************/ scan() {

char k;

for(k=0;k<4;k++) //4位LED扫描控制 {

Disdata=dis_7[display[k]]; //数据显示

if (k==1){DIN=0;} //小数点显示 discan=scan_con[k]; //位选 delay(200); } }

/****************DS18B20复位函数************************/ ow_reset(void) {

char presence=1; while(presence) {

while(presence) {

DQ=1;_nop_();_nop_(); //从高拉倒低 DQ=0; delay(50); //550 us DQ=1; delay(6); //66 us presence=DQ; //presence=0 复位成功,继续下一步 }

delay(45); //延时500 us presence=~DQ; } DQ=1; //拉高电平 }

/****************DS18B20写命令函数************************/ //向1-WIRE 总线上写1个字节 void write_byte(uchar val) {

uchar i;

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

DQ=1;_nop_();_nop_(); //从高拉倒低 DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us

DQ=val&0x01; //最低位移出 delay(6); //66 us val=val/2; //右移1位 }

DQ=1; delay(1); }

/****************DS18B20读1字节函数************************/ //从总线上取1个字节 uchar read_byte(void) {

uchar i;

uchar value=0; for(i=8;i>0;i--) {

DQ=1;_nop_();_nop_(); value>>=1;

DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us if(DQ)value|=0x80;

delay(6); //66 us } DQ=1; return(value); }

/****************读出温度函数************************/ read_temp() {

ow_reset(); //总线复位 delay(200);

write_byte(0xcc); //发命令

write_byte(0x44); //发转换命令 ow_reset(); delay(1);

write_byte(0xcc); //发命令 write_byte(0xbe);

temp_data[0]=read_byte(); //读温度值的低字节 temp_data[1]=read_byte(); //读温度值的高字节 temp=temp_data[1];

temp<<=8; temp=temp|temp_data[0]; // 两字节合成一个整型变量。 return temp; //返回温度值 }

/****************温度数据处理函数************************/

//二进制高字节的低半字节和低字节的高半字节组成一字节,这个

//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩 //下的低字节的低半字节转化成十进制后,就是温度值的小数部分

/********************************************************/ work_temp(uint tem) {

uchar n=0;

if(tem>6348) // 温度值正负判断

{tem=65536-tem;n=1;} // 负温度求补码,标志位置1 display[4]=tem&0x0f; // 取小数部分的值 display[0]=ditab[display[4]]; // 存入小数部分显示值

display[4]=tem>>4; // 取中间八位,即整数部分的值 display[3]=display[4]/100; // 取百位数据暂存 display[1]=display[4]%100; // 取后两位数据暂存 display[2]=display[1]/10; // 取十位数据暂存 display[1]=display[1]%10;

/******************符号位显示判断**************************/ if(!display[3]) {

display[3]=0x0a; //最高位为0时不显示 if(!display[2]) {

display[2]=0x0a; //次高位为0时不显示 } }

if(n){display[3]=0x0b;} //负温度时最高位显示\"-\" }

/****************主函数************************/ void main() {

Disdata=0xff; //初始化端口 discan=0xff;

for(h=0;h<4;h++) //开机显示\"0000\" {display[h]=0;}

ow_reset(); //复位 write_byte(0xcc); //Skip ROM write_byte(0x44); //发转换命令

for(h=0;h<100;h++) //开机显示\"0000\" {scan();} while(1) {

work_temp(read_temp()); //处理温度数据 scan(); //显示温度值 } }

//***********************结束**************************//

附件2:温度测量实物图

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务