www.pudn.com > LED-dianzheng.zip > ds18b20.h, change:2012-11-18,size:1778b


/**********************操作DS18B20模块***************************/ 
sbit DQ=P1^3; 
#define uchar unsigned char 
#define uint unsigned int 
unsigned char TP,TP1,TP2; 
void delay(uint t) 
{ 
	while(t--); 
} 
void Init_DS18B20() 
{ 
	unsigned char x=0; 
	DQ=1; 
	delay(8); 
	DQ=0; 
	delay(80); 
	DQ=1; 
	delay(14); 
	x=DQ; 
	delay(20); 
} 
Read(void) 
{ 
	unsigned char i=0; 
	unsigned char dat=0; 
	for(i=8;i>0;i--) 
	{ 
		DQ=0; 
		dat=dat>>1; 
		DQ=1; 
		if(DQ==1) 
		{ 
			dat=dat|0x80; 
		} 
		delay(4); 
	} 
	return dat; 
} 
void Write(unsigned char dat) 
{ 
	uchar i=0; 
	for(i=8;i>0;i--) 
	{ 
		DQ=0; 
		DQ=dat&0x01; 
		delay(5); 
 
		DQ=1; 
		dat=dat>>1; 
	} 
	delay(4); 
} 
Read_temperature() 
{ 
	uchar a=0; 
	uchar b=0; 
	uchar t=0; 
	Init_DS18B20(); 
	Write(0xcc); 
	Write(0x44); 
	Init_DS18B20(); 
	Write(0xcc); 
	Write(0xbe); 
	a=Read(); 
	b=Read(); 
	t=(b<<4)|(a>>4); 
	return t; 
} 
 
 /*******************温度主函数********************/ 
  
void displaytemperature() 
{ 
	TP=Read_temperature(); 
	TP1=TP/10; 
	TP2=TP%10;		 
	AB=0; 
	for(a0=0;a0<16;a0++)//扫描第一块16*16点阵的前8行 
	{ 
		SCK=0;	//164为行移位做准备 
		WriteByte(led[11][a0]);  //前8列的编码 
		WriteByte(led[TP2][a0]);//后8列的编码 
		WriteByte(led[TP1][a0]);  //前8列的编码 
		WriteByte(led[10][a0]);//后8列的编码 
		WriteByte(wen[2*a0+1]);  //前8列的编码 
		WriteByte(wen[2*a0]);//后8列的编码 
		WriteByte(qi[2*a0+1]);  //前8列的编码 
		WriteByte(qi[2*a0]);//后8列的编码 
		P2|=0X24;	//此句可以用以下两句来理解,如果不将两句合为一句,将出现拖影现像 
		ST_CP=0; 
		AB=1;//行数据位只在第d行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始只要SCK为高电平跳变沿则一直移位到最后一位, 
            //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱		 
	} 
	 
}