温度采集设计报告书

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机原理与接口技术
课程设计
温度采集设计报告
班级09机电2班
姓名:张耀斌学号24
同组人何鹏学号10
同组人杨杰学号38
同组人陈旺成学号55
广东省科学技术职业学院二O一一年六月二十九日
目录
一、绪论
二、硬件介绍
2.1STC89C51
2.2 4位七段数码管
2.3 DS18B20
三、电路图
四、软件系统设计
五、实验结果分析与总结
一.绪论
温度参数检测在测控系统,工业系统等场合中占有重要的地位.针对环境温
度检测,贴片机PCB板制造中回流焊接温度的测量分析,食品加工业.陶瓷工业.生物科研领域等需要检测和分析温度变化的场合,设计一个具有温度实时显示和动态记录功能的温度检测系统,对于提高工作效率和实现智能化测控具有很好的应用价值..
本设计运用了DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器DS18B20.与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。

运用着单片机和DS18B20,再加上数码管.我们可以制造出一个简单的温控系统.
关键词:单片机,DS18B20,智能化
二.硬件电路设计
2.1 STC89C51
STC89C51是一种带4K字节闪烁可编程可擦除只读存储器
(FPEROM—Falsh Programmable and Erasable Read Only
Memory)的低电压、高性能CMOS8位微处理器.
·与MCS-51 兼容
·4K字节可编程闪烁存储器
寿命:1000写/擦循环
数据保留时间:10年
·全静态工作:0Hz-24MHz
·三级程序存储器锁定
·128*8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路
VCC:供电电压。

GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据地址的第八位。

在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL 门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,
将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL 门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:来自反向振荡器的输出。

编辑本段振荡器特性
XTAL1和XTAL2分别为反向放大器的输入和输出。

该反向放大器可以配置为片内振荡器。

石晶振荡和陶瓷振荡均可采用。

如采用外部时钟源驱动器件,XTAL2应不接。

有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

编辑本段芯片擦除
整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。

在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被
重复编程以前,该操作必须被执行。

此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。

在闲置模式下,CPU停止工作。

但RAM,定时器,计数器,串口和中断系统仍在工作。

在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。

2.2 4位七段数码管
数码管使用条件:
a、段及小数点上加限流电阻
b、使用电压:段:根据发光颜色决定;小数点:
根据发光颜色决定
c、使用电流:静态:总电流80mA(每段10mA);动态:平均电流4-5mA 峰值电流100mA
上面这个只是七段数码管引脚图,其中共阳极数码管引脚图和共阴极的是一样的,4位数码管引脚图请在本站搜索我也提供了数码管使用注意事项说明:
(1)数码管表面不要用手触摸,不要用手去弄引角;
(2)焊接温度:260度;焊接时间:5S
(3)表面有保护膜的产品,可以在使用前撕下来。

数码管测试方法与数字显示译码表

三、测试:同测试普通半导体二极管一样。

注意!万用表应放在R×10K档,因为R×1K档测不出数码管的正反向电阻值。

对于共阴极的数码管,红表笔接数码管的“-”,黑表笔分别接其他各脚。

测共阳极的数码管时,黑表笔接数码管的vDD,红表笔接其他各脚。

另一种测试法,用两节一号电池串联,对于共阴极的数码管,电池的负极接数码管的“-”,电池的正极分别接其他各脚。

对于共阳极的数码管,电池的正极接数码管的VDD,电池的负极分别接其他各脚,看各段是否点亮。

对于不明型号不知管脚排列的数码管,用第一种方法找到共用点,用第二种方法测试出各笔段a-g、Dp、H等。

外部图内部图
2.3 DS18B20
1.DS18B20简介
(1)独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

(2)在使用中不需要任何外围元件。

(3)可用数据线供电,电压范围:+3.0~ +5.5 V。

(4)测温范围:-55 ~+125 ℃。

固有测温分辨率为0.5 ℃。

(5)通过编程可实现9~12位的数字读数方式。

(6)用户可自设定非易失性的报警上下限值。

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

