标签:
用户函数主要是bsp_ds18b20()函数的编写,其中涉及到单总线的读写,在DS18B20中根据时序可以得到读写函数:
static uint8_t DS18B20_Read_Bit(void) { uint8_t dat; /* 读0和读1的时间至少要大于60us */ DS18B20_Mode_Out_PP(); /* 读时间的起始:必须由主机产生 >1us <15us 的低电平信号 */ DS18B20_DATA_OUT(LOW); Delay_us(10); /* 设置成输入,释放总线,由外部上拉电阻将总线拉高 */ DS18B20_Mode_IPU(); //Delay_us(2); if( DS18B20_DATA_IN() == SET ) dat = 1; else dat = 0; /* 这个延时参数请参考时序图 */ Delay_us(45); return dat; } /* * 从DS18B20读一个字节,低位先行 */ uint8_t DS18B20_Read_Byte(void) { uint8_t i, j, dat = 0; for(i=0; i<8; i++) { j = DS18B20_Read_Bit(); dat = (dat) | (j<<i); } return dat; } /* * 写一个字节到DS18B20,低位先行 */ void DS18B20_Write_Byte(uint8_t dat) { uint8_t i, testb; DS18B20_Mode_Out_PP(); for( i=0; i<8; i++ ) { testb = dat&0x01; dat = dat>>1; /* 写0和写1的时间至少要大于60us */ if (testb) { DS18B20_DATA_OUT(LOW); /* 1us < 这个延时 < 15us */ Delay_us(8); DS18B20_DATA_OUT(HIGH); Delay_us(58); } else { DS18B20_DATA_OUT(LOW); /* 60us < Tx 0 < 120us */ Delay_us(70); DS18B20_DATA_OUT(HIGH); /* 1us < Trec(恢复时间) < 无穷大*/ Delay_us(2); } } }
另外延时的时序采用了滴答定时器来实现延时,在移植他人程序时除了移植bsp_ds18b20.c还要移植bsp_SysTick.c (当然延时函数可以自己写),滴答定时器中使用了1us中断一次,所以在中断服务文件中需要添加程序有:
extern void TimingDelay_Decrement(void); void SysTick_Handler(void) { TimingDelay_Decrement(); }
剩余的就是调用函数转换得到温度值。
标签:
原文地址:http://www.cnblogs.com/windworld17/p/4762697.html