📄 ds18b20.c
字号:
/***********************************************************************
;便携式温度计
;数码管引脚连接:a=P1.2 b=P1.1 c=P1.0 d=P1.3 e=P1.4 f=P1.6 g=P1.5 h=P1.7共阳;
;编写人:芦庆
;时间:2008年7月27日
;主控芯片:AT89C2051-24PU
;温度传感器:DS18B20
;占用资源:定时器0,P1口,P3.3,P3.4,P3.5
;晶振速度:6MHz
;版本:1.0
;
;ROM指令 代码
;Read ROM(读ROM) [33H]
;Match ROM(匹配ROM) [55H]
;Skip ROM(跳过ROM] [CCH]
;Search ROM(搜索ROM) [F0H]
;Alarm search(告警搜索) [ECH]
;
;存储器操作指令 代码
;Write Scratchpad(写暂存存储器) [4EH]
;Read Scratchpad(读暂存存储器) [BEH]
;Copy Scratchpad(复制暂存存储器) [48H]
;Convert Temperature(温度变换) [44H]
;Recall EPROM(重新调出) [B8H]
;Read Power supply(读电源) [B4H]
************************************************************************/
/*******************文件包含**********************/
#include <MAIN.H>
/*****************外部变量声明********************/
extern uchar flag;
extern uchar Temp[2];//原始温度数据
extern uchar DispLED[4];//数码管显示缓冲区
/*******************变量声明**********************/
uchar Temperature;
sbit dq=P3^7;//定义DS18B20数据引脚
/**************************微秒级延时*********************/
void TempDelay (uchar us)
{
while(us--);
}
/*****************18B20初始化函数***********************/
void Init18b20 ()
{
dq=1;
_nop_();
dq=0;
TempDelay(86/2); //delay 530 uS//80
_nop_();
dq=1;
TempDelay(14/2); //delay 100 uS//14
_nop_();
_nop_();
_nop_();
if(dq==0)
flag = 1; //detect 1820 success!
else
flag = 0; //detect 1820 fail!
TempDelay(20/2); //20
_nop_();
_nop_();
dq = 1;
}
/**************************向18B20写入一个字节******************/
void WriteByte (uchar wr) //单字节写入
{
uchar i;
for (i=0;i<8;i++)
{
dq = 0;
_nop_();
dq=wr&0x01;
TempDelay(5/2); //delay 45 uS //5
_nop_();
_nop_();
dq=1;
wr >>= 1;
}
}
/*************************读18B20的一个字节***********************/
uchar ReadByte() //读取单字节
{
uchar i;
uchar u=0;
for(i=0;i<8;i++)
{
dq = 0;
u >>= 1;
dq = 1;
if(dq==1)
u |= 0x80;
TempDelay (4/2);
_nop_();
}
return(u);
}
/**********************延时函数****************************/
void mDelay(uint num)
{
uint i;
for(;num>0;num--)
{ for(i=0;i<124;i++)
{;}
}
}
/********************温度转换全处理********************/
void Temperature_change(void)
{
Init18b20 ();//初始化18B20
WriteByte(0xcc); //跳过ROM
WriteByte(0x44); //启动温度转换
mDelay(50);//重要延时
Init18b20 ();
WriteByte(0xcc); //跳过ROM
WriteByte(0xbe); //读取温度
Temp[0]=ReadByte();//温度低8位
Temp[1]=ReadByte();//温度高8位
if(Temp[1]<0xF0)//温度大于0度
{
DispLED[3]=(Temp[0]&0x0F)*625/1000%10;//小数
Temperature=(Temp[0]>>4)+(Temp[1]<<4);
DispLED[2]=Temperature%10;//个位
DispLED[1]=Temperature/10;//十位
DispLED[0]=Temperature/100;//
}
else//温度小于0度
{
Temp[0]=~Temp[0]+1;
Temp[1]=~Temp[1];
DispLED[3]=(Temp[0]&0x0F)*625/1000%10;//小数
Temperature=(Temp[0]>>4)+(Temp[1]<<4);
DispLED[2]=Temperature%10;//个位
DispLED[1]=Temperature/10;//十位
DispLED[0]=Temperature/100+10;//百位+负号
}
}
void init_1820(void)
{
Init18b20 ();//初始化18B20
if(flag==0)//效验错误
{
DispLED[0]=12;//字母F
DispLED[1]=13;//字母A
DispLED[2]=14;//字母L
DispLED[3]=14;//字母L
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -