void onewire_reset(void) { OUT_DQ(); CLR_DQ(); clock_delay_usec(480); SET_DQ(); clock_delay_usec(60); IN_DQ(); clock_delay_usec(10); while(!(GET_DQ())); OUT_DQ(); SET_DQ(); }
/* * 读数据函数 * 输入参数: 无 * 输出参数: 无 * 返回参数: 读取的数据 * */ unsigned char DS18B20_Read(void) { unsigned char rdData; //读出的数据 unsigned char i, dat; //临时变量 rdData = 0; //读出的数据初始化为0 /* 每次读一位,读8次 */ for(i=0; i<8; i++) { CL_DQ(); //IO拉低 SET_DQ(); //IO拉高 SET_IN(); //设置IO方向为输入 DS18B20->CC2540 dat = DQ; //读数据,从低位开始 if(dat) { rdData |= (1<<i); //如果读出的数据位为正 } else { rdData &= ~(1<<i);//如果读出的数据位为负 } delay_nus(70); //保持60~120us SET_OUT(); //设置IO方向为输出 CC2540->DS18B20 } return (rdData); //返回读出的数据 }
/* * DS18B20初始化/复位函数 * 输入参数: 无 * 输出参数: 无 * 返回参数: 无 * */ void DS18B20_Init(void) { SET_OUT(); SET_DQ(); //IO口拉高 CL_DQ(); //IO口拉低 delay_nus(550); //IO拉低后保持一段时间 480-960us SET_DQ(); //释放 SET_IN(); //IO方向为输入 DS18B20->CC2540 delay_nus(40); //释放总线后等待15-60us /* 等待DQ变低 */ while(DQ) { ; } delay_nus(240); //检测到DQ 变低后,延时60-240us SET_OUT(); //设置IO方向为输出 CC2540->DS18B20 SET_DQ(); //IO拉高 }
/* * 写命令函数 * 输入参数: 命令(DS18B20.H中定义) * 输出参数: 无 * 返回参数: 无 * */ void DS18B20_Write(unsigned char cmd) { unsigned char i; SET_OUT(); //设置IO为输出,2530->DS18B20 /*每次一位,循环8次*/ for(i=0; i<8; i++) { CL_DQ(); //IO为低 if( cmd & (1<<i) ) //写数据从低位开始 { SET_DQ(); //IO输入高电平 } else { CL_DQ(); //IO输出低电平 } delay_nus(40); //保持15~60us SET_DQ(); //IO口拉高 } SET_DQ(); //IO口拉高 }
uint8_t onewire_read(void) { uint8_t data = 0; int i; for (i = 0; i < 8; i++) { OUT_DQ(); CLR_DQ(); data = data >> 1; SET_DQ(); IN_DQ(); clock_delay_usec(8); if(GET_DQ()) data |= 0x80; OUT_DQ(); SET_DQ(); clock_delay_usec(60); } return data; }
void onewire_write(uint8_t data) { uint8_t i; OUT_DQ(); SET_DQ(); clock_delay_usec(16); for(i = 0; i < 8; i++) { CLR_DQ(); if(data & 0x01) { SET_DQ(); } else { CLR_DQ(); } data = data >> 1; clock_delay_usec(40); //65 SET_DQ(); } }