DS18B20-51代码

声明 :仅供参考  

单片机 :89c52      pnp三极管驱动共阳数码管      

# include 
# include 
# define uint unsigned int 
# define uchar unsigned char
uchar code table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code table2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x66,0x21,0x06,0x0e,0x0c,0x09,0x11};
sbit led0=P2^0;
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;
sbit led4=P2^4;
sbit led5=P2^5;
sbit ds=P2^6;
float ftemp;
uint temp,flag;
void delay15us(uint temp)	  //整个函数关键的部分就在这个延时函数  在ds18b20中 每一步的延时都要求比较精确  要严格依据时序来写
{
	for(temp;temp>0;temp--)
	{
		_nop_();
		_nop_();
		_nop_();
	}
	_nop_();
	_nop_();
}
void delay(uint k)	 //延时函数	   这个延时是为了数码管
{
	uint i,j;
	for(i=k;i>0;i--)
		for(j=113;j>0;j--) ;
}

bit RST()	   //复位函数
{
	bit ret=1;
 	ds=0;
	delay15us(39);
	ds=1;
	delay15us(4);
	ret=ds;  //检测是否变位成功  即ds是否为零 下面用一个led/测试一下
	//led=ds;
	delay15us(27);//这都是根据时序图上来写的
	ds=1;
    return ret ;//其实有点不明白  为什么加上这个返回值  有什么用吗
}
void writebit(bit dat_bit) //完全依据时序来写一位 的函数
{
	ds=0;
	delay15us(0);
	ds=dat_bit;
	delay15us(2);
	ds=1;	
}
void writebyte(uchar dat_byte)
{
	uint i;
	for(i=0;i<8;i++)
	{
		 writebit((dat_byte&0x01));
		 dat_byte>>=1;
	}
}
bit readbit()
{
	bit dat_bit;
	ds=0;
	_nop_();
	_nop_();
	_nop_();
	ds=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	dat_bit=ds;
	delay15us(3);
	ds=1;
	return dat_bit;
}
uchar readbyte()
{
	uchar dat_byte=0;
	uchar i,j;
	for(i=0;i<8;i++)
	{
		j= readbit();
		dat_byte=(j<<7)|(dat_byte>>1);
	}
	return dat_byte;
}
void sweap()	  //启动温度转换
{
	RST();
	_nop_();
	_nop_();
	writebyte(0xcc);
	writebyte(0x44);
}
uint get()
{
	uint a,b,t;
	RST();
	_nop_();
	_nop_();
	writebyte(0xcc);
	writebyte(0xbe);
	a=readbyte();
	b=readbyte();
	if(b&0xfc)
	{
		 temp=b;
		 temp= temp<<8;
		 temp|=a;
		 temp=((~temp)+1);
		 ftemp=temp*0.0625*100+0.5;
		 t=ftemp;
		 flag=1;
	}
	else
	{
	   	ftemp=((b*256)+a)*0.0625;
	    t=ftemp*100+0.5;
		flag=0;
	}

	return t;
}
void display(disnum)
{
	led0=0;
	P1=table1[disnum/1000];
	delay(3);
	P1=0xff;
	led0=1;	

	led1=0;
	P1=table2[disnum%1000/100];
	delay(3);
	P1=0xff;
	led1=1;

	led2=0;
	P1=table1[disnum%100/10];
	delay(3);
	P1=0xff;
	led2=1;

	led3=0;
	P1=table1[disnum%10];
	delay(3);
	P1=0xff;
	led3=1;

	led4=0;
	P1=0xc6;
	delay(1);
	led4=1;

}
void main()
{
	uint disnum;
	led5=0;
	while(1)
	{	
		sweap()	 ;
		disnum=get();
		display(disnum);
	}
}

你可能感兴趣的:(单片机外设模块)