首页 > 电路 > 电路设计 > ds18b20多少字节,ds18b20读暂存器是9个字节的数据为什么这么多

ds18b20多少字节,ds18b20读暂存器是9个字节的数据为什么这么多

来源:整理 时间:2023-08-28 06:26:36 编辑:亚灵电子网 手机版

1,ds18b20读暂存器是9个字节的数据为什么这么多

9个寄存器中,地址单元0和1是测量温度的低字节和高字节,单元2是高温报警值,单元3是低温扳警值,单元4是配置寄存器,单元5一7说明书中介绍为保留值,单元8是单元0一7的CRC校验码。实际使用中,当只是为了测温,只需用到单元0,1和4。应用环境中如果没有强干扰,不是十分严格的话,不做校验也可以。
th是温度的高位 tl是温度的低位

ds18b20读暂存器是9个字节的数据为什么这么多

2,关于DS18B20读一个字节的问题

我想你是没注意到一个地方:dat>>1;这句在循环的一开始,也就是说,每一次读一位数据开始时,dat就右移一位,高位自动补0,所以只有当读到1时才为dat高位赋值为1,否则继续保持之前补上的数据0;其次,DQ=1,这是做输入用的,而硬件仿真时没有考虑进硬件,所以仿真结果只会是全1,而真正运行结果肯定是从硬件上读出数据来;右移的目的是让数据能正确拼装,因为读是先读最低位,最后读最高位,所以要右移以便在下一次能装入高一位的数据。希望我的回答能帮助到你。

关于DS18B20读一个字节的问题

3,ds18b20读一个字节

那个判断的应该是输出的电平的高低吧?高低平了就读书啊
我想你是没注意到一个地方:dat>>1;这句在循环的一开始,也就是说,每一次读一位数据开始时,dat就右移一位,高位自动补0,所以只有当读到1时才为dat高位赋值为1,否则继续保持之前补上的数据0;其次,dq=1,这是做输入用的,而硬件仿真时没有考虑进硬件,所以仿真结果只会是全1,而真正运行结果肯定是从硬件上读出数据来;右移的目的是让数据能正确拼装,因为读是先读最低位,最后读最高位,所以要右移以便在下一次能装入高一位的数据。希望我的回答能帮助到你。

ds18b20读一个字节

4,最近在学51单片机的温度传感器DS18B20其中有读字节和写字节函

程序调试过的吗?硬件电路调试过的吗?焊接没问题吗?lcd 的对比度电压正确吗?好像只有电源正常
DS18B20从总线DQ上读取数据,还是说是单片机读取DS18B20内的数据?例如读温度:单片向18B20写了一条读温度命令后,18B20开始把内部寄存器的数据放到总线上,一位一位的放,如果发送的位为0,DQ就被拉低,如果发送的位为1,DQ就被拉高,连续8次便完成一个字节的传输,总线提供了数据传输的介质。如有错误请指正。
读字节函数是单片机读取DS18B20内的数据写字节函数是单片机向DS18B20内写入数据
就是用DQ这条总线上读或者写入数据8次 这样就一个DQ控制口代替了8个 懂么 简单的说给DS18b20发送相应的一个字节命令(8位) 然后18b20读出2字节的数据 然后这个数据转换下 就是温度 这个懂了吧

5,单片机从ds18b20读出的温度为什么是两个字节比如说30度读出的

两个字节中,D15D14D13D12D11D10D09D08 D07D06D05D04D03D02D01D00其中D15D14D13D12D11是8个符号位,零上为00000,零下为11111 D03D02D01D00是小数位中间8位为是整数位,如果是零下负温度则为补码。30度读出来是:00000001 11100000
30度时,高字节是0x03,低字节是0x0015.5°时,高字节是0x01,低字节是0x55-10°时,高字节是0xf9,低字节是0x00
t=b; t<<=8; t=t(按位或)a; s=t*0.0625; t=s*10+ 0.5; reture(t) .51单片机不是八位吗,读数据分两个字节读的,读完当然要合在一起了。ds18b20分辩率为0.0625,故当然要转成实际温度了
默认状态是0.0625度/bit30度 = 0x1e0 * 0.0625就是说30度两个字节为 0x01 0xe0

6,单片机DS18B20

