1、ds18b20转十进制数DS18B20温度转换一、初始化1、步骤:1)、有总线控制器发出复位脉冲 2)、从机发出存在脉冲。(存在脉冲让总线知道DS15B20在总线上已准备好操作、一旦总线控制器探测到一个存在脉冲,就可以发出ROM命令)2、初始化过程“复位”和“存在”脉冲3、过程:送 1 复位送 0 拉低(800us)送 1 产生一个上升沿(50us)检测低电平检测高电平4、程序:init_1820()/1820初始化 unsigned char a,b,c; p23=1;/复位 p23=0;/拉低800us for(b=2;b0;b-) for(a=200;a0;a-); p23=1;/产生一
2、个上升沿, 进入等待应答状态 for(b=1;b0;b-)/延时50us for(a=25;a0;a-); while(p23=1); while(p23=0);/检测到应答脉冲 二、写Ds18b20的数据读写是通过时间间隙处理和命令来确认信息交换1、步骤:1)主机把数据从逻辑高电平拉到低电平,写时间间隙开始(写时间间隙必须最少持续60us,包括两个写周期至少1us的恢复时间。) 2)I/O线电平拉低后,DS18B20在一个15us到60us的时候对I/O线采样。如果线上为高电平,就是写1,如果线上是低电平,就是写02、写时序图:1) 写0:先把数据线拉低15us,然后在至少保持15us的低电
3、平,进行写0(数据线必须被拉至逻辑低电平且至少保持30us),然后必须拉高恢复(至少1us,不用考虑)。2) 写1:数据线必须被拉至逻辑低电平(至少1us,不用考虑)然后在从开始的15us内(也就是14us内)拉至到电平,3、程序写0:write0()/写0 uchar a,b; DQ=0;/拉低 for(a=6;a0;a-);/拉低15us for(a=21;a0;a-); /送入0至少45us,DS1820采样,(其实15us就行) /总共拉低至少60us/或for(b=15;b0;b-)/60us /for(a=2;a0;a-); DQ=1;/拉高恢复(至少1us) _nop_(); 写
4、1:write1()/写1 DQ=0;/拉低(至少1us) _nop_(); DQ=1;/15us之内送入高电平(其实不用非得15us之内) _nop_(); 三、读1、步骤:1)主机把数据线从高电平拉至低电平时,产生读时间片2)数据线必须保持低电平至少1us,读1820输出的数据在读时间片后的15us内有效(在读之前必须停止送低电平(也就是送高电平)低电平1us后直接拉高等待读数据)3)读时间片的最短持续时间为60us,各个读时间片之间要有最短为1us的恢复时间2、读时序3、程序uchar ds1820rd()/读数据 uchar a,b,i,dat = 0,dat1 = 0; for (i
5、=8;i0;i-) DQ = 0; /给脉冲信号延时1us _nop_(); DQ = 1; /给脉冲信号 准备读数据 if(DQ)/读 判为1为0 dat|=0x01; else dat&=0xfe; dat=_cror_(dat,1); for(b=3;b0;b-)/延时60us for(a=8;a0;a-); return(dat); 四、温度准换流程1、ROM操作命令Skip ROM(“跳过”ROM)CCh在单点总线系统中此命令通过允许总线主机不提供64位ROM编码而访问存储器操作节省时间。(在多于一个的从属器件责不可以使用该命令。)2、存储器操作命令Convert T44h启动温度变
6、换这条命令启动一次温度转换而无需其他数据。温度转换命令被执行后DS1820白痴等待转换状态。Read ScratchpadBEh读暂存存储器这个命令读取暂存器的内容。读取从字0开始,一直进行下去,直到第9(字节8,CRC)字节读完四、流程初始化10 800us1 50us检测0检测1nopnop写指令a=数&0x01a=0 写00 60us1 nopa=1 写1 0 nop 1 nop左移 数 循环8次nopnop读数据0nop1nop读 为1 a|=0x01 为0 a&=0xfe左移a60us循环8次主函数初始化写指令0xcc写指令0x44初始化写指令0xcc写指令0xbea=读数据b=读数
7、据b=8t=b|at=t*0.0625显示t五、源程序/*DS18B20温度显示温度传感器 DQ接p1.1数码管 (用164串口) */#include#include#define uchar unsigned char #define uint unsigned int sbit DQ=P11;uchar tab=0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09;init_1820()/1820初始化 unsigned char a,b,c; DQ=1;/复位 DQ=0;/拉低800us for(c=1;c0;c-)/延时800us for
8、(b=2;b0;b-) for(a=197;a0;a-); DQ=1;/产生一个上升沿, 进入等待应答状态 for(b=1;b0;b-)/延时50us for(a=22;a0;a-); while(DQ=1); while(DQ=0);/检测到应答脉冲 _nop_(); _nop_();write0()/写0 uchar a,b; DQ=0;/拉低 for(a=6;a0;a-);/拉低15us for(a=21;a0;a-); /送入0至少45us,DS1820采样,(其实15us就行) /总共拉低至少60us DQ=1;/拉高恢复(至少1us) _nop_(); write1()/写1 DQ
9、=0; _nop_(); DQ=1; _nop_(); wr18b20(uchar k)/写指令 uchar i,b; for(i=0;i0;i-) DQ = 0; /给脉冲信号0 _nop_(); DQ = 1; /给脉冲信号1 if(DQ)/读 判为1为0 dat|=0x01; else dat&=0xfe; dat=_cror_(dat,1); for(b=3;b0;b-)/60us for(a=8;a0;a-); return(dat); teml()/温度转换子程序 uint b,t,a; init_1820();/初始化 wr18b20(0xcc);/写入跳过序列号命令字 Skip
10、 Rom wr18b20(0x44);/写入温度转换命令字 Convert T init_1820(); wr18b20(0xcc);/写入跳过序列号命令字 Skip Rom wr18b20(0xbe);/写入读取数据令字 Read Scratchpad a=ds1820rd();/读低8位 b=ds1820rd();/读高8位 t=b; t=8;/高八位左移 t=t|a;/高低八位组合 t=t*0.0625;/转换温度值 return(t);display(uint c)/显示子程序 SBUF=tabc%10; while(TI=0); TI=0; SBUF=tabc/10%10; while(TI=0); TI=0; SBUF=tabc/100%10; while(TI=0); TI=0;main() uint b; while(1) b=teml(); display(b);
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2