⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.txt

📁 从温度传感器DS18B20的采集信号与显示
💻 TXT
字号:
					  		 
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#define PA8255 XBYTE[0X0800]
#define PB8255 XBYTE[0X0801]
#define PK8255 XBYTE[0X0803]
sbit DQ=P1^2;

//---------------延时程序------------------
void delay(int useconds)
{
	int s;
	for (s=0; s<useconds;s++);
}
//////////////////////////////////////////////////////////////////////////////
// OW_RESET - performs a reset on the one-wire bus and
// returns the presence detect. Reset is 480us, so delay
// value is (480-24)/16 = 28.5 - we use 29. Presence checked
// another 70us later, so delay is (70-24)/16 = 2.875 - we use 3.
//
unsigned char ow_reset(void)
{
	unsigned char presence;
	DQ = 0; //pull DQ line low
	delay(29); // leave it low for 480us
	DQ = 1; // allow line to return high
	delay(3); // wait for presence
	presence = DQ; // get presence signal
	delay(25); // wait for end of timeslot
	return(presence); // presence signal returned
} // 0=presence, 1 = no part


//////////////////////////////////////////////////////////////////////////////
// READ_BIT - reads a bit from the one-wire bus. The delay
// required for a read is 15us, so the DELAY routine won't work.
// We put our own delay function in this routine in the form of a
// for() loop.
//
unsigned char read_bit(void)
{
	unsigned char i;
	DQ = 0; // pull DQ low to start timeslot
	DQ = 1; // then return high
	for (i=0; i<4; i++); // delay 15us from start of timeslot
	return(DQ); // return value of DQ line
}

//////////////////////////////////////////////////////////////////////////////
// WRITE_BIT - writes a bit to the one-wire bus, passed in bitval.
//
void write_bit(char bitval)
{
	DQ = 0; // pull DQ low to start timeslot
	if(bitval==1) DQ =1; // return DQ high if write 1
	delay(5); // hold value for remainder of timeslot
	DQ = 1;
}// Delay provides 16us per loop, plus 24us. Therefore delay(5) = 104us

//////////////////////////////////////////////////////////////////////////////
// READ_BYTE - reads a byte from the one-wire bus.
//
unsigned char read_byte(void)
{
	unsigned char i;
	unsigned char value = 0;
	for (i=0;i<8;i++)
	{
		if(read_bit()) value|=0x01<<i; // reads byte in, one byte at a time and then
		// shifts it left
		delay(6); // wait for rest of timeslot
	}
	return(value);
}

//////////////////////////////////////////////////////////////////////////////
// WRITE_BYTE - writes a byte to the one-wire bus.
//
void write_byte(char val)
{
	unsigned char i;
	unsigned char temp;
	for (i=0; i<8; i++) // writes byte, one bit at a time
	{
		temp = val>>i; // shifts val right 'i' spaces
		temp &= 0x01; // copy that bit to temp
		write_bit(temp); // write bit in temp into
	}
	delay(5);
}
//---------------读取指定ROM_id
unsigned char Read_id_temp()
{
		unsigned char temp_low,temp_high,temp;
		EA=0;
		ow_reset();
		write_byte(0xcc);
		write_byte(0x44);
		delay(5);
		ow_reset();
		write_byte(0xcc);
		write_byte(0xbe);
		temp_low=read_byte();
		temp_high=read_byte();
		temp=((temp_high*256)+temp_low)*0.0625;
		EA=1;
		return temp;
}

void display(void)
    {             unsigned char temp1,temp2,temp_id,a;
		                int i;
	    temp_id=Read_id_temp();   //读取18B20温?		temp1=temp_id%10+48;
		temp_id=temp_id/10;
		temp2=temp_id%10+48;//16进制转换成10进制温度。 
    
	for(i=25;i>0;i--)	
	{a=temp1&0x0f;
    PK8255=0x80;                    //定义8255工作方式。 
    PA8255=0x02;                    //选择位码
	switch(a)
	{
	case 0x00: PB8255=0x3f; break;
	case 0x01: PB8255=0x06; break;
	case 0x02: PB8255=0x5b; break;
	case 0x03: PB8255=0x4f; break;
	case 0x04: PB8255=0x66; break;
	case 0x05: PB8255=0x6d; break; 
	case 0x06: PB8255=0x7d; break;
	case 0x07: PB8255=0x07; break;
	case 0x08: PB8255=0x7f; break;
	case 0x09: PB8255=0x6f; break;
	}
    delay(1000);
    a=temp2&0x0f;
 
    PK8255=0x80;
	PA8255=0x01;
	switch(a)
	{
	case 0x00: PB8255=0x3f; break;
	case 0x01: PB8255=0x06; break;
	case 0x02: PB8255=0x5b; break;
	case 0x03: PB8255=0x4f; break;
	case 0x04: PB8255=0x66; break;
	case 0x05: PB8255=0x6d; break; 
	case 0x06: PB8255=0x7d; break;
	case 0x07: PB8255=0x07; break;
	case 0x08: PB8255=0x7f; break;
	case 0x09: PB8255=0x6f; break;
	}
	delay(1000);
	}
	
}

main ()
{
    	unsigned char temp_id;
		
     while(1)
	{
		display();
	 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -