




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、DS18B2弹线数字温度传感器DALLAS半导体公司的数字化温度传感器DS1820是世界上第一片支持线总线”接口的温度传感器,体积更小、适用电压更宽、更经济。一线总线独特而且经济的特点,使用户可轻松地组建温度传感器网络,为测量系统的构建引入全新概念。DS18B20、DS1822线总线”数字化温度彳感器同DS1820样,支持线总线”接口,测量温度范围为-55°C+125C,在-10+85°C范围内,精度为S.5C,而DS1822的精度较差为±2C。现场温度直接以一线总线”的数字方式传输,大大提高了系统的抗干扰性,适合于恶劣环境的现场温度测量,如:环境控制、设备或过程
2、控制、测温类消费电子产品等。DS18B20可以程序设定912位的分辨率,精度为S.5C,分辨率设定,以及用户设定的报警温度存储在EEPROM中,掉电后依然保存。DS1822与DS18B20软件兼容,是DS18B20的简化版本。省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为上。C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。继线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。1、DS18B20性能特点DS18B20的性能特点:采用单总线专用技术,既可通过
3、串行口线,也可通过其它I/O口线与微机接口,无须经过其它变换电路,直接输出被测温度值(9位二进制数,含符号位),测温范围为-55C-+125C,测量分辨率为0.0625C,内含64位经过激光修正的只读存储器ROM,适配各种单片机或系统机,用户可分别设定各路温度的上、下限,内含寄生电源。2、DS18B20内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM,温度传感器,非挥发的温度报警触发器TH和TL,高速暂存器。DS18B20的管脚排列如图1所示。64位光刻ROM是出厂前被光刻好的,它可以看作是该DS18B20的地址序列号,不同的器件地址序列号不同。8位产品系列号48位产品序号8位
4、CRC编码SOSI封装PR33封装图1DS18B20引脚分布图DS18B20高速暂存器共9个存储单元,如表所示:序号寄存器名称作用0r温度低字节以16位补码形式存放1温度高字节2TH/用户字节1存放温度上限3HL/用户字节2存放温度卜-限序号寄存器名称作用4、5r保留字节1、26计数器余值7计数器/C8CRCCRC校验5位是符号位。如果测得的温度大于0,这5位为0,只要以12位转化为例说明温度高低字节存放形式及计算:两个高低两个8位的RAM中,二进制中的前面12位转化后彳#到的12位数据,存储在18B20的将测到的数值乘于0.0625即可得到实际温度(等价说明:高8位字节的低3位和低8位字节的
5、高4位组成温度整数值的二进制数;或者说:12位测量时,所测数值乘以0.0625(=1/16),即右移4位后去掉了二进制数的小数部分);如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625才能得到实际温度(等价说明:当温度小于0时,整数部分就是各位取反,小数部分则是各位取反后加1)。高8位SSSSS262524低8位232221202-12-22-32-4说明:温度测量分辨率有四种,即9位测量分辨率0.5C;10位测量分辨率0.25C;11位测量分辨率0.125C;12位测量分辨率0.0625C;912位的测量,无论采用哪种分辨率,温度整数的有效位均是表中2620;以12位为例:
6、温度值二进制数十六进制数+125C000001111101000007D0H+25.0625C00000001100100010191H+10.125C000000001010001000A2H+0.5C00000000000010000008H0C00000000000000000000H-0.5C1111111111111000FFF8H-10.125C1111111101011110FF5EH-25.0625C1111111001101111FF6FH-125C1111110010010000FC90H1、DS18B20控制方法在硬件上,DS18B20与单片机的连接有两种方法,一种是VC
7、C接外部电源,GND接地,I/O与单片机的I/O线相连;另一种是用寄生电源供电,此时Udd、GND接地,I/O接单片机I/O。无论是内部寄生电源还是外部供电,I/O线要接5k左右的上拉电阻。DS18B20有六条控制命令,如下表所示:指令约定代码操作说明温度转换44H启动DS18B20进行温度转换读暂存器BEH读暂存器9个字节内容写暂存器4EH将数据写入暂存器的TH、TL字节复制暂存器148H把暂存器的TH、TL字节写到E2RAM中重新倜E2ramB8H把E2RAM中的TH、TL字节写到暂存器TH、TL字节读电源供电方式B4H启动DS18B20发送电源供电方式的佶号给主CPUCPU对DS18B2
8、0的访问流程是:先对DS18B20初始化,再进行RO谦作命令,最后才能对存储器操作,数据操作。DS18B20每一步操作都要遵循严格的工作时序和通信协议。如主机控制DS18B20完成温度转换这一过程,根据DS18B20的通讯协议,须经三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。多点温度检测软件流程图(读DS18B20测量温度子程序)GET-TEMPATURE开始数据端置位复位DS18B20(调用RESETDS18B20)NDS18B20是否存在?Y,写跳过ROM匹配命令0CCH(调用WRITE18
9、B20)写温度转换命令44H(调用WRITE18B20)N延时750gs?Y(读温度前)复位DS18B20(调用RESETDS18B20)写跳过POM匹配命令0CCH(调用WRITE18B20)写读温度字节命令0BEH(调用WRITE18B20)读温度(调用READ18B20)读温度值返回读DS18B20温度的流程图Initializationprocedureresetandpresencepulses1-W1REBUSLINETYPELEGEM口:DSi&B2QactiveBusmasteractivelowHesisicrpull-upBothbusmasterartd口acti
10、velowRESETDS18B20:SETBP2.2NOPCLRP2.2;主机发出延时537微秒的复位低脉冲MOVR1,#3TSR1:MOVR0,#107DJNZR0,$DJNZR1,TSR1SETBP2.2;然后拉高数据线NOPNOPNOPMOVR0,#25HTSR2:JNBP2.2,TSR3;等待DS18B20回应DJNZR0,TSR2LJMPTSR4;延时TSR3:SETBFLAG1;置标志位,表示DS1820存在CLRP1.7;检查至UDS18B20就点亮P1.7LEDLJMPTSR5TSR4:CLRFLAG1;清标志位,表示DS1820不存在CLRP1.1LJMPTSR7TSR5:M
11、OVR0,#117TSR6:DJNZR0,TSR6;时序要求延时一段时间TSR7:SETBP2.2RETMASTERWRITt"V帛UQT写DS18B20(子程序)开始进位标志位清零数据端清零延时(15ss)循环右移一次进位标志位值送数据端延时30Vs数据端置位(拉高数据线)DS18B20写返回写DS18B20指令字节的流程图MASTERREADTSLOTMASTERREAD"orSLOTGND-3-fT,MASTERSAMPLESEIREBUSilMASlfcRSAMPLES读DS18B20两个温度字节的流程图C51程序#include<AT89X52.H>#
12、include<INTRINS.h>unsignedcharcodedisplaybit尸0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;unsignedcharcodedisplaycode尸0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40;unsignedcharcodedotcode32=0,3,6,9,12,16,19,22,25,28,31,34,38,41,44,48,50,53,56,59,63,66,69,
13、72,75,78,81,84,88,91,94,97;unsignedchardisplaycount;unsignedchardisplaybuf8=16,16,16,16,16,16,16,16;unsignedchartimecount;unsignedcharreaddata8;sbitDQ=P3”bitsflag;bitresetpulse(void)unsignedchari;DQ=0;for(i=255;i>0;i-);DQ=1;for(i=60;i>0;i-);return(DQ);for(i=200;i>0;i-);Voidwritecommandtods1
14、8b20(unsignedcharcommand)unsignedchari;unsignedcharj;for(i=0;i<8;i+)if(command&0x01)=0)DQ=0;for(j=35;j>0;j-);DQ=1;ElseDQ=0;for(j=2;j>0;j-);DQ=1;for(j=33;j>0;j-);command=_cror_(command,1);unsignedcharreaddatafromds18b20(void)unsignedchari;unsignedcharj;unsignedchartemp;temp=0;for(i=0;
15、i<8;i+)temp=_cror_(temp,1);DQ=0;_nop_();_nop_();DQ=1;for(j=10;j>0;j-);if(DQ=1)temp=temp|0x80;elsetemp=temp|0x00;for(j=200;j>0;j-);return(temp);voidmain(void)TMOD=0x01;TH0=(65536-4000)/256;TL0=(65536-4000)%256;ET0=1;EA=1;while(resetpulse();writecommandtods18b20(0xcc);writecommandtods18b20(0x
16、44);TR0=1;while(1);voidt0(void)interrupt1using0unsignedcharx;unsignedintresult;TH0=(65536-4000)/256;TL0=(65536-4000)%256;if(displaycount=2)P0=displaycodedisplaybufdisplaycount|0x80;elseP0=displaycodedisplaybufdisplaycount;P2=displaybitdisplaycount;displaycount+;if(displaycount=8)displaycount=0;timec
17、ount+;if(timecount=150)timecount=0;while(resetpulse();writecommandtods18b20(0xcc);writecommandtods18b20(0xbe);readdata0=readdatafromds18b20();readdata1=readdatafromds18b20();for(x=0;x<8;x+)displaybufx=16;sflag=0;if(readdata1&0xf8)!=0x00)sflag=1;readdata1=readdata1;readdata0=readdata0;result=r
18、eaddata0+1;readdata0=result;if(result>255)readdata1+;readdata1=readdata1<<4;readdata1=readdata1&0x70;x=readdata0;x=x>>4;x=x&0x0f;readdata1=readdata1|x;x=2;result=readdata1;while(result/10)displaybufx=result%10;result=result/10;x+;displaybufx=result;if(sflag=1)displaybufx+1=17;
19、x=readdata0&0x0f;x=x<<1;displaybuf0=(dotcodex)%10;displaybuf1=(dotcodex)/10;while(resetpulse();writecommandtods18b20(0xcc);writecommandtods18b20(0x44);;这是关于DS18B20的读写程序,数据脚P2.2,晶振11.0592MHz;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒;可以将检测到的温度直接显示到AT89C51的两个数码管上;显示温度00到99度,很准确无需校正!ORG0000H;单片机
20、内存分配申明!TEMPER_LEQU29H;用于保存读出温度的彳氐8位TEMPER_HEQU28H;用于保存读出温度的高8位FLAG1EQU38H;是否检测到DS18B20标志位a_bitequ20h;数码管个位数存放内存位置b_bitequ21h;数码管十位数存放内存位置MAIN:LCALLGET_TEMPER;调用读温度子程序;进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度;显示范围00到99度,显示精度为1度;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际
21、测量获得的温度;这个转化温度的方法可是我想出来的哦非常简洁无需乘于0.0625系数MOVA,29HMOVC,40H;将28H中的最低位移入CRRCAMOVC,41HRRCAMOVC,42HRRCAMOVC,43HRRCAMOV29H,ALCALLDISPLAY;调用数码管显示子程序CPLP1.0AJMPMAIN;这是DS18B20复位初始化子程序INIT_1820:SETBP2.2;数据脚NOPCLRP2.2;主机发出延时537微秒的复位低脉冲MOVR1,#3TSR1:MOVR0,#107DJNZR0,$DJNZR1,TSR1SETBP2.2;然后拉高数据线NOPNOPNOPMOVR0,#25
22、HDJNZLJMPR0,TSR2TSR4;延时TSR3:SETBFLAG1;置标志位,表示DS1820存在CLRP1.7;检查5ijDS18B20就点亮P1.7LEDLJMPTSR5TSR4:CLRFLAG1;涓标志位,表小DS1820/、存在CLRP1.1LJMPTSR7TSR5:MOVR0,#117TSR6:DJNZR0,TSR6;时序要求延时Tt时间TSR7:SETBP2.2TSR2:JNBP2.2,TSR3;等待DS18B20回应RET;读出转换后的温度值GET_TEMPER:SETBP2.2LCALLINIT_1820;先复位DS18B20JBFLAG1,TSS2CLRP1.2RET
23、;判断DS1820是否存在*DS18B20不存在则返回TSS2:CLRP1.3;DS18B20已经被检测到!!!MOVA,#0CCH;跳过ROM匹配LCALLWRITE_1820MOVA,#44H;发出温度转换命令LCALLWRITE_1820;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒LCALLDISPLAYLCALLINIT_1820;准备读温度前先复位MOVA,#0CCH;跳过ROM匹配LCALLWRITE_1820MOVA,#0BEH;发出读温度命令LCALLWRITE_1820LCALLREAD_18200;将读出的温度数据保存到35H/36HCL
24、RP1.4RET;写DS18B20的子程序(有具体的时序要求)WRITE_1820:MOVR2,#8;一共8位数据CLRCWR1:CLRP2.2MOVR3,#5DJNZR3,$RRCAMOVP2.2,CMOVR3,#21DJNZR3,$SETBP2.2NOPDJNZR2,WR1SETBP2.2RETREAD_18200:MOVR4,#2;将温度高位和低位从DS18B20中读出MOVR1,#29H;低位存入29H(TEMPER_L),高位存入28H(TEMPER.RE00:MOVR2,#8;数据一共有8位读DS18B20的程序,从DS18B20中读出两个字节的温度数据H)RE01:CLRCSET
25、BP2.2NOPNOPCLRP2.2NOPNOPNOPSETBP2.2MOVR3,#8RE10:DJNZR3,RE10MOVC,P2.2MOVR3,#21RE20:DJNZR3,RE20RRCADJNZR2,RE01MOVR1,ADECR1DJNZR4,RE00RET;显示子程序display:MOVA,29H;将29H中的十六进制数转换成10进制MOVB,#10;10进制/10=10进制DIVABMOVb_bit,A;十位在aMOVa_bit,B;个位在bMOVDPTR,#numtab;指定查表启始地址MOVR0,#4dpl1:MOVR1,#250;显示1000次dplop:MOVA,a_b
26、it;取个位数MOVCA,A+DPTR;查个位数的7段代码MOVP0,A;送出个位的7段代码CLRP2.7;开个位显示ACALLd1ms;显示1msSETBP2.7MOVA,b_bit;取十位数MOVCA,A+DPTR;查十位数的7段代码MOVP0,A;送出十位的7段代码CLRP2.6;开十位显示ACALLd1ms;显示1msSETBP2.6DJNZR1,dplop;100次没完循环DJNZR0,dpl1;4个100次没完循环RET;1MS延时dims:MOVR7,#80DJNZR7,$RET;实验板上的7段数码管09数字的共阴显示代码numtab:DB0CFH,03H,5DH,5BH,93H
27、,0DAH,0DEH,43H,0DFH,0DBHEND#include"reg51.h"#include"INTRINS.H"#include"LCD.h"#defineCLR_RI(RI=0)#defineCLR_TI(TI=0)unsignedcharcodeID28=0x28,0x1D,0x25,0x1D,0x00,0x00,0x00,0x80,0x28,0x0e,0x9e,0x1c,0x00,0x00,0x00,0x32;unsignedcharcurrSensorNo=0;sbitTMDAT=P1A7;sbitRUN_LED
28、=P1A6;/*/voidserial_initial()TMOD=0X20;SCON=0X50;PCON=0X00;TL1=TH1=0XE8;TR1=1;/*/voidsend(unsignedcharcount,unsignedcharSEND_Buf)unsignedchari;for(i=0;i<count;i+)SBUF=SEND_Bufi;while(!TI);CLR_TI;/*delayNms*/voidDelay_ms(unsignedintNms)unsignedchari;while(Nms-)for(i=0;i<125;i+);*/*delayNcountvo
29、idDelay_Count(unsignedcharCount)while(Count>0)Count-;*/*startResetPulsevoidtmreset(void)TMDAT=0;Delay_Count(103);TMDAT=1;Delay_Count(4);/*ACK*/voidtmpre(void)while(TMDAT);while(TMDAT);Delay_Count(4);/*Readabitfrom1820*/bittmrbit(void)inti=0;bitdat;TMDAT=0;i+;TMDAT=1;i+;i+;dat=TMDAT;Delay_Count(8)
30、;returndat;/*Readabytefrom1820*/unsignedchartmrbyte(void)unsignedchari,j,dat=0;for(i=1;i<=8;i+)j=tmrbit();dat=(j<<7)|(dat>>1);returndat;/*Readabytefrom1820*/voidtmwbyte(unsignedchardat)signedchari=0;unsignedcharj;bittestb;for(j=1;j<=8;j+)testb=dat&0x01;dat=dat>>1;if(testb)TMDAT=0;i+;i+;TMDAT=1;Delay_Count(8);elseTMDAT=0;Delay_Count(8);TMDAT=1;i+;i+;/*sendconvertcommandto1820*/voidtmstart(void)unsignedchari;tmreset();tmpre();Delay_ms(1);/*tmwbyte(0xcc);*/tmwbyte(0x55);for(i=0;i<8;i+)tmwbyte(IDcurrSensorNoi);tmwbyte(0x44);/*Readtempreaturefrom1820*/unsignedinttm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 居间委托销售协议书
- 工资发放免责协议书
- 电信保底协议书
- 屋顶漏水赔偿协议书
- 定车合同解除协议书
- 客运车辆合伙协议书
- 小区送货安全协议书
- 家居买卖合同协议书
- 市场开发或作协议书
- 法院民事协议书
- 哈尔滨工业大学《信号与系统》2020-2021学年期末考试试卷
- 民用爆炸物品仓库管理规定培训课件
- 康复医学科作业治疗技术操作规范2023版
- 活动安保应急预案
- 人教版八年级物理下册 实验题02 压力压强实验(含答案详解)
- 马克思主义基本原理智慧树知到课后章节答案2023年下宁波大学
- 肝硬化病人的护理练习题
- 一文读懂-特鲁索综合征病例、影像、诊断、治疗
- CW6163B万能卧式车床的控制线路图解
- 贵州省情学习通超星课后章节答案期末考试题库2023年
- 小学随班就读学生教育随笔
评论
0/150
提交评论