c语言18b20,温度传感器18B20驱动程序(C语言)

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

*18B20驱动程序,DQ为数据口,接于P2.1

*11.0592M晶振,上拉4.7k电阻

*Author:fyb

*2005-3-25 11:23,OK!

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

#i nclude#i nclude

#define uchar unsigned char

#define uint? unsigned int

sbit dq = P1^7;

bit? flag;

uint Temperature;

uchar temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节

uchar id_buff[8];

uchar *p;

uchar crc_data;

uchar code CrcTable [256]={

0,? 94, 188,? 226,? 97,? 63,? 221,? 131,? 194,? 156,? 126,? 32,? 163,? 253,? 31,? 65,

157,? 195,? 33,? 127,? 252,? 162,? 64,? 30,? 95,? 1,? 227,? 189,? 62,? 96,? 130,? 220,

35,? 125,? 159,? 193,? 66,? 28,? 254,? 160,? 225,? 191,? 93,? 3,? 128,? 222,? 60,? 98,

190,? 224,? 2,? 92,? 223,? 129,? 99,? 61,? 124,? 34,? 192,? 158,? 29,? 67,? 161,? 255,

70,? 24,? 250,? 164,? 39,? 121,? 155,? 197,? 132,? 218,? 56,? 102,? 229,? 187,? 89,? 7,

219,? 133, 103,? 57,? 186,? 228,? 6,? 88,? 25,? 71,? 165,? 251,? 120,? 38,? 196,? 154,

101,? 59, 217,? 135,? 4,? 90,? 184,? 230,? 167,? 249,? 27,? 69,? 198,? 152,? 122,? 36,

248,? 166, 68,? 26,? 153,? 199,? 37,? 123,? 58,? 100,? 134,? 216,? 91,? 5,? 231,? 185,

140,? 210, 48,? 110,? 237,? 179,? 81,? 15,? 78,? 16,? 242,? 172,? 47,? 113,? 147,? 205,

17,? 79,? 173,? 243,? 112,? 46,? 204,? 146,? 211,? 141,? 111,? 49,? 178,? 236,? 14,? 80,

175,? 241, 19,? 77,? 206,? 144,? 114,? 44,? 109,? 51,? 209,? 143,? 12,? 82,? 176,? 238,

50,? 108,? 142,? 208,? 83,? 13,? 239,? 177,? 240,? 174,? 76,? 18,? 145,? 207,? 45,? 115,

202,? 148, 118,? 40,? 171,? 245,? 23,? 73,? 8,? 86,? 180,? 234,? 105,? 55,? 213, 139,

87,? 9,? 235,? 181,? 54,? 104,? 138,? 212,? 149,? 203,? 41,? 119,? 244,? 170,? 72,? 22,

233,? 183,? 85,? 11,? 136,? 214,? 52,? 106,? 43,? 117,? 151,? 201,? 74,? 20,? 246,? 168,

116,? 42,? 200,? 150,? 21,? 75,? 169,? 247,? 182,? 232,? 10,? 84,? 215,? 137,? 107,? 53};

//

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

*Function:延时处理

*parameter:

*Return:

*Modify:

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

void TempDelay (uchar us)

{

??while(us--);

}

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

*Function:18B20初始化

*parameter:

*Return:

*Modify:

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

void Init18b20 (void)

{

?dq=1;

?_nop_();

?dq=0;

?TempDelay(86);?? //delay 530 uS//80

?_nop_();

?dq=1;

?TempDelay(14);?? //delay 100 uS//14

?_nop_();

?_nop_();

?_nop_();

?

?if(dq==0)

??flag = 1;?? //detect 1820 success!

?else

??flag = 0;??? //detect 1820 fail!

?TempDelay(20);?????? //20

?_nop_();

?_nop_();

?dq = 1;

}

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

*Function:向18B20写入一个字节

*parameter:

*Return:

*Modify:

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

void WriteByte (uchar wr)? //单字节写入

{

?uchar i;

?for (i=0;i<8;i++)

?{

??dq = 0;

??_nop_();

??dq=wr&0x01;

??TempDelay(5);?? //delay 45 uS //5

??_nop_();

??_nop_();

??dq=1;

??wr >>= 1;

?}

}

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

*Function:读18B20的一个字节

*parameter:

*Return:

*Modify:

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

uchar ReadByte (void)???? //读取单字节

{

?uchar i,u=0;

?for(i=0;i<8;i++)

?{

??dq = 0;

??u >>= 1;

??dq = 1;

??if(dq==1)

??u |= 0x80;

??TempDelay (4);

??_nop_();

?}

?return(u);

}

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

*Function:读18B20

*parameter:

*Return:

*Modify:

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

void read_bytes (uchar j)

{

? uchar i;

? for(i=0;i? {

??? *p = ReadByte();

??? p++;

? }

}

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

*Function:CRC校验

*parameter:

*Return:

*Modify:

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

uchar CRC (uchar j)

{

?? ?uchar i,crc_data=0;

? ?for(i=0;i??? ?crc_data = CrcTable[crc_data^temp_buff[i]];

??? return (crc_data);

}

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

*Function:读取温度

*parameter:

*Return:

*Modify:

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

void GemTemp (void)

{

?? read_bytes (9);

?? if (CRC(9)==0) //校验正确

?? {

???? Temperature = temp_buff[1]*0x100 + temp_buff[0];

//???? Temperature *= 0.625;

??Temperature /= 16;

??TempDelay(1);

??? }

}

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

*Function:内部配置

*parameter:

*Return:

*Modify:

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

void Config18b20 (void)? //重新配置报警限定值和分辨率

{

???? Init18b20();

???? WriteByte(0xcc);? //skip rom

???? WriteByte(0x4e);? //write scratchpad

???? WriteByte(0x19);? //上限

???? WriteByte(0x1a);? //下限

???? WriteByte(0x7f);???? //set 11 bit (0.125)

???? Init18b20();

???? WriteByte(0xcc);? //skip rom

???? WriteByte(0x48);? //保存设定值

???? Init18b20();

???? WriteByte(0xcc);? //skip rom

???? WriteByte(0xb8);? //回调设定值

}

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

*Function:读18B20ID

*parameter:

*Return:

*Modify:

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

void ReadID (void)//读取器件 id

{

?Init18b20();

?WriteByte(0x33);? //read rom

?read_bytes(8);

}

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

*Function:18B20ID全处理

*parameter:

*Return:

*Modify:

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

void TemperatuerResult(void)

{

? ?p = id_buff;

? ?ReadID();

? ?Config18b20();

?Init18b20 ();

?WriteByte(0xcc);?? //skip rom

?WriteByte(0x44);?? //Temperature convert

?Init18b20 ();

?WriteByte(0xcc);?? //skip rom

?WriteByte(0xbe);?? //read Temperature

?p = temp_buff;

?GemTemp();

}

?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值