发表于:2008-10-31 19:33:31
楼主
#include <REG52.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P2^0; //引脚定义
extern uchar TT_Ok;
uchar TT_Ok;
uchar out【4】; //输出数据存储地址
void delay(unsigned char useconds) //要用到的延时程序
{
for(;useconds>0;useconds--);
}
unsigned char _18b20_init(void) //初始化
{
unsigned char presence;
EA=0;
DQ = 0; //拉低总线
delay(29); // 保持 480us
DQ = 1; // 释放总线
delay(3); // 等待回复
presence = DQ; // 读取信号
delay(25); // 等待结束信号
return(presence); // 返回 0:正常 1:不存在
}
//从 1-wire 总线上读取一个字节
unsigned char _18b20_read(void)
{
unsigned char i;
unsigned char value = 0;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0;
_nop_();
_nop_();
_nop_();
DQ = 1;
delay(1);
if(DQ)value|=0x80;
delay(6);
}
return(value);
}
//向 1-WIRE 总线上写一个字节
void _18b20_write(char val)
{
unsigned char i;
EA=0;
for (i=8; i>0; i--) // 一次写一位
{
DQ = 0; //
_nop_();
_nop_();
_nop_();
DQ = val&0x01;
delay(5); //
DQ = 1;
val=val/2;
}
delay(5);
}
//读取和显示温度
void Read_Temperature(unsigned char *p)
{
unsigned char i;
unsigned char x;
unsigned char th,tl;
unsigned char tll,tlh;
unsigned char code temp【16】={0,1,1,2,3,3,4,4,5,6,6,7,7,8,8,9}
TT_Ok=0; //温度读取开始
for(i=0;i<10;i++);
_18b20_init();
for(i=0;i<10;i++);
_18b20_write(0xCC); // Skip ROM
_18b20_write(0x44); // 转换温度
for(i=0;i<254;i++);
_18b20_init();
for(i=0;i<10;i++);
_18b20_write(0xCC); //Skip ROM
_18b20_write(0xbe); // 读取寄存器
tl=_18b20_read();//读出温度低8位
th=_18b20_read();//读出温度高8位
tlh=tl&0xf0;
tll=tl&0x0f;
tlh >>= 4;
out【3】=temp【tll】+‘0‘;//显示十分位
out【2】=‘.‘; //显示小数点
x=((th&0x07)<<4)+tlh;
out【0】=x/10+‘0‘;//显示温度十位数
out【1】=x%10+‘0‘;//显示温度个位数
TT_Ok=1; //温度读取完毕
EA=1;
}