(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。

DS18B20的测温原理
DS18B20的测温原理如图所示,图中低温度系数晶振的振荡频率受温度的影响很小〔1〕,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。

计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55 ℃所对应的一个基数值。

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

图2中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。

另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。

系统对DS18B20的各种操作必须按协议进行。

操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。

各种操作的时序图与DS1820相同,可参看文献〔2〕。

DS18B20工作过程及时序
DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。

高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。

DS18B20内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。

在计数器2停止计数后,比较器将计数器1中的计数剩余值转换为温度值后与0.25℃进行比较,若低于0.25℃,温度寄存器的最低位就置0;若高于0.25℃,最低位就置1;若高于0.75℃时,温度寄存器的最低位就进位然后置0。

这样,经过比较后所得的温度寄存器的值就是最终读取的温度值了,其最后位代表0.5℃,四舍五入最大量化误差为±1/2LSB,即0.25℃。

温度寄存器中的温度值以9位数据格式表示,最高位为符号位,其余8位以二进制补码形式表示温度值。

测温结束时,这9位数据转存到暂存存储器的前两个字节中,符号位占用第一字节,8位温度数据占据第二字节。

DS18B20测量温度时使用特有的温度测量技术。

DS18B20内部的低温度系数振荡器能产生稳定的频率信号;同样的,高温度系数振荡器则将被测温度转换成频率信号。

当计数门打开时,DS18B20进行计数,计数门开通时间由高温度系数振荡器决定。

芯片内部还有斜率累加器,可对频率的非线性度加以补偿。

测量结果存入温度寄存器中。

一般情况下的温度值应该为9位,但因符号位扩展成高8位,所以最后以16位补码形式读出。

DS18B20工作过程一般遵循以下协议:初始化——ROM操作命令——存储器操作命令——处理数据
①初始化
单总线上的所有处理均从初始化序列开始。

初始化序列包括总线主机发出一复位脉冲,接着由从属器件送出存在脉冲。

存在脉冲让总线控制器知道DS1820 在总线上且已准备好操作。

②ROM操作命令
一旦总线主机检测到从属器件的存在,它便可以发出器件ROM操作命令之一。

所有ROM 操作命令均为8位长。

这些命令列表如下:
Read ROM(读ROM)[33h]
此命令允许总线主机读DS18B20的8位产品系列编码,唯一的48位序列号,以及8位的CRC。

此命令只能在总线上仅有一个DS18B20的情况下可以使用。

如果总线上存在多于一个的从属器件,那么当所有从片企图同时发送时将发生数据冲突的现象(漏极开路会产生线与的结果)。

④处理数据
DS18B20的高速暂存存储器由9个字节组成,其分配如图3所示。

当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。

单片机可通过单线接口读到该数据,读取时低位在前,高位在后。

三、电路图
四、软件系统设计
#include<reg51.h>
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
sbit DQ=P2^0; //DQ接口
unsigned char discount[]={1,2,3,4}; //个,十,百位
unsigned char dis_num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // 段选unsigned char dis_wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//位选
void delay(uchar k) //延时子函数
{
uchar i;
for(i=0;i<k;i++);
}
void time0()
{ //
定时器函数
TR0=0;
TH0=0Xdf;
TL0=0Xbb;
TF0=0;
TR0=1;
}
//DS18B20复位子函数
void DS18B20_reset()
{
DQ=1; //
拉高电平
delay(1); //延时大约9US
DQ=0; //
拉低电平
delay(100); //
延时410US
DQ=1;
delay(50);
}
void DS18B20_write(uchar Dat)
//DS18B20写子函数
{
uchar j;
for(j=0;j<8;j++)
{
DQ=1;
delay(1); //延时9US
DQ=0;
delay(1);
DQ=Dat&0x01; //写数据
delay(1);
DQ=1;
Dat>>=1; //准备写下一位
}
}
uchar DS18B20_Read()
//DS18B20读子函数
{
uchar j,valude;
for(j=0;j<8;j++)
{
DQ=1;
DQ=0;
DQ=1;
delay(1); //延时9US
if(DQ)valude|=0x80; //读数据
if(j==7)break;
valude>>=1; //准备读下一位
}
return valude;
}
uint Read_temperature() //温度采集{
unsigned char tempL=0; //定义低位unsigned char tempH=0; //定义高位unsigned int temperature=0; //定义温度
DS18B20_reset(); //复位
DS18B20_write(0xcc); //跳过读序号列号的操作
DS18B20_write(0x44); //启动温度转换
DS18B20_reset(); //复位
DS18B20_write(0xcc); //跳过读序号列号的操作
DS18B20_write(0xbe); //读取温度寄存器等(共可读9个寄存器)前两个就是温度
tempL=DS18B20_Read(); //读低八位
tempH=DS18B20_Read(); //读高八位
temperature=((tempH*256)+tempL); //当前温度if(tempH>20)
temperature=(~temperature+1)*0.625; //零下转换else
temperature*=0.625; //零上转换
return temperature;
}
void Get_temperature() //当前温度
转换成十进制子函数
{
unsigned int x;
x=Read_temperature();
discount[3]=x/1000;
//拆百位
discount[2]=x%1000/100;
//拆十位
discount[1]=(x%1000-discount[2]*100)/10; //拆个位
discount[0]=x%10; //拆小数点
}
void int_time0()interrupt 1 //动态扫描显示子函数
{
unsigned char i;
P2=dis_wei[i+3]; //显示哪位
if(i==1) P0=dis_num[discount[i]]&0x7f;
else P0=dis_num[discount[i]]; //此位的值
i++;
if(i==4)i=0;
time0(); //定时器初始化
}
main()
{
TMOD=0x01; //定时器工作方式0
EA=1; //打开中断ET0=1; //打开定时中断0
time0(); //定时器初始化while(1)
{
Read_temperature(); //调用温度采集函数
Get_temperature(); //调用当前温度转换成十进制函数
}
}
五、实验结果分析与总结
在这次实验中,最难的不是硬件方面.因为硬件只有七段数码管、一个DS18B20和一个单片机,连接很简单。

难得就是在软件方面。

编程的时候一定要按照它的时序图,有一点差错都不行。

编程如果给的时间过长绝对不能通过,给的过短也不行,所以在调试的过程是最痛苦的。

程序分为三大块,复位、写和读,只要一部分不能通过都不行,所以在调试的时候不知道是哪部分有错误,也可能这部分是对就被你改错了,改了无数次之后才能成功。

经过这次实验后,对DS18B20最大经验是时间宜短不宜长。

实验电路的连接虽然比较简单,但因为接线脚管的位置不能调整,在线路焊接时容易导致线路的交叉,破坏线路,所以焊接前必须考虑线路的分布,以免做成短路影响结果。

相关文档
最新文档