EDN首页   博客首页

日志档案

发表于 2008-9-25 9:41:42

0

标签: DS18B20  1-Wire  C语言  AVR  

DS18B20 C语言读写函数

pdfDS18B20读写

/***************************************************************************

作者:yupc

Bog 地址: http://blog.ednchina.com/yupc/

硬件描述:以下程序在AVR单片机上能可靠运行,运行频率为8M.

程序描述:以下程序只对DS18B20单个读写,多个读写的函数我没有写,这个不是难点,难点在于读写时续,本程序已成功运行了好几个月,

时间:2008.9.25

****************************************************************************/

#include <avr/io.h>

#include "DS18B20.h"

#include <avr/interrupt.h>

#define SetDo1() DDRD&=~_BV(PD6)

#define ClrDo1() DDRD|=_BV(PD6)

#define TestDo1() PIND&_BV(PD6)

#define SetDo2() DDRB&=~_BV(PB0)

#define ClrDo2() DDRB|=_BV(PB0)

#define TestDo2() PINB&_BV(PB0)


#define SKIPROM 0xCC

#define CONVERT 0x44

#define READSCRA 0xBE


/********************************************************************

作者:俞萍初

函数名: void tickDelay(unsigned int data)

描述:AVR运行在8M的频率下时,当参数data0,延时2us,分辨率为0.875us

计算公式为: 延时=2+data*0.875;

AVR运行在4M, 延时=(2+data*0.875)*2;

********************************************************************/

#define TD_A ((7 -2)/0.875) //延时7us

#define TD_B ((64)/0.875) //延时64us

#define TD_C ((60)/0.875) //延时60us

#define TD_D ((10-2)/0.875) ////延时10us

#define TD_E ((9-2)/0.875) //延时9us

#define TD_F ((55)/0.875) //延时55us

#define TD_G 0 ////延时0us

#define TD_H ((480)/0.875) //延时480us

#define TD_I ((70)/0.875) //延时70us

#define TD_J ((410)/0.875) //延时410us

void tickDelay(unsigned int data)

{

while(data--);

}

unsigned char OWTouchReset1(void)

{

unsigned char result;

tickDelay(TD_G);

ClrDo1();

tickDelay(TD_H);

SetDo1();

tickDelay(TD_I);

result=TestDo1();

tickDelay(TD_J);

return result;

}

void OWWriteBit1(unsigned char bit)

{

if(bit)

{

ClrDo1();

tickDelay(TD_A);

SetDo1();

tickDelay(TD_B);

}

else

{

ClrDo1();

tickDelay(TD_C);

SetDo1();

tickDelay(TD_D);

}

}

unsigned char OWReadBit1(void)

{

unsigned char result;

ClrDo1();

tickDelay(TD_A);

SetDo1();

tickDelay(TD_E);

result = TestDo1();

tickDelay(TD_F);

return result;

}

void OWWriteByte1(unsigned char data)

{

unsigned char loop;

for(loop=0;loop<8;loop++)

{

OWWriteBit1(data & 0x01);

data >>=1;

}

}

unsigned char OWReadByte1(void)

{

unsigned char loop,result;

result=0;

for(loop=0;loop<8;loop++)

{

result>>=1;

if(OWReadBit1())

result |= 0x80;

}

return result;

}

unsigned char OWTouchByte1(unsigned char data)

{

unsigned char loop,result;

result=0;

for(loop=0;loop<8;loop++)

{

result >>=1;

if(data & 0x01)

{

if(OWReadBit1())

result |= 0x80;

}

else

{

OWWriteBit1(0);

}

data >>= 1;

}

return result;

}

///////////////////////////////////////////////////////////////

unsigned char OWTouchReset2(void)

{

unsigned char result;

tickDelay(TD_G);

ClrDo2();

tickDelay(TD_H);

SetDo2();

tickDelay(TD_I);

result=TestDo2();

tickDelay(TD_J);

return result;

}

void OWWriteBit2(unsigned char bit)

{

if(bit)

{

ClrDo2();

tickDelay(TD_A);

SetDo2();

tickDelay(TD_B);

}

else

{

ClrDo2();

tickDelay(TD_C);

SetDo2();

tickDelay(TD_D);

}

}

unsigned char OWReadBit2(void)

{

unsigned char result;

ClrDo2();

tickDelay(TD_A);

SetDo2();

tickDelay(TD_E);

result = TestDo2();

tickDelay(TD_F);

return result;

}

void OWWriteByte2(unsigned char data)

{

unsigned char loop;

for(loop=0;loop<8;loop++)

{

OWWriteBit2(data & 0x01);

data >>=1;

}

}

unsigned char OWReadByte2(void)

{

unsigned char loop,result;

result=0;

for(loop=0;loop<8;loop++)

{

result>>=1;

if(OWReadBit2())

result |= 0x80;

}

return result;

}

unsigned char OWTouchByte2(unsigned char data)

{

unsigned char loop,result;

result=0;

for(loop=0;loop<8;loop++)

{

result >>=1;

if(data & 0x01)

{

if(OWReadBit2())

result |= 0x80;

}

else

{

OWWriteBit2(0);

}

data >>= 1;

}

return result;

}

////////////////////////////////////////////////////////////////

void OWBlock1(unsigned char *data,unsigned char data_len)

{

unsigned char loop;

for(loop=0;loop<data_len;loop++)

{

data[loop] = OWTouchByte1(data[loop]);

}

}

void OWBlock2(unsigned char *data,unsigned char data_len)

{

unsigned char loop;

for(loop=0;loop<data_len;loop++)

{

data[loop] = OWTouchByte2(data[loop]);

}

}

unsigned char Ds18b20_Start(unsigned char chflg)

{

cli();

if(chflg==1)

{

if(OWTouchReset1())

return 0;

OWWriteByte1(SKIPROM);

OWWriteByte1(CONVERT);

}

else

{

if(OWTouchReset2())

return 0;

OWWriteByte2(SKIPROM);

OWWriteByte2(CONVERT);

}

sei();

return 1;

}

unsigned char Ds18b20_Read(unsigned char chflg,int *pdata)

{

unsigned char *pchar;

pchar = (unsigned char *)pdata;

cli();

if(chflg==1)

{

if(OWTouchReset1())

return 0;

OWWriteByte1(SKIPROM);

OWWriteByte1(READSCRA);

*pchar=OWReadByte1();

*(pchar+1)=OWReadByte1();

}

else

{

if(OWTouchReset2())

return 0;

OWWriteByte2(SKIPROM);

OWWriteByte2(READSCRA);

*pchar=OWReadByte2();

*(pchar+1)=OWReadByte2();

}

sei();

return 1;

}

系统分类: 单片机   |   用户分类: 编程   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(489)    回复(0)  

投一票您将和博主都有获奖机会!