#include "REG51.H"#include "INTRINS.H" typedef unsigned char BYTE; sbit DQ = P3^3; //DS18B20的数据口位P3.3BYTE TPH; //存放温度值的高字节BYTE TPL; //存放温度值的低字节 void DelayXus(BYTE n);void DS18B20_Reset();void DS18B20_WriteByte(BYTE dat);BYTE DS18B20_ReadByte(); void main() DS18B20_Reset(); //设备复位 DS18B20_WriteByte(0xCC); //跳过ROM命令 DS18B20_WriteByte(0x44); //开始转换命令 while (!DQ); //等待转换完成 DS18B20_Reset(); //设备复位 DS18B20_WriteByte(0xCC); //跳过ROM命令 DS18B20_WriteByte(0xBE); //读暂存存储器命令 TPL = DS18B20_ReadByte(); //读温度低字节 TPH = DS18B20_ReadByte(); //读温度高字节 while (1);} /**************************************延时X微秒(STC12C5A60S2@12M)不同的工作环境,需要调整此函数此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同**************************************/void DelayXus(BYTE n) while (n--) _nop_(); _nop_(); }} /**************************************复位DS18B20,并检测设备是否存在**************************************/void DS18B20_Reset() CY = 1; while (CY) DQ = 0; //送出低电平复位信号 DelayXus(240); //延时至少480us DelayXus(240); DQ = 1; //释放数据线 DelayXus(60); //等待60us CY = DQ; //检测存在脉冲 DelayXus(240); //等待设备释放数据线 DelayXus(180); }} /**************************************从DS18B20读1字节数据**************************************/BYTE DS18B20_ReadByte() BYTE i; BYTE dat = 0; for (i=0; i<8; i++) //8位计数器 dat >>= 1; DQ = 0; //开始时间片 DelayXus(1); //延时等待 DQ = 1; //准备接收 DelayXus(1); //接收延时 if (DQ) dat |= 0x80; //读取数据 DelayXus(60); //等待时间片结束 } return dat;} /**************************************向DS18B20写1字节数据**************************************/void DS18B20_WriteByte(BYTE dat) char i; for (i=0; i<8; i++) //8位计数器 DQ = 0; //开始时间片 DelayXus(1); //延时等待 dat >>= 1; //送出数据 DQ = CY; DelayXus(60); //等待时间片结束 DQ = 1; //恢复数据线 DelayXus(1); //恢复延时 }}

7,温度传感器DS18B20的读写一个字节的子程序

