说明: 拉低总线至少480us ;可用于检测DS18B20 工作是否正常 bit RST_DS18B20() {
bit ret=\
DQ=0;/*拉低总线 */
Delayxus_DS18B20(32);/*为保险起见,延时495us */
DQ=1;/*释放总线 ,DS18B20 检测到上升沿后会发送存在脉冲*/
Delayxus_DS18B20(4);/*需要等待15~60us,这里延时75us 后可以保证接受到 的是存在脉冲(如果通信正常的话) */ ret=DQ;
Delayxus_DS18B20(14);/*延时495us,让ds18b20 释放总线,避免影响到下一 步的操作 */
DQ=1;/*释放总线 */ return(~ret);}
写时序:读写时隙
主机在写时隙向DS18B20 写入数据,并在读时隙从DS18B20 读入数据。在单总 线上每个时隙只传送一位数据。
有两种写时隙:写“0”时间隙和写“1”时间隙。总线主机使用写“1”时间隙向 DS18B20 写入逻辑1,使用写“0”时间隙向DS18B20 写入逻辑0.所有的写时隙必须有
最少60us 的持续时间,相邻两个写时隙必须要有最少1us 的恢复时间。两种写时隙
都通过主机拉低总线产生。
为产生写1 时隙,在拉低总线后主机必须在15μs 内释放总线。在总线被释放
后,由于5kΩ 上拉电阻的作用,总线恢复为高电平。为产生写0 时隙,在拉低总线
后主机必须继续拉低总线以满足时隙持续时间的要求(至少60μs)。 在主机产生写时隙后,DS18B20 会在其后的15 到60us 的一个时间窗口内采样单 总线。在采样的时间窗口内,如果总线为高电平,主机会向DS18B20 写入1;如果
总线为低电平,主机会向DS18B20 写入0。
如文档所述,所有的写时隙必须至少有60us 的持续时间。相邻两个写时隙必须 要有最少1us 的恢复时间。所有的写时隙(写0 和写1)都由拉低总线产生。 为产生写1 时隙,在拉低总线后主机必须在15us 内释放总线(拉低的电平要持 续至少1us)。由于上拉电阻的作用,总线电平恢复为高电平,直到完成写时隙。 为产生写0 时隙,在拉低总线后主机持续拉低总线即可,直到写时隙完成后释放 总线(持续时间60-120us)。 写时隙产生后,DS18B20 会在产生后的15 到60us 的时间内采样总线,以此来确 定写0 还是写1。
满足上述要求的写函数为: 函数:WR_Bit
功能:向DS18B20 写一位数据 参数:i 为待写的位 返回:无
说明: 总线从高拉到低产生写时序 void WR_Bit(bit i) {
DQ=0;//产生写时序 _nop_();
_nop_();//总线拉低持续时间要大于1us DQ=i;//写数据 ,0 和1 均可
Delayxus_DS18B20(3);//延时60us,等待ds18b20 采样读取 DQ=1;//释放总线 }
函数:WR_Byte
功能:DS18B20 写字节函数,先写最低位 参数:dat 为待写的字节数据 返回:无 说明:无
void WR_Byte(unsigned char dat) {
unsigned char i=\while(i++<8) {
WR_Bit(dat&0x01);//从最低位写起 dat>>=1; //注意不要写成dat>>1 } }
读时序:
DS18B20 只有在主机发出读时隙后才会向主机发送数据。因此,在发出读暂存器命令 [BEh]或读电源命令[B4h]后,主机必须立即产生读时隙以便DS18B20 提供所需数据。另外,主机可在发出温度转换命令T [44h]或Recall 命令E 2[B8h]后产生读时隙,以便了解操作的状态(在 DS18B20 操作指令这一节会详细解释)。 所有的读时隙必须至少有60us 的持续时间。相邻两个读时隙必须要有最少1us 的恢复时间。所有的读时隙都由拉低总线,持续至少1us 后再释放总线(由于上拉电阻的作用,总线恢复为高电平)产生。在主机产生读时隙后,DS18B20 开始发送0 或1 到总线上。DS18B20 让总线保持高电平的方式发送1,以拉低总线的方式表示发送0.当发送0 的时候,DS18B20 在读时隙的末期将会释放总线,总线将会被上拉电阻拉回高电平(也是总线空闲的状态)。DS18B20 输出的数据在下降沿(下降沿产生读时隙)产生后15us 后有效。因此,主机释放总线和采样总线等动作要在15μs内完成。如图表明了对于读时隙,TINIT(下降沿后低电平持续时间), TRC(上升沿和SAMPLE(主机采样总线)的时间和要在15μs 以内 下图显示了最大化系统时间宽限的方法:让TINIT 和TRC 尽可能的短,把主机采样总线放到15μs 这一时间段的尾部。
由文档可知,DS18B20 只有在主机发出读时隙时才能发送数据到主机。因此,主机必须在BE 命令,B4 命令后立即产生读时隙以使DS18B20 提供相应的数据。另外,在44 命令,B8 命令后也要产生读时隙。所有的读时隙必须至少有60us 的持续时间。相邻两个读时隙必须要有最少1us的恢复时间。所有的读时隙都由拉低总线,持续至少1us 后再释放总线(由于上拉电阻的作用,总线恢复为高电平)产生。DS18B20 输出的数据在下降沿产生后15us后有效。因此,释放总线和主机采样总线等动作要在15us 内完成。 满足以上要求的函数为: 函数:Read_Bit
功能:向DS18B20 读一位数据
参数:无 返回:bit i
说明: 总线从高拉到低,持续至1us 以上,再释放总线为高电平空闲状态产生 读时序
unsigned char Read_Bit() {
unsigned char ret; DQ=0;//拉低总线 _nop_(); _nop_(); DQ=1;//释放总线 _nop_(); _nop_(); _nop_(); _nop_();
ret=DQ;//读时隙产生7 us 后读取总线数据。把总线的读取动作放在15us 时 间限制的后面是为了保证数据读取的有效性
Delayxus_DS18B20(3);//延时60us,满足读时隙的时间长度要求 DQ=1;//释放总线
return ret; //返回读取到的数据 }
函数:Read_Byte
功能:DS18B20 读一个字节函数,先读最低位 参数:无
返回:读取的一字节数据 说明: 无
unsigned char Read_Byte() {
unsigned char i;
unsigned char dat=\for(i=0;i<8;i++) {
dat>>=1;//先读最低位 if(Read_Bit()) dat|=0x80; }
return(dat); }
函数:Start_DS18B20 功能:启动温度转换 参数:无 返回:无
说明: 复位后写44H 命令 void Start_DS18B20() {DQ=1;
RST_DS18B20();
WR_Byte(0xcc);// skip
WR_Byte(0x44);//启动温度转换 }
函数:Read_Tem 功能:读取温度 参数:无
返回:int 型温度数据,高八位为高八位温度数据,低八位为低八位温度数据 说明: 复位后写BE 命令 int Read_Tem() {int tem=\RST_DS18B20();
WR_Byte(0xcc);// skip
WR_Byte(0xbe);//发出读取命令 tem=Read_Byte();//读出温度低八位
tem|=(((int)Read_Byte())<<8);//读出温度高八位 return tem;}
DS18B20:
//============================================================= // 文件名称: DS18B20.c // 功能描述: DS18B20驱动 // 维护记录: 2014-06-12 V1.0
//============================================================= #include \#include \#include \#include \#include \#include \#include \
int i,j,k;
extern volatile unsigned short
LCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT]; U16 temp; //定义无符号的16位的变量 U16 t;
U8 DS18B20_ID[8] = {0};
extern unsigned int PCLK;//定义无符号整形PCLK void usDelay(int time) //延时函数 {
U32 i,j;
for (i = time; i > 0; i--) for (j = 1; j > 0; j--); }
//========================================