基于51单片机DS18B20温度采集器.docx
- 文档编号:5411026
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:19
- 大小:111.11KB
基于51单片机DS18B20温度采集器.docx
《基于51单片机DS18B20温度采集器.docx》由会员分享,可在线阅读,更多相关《基于51单片机DS18B20温度采集器.docx(19页珍藏版)》请在冰豆网上搜索。
基于51单片机DS18B20温度采集器
一核心器件的基本构成及特性
1.1AT89S51功能特性
89C51是INTEL公司MCS-51系列单片机中基本的产品,它采用INTEL公司可靠的CHMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。
它结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于80C51基础型单片机版本,集成了时钟输出和向上或向下计数器等更多的功能。
89C51内置8位中央处理单元、256字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。
此外,89C51还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。
在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。
掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。
89C51有PDIP(40pin)和PLCC(44pin)两种封装形式。
1.2AT89S51管脚介绍
AT89C51单片机是把那些作为控制应用所必需的基本内容都集成在一个尺寸有限的集成电路芯片上。
如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM)、并行I/O口(4个8位I/O口)、串行口、定时器/计数器、中断系统及特殊功能寄存器。
它们都是通过片内单一总线连接而成,其基本结构依旧是微处理器(CPU)加上外围芯片的传统结构模式。
但对各种功能部件的控制是采用特殊功能寄存器的集中控制方式,以实现不同的功能。
AT89C51单片机如图所示。
1.1.1引脚功能介绍
Vcc(40引脚):
接+5V电源。
Vss(20引脚):
接地。
XTAL1(19引脚):
片内振荡器反相放大器和时钟发生器电路的输入端。
XTAL2(18引脚):
片内震荡器反相放大器的输出端。
RST:
复位引脚,高电平有效。
EA:
外部程序存储器访问允许控制端。
ALE:
低8位地址锁存允许信号端。
PSEN:
读外部程序存储器的选通信号端。
P0口:
8位,漏极开路的双向I/O口。
P1口:
8位,准双向I/O口,具有内部上拉电阻。
P2口:
8位,准双向I/O口,具有内部上拉电阻。
P3口:
8位,准双向I/O口,具有内部上拉电阻。
1.1.2微处理器(CPU)
AT89C51单片机中有一个8位的微处理器,与通用的微处理器基本相同,同样包括了运算器和控制器两大部分,只是增加了面向控制的处理功能,不仅可处理数据,还可以位变量的处理。
1.1.3数据存储器(RAM)
数据存储器空间分为片内与片外两部分。
当AT89C51单片机的片内RAM不够用时,又给用户提供了在片外可扩展至64KBRAM的能力,以供用户的需求。
片内为128个字节,字节地址为00H~7FH。
片外最多可外扩至64k字节,用来存储程序在运行期间的工作变量、运算的中间结果、数据暂存和缓冲、标志位等,所以称为数据存储器。
1.1.4程序存储器(ROM)
AT89C51单片机的片内程序存储器为4KB的FLASH存储器,地址范围为0000H~0FFFH。
有16位地址线,可外扩的程序存储器空间最大为64KB,地址范围为0000H~FFFFH。
由于受集成度限制,片内只读存储器一般容量较小,如果片内的只读存储器的容量不够,则需用扩展片外的只读存储器,片外最多可外扩至64k字节。
1.1.5中断系统
具有5个中断源,2级中断优先权。
定时器/计数器
片内有2个16位的定时器/计数器,具有四种工作方式(方式0、方式1、方式2、方式3)。
串行口
1个全双工的串行口,具有四种工作方式。
可用来进行串行通讯,扩展并行I/O口,甚至与多个单片机相连构成多机系统,从而使单片机的功能更强且应用更广。
1.1.6特殊功能寄存器(SFR)
AT89C51单片机共有21个特殊功能寄存器,用于对片内的个功能的部件进行管理、控制、监视。
实际上是一些控制寄存器和状态寄存器,是一个具有特殊功能的RAM区。
由上可见,AT89C51单片机的硬件结构具有功能部件种类全,功能强等特点。
特别值得一提的是该单片机CPU中的位处理器,它实际上是一个完整的1位微计算机,这个1位微计算机有自己的CPU、位寄存器、I/O口和指令集。
1位机在开关决策、逻辑电路仿真、过程控制方面非常有效;而8位机在数据采集,运算处理方面有明显的长处。
MCS-51单片机中8位机和1位机的硬件资源复合在一起,二者相辅相承,它是单片机技术上的一个突破,这也是MCS-51单片机在设计的精美之处,得以在实际生活中得到了广泛的应用。
1.3DS18B20的主要特性
这里我们用到温度芯片DS18B20。
DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式。
测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出。
其工作电源既可在远端引入,也可采用寄生电源方式产生。
CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
DS18B20支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:
环境控制、设备或过程控制、测温类消费电子产品等。
1.4DS18B20的内容结构
(1)DS18B20的内部结构如下图所示。
DS18B20内部结构图
DS18B20有4个主要的数据部件:
①64位激光ROM。
64位激光ROM从高位到低位依次为8位CRC、48位序列号和8位家族代码(28H)组成。
②温度灵敏元件。
③非易失性温度报警触发器TH和TL。
可通过软件写入用户报警上下限值。
④配置寄存器。
配置寄存器为高速暂存存储器中的第五个字节。
DS18B20在0工作时按此寄存器中的分辨率将温度转换成相应精度的数值,其各位定义如图所示。
TM
R1
R0
1
1
1
1
1
DS18B20配置寄存器结构图
其中,TM:
测试模式标志位,出厂时被写入0,不能改变;R0、R1:
温度计分辨率设置位,其对应四种分辨率如下表所列,出厂时R0、R1置为缺省值:
R0=1,R1=1(即12位分辨率),用户可根据需要改写配置寄存器以获得合适的分辨率。
配置寄存器与分辨率关系表:
R0
R1
温度计分辨率/bit
最大转换时间/us
0
0
9
93.75
0
1
10
187.5
1
0
11
375
1
1
12
750
(2)高速暂存存储器
高速暂存存储器由9个字节组成,其分配如下图所示。
当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如图所示。
对应的温度计算:
当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。
温度低位
温度高位
TH
TL
配置
保留
保留
保留
8位CRC
LSB
DS18B20存储器映像图
MSB
温度值格式图DS18B20温度数据表:
23
22
21
20
2-1
2-2
2-3
2-4
MSB
LSB
S
S
S
S
S
26
25
24
典型对应的温度值表:
温度/℃
二进制表示
十六进制表示
+125
+25.0625
+10.125
+0.5
0
-0.5
-10.125
-25.0625
-55
0000011111010000
0000000110010001
0000000010100010
0000000000001000
0000000000000000
1111111111111000
1111111101011110
1111111001101111
1111110010010000
07D0H
0191H
00A2H
0008H
0000H
FFF8H
FF5EH
FE6FH
FC90H
1.5DS18B20的应用电路
DS18B20最大的特点是单总线数据传输方式,DS18B20的数据I/O均由同一条线来完成。
硬件连接电路如下图:
本系统为多点温度测试。
DS18B20采用外部供电方式,理论上可以在一根数据总线上挂256个DS18B20,但时间应用中发现,如果挂接25个以上的DS18B20仍旧有可能产生功耗问题。
另外单总线长度也不宜超过80M,否则也会影响到数据的传输。
在这种情况下我们可以采用分组的方式,用单片机的多个I/O来驱动多路DS18B20。
在实际应用中还可以使用一个MOSFET将I/O口线直接和电源相连,起到上拉的作用。
1.6DS18B20的注意事项
对DS18B20的设计,需要注意以下问题
(1)对硬件结构简单的单线数字温度传感器DS18B20进行操作,需要用较为复杂的程序完成。
编制程序时必须严格按芯片数据手册提供的有关操作顺序进行,读、写时间片程序要严格按要求编写。
尤其在使用DS18B20的高测温分辨力时,对时序及电气特性参数要求更高。
(2)有多个测温点时,应考虑系统能实现传感器出错自动指示,进行自动DS18B20序列号和自动排序,以减少调试和维护工作量。
(3)测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接地。
DS18B20在三线制应用时,应将其三线焊接牢固;在两线应用时,应将VCC与GND接在一起,焊接牢固。
若VCC脱开未接,传感器只送85.0℃的温度值。
(4)实际应用时,要注意单线的驱动能力,不能挂接过多的DS18B20,同时还应注意最远接线距离。
另外还应根据实际情况选择其接线拓扑结构。
二理论分析及流程图
整个系统的功能是由硬件电路配合软件来实现的,当硬件基本定型后,软件的功能也就基本定下来了。
从软件的功能不同可分为两大类:
一是监控软件(主程序),它是整个控制系统的核心,专门用来协调各执行模块和操作者的关系。
二是执行软件(子程序),它是用来完成各种实质性的功能如测量、计算、显示、通讯等。
每一个执行软件也就是一个小的功能执行模块。
这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义。
各执行模块规划好后,就可以规划监控程序了。
首先要根据系统的总体功能和键盘设置选择一种最合适的监控程序结构,然后根据实时性的要求,合理地安排监控软件和各执行模块之间地调度关系。
2.1:
主电路程序方案
主程序调用了4个子程序,分别是数码管显示程序、温度测试程序、中断控制程序、单片机与PC机串口通讯程序。
温度测试程序:
对温度芯片送过来的数据进行处理,进行判断和显示。
数码管显示程序:
向数码的显示送数,控制系统的显示部分。
中断控制程序:
实现循环显示功能。
串口通讯程序:
实现PC机与单片机通讯。
2.2读取温度子程序流程图
将各个功能程序以子程序的形式写好,当写主程序的时候,只需要调用子程序,然后在寄存器的分配上作一下调整,消除寄存器冲突和I/O冲突即可。
程序应该尽可能多的使用调用指令代替跳转指令。
因为跳转指令使得程序难以看懂各程序段之间的结构关系。
而调用指令则不同,调用指令使得程序结构清晰,无论是修改还是维护都比较方便。
将功能程序段写成子程序的形式,除了方便调用之外,还有一个好处那就是以后写程序的时候如果要用到,就可以直接调用这个单元功能模块。
2.3温度转换命令子程序流程图
中断控制程序设计:
串口通信程序设计:
软件流程图如下:
单片机程序流程图
PC通讯程序流程图
三电路与程序设计
3.1读DS18B20ROM程序
/*****1ds1820序列号获得******/;
数码管显示八组(64位)ROM数据
A_BITEQU35H;
B_BITEQU36H
ORG0000H
AJMPMAIN
ORG0100H
MAIN:
MOVSP,#60H
CLREA;使用ds1820一定要禁止任何中断产生
LCALLINT;初始化ds1820
MOVA,#33H
LCALLWRITE;送入读ds1820的ROM命令
LCALLREAD;开始读出当前ds1820序列号
MOV40H,A
LCALLREAD
MOV41H,A
LCALLREAD
MOV42H,A
LCALLREAD
MOV43H,A
LCALLREAD
MOV44H,A
LCALLREAD
MOV45H,A
LCALLREAD
MOV46H,A
LCALLREAD
MOV47H,A
LCALLDISPLAY
SETBEA
SJMP$
DISPLAY:
movr2,#8
MOVR4,#0
movr1,#40H
LOOP:
mova,@r1;将ram中的十六进制数转换成10进制
movb,#16;10进制/10=10进制
divab
movb_bit,a;十位在a
mova_bit,b;个位在b
movdptr,#TAB;指定查表启始地址
clrp2.2;
movr0,#250
MOVR3,#10
dplop:
mova,a_bit;取个位数
MOVCA,@A+DPTR;查个位数的7段代码
setbp2.1;开个位显示
clrp2.0;
movp0,a;送出个位的7段代码
acalld1ms
acalld1ms;显示1ms
movp0,#0
mova,b_bit;取十位数
MOVCA,@A+DPTR;查十位数的7段代码
SETBp2.0;开十位显示
clrp2.1;
movp0,a;送出十位的7段代码
acalld1ms;显示1ms
acalld1ms
movp0,#0
mova,R4;取十位数
MOVCA,@A+DPTR;查十位数的7段代码
CLRp2.0;开十位显示
clrp2.1;
movp0,a;送出十位的7段代码
acalld1ms;显示1ms
acalld1ms
movp0,#0
djnzr0,dplop;4个100次没完循环
djnzr3,dplop
INCR1
INCR4
DJNZr2,LOOP
RET
;***********************************
D1MS:
MOVR7,#80;1MS延时(按12MHZ算)
DJNZR7,$
RET
TA:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7cH,39H,5eH,79H,71H
RET
INT:
;初始化ds1820子程序
CLREA
L0:
CLRP2.3;ds1820总线为低复位电平
MOVR2,#200
L1:
CLRP2.3
DJNZR2,L1;总线复位电平保持400us
SETBP2.3;释放ds1820总线
MOVR2,#30
L4:
DJNZR2,L4;释放ds1820总线保持60us
CLRC;清存在信号
ORLC,P2.3
JCL0;存在吗?
不存在则重新来
MOVR6,#80
L5:
ORLC,P2.3
JCL3
DJNZR6,L5
SJMPL0
L3:
MOVR2,#240
L2:
DJNZR2,L2
RET
WRITE:
;向ds1820写操作命令子程序
CLREA
MOVR3,#8;写入ds1820的bit数,一个字节8个bit
WR1:
SETBP2.3
MOVR4,#8
RRCA;把一个字节data(A)分成8个bit环移给C
CLRP2.3;开始写入ds1820总线要处于复位(低)状态
WR2:
DJNZR4,WR2;ds1820总线复位保持16us
MOVP2.3,C;写入一个bit
MOVR4,#20
WR3:
DJNZR4,WR3;等待40us
DJNZR3,WR1;写入下一个bit
SETBP2.3;重新释放ds1820总线
RET
READ:
CLREA
MOVR6,#8;连续读8个bit
RE1:
CLRP2.3;读前总线保持为低
MOVR4,#4
NOP
SETBP2.3;开始读总线释放
RE2:
DJNZR4,RE2;持续8us
MOVC,P2.3;从ds1820总线读得一个bit
RRCA;把读得的位值环移给A
MOVR5,#30
RE3:
DJNZR5,RE3;持续60us
DJNZR6,RE1;读下一个bit
SETBP2.3;重新释放ds1820总线
RET
END
3.2温度采集主程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
uchardatadisdata[5];
ucharcodetable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
ucharcodeLED_W[8]={0,1,2,3,4,5,6,7};
uinttvalue;//温度值
uchartflag;//温度正负标志
/**************************************************灵活改动*********************************/
uchard=3;//总路数灵活改动
sbitDQ=P2^3;//数据引脚
ucharcodestr[3][8]={{0x28,0x96,0x24,0x84,0x03,0x00,0x00,0xC9},{0x28,0x83,0x1B,0x1E,0x02,0x00,0x00,0xC3},{0x28,0x32,0x51,0x31,0x03,0x00,0x00,0xE6}};//ROM序列号0~n路
/**************************************************以上三个量灵活改动**********************/
/******************************ds1820程序***************************************/
voiddelay1ms(uintms)//延时1毫秒(不够精确的)
{uinti,j;
for(i=0;i for(j=0;j<100;j++); } voiddelay_18B20(uinti)//延时1微秒 { while(i--); } voidds1820rst()/*ds1820复位*/ {ucharx=0; DQ=1;//DQ复位 delay_18B20(4);//延时 DQ=0;//DQ拉低 delay_18B20(100);//精确延时大于480us DQ=1;//拉高 delay_18B20(40); } uchards1820rd()/*读数据*/ {uchari=0; uchardat=0; for(i=0;i<8;i++) {DQ=0;//给脉冲信号 dat>>=1; DQ=1;//给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } voidds1820wr(uchardat)/*写数据*/ {uchari=0; for(i=0;i<8;i++) {DQ=0; DQ=dat&0x01; delay_18B20(10); DQ=1; dat>>=1; } } voidb20_Matchrom(uchara)//匹配ROM { charj; ds1820wr(0x55);//发送匹配ROM命令 for(j=0;j<8;j++) {ds1820wr(str[a][j]);//发送18B20的序列号,先发送低字节 } } read_temp(ucharz)/*读取温度值并转换*/ {uchara,b; floattt; ds1820rst(); ds1820wr(0xcc);//读序列号 ds1820rst(); b20_Matchrom(z);//匹配ROM ds1820wr(0x44);//*启动温度转换*/ delay1ms(5); ds1820rst(); ds1820wr(0xcc);//读序列号 ds1820rst(); b20_Matchrom(z);//匹配ROM ds1820wr(0xbe);//*读取温度*/ a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x0fff) tflag=0; else {tvalue=~tvalue+1; tflag=1; } tt=tvalue*0.0625; tvalue=tt*10; return(tvalue); } /**************************************************************** ●名称: ds1820disp(ucharz) ●功能: 数码管的显示 ●输入: 无 ●输出: 无 ***********************************************************************/ voidds1820disp(z)//温度值显示 {intc; disdata[0]=tvalue/1000+0x30;//百位数 disdata[1]=tvalue%1000/100;//十位数 disdata[2]=tvalue%100/10;//个位数 disdata[3]=tvalue%10+0x30;//小数 for(c=0;c<200;c++) { P0=table[z];//路数 P2=LED_W[4];//点亮第一位数码管 delay
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 DS18B20 温度 采集