/***********ds18b20读一个字节**************/ unsigned char ReadOneChar(void)uchar i=0; //定义i用于循环uchar dat = 0; //读取的8位数据for (i=8;i>0;i--) //8次循环DQ = 0; //拉低DQ总线开始读时序dat>>=1; //dat左移一位DQ = 1; //释放DQ总线 if(DQ) //如果DQ=1,执dat|=0x80;(0x80即第7位为1,如果DQ为1,即读取的数据为1,将dat的第7为置1,然后dat>>=1,循环8次结束,dat即为读取的数据) //DQ=0,就跳过 dat|=0x80; delay_18B20(4); // 延时以完成此次读时 序,之后再读下一数据 } return(dat); //返回读取的dat}DQ = dat&0x01;这句语句是错误的。DQ为位变量,而dat为 unsigned char如果真要这么写的话,应该是这样 :DQ = (bit)dat&0x01;把我写的给你做个参考吧:extern uchar8 sig; //sig判定温度符号/*延时函数*/void delay (int us) //DELAY-11.0592MHZ 调用程序大约为24us,每次循环为16us int s; for(s=0;s<us;s++);}void delayms(int z) //z为毫秒数 int x,y; for(x=z;x>0;x--) for(y=125;y>0;y--);}/*复位程序*/unsigned char reset(void) uchar8 presence; DQ=0; //拉低总线。当总线停留在低电平480us-960us ,总线上所以器件都将被复位 delay(30); //保持低电平504us DQ=1; //释放总线,让其恢复高电平 delay(3); //等待芯片应答信号 presence=DQ; //获取应答信号 delay(25); //延时以完成整个时序 return(presence); //返回应答信号。有芯片应答返回0,否则返回1。}/*写一位数据*/void write_bit(char bitval) DQ=0; //拉低DQ总线,开始时序 if(bitval==1) //如果写入的为1,则返回高电平 DQ=1; delay(5); //延时104us,以完成整个时序 DQ=1; }/*写一字节数据*/void write_byte(char val) uchar8 i,temp; for (i=0;i<8;i++) //写入一个字节的数据,一个时序中写一次 temp=val>>i; //右移i位 temp&=0x01; //复制那位数据到temp write_bit(temp); //调用write_bit() } delay(5); //延时104us以完成此次时序,之后再写下一数据}/*读一位数据*/uchar8 read_bit(void) uchar8 i; DQ=0; //拉低DQ,开始读时序 DQ=1; //释放DQ总线 for(i=0;i<3;i++); //从时序开始延时15us return(DQ); //返回DQ值}/*读一字节数据*/uchar8 read_byte(void) uchar8 i,value=0; for(i=0;i<8;i++) if(read_bit()) //读一字节数据,一个时序中读一次,并作移位处理 value|=0x01<<i; delay(6); //延时以完成此次读时序,之后再读下一数据 } return(value);}/*温度转化*/void tmconvert(void) reset(); //复位 delay(1); write_byte(0xcc); //仅一个DS18b20 ,跳过ROM write_byte(0x44); //温度变换}/*读取温度*/long gettm(void) uchar8 LSB=0,MSB=0; //用于存储读取的温度 long temp; reset(); //复位 write_byte(0xcc); //写指令,跳过ROM,仅一个DS18b20 write_byte(0xbe); //写指令,读暂存存储器 LSB = read_byte(); //读LSB MSB = read_byte(); //读MSB sig=(MSB>>4==0X0F); if(sig) //判断符号位是否为负值,是负值了,转去处理 LSB=~LSB; //温度处理 MSB=~MSB; LSB=LSB+1; } temp=MSB*256+LSB; //十六进制转换为10进制 temp=temp*100/16; //12位精度,最小分辨率为0.0625°C return temp; //获得0.01°C 的精度并返回}
/***********ds18b20读一个字节**************/unsignedcharReadOneChar(void)uchari=0;//定义i用于循环uchardat=0;//读取的8位数据for(i=8;i>0;i--)//8次循环DQ=0;//拉低DQ总线开始读时序dat>>=1;//dat左移一位DQ=1;//释放DQ总线if(DQ)//如果DQ=1,执dat|=0x80;(0x80即第7位为1,如果DQ为1,即读取的数据为1,将dat的第7为置1,然后dat>>=1,循环8次结束,dat即为读取的数据)//DQ=0,就跳过dat|=0x80;delay_18B20(4);//延时以完成此次读时序,之后再读下一数据}return(dat);//返回读取的dat}DQ=dat&0x01;这句语句是错误的。DQ为位变量,而dat为unsignedchar如果真要这么写的话,应该是这样:DQ=(bit)dat&0x01;把我写的给你做个参考吧:externuchar8sig;//sig判定温度符号/*延时函数*/voiddelay(intus)//DELAY-11.0592MHZ调用程序大约为24us,每次循环为16usints;for(s=0;s<us;s++);}voiddelayms(intz)//z为毫秒数intx,y;for(x=z;x>0;x--)for(y=125;y>0;y--);}/*复位程序*/unsignedcharreset(void)uchar8presence;DQ=0;//拉低总线。当总线停留在低电平480us-960us,总线上所以器件都将被复位delay(30);//保持低电平504usDQ=1;//释放总线,让其恢复高电平delay(3);//等待芯片应答信号presence=DQ;//获取应答信号delay(25);//延时以完成整个时序return(presence);//返回应答信号。有芯片应答返回0,否则返回1。}/*写一位数据*/voidwrite_bit(charbitval)DQ=0;//拉低DQ总线,开始时序if(bitval==1)//如果写入的为1,则返回高电平DQ=1;delay(5);//延时104us,以完成整个时序DQ=1;}/*写一字节数据*/voidwrite_byte(charval)uchar8i,temp;for(i=0;i<8;i++)//写入一个字节的数据,一个时序中写一次temp=val>>i;//右移i位temp&=0x01;//复制那位数据到tempwrite_bit(temp);//调用write_bit()}delay(5);//延时104us以完成此次时序,之后再写下一数据}/*读一位数据*/uchar8read_bit(void)uchar8i;DQ=0;//拉低DQ,开始读时序DQ=1;//释放DQ总线for(i=0;i<3;i++);//从时序开始延时15usreturn(DQ);//返回DQ值}/*读一字节数据*/uchar8read_byte(void)uchar8i,value=0;for(i=0;i<8;i++)if(read_bit())//读一字节数据,一个时序中读一次,并作移位处理value|=0x01<<i;delay(6);//延时以完成此次读时序,之后再读下一数据}return(value);}/*温度转化*/voidtmconvert(void)reset();//复位delay(1);write_byte(0xcc);//仅一个DS18b20,跳过ROMwrite_byte(0x44);//温度变换}/*读取温度*/longgettm(void)uchar8LSB=0,MSB=0;//用于存储读取的温度longtemp;reset();//复位write_byte(0xcc);//写指令,跳过ROM,仅一个DS18b20write_byte(0xbe);//写指令,读暂存存储器LSB=read_byte();//读LSBMSB=read_byte();//读MSBsig=(MSB>>4==0X0F);if(sig)//判断符号位是否为负值,是负值了,转去处理LSB=~LSB;//温度处理MSB=~MSB;LSB=LSB+1;}temp=MSB*256+LSB;//十六进制转换为10进制temp=temp*100/16;//12位精度,最小分辨率为0.0625°Creturntemp;//获得0.01°C的精度并返回}
文章TAG:ds18b20多少字节多少字节暂存器

