~~~~ 经过单线接口访问 DS1820 的协议 如下~~
1. 初始化
2. ROM 操作命令
3. 存贮器操作命令
4. 处理/数据
首先,我们对18B20进行操作,我们要对其初始化,
初始化:单线总线上的所有处理均从初始化序列开始 初始化序列包括总线主机发出一复位脉冲 接着
由从属器件送出存在脉冲
初始化子程序:
Init_DS18B20(void)
{
unsigned char x=0;定义一个变量判断是否初始化程序
DQ=1; //DQ先置高
delay(8); //稍延时
DQ=0; //发送复位脉冲
delay(80); //延时(>480us)
DQ=1; //拉高数据线
delay(5); //等待(15~60us)
x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay(20);
}
ROM操作命令:
写操作:
当主机总线 t o 时刻从高拉至低电平时 就产生写时间隙 见图
从 to 时刻开始 15us 之内应将所需写的位送到总线上 DSl820 在 t 后15-60us间对总线
采样 若低电平 写入的位是 0 见图 2 25 3 若高电平 写入的位是 1 见图 2 25 4
连续写 2 位间的间隙应大于 1us 即必须有1us以上的高电平恢复期。
写数据子程序
WriteOneChar(unsigned char dat) //unsigned char dat 定义存控制命令;以下对命令操作
{
unsigned char i=0;
for(i=8;i>0;i--) //因为写一个字节 ,所以要循环八次
{
DQ=1; //置高电平
_nop_(); //在开始另一个写周期前必须有1us以上的高电平恢复期。
DQ=0; //进入写开始
_nop_();
DQ=dat&0x01; //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0。
delay(5); //向1-Wire总线写1bit至少需要60μs
dat>>=1; //因为写数据是从低位到高位,高位逐位的往右移
}
}
读操作
见图2 25 5 主机总线 to 时刻从高拉至低电平时 总线只须保持低电平 l 7ts 之后
在 t1 时刻将总线拉高 产生读时间隙 读时间隙在 t1 时刻后 t 2 时刻前有效 t z 距 to 为15
捍 s 也就是说 t z 时刻前主机必须完成读位 并在 t o 后的60尸 s 一 120 fzs 内释放总线
读位子程序(读得的位到 C 中)
void ReadOneChar() //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{
unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
unsigned char dat=0; //首先初始化dat
for (i=8;i>0;i--) //一个字节有8位 ,所以循环八次
{
DQ=1;
delay(1);
DQ=0; //从高拉至低电平时 总线只须保持低电平 l 7ts
dat>>=1; // 读出来的数据要一位一位的移进去
DQ=1; //将总线拉高 产生读时间隙
_nop_();
if(DQ) //判断DQ是1还是0
dat|=0x80; //是1的话dat就高位1或,因为读数据是从低位读取 delay(4);
}
return(dat); //返回读出来的一个字节数据
}
只要根据时序来办事,就简单多了,然后在根据读出温度的过程来,就可以达到你想要的结果了,做的不太好,多多指教,谢谢~!