1我的ds18b20总结.doc_第1页
1我的ds18b20总结.doc_第2页
1我的ds18b20总结.doc_第3页
1我的ds18b20总结.doc_第4页
1我的ds18b20总结.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

我的ds18b20总结,一、 初始化,如图一:数据线拉低至少480us后再将其拉高,大约等待1560us,就会收到60240us的低电平的存在脉冲,其后数据线会恢复被拉高状态,在数据线被拉高到初始化结束经过的时间至少为480us,以下是我根据对初始化时序写的子程序,用的是51:#include #define uchar unsigned char #define uint unsigned intvoid delay1(uint z)/延时子程序 uint x,y; for(x=10;x0;x-)/*z=1时,延时子程序用时约为61.5US*/ for(y=z;y0;y-); void reset() uint i; DQ=1; i+; DQ=0; delay1(120);/软件仿真测试为495us DQ=1; for(i=65;i0;i-) /i这个数值可以改,for语句只是作为收到存在脉冲时的延时只要满足60us就可以 if(!DQ)break; /当收到存在脉冲时跳出循环 delay1(120); /大于480us其实这个子程序并没考虑到干扰,因为假设在初始化过程有低电平脉冲的干扰,那么即使ds18b20没有发送低电平,也会认为初始化成功。二、 写时隙(1)写1时隙,如上右图:主控器将数据线拉低至少1us,并在拉低后的15us内再将其拉高,整个过程大于60us,子程序如下uchar bit1_write18b20()uint i=0; DQ=1; i+; DQ=0; for(i=0;i1;i+); /for(i=0;i1;i+)约为12.94us DQ=1; for(i=0;i4;i+); /约为51us,整个过程大于60us return(DQ);(2)写0时隙,如上左图,主控器将数据线拉低至少60us后将其拉高,子程序如下:uchar bit0_write18b20()uint i=0; DQ=1; i+; DQ=0; for(i=0;i5;i+);/大于60us return(DQ);三、 读时隙阴影部分表示数据线的在这个时间段状态不确定,整个时序图的意思是主控制器将数据线拉高至少1us后,再将其拉低,在拉低后15us内的数据有效,整个时隙时间要大于60us.虽然pdf中,用两个时序图分别表示读0时隙和读1时隙,实际上读一位数的子程序只要一个,数据线拉低后1us,将数据线拉高,在15us内储存数据,再延时,使其满足总时间大于60us,下面给个例子:uchar bit_read18b20(void) uint i; uint k; DQ=1;k+; DQ=0; for(i=0;i1;i+);/*for(i=0;i1;i+)约为12.94us*/ DQ=1; /*60us*/ return(DQ);四、 写、读一个字节数子程序:/*写一字节数*/void byte_write18b20(uint w) uint i=0; bit b; for(;i1; /*读一字节*/uchar byte_read18b20(void) uchar i; uint k; ucharvalue=0; for(i=0;i8;i+) if(bit_read18b20()value|=(0x01i); for(k=0;k6;k+);/延时使其满足读时隙时间 return(value);(1)unsigned int Readtemp() /温度转换unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;reset(); byte_write18b20(0xCC);byte_write18b20(0x44);reset();byte_write18b20(0xCC); /skip rom指令 byte_write18b20(0xBE); /温度转换指令a=byte_read18b20(); /连续读两个字节数据 /读低8位 b=byte_read18b20(); /读高8位t=b;/数值处理t=8;t=t|a; /两字节合成一个整型变量。tt=t*0.0625; /得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回0.625据的最低位代表的是0.0625度t= tt*10+0.5; /*放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行4舍5入计算*/return(t);(2)/*电源模式读取*/unsigned int Readpower( ) unsigned int t=0;reset(); byte_write18b20(0xCC);/skip rombyte_write18b20(0xB4);t=bit_read18b20();return(t);(3)/*将快速暂存寄存器的TH,TL和配置寄存器复制到EEPROM*/void copyRam() reset();byte_write18b20(0xCC);byte_write18b20(0x48);说明:这个指令与WRITE SCRATCHPAD(4Eh)指令结合可以将所要设置的温度上下限值写入ds18b20中的eeprom中,实现断电后所设置的数值仍然保存,可已通过这种方式做一个可报警的温度计,下面给个例子:void send(uchar TH,ucharTL)/将要写的温度上下限值存入EEPROMreset(); byte_write18b20(0xCC); byte_write18b20(0x4E); byte_write18b20(TH); byte_write18b20(TL); byte_write18b20(0x00); reset(); byte_write18b20(0xCC); byte_write18b20(0x48); reset();(3)读单个ds18b20的序列号子程序uint a7;uint b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论