最近更新

  • 起辉器多少钱,请问空调启动器多少钱一个起辉器多少钱,请问空调启动器多少钱一个

    请问空调启动器多少钱一个付费内容限时免费查看回答很多空调都有空调启动器,一般空调启动机的价格,是在50元到300元左右,具体的价格要看空调启动器的材质来决定,它的材质不一样,价格也是不.....

    电路设计 日期:2024-04-11

  • 飞腾芯片的笔记本,国产电脑处理器有哪些品牌?飞腾芯片的笔记本,国产电脑处理器有哪些品牌?

    在车身尾部,飞腾龙E2000Q芯片和基于该芯片的车内智能终端的图案令人印象深刻,成为了这辆324路公交车最亮眼的核心亮点。今年由腾飞跨境联合品牌广州交信投资有限公司推出的“龙”主题公.....

    电路设计 日期:2024-04-11

  • 电压环路响应速度,电源环路响应电压环路响应速度,电源环路响应

    电压调节器的控制回路的响应速度越快。限制响应速度,可以先放慢环路速度和增益,待电路稳定后再观察伯德图调整环路以满足动态响应的要求,闭环的响应越慢,稳压电路的时间常数:稳压电路中的.....

    电路设计 日期:2024-04-10

  • 红外遥控音乐插座电路,智能红外遥控插座怎么设置?红外遥控音乐插座电路,智能红外遥控插座怎么设置?

    如果只是遥控音响的电源开关,在淘宝上买一套“带继电器的红外遥控套装”就行了,十几块钱。红外遥控系统通用红外遥控系统由发射和接收两部分组成,由编码/解码ASIC芯片进行控制操作,如图所.....

    电路设计 日期:2024-04-10

  • 单差分电路图,差分通道单端输出单差分电路图,差分通道单端输出

    输入级采用双差分通道。该机器将OCL的差分输入和电压放大部分与其后面的驱动输出分开,并将其与前端电路一起设置在电路板上,这是该功率放大器的特点之一,这种布置可以有效地降低大电流电.....

    电路设计 日期:2024-04-10

  • 电路板油脂用什么,油性电路板电路板油脂用什么,油性电路板

    什么是PCB润滑脂?因为电路板是一个敏感部件,清洗时必须使用水,一旦电路板变湿,就会出现问题。应拆下控制电路板,在受污染的印制板上喷洒清洗剂,然后用干净的牙刷刷去污垢和油渍,PCB润滑脂是指.....

    电路设计 日期:2024-04-10

  • 射频mos驱动电路,MOS开关电路怎么接?射频mos驱动电路,MOS开关电路怎么接?

    Mosfet不需要驱动电路。电压和电流太小,芯片无法驱动,例如,dsp的输出只有以下原因:RC时间常数:在驱动电路中,驱动电阻和驱动电容之间形成RC并联网络,pwm驱动mos晶体管的电路提供以下特性:用.....

    电路设计 日期:2024-04-10

  • 电路中编码器,编码器电路分析电路中编码器,编码器电路分析

    断路器:用于保护电路,当电流超过规定值时自动断开电路。出现此类故障时,首先考虑编码器问题,更换编码器,技术|编码器的分类和使用编码器是用于测量机械运动的速度、位置、角度、距离或计数.....

    电路设计 日期:2024-04-10