ZKX's LAB

程序为什么要写字节到ds18b20 给我一个可用的DS18B20的程序 不用带显示 请不要百度复制给我

2020-10-05知识599

给我一个可用的DS18B20的程序 不用带显示 请不要百度复制给我 【本人严格根据手册写成的,已通过软件仿真和硬件实物验证,注释详细,望采纳!【延时函数】*/void delay(unsigned char i)/延时时间为 8i+10{for;i>;0;i-);}【复位与应答】*/bit reset()/执行完毕自动释放总线{bit presence;应答标志位,'0'有效DQ=0;delay(60);将总线拉低490us(480us),发出复位脉冲DQ=1;delay(7);释放总线后等待66us(60us),以准备接收应答信号presence=DQ;接收应答信号delay(53);延时434us以满足时序要求,加上前面的66us,一共500us。应答低电平的持续时间是60us~240us,也就是说,应答信号发送完毕后总线自动释放return(presence);如果返回0,则表明复位成功}【写一个字节】*/void write8(unsigned char byte)/执行完毕将释放总线{ unsigned char i;for(i=8;i>;0;i-){/复位后总线自动释放DQ=0;nop_();将总线拉低至少1us,启动写时序DQ=byte&0x01;将byte的最低位写入总线,15us后等待DS18B20采样delay(7);延时66us,DS18B20在拉低后的约15~60us期间从总线上采样DQ=1;nop_();释放总线并延时1us,两个写时序之间至少需要1us的恢复时间byte>;>;=1;将byte中的各二进制位数据右移1位,为写下一位做准备}}【读一个字节】*/unsigned char 。

程序为什么要写字节到ds18b20 给我一个可用的DS18B20的程序 不用带显示 请不要百度复制给我

我有个关于DS18B20的程序不是很懂 求指点一下 我是新手。..求好心人。 你这是要显示温度的嘛,我毕业设计正好搞过DS18B20,所以把我的程序给你,讲解的很详细,最终获得温度值。DS18B20温度控制相关函数/DS18B20延时函数0=void delay(unsigned int i)/i=1要使之为6us,不然DS18B20读写程序会出错!{while(i-);}DS18B20延时函数1=void delay10ms(unsigned int x)/延时2S的延时函数{unsigned int i,j;for(i=x;i>;0;i-)for(j=1100;j>;0;j-);j=110,x=1时约为1MS延时}DS18B20复位函数=保证复位成功!void Init_DS18b20(void){int presence=1;先定义个变量,用于复位信号的判断while(presence){DQ=1;先给数据口写1delay(1);稍做延时DQ=0;复位信号就是控制器给芯片至少480us的低电平delay(90);550usDQ=1;拉高数据口delay(14);延时66us(当DS18B20接到复位脉冲后在15-60us后产生存在脉冲,其为短暂低电平存在时间为60-240us)presence=DQ;判断是否产生存在脉冲,若DQ=0表示存在,复位成功,否则继续循环!}delay(45);延时500usDQ=1;}读一个字节的数据=uchar Read_One_Byte()/读数据时,数据以字节的最低有效位先从总线移出{uchar i=0;uchar dat=0x00;for(i=8;i>;0;i-)/一个字节共8位{DQ=1;主机数据线先从高拉至低电平1ms。

程序为什么要写字节到ds18b20 给我一个可用的DS18B20的程序 不用带显示 请不要百度复制给我

写DS18B20的控制程序的依据是什么,或者说为什么要这样写?温度显示部分不用解释,盼大神相助. DS18B20与单片机的通信比较特别,是单总线通信方式,可以这样理解,它实际上是串口通信,既然要通信,必须要有个协议吧,这个协议不是你定的,也不是我定的,而是研发的人去定的。单片机与18b20实际上就是要按照研发者的协议,一步一步写的,那个协议我就不细说了。这样吧,举个例子,ReadOneChar(void){uchar i=0;uchar dat=0;for(i=8;i>;0;i-){DATA=0;给脉冲信号dat>;>;=1;DATA=1;给脉冲信号if(DATA)dat|=0x80;delay(8);}return(dat);}这个是单片机读18b20的数据,上面dat是用来存数据的,至于为什么循环读值前右移一位,我就不细说了,自己琢磨琢磨。协议规定,读的时候,先拉低电平短时间内(dat右移的时间就够了,所以没写)再拉高,然后一位一位的读,主意是一位一位!其他我也没什么得说了,自己琢磨琢磨18b20的资料,你会懂的!

程序为什么要写字节到ds18b20 给我一个可用的DS18B20的程序 不用带显示 请不要百度复制给我

DS18B20读程序和写程序有何不同?为何读程序或上0X80,写程序却与上0X01? 貌似你是用C,我只会汇编,读字节右移是为了把1个地址低位放到另一个地址高位获得1个新的字节,这个字节实际上就是测量的温度值,写貌似是直接写

温度传感器DS18B20的读写一个字节的子程序 /*ds18b20读一个字节*/unsigned char ReadOneChar(void){uchar i=0;定义2113i用于循环5261uchar dat=0;读取的8位数据for(i=8;i>;0;i-)/8次循环{DQ=0;拉低DQ总线4102开始1653读时序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;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);保持低电平504usDQ=1;释放总线,让其恢复高。

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

DS18B20把高低字节读出来了,怎么转化为实际温度? DS18B20精度是±0.5度,和分辨率 根据你的叙述分析,把高低字节读出来了,用的是12位方式,这时候DS18B20的分辨率是0.0625度,你说DS18B20精度是±0.5度,是错误的,DS18B20精度最高是±1度。转化为实际温度的方法是先判断高字节的D7、D6、D5、D4、D3为,如果为11111,温度为负,如果为00000,温度为正,正温度=采集数据X0.0625,得到实际摄氏温度。负温度=采集数据取反加一X0.0625,得到实际摄氏温度。

#unsigned#dq#ds18b20

随机阅读

qrcode
访问手机版