1、这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。例如+125的数字输出为07D0H,+25.0625的数字输出为0191H,-25.0625的数字输出为FF6FH,-55的数字输出为FC90H。DS18B20温度传感器的存储器 DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。
2、暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。第六、七、八个字节用于内部计算。第九个字节是冗余检验字节。该字节各位的意义如下:TM R1 R0 1 1 1 1 1 低五位一直都是1 ,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置分辨率,如下表所示:较小的硬件开销需要相对复杂的软件进行补偿,由于DS1820与微处理
3、器间采用串行数据传送,因此,在对DS1820进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。在使用PL/M、C等高级语言进行系统程序设计时,对DS1820操作部分最好采用汇编语言实现。(2在DS1820的有关资料中均未提及单总线上所挂DS1820数量问题,容易使人误认为可以挂任意多个DS1820,在实际应用中并非如此。当单总线上所挂DS1820超过8个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。(3连接DS1820的总线电缆是有长度限制的。实验中,当采用普通信号电缆传输长度超过50m时,读取的测温数据将发生错误。当将总线电缆改为双绞线带屏蔽电
4、缆时,正常通讯距离可达150m,当采用每M绞合次数更多的双绞线带屏蔽电缆时,正常通讯距离进一步加长。这种情况主要是由总线分布电容使信号波形产生畸变造成的。因此,在用DS1820进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。(4在DS1820测温程序设计中,向DS1820发出温度转换命令后,程序总要等待DS1820的返回信号,一旦某个DS1820接触不好或断线,当程序读该DS1820时,将没有返回信号,程序进入死循环。这一点在进行DS1820硬件连接和软件设计时也要给予一定的重视。测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接
5、地。本站实验板实验程序:。这是关于DS18B20的读写程序,数据脚P2.2,晶振12MHZ 温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒 可以将检测到的温度直接显示到AT89C51开发实验板的两个数码管上 显示温度00到99度,很准确哦无需校正!ORG 0000H 单片机内存分配申明!TEMPER_L EQU 29H。用于保存读出温度的低8位 TEMPER_H EQU 28H。用于保存读出温度的高8位 FLAG1 EQU 38H。是否检测到DS18B20标志位 a_bit equ 20h 。数码管个位数存放内存位置 b_bit equ 21h 。数码管十位数存
6、放内存位置 MAIN:LCALL GET_TEMPER。调用读温度子程序 进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度 显示范围00到99度,显示精度为1度 因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位 将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度 MOV A,29H MOV C,40H。将28H中的最低位移入C RRC A MOV C,41H MOV C,42H MOV C,43H MOV 29H,A LCALL DISPLAY。调用数码管显示子程序 CPL P1.0 AJMP MAIN
7、 这是DS18B20复位初始化子程序 INIT_1820:SETB P3.5 NOP CLR P3.5 主机发出延时537微秒的复位低脉冲 MOV R1,#3 TSR1:MOV R0,#107 DJNZ R0,$ DJNZ R1,TSR1 SETB P3.5。然后拉高数据线 MOV R0,#25H TSR2:JNB P3.5,TSR3。等待DS18B20回应 DJNZ R0,TSR2 LJMP TSR4 。 延时 TSR3:SETB FLAG1 。 置标志位,表示DS1820存在 CLR P1.7。检查到DS18B20就点亮P1.7LED LJMP TSR5 TSR4:CLR FLAG1 。
8、清标志位,表示DS1820不存在 CLR P1.1。点亮P1。1脚LED表示温度传感器通信失败 LJMP TSR7 TSR5:MOV R0,#117 TSR6:DJNZ R0,TSR6 。 时序要求延时一段时间 TSR7:RET 读出转换后的温度值 GET_TEMPER:LCALL INIT_1820。先复位DS18B20 JB FLAG1,TSS2 CLR P1.2 RET 。 判断DS1820是否存在?若DS18B20不存在则返回 TSS2:CLR P1.3。DS18B20已经被检测到!MOV A,#0CCH 。 跳过ROM匹配 LCALL WRITE_1820 MOV A,#44H 。
9、发出温度转换命令 这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒 LCALL DISPLAY 准备读温度前先复位 MOV A,#0BEH 。 发出读温度命令 LCALL READ_18200。 将读出的温度数据保存到35H/36H CLR P1.4 写DS18B20的子程序(有具体的时序要求WRITE_1820:MOV R2,#8。一共8位数据 CLR C WR1:MOV R3,#6 DJNZ R3,$ MOV P3.5,C MOV R3,#23 DJNZ R2,WR1 读DS18B20的程序,从DS18B20中读出两个字节的温度数据 READ_18200:MO
10、V R4,#2 。 将温度高位和低位从DS18B20中读出 MOV R1,#29H 。 低位存入29H(TEMPER_L,高位存入28H(TEMPER_HRE00:数据一共有8位 RE01:MOV R3,#9 RE10:DJNZ R3,RE10 MOV C,P3.5 RE20:DJNZ R3,RE20 DJNZ R2,RE01 MOV R1,A DEC R1 DJNZ R4,RE00 显示子程序 display: mov a,29H。将29H中的十六进制数转换成10进制 mov b,#10 。10进制/10=10进制 div ab mov b_bit,a 。十位在a mov a_bit,b 。
11、个位在b mov dptr,#numtab 。指定查表启始地址 mov r0,#4 dpl1: mov r1,#250 。显示1000次 dplop: mov a,a_bit 。取个位数 MOVC A,A+DPTR 。查个位数的7段代码 mov p0,a 。送出个位的7段代码 clr p2.0 。开个位显示 acall d1ms 。显示1ms setb p2.0 mov a,b_bit 。取十位数 查十位数的7段代码 送出十位的7段代码 clr p2.1 。开十位显示 setb p2.1 djnz r1,dplop 。100次没完循环 djnz r0,dpl1 。4个100次没完循环 ret
12、1MS延时(按12MHZ算D1MS: MOV R7,#80 DJNZ R7,$ 实验板上的7段数码管09数字的共阴显示代码 numtab: DB 0F3H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H end 以下是第二种采集和处理程序供网友参考 将温度数据通过串口发送出去,波特率2400 本程序专为AT89C51实验开发板编写.适合12晶振 本程序经过验证,可以显示温度+/-和两位整数温度和两位小数温度数据 DOT EQU 30H ZHENGSHU EQU 31H FLAG1 EQU 38H 。是否检测到DS18B20的标志位 定义温度数据 DIS_1 EQU 32H
13、 。符号 DIS_2 EQU 33H 。十位 DIS_3 EQU 34H 。个位 DIS_4 EQU 35H 。小数点后第一位 DIS_5 EQU 36H 。小数点后第二位 WDDATA BIT P2.2 。定义DS18B20的数据脚为P2.2端口 以下为主程序进行CPU中断方式设置 CLR EA 。关闭总中断 MOV SCON,#50H 。设置成串口1方式 MOV TMOD,#20H 。波特率发生器T1工作在模式2上 MOV TH1,#0F3H 。预置初值(按照波特率2400BPS预置初值MOV TL1,#0F3H 。SETB TR1 。启动定时器T1 以上完成串口2400通讯初始化设置 -
14、 主程序 LCALL INIT_1820 。调用复位DS18B20子程序 MAIN1:LCALL FORMULA 。通过公式计算,小数点后显示两位 LCALL BCD LCALL DISPLAY 。调用串口显示子程序 LCALL DELAY500 。延时0.5秒 AJMP MAIN1 DS18B20复位初始化程序 SETB WDDATA CLR WDDATA 主机发出延时540微秒的复位低脉冲 MOV R0,#36 LCALL DELAY SETB WDDATA。JNB WDDATA,TSR3。MOV R0,#06BH 复位成功!时序要求延时一段时间 - SETB WDDATA 。 定时入口
15、MOV R0,#50 。等待AD转换结束,12位的话750微秒. 将读出的九个字节数据保存到60H-68H - MOV R2,#8 。MOV WDDATA,C MOV R3,#24 - 读DS18B20的程序,从DS18B20中读出九个字节的数据 MOV R4,#9 MOV R1,#60H 。 存入60H开始的九个单元 MOV R2,#8 MOV R3,#09 MOV C,WDDATA INC R1 - 温度计算子程序 FORMULA: 。 按公式:T实际=(T整数-0.25+( M每度-M剩余/ M每度 计算出实际温度,整数部分和小数部分分别存于ZHENGSHU单元和DOT单元 将61H中的
16、低4位移入60H中的高4位,得到温度的整数部分,并存于ZHENGSHU单元 MOV 29H,61H MOV A,60H MOV C,48H MOV C,49H MOV C,4AH MOV C,4BH MOV ZHENGSHU,A ( M每度-M剩余/ M每度,小数值存于A中 MOV A,67h SUBB A,66h MOV B,#64H MUL AB MOV R4,B MOV R5,A MOV R7,67H LCALL DIV457 MOV A,R3 再减去0.25,实际应用中减去25 SUBB A,#19H MOV DOT,A 。小数部分存于DOT中 MOV A,ZHENGSHU SUBB
17、A,#00H 。整数部分减去来自小数部分的借位 JNC ZHENG 。是否为负数 CPL A INC A MOV DIS_1,#2DH 。 零度以下时,第一位显示-号 ZHENG:MOV DIS_1,#2BH 。 零度以上时,第一位显示+双字节除以单字节子程序 DIV457: CLR C MOV A,R4 SUBB A,R7 JC DV50 SETB OV 。商溢出 DV50: MOV R6,#8 。求平均值R4R5R7R3) DV51: MOV A,R5 RLC A MOV R4,A MOV F0,C ANL C,/F0 JC DV52 DV52: CPL C MOV R3,A DJNZ R
18、6,DV51 MOV A,R4 。四舍五入 ADD A,R4 JC DV53 JC DV54 DV53: INC R3 DV54: CLR OV - 转换成非压缩的BCD码 BCD: MOV A,ZHENGSHU MOV B,#0AH DIV AB ORL A,#00110000B 。转换成ASCII码 MOV DIS_2,A MOV DIS_3,B MOV A,DIS_3 mov DIS_3,A MOV A,DOT MOV DIS_4,A MOV DIS_5,B MOV A,DIS_5 mov DIS_5,A - 串口显示数据子程序 DISPLAY:CLR TI MOV A,DIS_1 MOV SBUF,A J
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1