18b20,18B20这个温度传感器工作原理究竟是怎么样的呢答案要简洁明了
来源:整理 编辑:智能门户 2023-08-25 07:45:40
本文目录一览
1,18B20这个温度传感器工作原理究竟是怎么样的呢答案要简洁明了
18B20采用的是半导体测温。经过传感器内部的电路直接将温度变换成数字信号。单片机经过传感器上的单线总线对传感器进行设定和测量。传感器的分辨率为0.0625℃,测量精度±0.5℃(-30~+50℃)。由于输出数字信号,在传输过程中不会损失精度。

2,18B20初始化是否成功
/* ==== 18b20复位子程序==== */void b20init() uchar temp; DQ=0; delay(60); //总机拉低超过480us以上,初始化总时间不超过960us。此处拉低556us(调试时显示此值) DQ=1;//释放总线后,以便从机18b20通过拉低总线来指示其是否在线, delay(3); //存在检测高电平时间:15~60us,此处拉低43us(调试时显示此值) temp=DQ; if (temp==0) //如果总线被拉低,则表示B20应答了 flag=1; else flag=0; //否则表示未联系成功 delay(10); //在60--240us之内,18B20应该做出反应,并将总线置为0,此处拉低106us(调试时显示此值) DQ=1; //再次拉高总线,让总线处于空闲状态 }
3,DS18B20 报警
将数据写入TH和TL,18B20会和主机有个互动。用蜂鸣器也是一种方法。只是方便而已,其实没什么用,DATASHEET都说了这两个寄存器可以当用户存储器用的,就看你用不用了ds18b20只是一个测温元件,所谓的报警功能要通过程序由单片机来实现。 ds18b20温度传感器的内部存储器包括一个高速暂存ram和一个非易失性的可电擦除的eeram。高速暂存ram的结构为8字节的存储器,头2个字节包含测得的温度信息,第3和第4字节th(报警温度上限)和tl(报警温度下限)的拷贝。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。第6、7、8字节保留未用。 要实现报警,完成温度转换后,就把测得的温度值与ram中的th、tl字节内容作比较(当然要自己编程序)。若t>th或t<tl,则将报警标志位置位,然后单片机通过一端口连接一个led或者蜂鸣器来实现报警......
4,18b20初始化程序解释
其实你的程序的注释写的已经很清楚了。首先需要明确的是,ds18B20作为单总线器件,它对时序要求比较高,否则是不能正常工作的。至于你问的程序注释,我说过了,本身写的已经很清楚了,大没有在去解释的必要。估计你有这样的问题,是本身对ds18b20的数据手册还不是很清楚,建议自己看看他的资料和用法,先把时序和一些概念搞清楚就好了。至于你问的while(--delay);这句程序,意思就是只要“--delay”非零(while语句非零即为真),那程序就会停到这里一直执行,执行一次delay减1,直到--delay最后变成0。然后程序才能跳到下一句去执行。本身这个地方很好理解的,看来你的c语言还有待在看看。不过也没事,程序写多了自然这些东西就明白了。最后给你举个例子吧,比如程序前面给delay赋值为5,那么while(--delay)这句程序会执行5次,第一次while(4),第二次while(3),while(2),while(1),最后成了while(0),到了这时候,while(0)为假,程序就不执行了,然后就转到了下面。这样你应该就明白了,就是让程序在while这个地方循环多执行几次,起到一个延时的作用。
5,单片机汇编语言18B20程序设计说明
写的程序: ;-------------------写DS18B20的程序 WRITE_1820: ;子程序名称 MOV R2,#8 ; CLR C ;清零进位标志位 WR1: CLR DQ ;拉低18b20总线 MOV R3,#6 ;延时 DJNZ R3,$ RRC A ;带进位循环右移一次累加器A,即把最低位移到C MOV DQ,C;把C送到DQ输出 MOV R3,#23 ;延时 DJNZ R3,$ SETB DQ ;拉高总线 NOP ;延时 DJNZ R2,WR1;循环8次,即可把A一位一位的通过DQ写入18b20 SETB DQ ;拉高总线 RET ;返回 读的程序: ;-------------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据 READ_18200: MOV R4,#2 ; 将温度高位和低位从DS18B20中读出 MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H) RE00: MOV R2,#8 RE01: CLR C SETB DQ NOP NOP CLR DQ NOP NOP NOP SETB DQ MOV R3,#7 DJNZ R3,$ MOV C,DQ MOV R3,#23 DJNZ R3,$ RRC A DJNZ R2,RE01 MOV @R1,A DEC R1 DJNZ R4,RE00 RET
6,单片机温度传感器18b20这个写数据怎么完全看不懂
时序就是时间序列,每一步都有固定要求,满足这个要求,单总线能正确通信,反之就不能。你看图的下面,写0和写1时18B20的时间特征是一样的,也就是说如果你的输出电平小于60us或者大于120us,18B20就不能正确接收你的数据。;这是关于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 ;数码管十位数存放内存位置 temp_th equmain: 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 rrc a mov c,42h rrc a mov c,43h rrc a mov 29h,a lcall display ;调用数码管显示子程序 cpl p1.0 ajmp main ; 这是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 ;然后拉高数据线 nop nop nop 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 ; 清标志位,表示ds1820不存在 clr p1.1 ;点亮p1。1脚led表示温度传感器通信失败 ljmp tsr7 tsr5: mov r0,#117 tsr6: djnz r0,tsr6 ; 时序要求延时一段时间 tsr7: setb p3.5 ret ; 读出转换后的温度值 get_temper: setb p3.5 lcall init_1820 ;先复位ds18b20 jb flag1,tss2 clr p1.2 ret ; 判断ds1820是否存在?若ds18b20不存在则返回 tss2: clr p1.3 ;ds18b20已经被检测到!!!!!!!!!!!!!!!!!! mov a,#0cch lcall write_1820 mov a,#44h ;发出温度转换命令 lcall write_1820 ;这里通过调用显示子程序实现延时一段时间,等待ad转换结束,12位的话750微秒 lcall display lcall init_1820 ;准备读温度前先复位 mov a,#0cch ; 跳过rom匹配 lcall write_1820 mov a,#0beh ; 发出读温度命令 lcall write_1820 lcall read_18200; 将读出的温度数据保存到35h/36h clr p1.4 ret ;写ds18b20的子程序(有具体的时序要求) write_1820: mov r2,#8;一共8位数据 clr c wr1: clr p3.5 mov r3,#6 djnz r3,$ rrc a mov p3.5,c mov r3,#23 djnz r3,$ setb p3.5 nop djnz r2,wr1 setb p3.5 ret ; 读ds18b20的程序,从ds18b20中读出两个字节的温度数据 read_18200: mov r4,#2 ; 将温度高位和低位从ds18b20中读出 mov r1,#29h ; 低位存入29h(temper_l),高位存入28h(temper_h) re00: mov r2,#8;数据一共有8位 re01: clr c setb p3.5 nop nop clr p3.5 nop nop nop setb p3.5 mov r3,#9 re10: djnz r3,re10 mov c,p3.5 mov r3,#23 re20: djnz r3,re20 rrc a djnz r2,re01 mov @r1,a dec r1 djnz r4,re00 ret ;显示子程序 display: mov a,29h;将29h中的十六进制数转换成10进制 mov b,#10 ;10进制/10=10进制 div ab mov b_bit,a ;十位在a mov a_bit,b ;个位在b mov dptr,#numtab ;指定查表启始地址 mov r0,#4 dpl1: mov r1,#250 ;显示1000次 dplop: mov a,a_bit ;取个位数 movc a,@a+dptr ;查个位数的7段代码 mov p1,a ;送出个位的7段代码 setb p2.0 ;开个位显示 acall d1ms ;显示1ms clr p2.0 mov a,b_bit ;取十位数 movc a,@a+dptr ;查十位数的7段代码 mov p1,a ;送出十位的7段代码 setb p2.1 ;开十位显示 acall d1ms ;显示1ms clr p2.1 djnz r1,dplop ;100次没完循环 djnz r0,dpl1 ;4个100次没完循环 ret ;1ms延时(按12mhz算) d1ms: mov r7,#80 djnz r7,$ ret numtab: ;数码管共阳极0~9代码 db 0c0h,0f9h,0a4h,0b0h,99h, 92h,82h,0f8h,80h,90hend 感觉对你有用就赏分吧~
文章TAG:
18b20 18B20这个温度传感器工作原理究竟是怎么样的呢答案要简洁明了