📄 ds18b20.c
字号:
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P2^7;
bit present;
uchar disbuff[8];
uchar TMP[9];
uchar code table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xff,0xf6};
//----延时2us子程序----//
void delay2(uchar t)
{
while(--t);
}
//------延时50ms子程序-----//
void delay50ms(uint t)
{
uint j;
for(;t>0;t--)
{
for(j=6245;j>0;j--);
}
}
//----延时8us子程序----//
void delay8(uint t)
{
while(--t);
}
//--------18B20写1操作-----//
void write1(void)
{
DQ=1; //两次写之间DQ保持最少1us的高电平
_nop_();
DQ=0; //DQ拉低
_nop_();
_nop_();
DQ=1; //在15us之内使得DQ变为高电平
delay2(40); //延时80us
}
//--------18B20写0操作-----//
void write0(void)
{
DQ=1; //两次写之间DQ保持最少1us的高电平
_nop_();
DQ=0; //DQ拉低
delay2(40); //延时80us
}
//-----18B20读一位---------//
bit read1bit(void)
{
bit r;
DQ=1; //两次写之间DQ保持最少1us的高电平
_nop_();
DQ=0; //DQ拉低
_nop_(); //延时1us
_nop_();
DQ=1; //释放总线
delay2(2); //延时4us
r=DQ; //采样DQ的值
delay2(40); //延时80us
return r;
}
//------DS18B20复位子程序-----//
void reset_DS18B20(void)
{
uchar i;
DQ=1;
_nop_();
DQ=0;
delay2(250); //延时500us
DQ=1; //DQ拉高
delay2(20); //延时40us
for(i=0;i<80&&DQ==1;i++);
present=DQ;
delay2(220); //延时使得RX时间超过480us
}
//----------DS18B20写字节操作-----//
void write(uchar dat)
{
uchar i;
uchar j;
for(i=0;i<8;i++)
{
_nop_();
j=dat&0x01; //如果最低位为1,则进行写1操作,否则,进行写0操作
if(j)
write1();
else
write0();
dat>>=1; //dat右移一位
}
DQ=1;
}
//----------DS18B20读字节操作-----//
uchar read(void)
{
uchar i;
uchar result;
for(i=0;i<8;i++)
{
_nop_();
result>>=1; //否则result左移一位
if(read1bit())
{ //如果读得的数据为1,则将result或上01
result=result|0x80;
}
}
// DQ=1;
return result;
}
//----------读DS18B20 64bitcode操作-----//
void read64bitcode(void)
{
uchar i;
write(0x33); //发送readrom命令
for(i=0;i<8;i++) //读得的数据存进disbuff
{
disbuff[i]=read();
}
}
//----------静态显示程序-----//
void display(void)
{
uchar dis[4];
uint k=0;
uchar j;
k=(TMP[1]<<8)|TMP[0];
k=k>>4;
dis[0]=k%10;
dis[1]=(k%100)/10;
dis[2]=k/100;
dis[3]=k/1000;
for(j=0;j<4;j++)
{
SBUF=table[dis[j]];
while(TI==0);
TI=0;
}
}
//----------配置ds18b20-----//
void config(void)
{
write(0X4e); //write Scratchpad
write(0X4b); //发送TH
write(0X02); //发送TL
write(0X7F); //发送配置寄存器的值0001 1111 其中R1=R0=0
}
void main(void)
{
uchar i;
SCON=0X00;
SP=0X60;
while(1)
{
//reset_DS18B20(); //复位
// read64bitcode(); //读取64位ROM的值
//reset_DS18B20(); //复位
//write(0XCC); //skip rom
// write(0XBE); //read Scratchpad command
// for(i=0;i<9;i++)
//{
// TMP[i]=read();
//}
reset_DS18B20(); //复位
write(0XCC); //skip rom
config();
reset_DS18B20(); //复位
write(0XCC); //skip rom
write(0X48); //保存设置
delay50ms(1);
reset_DS18B20(); //复位
write(0XCC); //skip rom
write(0X44); //开始温度转换
while(read1bit()==0); //等待转换完毕
//delay50ms(40);
reset_DS18B20(); //复位
write(0XCC); //skip rom
write(0XBE); //read Scratchpad command
for(i=0;i<9;i++)
{
TMP[i]=read();
}
display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -