📄 18b20di.c
字号:
#include <reg51.H>
#include <INTRINS.h>
unsigned char timecount;
unsigned char readdata[2];
sbit RE_DE=P1^0; //485使能控制端
sbit DQ=P1^2;
bit sflag; //负号显示
bit resetpulse(void) //复位函数
{
unsigned char i;
DQ=0;
for(i=255;i>0;i--);
DQ=1;
for(i=60;i>0;i--);
return(DQ); //判断复位是否成功,DQ为1,说明复位成功,否则,复位失败
for(i=200;i>0;i--);
}
//18B20写函数//
void writecommandtods18b20(unsigned char command) //按位写函数
{
unsigned char i;
unsigned char j;
for(i=0;i<8;i++) //将一个字节八位命令分八次写入18B20
{
if((command & 0x01)==0) //写0时序
{
DQ=0;
for(j=35;j>0;j--);
DQ=1;
}
else
{
DQ=0; //写1时序
for(j=2;j>0;j--);
DQ=1;
for(j=33;j>0;j--);
}
command=_cror_(command,1); //右移命令,共移八次
}
}
//18B20读函数//
unsigned char readdatafromds18b20(void) //按位读函数
{
unsigned char i;
unsigned char j;
unsigned char temp;
temp=0;
for(i=0;i<8;i++)
{
temp=_cror_(temp,1); //temp向右循环移位1位
DQ=0; //把温度数据传到总路线上
_nop_();
_nop_();
DQ=1;
for(j=10;j>0;j--);
if(DQ==1)
{
temp=temp | 0x80;
}
else
{
temp=temp | 0x00;
}
for(j=200;j>0;j--);
}
return(temp);
}
void main(void)
{ SCON=0x50;
TMOD=0x21; //定时器1工作方式1
TH1=0xF3;
TL1=0xF3;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
ET0=1;
ET1=1;
TR1=1;
EA=1;
RE_DE=1;
while(resetpulse()); //等待复位
writecommandtods18b20(0xcc); //允许总线控制器不用提供64位ROM编码就使用储存器操作命令(跳过读序列号的操作)
writecommandtods18b20(0x44); //启动18B20转换,结果存入内部9字节ROM(前两个为温度)
TR0=1;
while(1);
}
void t0(void) interrupt 1 using 0
{
unsigned char x;
unsigned int result;
TR0=0;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
///////////////////////////////////////////////////////////////////////
////////////下面是用来处理数据,从18B20读得数据后进行处理//////////////
///////////////////////////////////////////////////////////////////////
timecount++;
if(timecount==150) //每600MS温度值更新一次
{
timecount=0;
while(resetpulse()); //18B20复位
writecommandtods18b20(0xcc); //允许总线控制器不用提供64位ROM编码就使用储存器操作命令
writecommandtods18b20(0xbe); //读内部ROM九字节ROM内容(前两个为温度)
readdata[0]=readdatafromds18b20(); //读低八位
readdata[1]=readdatafromds18b20(); //读高八位
sflag=0;
if((readdata[1] & 0xf8)!=0x00)
{
sflag=1;
readdata[1]=~readdata[1];
readdata[0]=~readdata[0];
result=readdata[0]+1;
readdata[0]=result;
if(result>255)
{
readdata[1]++;
}
}
readdata[1]=readdata[1]<<4;
readdata[1]=readdata[1] & 0x70;
x=readdata[0];
x=x>>4;
x=x & 0x0f;
readdata[1]=readdata[1] | x;
result=readdata[1];
{SBUF=readdata[1];
while(TI==0);
TI=0;
}
while(resetpulse());
writecommandtods18b20(0xcc);
writecommandtods18b20(0x44);
}
TR0=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -