《温度传感器DS18B20与MCS-51单片机的接口.doc》由会员分享,可在线阅读,更多相关《温度传感器DS18B20与MCS-51单片机的接口.doc(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精品文档,仅供学习与交流,如有侵权请联系网站删除1.1 温度传感器DS18B20与MCS-51单片机的接口数字温度传感器问世于20世纪90年代中期。它是微电子技术、计算机技术和自动测试技术的结晶。数字温度传感器具有价格低、精度高、封装小、温度范围宽、使用方便等优点,被广泛应用于工业控制、电子测温计、医疗仪器等各种温度控制系统中。数字温度传感器一般内部包含温度传感器、A/D转换器、信号处理器、存储器和相应的接口电路,有的还带多路选择器、中央控制器(CPU)、随机存储器(RAM)和只读存储器(ROM)。数字温度传感器的种类繁多,一般按总线形式可分为单总线(1-wire)接口、双总线(I2C)接口和
2、三总线(SPI)接口。下面主要以单总线接口数字温度传感器芯片DS18B20为例来介绍数字温度传感器的使用。1.1.1 DS18B20简介DS18B20是DALLAS公司生产的单总线数字温度传感器芯片,具有3引脚TO-92小体积封装形式;温度测量范围为-55+125;可编程为912位A/D转换精度;用户可自设定非易失性的报警上下限值;被测温度用16位补码方式串行输出;测温分辨率可达0.0625;其工作电源既可在远端引入,也可采用寄生电源方式产生;多个DS18B20可以并联到3根或两根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少。可广泛用于工业、民用、军事等领域的
3、温度测量及控制仪器、测控系统和大型设备中。1.1.2 DS18B20的外部结构DS18B20可采用3脚TO-92小体积封装和8脚SOIC封装。其外形和引脚图如图7.17所示。图1.1 DS18B20的外形及引脚图图中引脚定义如下。(1) DQ:数字信号输入/输出端。(2) GND:电源地。(3) VDD:外接供电电源输入端(在寄生电源接线方式时接地)。1.1.3 DS18B20的内部结构DS18B20内部主要由4部分组成:64位光刻ROM、温度传感器、非易失性温度报警触发器TH和TL、配置寄存器等。其内部结构图如图7.18所示。DS18B20的存储部件有以下几种。1光刻ROM存储器光刻ROM中
4、存放的是64位序列号,出厂前已被光刻好,它可以看作是该DS18B20的地址序列号。不同的器件地址序列号不同。64位序列号的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。图7.18 DS18B20的内部结构图2高速暂存存储器高速暂存存储器由9个字节组成,其分配如表7.6所示。第0和第1个字节存放转换所得的温度值;第2和第3个字节分别为高温度触发器TH和低温度触发器TL;第4个字节为配置寄存器;第5、6、7个字节保留
5、;第8个字节为CRC校验寄存器。表7.6 DS18B20高速暂存存储器的分布字节序号功 能0温度转换后的低字节1温度转换后的高字节2高温度触发器TH3低温度触发器TL4配置寄存器5保留6保留7保留8CRC校验寄存器DS18B20中的温度传感器可完成对温度的测量,当温度转换命令发布后,转换后的温度以补码形式存放在高速暂存存储器的第0和第1个字节中。以12位转化为例:用16位符号扩展的二进制补码数形式提供,以0.0625/LSB形式表示,其中S为符号位。表7.7是12位转化后得到的12位数据,高字节的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘以0.0625即可得到实际温
6、度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘以0.0625即可得到实际温度。表7.7 DS18B20温度值格式表D7D6D5D4D3D2D1D0LS Byte232221202-12-22-32-4D7D6D5D4D3D2D1D0MS ByteSSSSS262524例如,+125的数字输出为07D0H,+25.0625的数字输出为0191H,-25.0625的数字输出为FF6FH,-55的数字输出为FC90H。 表7.8列出了DS18B20部分温度值与采样数据的对应关系。表7.8 DS18B20部分温度数据表温度/16位二进制编码十六进制表示1250000 0111 1101 0
7、00007D0H850000 0101 0101 00000550H+25.06250000 0001 1001 00010191H+10.1250000 0000 1010 001000A2H+0.50000 0000 0000 10000008H00000 0000 0000 00000000H-0.51111 1111 1111 1000FFF8H-10.1251111 1111 0101 1110FF5EH-25.06251111 1110 0110 1111FE6FH-551111 1100 1001 0000FC90H高温度触发器和低温度触发器分别存放温度报警的上限值TH和下限值T
8、L;DS18B20完成温度转换后,就把转换后的温度值T与温度报警的上限值TH和下限值TL作比较,若TTH或TTL,则把该器件的告警标志置位,并对主机发出的告警搜索命令作出响应。配置寄存器用于确定温度值的数字转换分辨率,该字节各位的意义如下:D7D6D5D4D3D2D1D0TMR1R011111其中:低五位一直都是1 ,TM是测试模式位,用于设置DS18B20是在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置分辨率,如表7.9所示(DS18B20出厂时被设置为12位)。表7.9 温度值分辨率设置表R1R0分辨率/位温度最大转换时间/ms00993
9、.750110187.51011275.001112750.00CRC校验寄存器存放的是前8个字节的CRC校验码。1.1.4 DS18B20的温度转换过程根据DS18B20的通信协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。DS18B20的ROM指令和RAM指令如表7.10和表7.11所示。表7.10 ROM指令表指 令约定代码功 能读ROM33H读DS18B20温度传感器ROM中的编码(即64位地址)匹配 ROM55H发出此命令之后,接着发出 64
10、 位 ROM 编码,访问单总线上与该编码相对应的 DS18B20 使之作出响应,为下一步对该 DS18B20 的读写作准备搜索 ROM0F0H用于确定挂接在同一总线上 DS18B20 的个数和识别 64 位 ROM 地址。为操作各器件做好准备跳过 ROM0CCH忽略 64 位 ROM 地址,直接向 DS1820 发温度变换命令。适用于单片工作告警搜索命令0ECH执行后只有温度超过设定值上限或下限的片子才作出响应表7.11 RAM指令表指 令约定代码功 能温度变换44H启动DS18B20进行温度转换,12位转换时最长为750ms(9位为93.75ms)。结果存入内部9字节RAM中读暂存器0BEH
11、读内部RAM中9字节的内容写暂存器4EH发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据复制暂存器48H将RAM中第3、4字节的内容复制到EEPROM中重调 EEPROM0B8H将EEPROM中的内容恢复到RAM中的第3、4字节读供电方式0B4H读DS18B20的供电模式。寄生供电时DS18B20发送“0”,外接电源供电时DS18B20发送“1”每一步骤都有严格的时序要求,所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和
12、命令的传输都是低位在前。时序可分为初始化时序、读时序和写时序。复位时要求主CPU将数据线下拉500ms,然后释放,DS18B20收到信号后等待1560ms左右,后发出60240ms的低电平,主CPU收到此信号则表示复位成功。读时序分为读“0”时序和读“1”时序两个过程。对于DS18B20的读时序是从主机把单总线拉低之后,在15ms之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20完成一个读时序过程至少需要60ms。对于DS18B20的写时序仍然分为写“0”时序和写“1”时序两个过程。DS18B20写“0”时序和写“1”时序的要求不同,当要写“0”时,单总线要被拉低至少6
13、0ms,以保证DS18B20能够在15ms到45ms之间正确地采样I/O总线上的“0”电平;当要写“1”时,单总线被拉低之后,在15ms之内就得释放单总线。 1.1.5 DS18B20与51单片机的接口DS18B20与51单片机的连接非常简单,只须把DS18B20的数据线DQ与51单片机的一根并口线连接即可,51单片机通过这根并口就能实现对DS18B20的所有操作,这根并口线一般通过电阻接电源。DS18B20的电源可采用外部电源供电,也可采用内部寄生电源供电。当外部电源供电时,VDD接外部电源,GND接地地。当采用内部寄生电源供电时,VDD与GND一起接地。另外,也可用多片DS18B20连接组
14、网形成多点测温系统,在多片连接时,DS18B20必须采用外部电源供电方式。图7.19 单片DS18B20与51单片机的一种连接图图7.19是单片DS18B20与51单片机的连接电路,DS18B20的数据线DQ连接在51单片机的P1.0上,并通过上拉电阻接电源,采用外部电源供电方式。为了便于显示温度结果,在图7.19中加一块LCD显示器用显示DS18B20测量的当前温度值。由于DS18B20对时间非常敏感,如果延时时间不准确不能对DS18B20进行正确的操作。因此不同的系统时钟,编制的程序会有所区别,在这里假定系统时钟频率为12MHZ,测量的温度范围-55+99,精度为小数点后一位,相应程序如下
15、。汇编语言程序:;程序适合单个DS18B20和MCS-51单片机的连接,晶振为12MHz;测量的温度范围-55+99,温度精确到小数点后一位 TEMPER_L EQU 30H;存放从DS18B20中读出的高、低位温度值TEMPER_H EQU 31HTEMPER_NUM EQU 32H;存放温度转换后的整数部分TEMPER_POTEQU 33H;存放温度转换后的小数部分FLAG0 EQU 34H;FLAG0存放温度的符号 DQ EQU P1.0;DS18B20数据线RS BIT P1.7;LCD1602控制线定义RW BIT P1.6E BIT P1.5SkipDs18b20 EQU 0CCH
16、;DS18B20跳过ROM命令StartDs18b20 EQU 44H;DS18B20温度变换命令ReadDs EQU 0BEH;DS18B20读暂存器命令 ORG 0000H SJMP MAIN ORG 0040H MAIN:MOV SP,#60HACALL LCD_INITMOV A,#80H;lcd第1行第1列开始显示temperature:ACALL WC51RMOV A,#t ACALL WC51DDRMOV A,#e ACALL WC51DDRMOV A,#m ACALL WC51DDRMOV A,#p ACALL WC51DDRMOV A,#e ACALL WC51DDRMOV
17、A,#r ACALL WC51DDRMOV A,#a ACALL WC51DDRMOV A,#t ACALL WC51DDRMOV A,#u ACALL WC51DDRMOV A,#r ACALL WC51DDRMOV A,#e ACALL WC51DDRMOV A,#: ACALL WC51DDRREP:LCALL GET_TEMPER ;读出转换后的温度值 LCALL TEMPER_COVMOV A,#0c6H ;lcd第2行第7列开始显示温度ACALL WC51RMOV A,FLAG0;显示符号ACALL WC51DDRMOV A,TEMPER_NUM;温度整数拆分成十位和个位显示MOV
18、 B,#10DIV ABADD A,#30HCJNE A,#30H,REP1 ;如果十位为0不显示MOV A,#20HREP1:ACALL WC51DDRMOV A,B ADD A,#30H ACALL WC51DDR MOV A,#.;显示小数点 ACALL WC51DDRMOV DPTR,#TABLEMOV A,TEMPER_POT;显示小数部分MOVC A,A+DPTR ACALL WC51DDR LJMP REP;DS18B20复位程序DS18B20_INIT:SETB DQNOPNOPCLR DQMOVR7,#9INIT_DELAY:CALLDELAY60USDJNZR7,INIT_
19、DELAYSETB DQCALLDELAY60USCALLDELAY60USMOV C,DQ JCERRORCALLDELAY60USCALLDELAY60USCALLDELAY60USCALLDELAY60USRETERROR:CLR DQ SJMP DS18B20_INIT RET;读DS18B20一个字节到累加器A程序READ_BYTE:MOV R7,#08HSETB DQNOPNOPLOOP:CLR DQ NOPNOPNOPSETB DQMOV R6,#07HDJNZ R6,$MOV C,DQCALLDELAY60USRRC ASETB DQDJNZ R7,LOOPCALLDELAY6
20、0USCALLDELAY60USRET;累加器A写到DS18B20程序WRITE_BYTE:MOV R7,#08H SETB DQNOPNOPLOOP1:CLR DQ MOV R6,#07HDJNZ R6,$RRC AMOV DQ,CCALLDELAY60USSETB DQDJNZ R7,LOOP1RETDELAY60US:MOVR6,#1EHDJNZR6,$RET;读温度程序GET_TEMPER:CALL DS18B20_INIT;DS18B20复位程序 MOV A,#0CCH;DS18B20跳过ROM命令CALL WRITE_BYTECALLDELAY60USCALLDELAY60USMO
21、V A,#44H;DS18B20温度变换命令CALL WRITE_BYTECALLDELAY60USCALLDS18B20_INIT;DS18B20复位程序 MOV A,#0CCH;DS18B20跳过ROM命令CALL WRITE_BYTECALLDELAY60USMOV A,#0BEH;DS18B20读暂存器命令CALL WRITE_BYTECALLDELAY60USCALLREAD_BYTE;读温度低字节MOV TEMPER_L,ACALL READ_BYTE;读温度高字节MOV TEMPER_H,ARET ;将从DS18B20中读出的温度拆分成整数和小数TEMPER_COV: MOV F
22、LAG0,#+ ;设当前温度为正 MOV A,TEMPER_H SUBB A,#0F8H JC TEM0 ;看温度值是否为负?不是,转 MOV FLAG0,#- ;是,置FLAG0为- MOV A,TEMPER_L CPL A ADD A,#01 MOV TEMPER_L,A MOV A,TEMPER_H CPL A ADDC A,#00 MOV TEMPER_H,ATEM0: MOV A,TEMPER_L;存放小数部分到TEMPER_POT ANL A,#0FH MOV TEMPER_POT,A MOV A,TEMPER_L ;存放小数部分到TEMPER_NUM ANL A,#0F0H SW
23、AP A MOV TEMPER_NUM,A MOV A,TEMPER_H SWAP A ORL A,TEMPER_NUM MOV TEMPER_NUM,A RET;LCD初始化子程序LCD_INIT:MOV A,#00000001H;清屏ACALL WC51RMOV A,#00111000B ;使用8位数据,显示两行,使用57的字型LCALL WC51RMOV A,#00001100B ;显示器开,光标关,字符不闪烁LCALL WC51RMOV A,#00000110B ;字符不动,光标自动右移一格LCALL WC51RRET;检查忙子程序F_BUSY:PUSH ACC ;保护现场MOV P2
24、,#0FFHCLR RSSETB RWWAIT:CLR ESETB EJB P2.7,WAIT;忙,等待POP ACC ;不忙,恢复现场RET;写入命令子程序WC51R:ACALL F_BUSYCLR ECLR RSCLR RWSETB EMOV P2,ACCCLR ERET;写入数据子程序WC51DDR:ACALL F_BUSYCLR ESETB RSCLR RWSETB EMOV P2,ACCCLR ERETTABLE: DB30H,31H,31H,32H,33H,33H,34H,34H DB 35H,36H,36H,37H,38H,38H,39H,39H ;小数温度转换表ENDC语言程序
25、:/程序适合单个DS18B20和MCS-51单片机的连接,晶振为12MHz/测量的温度范围-55+99,温度精确到小数点后一位 #include #define uchar unsigned char#define uint unsigned intsbit DQ =P10; /定义端口sbit RS=P17;sbit RW=P16;sbit EN=P15;union uchar c2; uint x;temp;uchar flag;/flag为温度值的正负号标志单元, 1表示为负值,0时表示为正值。 uint cc,cc2;/变量cc中保存读出的温度值 float cc1;uchar buf
26、f113=temperature:;uchar buff26=+00.0;/检查忙函数void fbusy()P2 = 0xff;RS = 0;RW = 1;EN = 1;EN = 0;while(P2 & 0x80)EN = 0;EN = 1;/写命令函数void wc51r(uchar j) fbusy();EN = 0;RS = 0;RW = 0;EN = 1;P2 = j;EN = 0;/写数据函数void wc51ddr(uchar j) fbusy();/读状态;EN = 0;RS = 1;RW = 0;EN = 1;P2 = j;EN = 0;void init()wc51r(0
27、x01); /清屏wc51r(0x38); /使用8位数据,显示两行,使用5*7的字型wc51r(0x0c); /显示器开,光标开,字符不闪烁wc51r(0x06); /字符不动,光标自动右移一格void delay(uint useconds) /延时程序 for(;useconds0;useconds-);uchar ow_reset(void) /复位 uchar presence; DQ = 0; / DQ 低电平 delay(50); / 480ms DQ = 1; / DQ 高电平 delay(3); / 等待 presence = DQ; / presence 信号 delay(
28、25); return(presence); / 0允许, 1禁止uchar read_byte(void) /从单总线上读取一个字节 uchar i; uchar value = 0; for (i=8;i0;i-) value=1; DQ = 0; DQ = 1; delay(1); if(DQ)value|=0x80; delay(6); return(value);void write_byte(uchar val) /向单总线上写一个字节 uchar i; for (i=8; i0; i-) / 一次写一字节 DQ = 0; DQ = val&0x01; delay(5); DQ =
29、 1; val=val/2; delay(5);void Read_Temperature(void) /读取温度 ow_reset(); write_byte(0xCC); / 跳过 ROM write_byte(0xBE); / 读 temp.c1=read_byte(); temp.c0=read_byte(); ow_reset(); write_byte(0xCC); write_byte(0x44); / 开始 return;void main() /主程序uchar k;delay(10); EA=0; flag=0; init();wc51r(0x80); /写入显示缓冲区起始
30、地址为第1行第1列for (k=0;k0xf8) flag=1;cc=cc+1;else flag=0; cc1=cc*0.0625; /计算出温度值 cc2=cc1*100;/放大100倍,放在整型变量中便于取数字 buff21=cc2/1000+0x30;if ( buff21=0x30) buff21=0x20;/取出十位,转换成字符,如果十位是0不显示。 buff22=cc2/100-(cc2/1000)*10+0x30;/取出个位,转换成字符 buff24=cc2/10-(cc2/100)*10+0x30;/取出小数点后一位,转换成字符 if (flag=1) buff20=-;else buff20=+; wc51r(0xc5); /写入显示缓冲区起始地址为第2行第6列 for (k=0;k6;k+)/第二行显示温度 wc51ddr(buff2k);【精品文档】第 10 页