static void ds1820_write_bit(uint8_t bit){ DQ_OUT(); DQ_SET(); // make sure bus is high portENTER_CRITICAL(); DQ_RESET(); // pull low for 2us delay_us(2); if (bit){ DQ_IN(); } else DQ_RESET(); delay_us(60); portEXIT_CRITICAL(); DQ_IN(); // return bus }
static void ds1820_convert(void){ int code = 0; portENTER_CRITICAL(); code = ds1820_reset(); if (code!= NO_ERROR) ds1820_error(code); ds1820_write_byte(SKIP_ROM); ds1820_write_byte(CONVERT_TEMP); ds1820_reset(); portEXIT_CRITICAL(); DQ_IN(); }
static unsigned char ds1820_reset(void) { portENTER_CRITICAL(); DQ_OUT(); DQ_SET(); DQ_RESET(); delay_us(500); DQ_IN(); delay_us(60); if (DQ_READ()!= 0) { portEXIT_CRITICAL(); return PRESENCE_ERROR; } portEXIT_CRITICAL(); delay_us(240); return NO_ERROR; }
static uint8_t ds1820_read_bit(void){ uint8_t bit; delay_us(1); DQ_OUT(); DQ_SET(); // make sure bus is high portENTER_CRITICAL(); DQ_RESET(); // pull low for 2us delay_us(1); DQ_IN(); // give bus back to DS1820; delay_us(5); bit = DQ_READ(); delay_us(56); //DQ_OUT(); //DQ_SET(); portEXIT_CRITICAL(); if (bit) return 1; else return 0; }
/************************************************************************************************* * * 函数名称: * * 函数功能: 读18B20的一个字节 * * 入口参数: * * 出口参数: 无 * * 说明: * *************************************************************************************************/ uint8_t DS18B20ReadByte (void) { uint8_t i; uint8_t u; for (u = 0, i = 0; i < 8; i++) { _D_DIS_INT(); //// DQ_OUT(0); DelayUS(10); // <= 15 u >>= 1; DQ_OUT(1); //////////////////// DelayUS(5); if (DQ_IN()) { u |= 0x80; } _D_ENA_INT(); //// DelayUS(_DEBUG_R_TMPTR_TM_DLY); /////40 DQ_OUT(1); DelayUS(4); } return(u); }
/************************************************************************************************* * * 函数名称: * * 函数功能: 18B20初始化 * * 入口参数: * * 出口参数: 无 * * 说明: * *************************************************************************************************/ uint8_t Init18B20(void) { //volatile UINT32 in; ///volatile UINT32 timer_us2; ///char buff[20]; volatile uint32_t TmptrIOTmOut = 0; // min-480us |-------------------->min-480us<-------------------| // max-960us |->15-60us<-|------->60-240us<--------| // ___________ // | | | |XXXXXXXXXXXX| // |_____________________| |_________________________|XXXXXXXXXXXX| _D_DIS_INT(); DQ_OUT(1); _NOP(); _NOP(); DQ_OUT(0); DelayUS(600); // //切换到输入口, 外部上拉至高, 释放总线 DQ_OUT(1); //以下操作由DS18B20引起 ///BEGIN_TIMER_uS(); TmptrIOTmOut = 0; while (DQ_IN()) { TmptrIOTmOut++; if (TmptrIOTmOut++ > 4000) //超时处理 { return FALSE_P; } } ///timer_us1 = GET_TIMER_uS(); /// BEGIN_TIMER_uS(); TmptrIOTmOut = 0; while (!DQ_IN()) { if (TmptrIOTmOut++ > 4000) //超时处理 { return FALSE_P; } } _D_ENA_INT(); DelayUS(600); // return 1; }