新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 温度传感器18B20的驱动程序

温度传感器18B20的驱动程序

作者:时间:2016-11-26来源:网络收藏
以下绿色文字都是18B20驱动程序的驱动程序,学习时不必每句都看懂,只需要知道每个函数的作用已利于以后调用!调用的方法在最后黑体字那里加以体会即可!

学习方法:

本文引用地址:http://www.eepw.com.cn/article/201611/321641.htm

越是看似高级、复杂的器件,都会有自己的驱动程序往往由生产厂家提供!所以在后期提高阶段要联系如何使用这些驱动函数!就像是以后学习高一级的ARM系统时,那都是有自己的库函数的,使用时改变参数而已(当然从表面来讲)!后期价已熟练即可

bitflag;
unsigned intidata Temperature;
unsigned char idata temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节
unsigned char idata id_buff[8];
unsigned char idata *p,TIM;
unsigned char idata crc_data;


unsigned char 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
};
//

void TempDelay (unsigned char idata us)
{
while(us--);
}


void Init18b20 (void)
{
D18B20=1;
_nop_();
D18B20=0;
TempDelay(80);//delay 530 uS//80
_nop_();
D18B20=1;
TempDelay(14);//delay 100 uS//14
_nop_();
_nop_();
_nop_();

if(D18B20==0)
flag = 1;//detect 1820 success!
else
flag = 0;//detect 1820 fail!
TempDelay(20);//20
_nop_();
_nop_();
D18B20 = 1;
}


void WriteByte (unsigned char idata wr)//单字节写入
{
unsigned char idata i;
for (i=0;i<8;i++)
{
D18B20 = 0;
_nop_();
D18B20=wr&0x01;
TempDelay(3);//delay 45 uS //5
_nop_();
_nop_();
D18B20=1;
wr >>= 1;
}
}


unsigned char ReadByte (void)//读取单字节
{
unsigned char idata i,u=0;
for(i=0;i<8;i++)
{
D18B20 = 0;
u >>= 1;
D18B20 = 1;
if(D18B20==1)
u |= 0x80;
TempDelay (2);
_nop_();
}
return(u);
}


void read_bytes (unsigned char idata j)
{
unsigned char idata i;
for(i=0;i{
*p = ReadByte();
p++;
}
}


unsigned char CRC (unsigned char j)
{
unsigned char idata i,crc_data=0;
for(i=0;i//查表校验
crc_data = CrcTable[crc_data^temp_buff[i]];
return (crc_data);
}


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);
}
}


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);//回调设定值
}


void ReadID (void)//读取器件 id
{
Init18b20();
WriteByte(0x33);//read rom
read_bytes(8);
}


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();
}

void GetTemp()
{
if(TIM==100) //每隔 1000ms 读取温度
{TIM=0;
TemperatuerResult();
}

}


void T1zd(void) interrupt 3
{
TH1 = 0xD8;//10
TL1 = 0xF0;
TIM++;

}
#include
#include "tem.H"
extern GetTemp();//声明引用外部函数
extern unsigned intidata Temperature;// 声明引用外部变量
void delay(unsigned int i);

//else IO
sbitLS138A=P2^2;//管脚定义
sbitLS138B=P2^3;
sbitLS138C=P2^4;


//此表为 LED 的字模, 共阴数码管 0-9-
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unsigned longLedOut[5],LedNumVal;


void system_Ini()
{
TMOD|= 0x11;
TH1 = 0xD8;//10
TL1 = 0xF0;
IE = 0x8A;
TR1= 1;

}

main()
{ unsigned char i;
system_Ini();
while(1)
{
GetTemp();


LedNumVal=Temperature;//把实际温度送到LedNumVal变量中
LedOut[0]=Disp_Tab[LedNumVal000/1000];
LedOut[1]=Disp_Tab[LedNumVal00/100];
LedOut[2]=Disp_Tab[LedNumVal0/10];//十位
LedOut[3]=Disp_Tab[LedNumVal];//个位

for(i=0; i<4; i++)
{
P0 = LedOut[i] ;

switch(i)
{//138译码
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
}

delay(100);
}

P0 = 0;

}
}

//延时程序
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}



评论


技术专区

关闭