本帖最后由 freeelectron 于 2019-1-11 19:39 编辑
2012年刚学51单片机的时候,玩过DS18B20,忘的差不多了。最近再次用到,记一片流水账,加深理解,以防又忘掉。
1、整体把握 (1)读写数据都是低位先行; (2)默认12bit,可以配置为9,10,11,12bit,精度0.5,0.25,0.125,0.0625; (3)符号位S为0,表示正值,符号位s为1表示负值。
2、芯片检测
- static uint8_t DS18B20_Check(void)
- {
- uint8_t retry=0;
-
- while(DS18B20_DQ_READ()&&retry<200)
- {
- retry++;
- _delay_us(1);
- }
- if(retry>=200)
- {
- return 0;//未检测到设备
- }
- else
- {
- retry=0;
- }
-
- while(!DS18B20_DQ_READ()&&retry<240)
- {
- retry++;
- _delay_us(1);
- }
-
- if(retry>=240)
- {
- return 0;//未检测到设备
- }
- else
- {
- return 1; //检测到设备
- }
- }
复制代码
3、写数据 (1)所有的写逻辑,都是有主机拉低总线再释放总线开始(总线电平:高->低); (2)所有的写(写1位)最少持续60us,相邻两个写之间大于1us; (3)DS18B20在第写信号产生之后的15us-60us之间采样。 - static void DS18B20_Write_Byte(uint8_t dat)
- {
- uint8_t j, testb;
-
- for (j=1;j<=8;j++)
- {
- testb=dat&0x01;
- dat=dat>>1;
- if (testb)
- {
- DS18B20_DQ_LOW(); // Write 1
- _delay_us(2);
- DS18B20_DQ_HIGH();
- _delay_us(60);
- }
- else
- {
- DS18B20_DQ_LOW(); // Write 0
- _delay_us(60);
- DS18B20_DQ_HIGH();
- _delay_us(2);
- }
- }
- }
复制代码4、读数据 所有的读逻辑,都是有主机拉低总线再释放总线开始(总线电平:高->低->高); 在主机产生读信号之后(下降沿),15us之内读取DS18B20。
- static uint8_t DS18B20_Read_Bit(void)
- {
- uint8_t dat;
-
- DS18B20_DQ_LOW();
- _delay_us(2);
- DS18B20_DQ_HIGH();
- _delay_us(10);
- if(DS18B20_DQ_READ())
- {
- dat=1;
- }
- else
- {
- dat=0;
- }
- _delay_us(45);
- return dat;
- }
- static uint8_t DS18B20_Read_Byte(void)
- {
- uint8_t i,j,dat;
- dat=0;
- for (i=1;i<=8;i++)
- {
- j=DS18B20_Read_Bit();
- dat=(j<<7)|(dat>>1);
- }
- return dat;
- }
复制代码
5、DS18B20命令
|