?? 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 + -