单片机解密DS18B20的C51程序及DS18b20.h头文件下
单片机解密DS18B20复位和初始化函数: DS18B20_Reset(void)
// 单片机解密 功能: 8051发出时间长度>=480us的低电平到数据线,然后拉高数据线维持15~60us
// 单片机解密 输入: 无
// 单片机解密输出: DS18B20被复位
// 返回: 无
//******************************************************************************
void DS18B20_Reset(void)
{
uchar i;
DQ = 0; //拉低数据线DQ
i = 80; //使用12MHz晶体时用80,根据晶体频率按比例增减i的值
while(i--); //软件延时,"while(i--);"的反汇编代码单次循环消耗6us,80*6us=480us
DQ = 1;
i = 5; //使用12MHz晶体时用5,根据晶体频率按比例增减
while(i--); //软件延时,"while(i--);"的反汇编代码单次循环消耗6us,5*6us=30us
}
//******************************************************************************
// 读取一位数据函数: bit bitread(void)
// 功能: 51发长3us的低电平到数据线, 然后拉高数据线7us,再读回数据线,最后由软件延
// 时消耗掉60us位时间的剩余部分.
// 输入: 无
// 输出: 无
// 返回: 位值
//******************************************************************************
bit bitread(void)
{
uchar i;
bit dat;
DQ = 0; //拉低数据线DQ
i++; //模拟1~15us的延时,反汇编显示实际延时3us
DQ = 1; //拉高数据线DQ
i++; i++; //适当延时,反汇编显示实际延时7us
dat = DQ; //至此,DS18B20会在DQ上给出位值,读回此位值
i = 8; //从DQ拉低至此,反汇编显示已耗时13us, 60us-13us=47us约=48us
while(i--); //软件延时,"while(i--);"的反汇编代码单次循环消耗6us,8*6us=48us
return(dat); //返回位值
}
//******************************************************************************
// 读取一个字节数据函数: uchar byteread(void)
// 功能: 通过8次调用读取一位函数, 从DS18B20读回一个字节值,注意先读的是最低位
// 输入: 无
// 输出: 无
// 返回: 字节值
//******************************************************************************
uchar byteread(void)
{
uchar i, j, dat;
dat = 0;
for(i=1; i<=8; i++)
{
j = bitread(); //顺序读8个位
dat >>= 1;
dat |= (j<<7); //组装成一个字节
}
return(dat); //返回字节值
}
//******************************************************************************
// 写一个字节数据或命令函数: bytewrite(uchar dat)
// 功能: 写一个字节数据或命令到DS18B20中
// 输入: dat是准备写入DS18B20的一个命令字节或数据字节
// 输出: 命令字节或数据字节被写入DS18B20中
// 返回: 无
// 按位写入: 位值1写法:在DQ上发 1~ 15us低电平后跟高电平,应使位时间>=60us
// 位值0写法:在DQ上发60~120us低电平后跟高电平,应使位时间>=60us
// 注意:延时时间的统计计算需要浏览反汇编代码
//******************************************************************************
void bytewrite(uchar dat)
{
uchar i, j;
for(j=0; j<8; j++)
{
if(dat&0x01) //如果当前位的值为1,发1~15us低电平后跟高电平到数据线DQ
{
DQ = 0; //拉低数据线DQ
DQ = 0; //延时1us
DQ = 0; //到此共延时2us, 1us<2us<15us
DQ = 1; //拉高数据线DQ
i = 7; //自DQ拉低后到此语句执行完毕共耗时4us
while(i--); //每次循环耗时8us,7*8us=56us, 56us+4us=60us
}
else //如果当前位的值为0,发60~120us低电平后跟高电平到数据线DQ
{
DQ = 0; //拉低数据线DQ
i = 8; while(i--); //延时约65us, 60us<65us<120us
DQ =1; //拉高数据线DQ
DQ =1; //延时1us
DQ =1; //延时2us
}
dat = dat>>1; //右移,准备下一个位
}
}

芯片解密