/*******************************************************************
**函数功能:ds18b20的驱动函数 **
**创建人:xingyuegu **
**创建日期:2006-7-12 **
**版本:1.0 **
**修改日期:2006-10-30 **
**版本:2.0 **
*******************************************************************/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void serial_set(void);
void process(unsigned char,unsigned char);
char volatile xiaoshu_temp[5],zhen_temp[4]; //
bit flag;
bit dot_dis=1;
sbit DQ=P3^5;
//sbit DQ=P2^3;
extern unsigned char temp[5];
/*************************************************************
**功能:延时600us **
**参数:无 **
*************************************************************/
void delay600us(void)
{
uchar i;
for(i=0;i<255;i++);
}
/*************************************************************
**功能:延时60us **
**参数:无 **
*************************************************************/
void delay60us(void)
{
uchar i;
for(i=0;i<20;i++);
}
/*************************************************************
**功能:延时18us **
**参数:无 **
*************************************************************/
/*void delay15us(void)
{
uchar i;
for(i=0;i<2;i++);
}*/
/*************************************************************
**功能:复位脉冲 **
**参数:bool **
*************************************************************/
bit resetpulse(void)
{
DQ=0;
delay600us(); //延时500us
DQ=1;
delay60us(); // 延时60us
return(DQ); //读取P1.0的状态
}
/*************************************************************
**功能:ds18b20的初始化 **
**参数:无 **
*************************************************************/
void ds18b20_init(void)
{
while(1)
{
if(!resetpulse()) //收到ds18b20的应答信号
{
//printf("reset successful!");
//delay240us(); //延时240us
DQ=1;
delay600us(); //延时240us
break;
}
else
resetpulse(); //否则再发复位信号
}
}
/*************************************************************
**功能:向ds18b20写命令 **
**参数:无 **
*************************************************************/
void ds18b20_writecommand(uchar command)
{
uchar i;
for(i=0;i<8;i++)
{
if((command & 0x01)==0)
{
DQ=0; //写0
delay60us(); //延时60us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
DQ=1;
_nop_();
_nop_();
}
else //写1
{
DQ=0;
_nop_();
_nop_(); //延时2us
DQ=1;
delay60us(); //延时60us
_nop_();
_nop_();
_nop_();
_nop_();
}
command=_cror_(command,1); // 右移1位
}
}
/*************************************************************
**功能:读ds18b20数据 **
**参数:返回读到的数据 **
*************************************************************/
uchar ds18b20_readdata(void)
{
uchar readdata;
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
_nop_();
_nop_();
DQ=1; //释放总线
//delay15us(); 注意不需要
if(DQ==0) //如果读到的是0
{
readdata=readdata&0x7f;
delay60us();
}
else //读到的是1
{
readdata=readdata|0x80;
delay60us();
}
if(i<7)
readdata=_cror_(readdata,1);
}
return readdata;
}
/*************************************************************
**功能:温度处理函数 **
**参数:无返回 **
*************************************************************/
void temperature_process(uchar low,uchar high)
{
uint temp1,temp2,temp3;
if(high&0x80)//判断正负
{
flag=1;
temp3=temp3|high;
temp3=temp3&0x00ff;
temp3=temp3<<8;
temp1=temp3;
temp1=temp1|low;
temp1=(temp1^0xffff);
temp1=temp1+1; //取反加1
low=temp1&0x000f;
high=temp1>>4;
process(high,low);
}
else
{
flag=0; //zhen
temp1=high;
temp2=low;
temp1=temp1<<4;
temp2=temp2>>4;
temp3=temp1|temp2;
high=temp3;
low=low&0x0f;
process(high,low);
}
}
/*************************************************************
**功能:数值处理函数 **
**参数:无返回 **
*************************************************************/
void process(unsigned char high,unsigned char low)
{
uint temp1;
uchar i;
temp1=low*625;
xiaoshu_temp[0]=temp1/1000+'0';
//xiaoshu_temp[1]=temp1/100%10+'0';
//xiaoshu_temp[2]=temp1%100/10+'0';
//xiaoshu_temp[3]=temp1%10+'0';
xiaoshu_temp[1]='\0';
dot_dis=1;
//if(xiaoshu_temp[3]=='0')
//{
// xiaoshu_temp[3]='\0';
// if(xiaoshu_temp[2]=='0')
// {
// xiaoshu_temp[2]='\0';
// if(xiaoshu_temp[1]=='0')
// {
// xiaoshu_temp[1]='\0';
if(xiaoshu_temp[0]=='0')
{
xiaoshu_temp[0]='\0';
dot_dis=0;
}
else
dot_dis=1;
// }
// }
// }
zhen_temp[0]=high/100+'0';
zhen_temp[1]=high%100/10+'0';
zhen_temp[2]=high%10+'0';
zhen_temp[3]='\0';
for(i=0;i<2;i++)
if(zhen_temp[0]=='0')
{
zhen_temp[0]=zhen_temp[1];
zhen_temp[1]=zhen_temp[2];
zhen_temp[2]='\0';
}
else
break;
}
/****************************************/
//serial_set func
void serial_set(void)
{
SCON=0x50;
TMOD=TMOD&0x0f;
TMOD=TMOD|0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
TI=1; //用PRINTF时,TI要置1
}
/*************************************************************
**功能:序列号匹配子程序 **
**参数:无返回 **
*************************************************************/
bit match_rom(uchar *rom)
{
uchar i;
ds18b20_init();
ds18b20_writecommand(0x55);
for(i=8;i>0;i--)
{
ds18b20_writecommand(*(rom+i-1));
// rom++;
}
return 1;
}
单总线挂载多个18B20驱动代码
5星 · 超过95%的资源 需积分: 50 159 浏览量
2009-10-05
15:38:21
上传
评论 1
收藏 388KB RAR 举报
lovecsy001
- 粉丝: 1
- 资源: 13
最新资源
- 2002-2019年地级市城镇人均可支配收入面板数据
- 1990-2019操控性与非操控性应计利润指标数据
- 2009-2020各省单位地区生产总值能耗(等价值)(吨标准煤万元)
- 2000-2020年各省城镇登记失业率面板数据
- Python实现B站视频采集源代码
- 2010-2019分省电力消费量及在能源消费中的占比数据
- 超级好看的AI绘画小程序官网 html源码
- 1989-2020年全国以及各地区人口平均受教育年限
- 本工具是一款小巧自定义功能强大的PECMD/7zSFX单文件制作工具,简化单文件制作程序步骤,默认四步即可制作出一个单文件
- 2006-2019 地级市能源消耗量、煤炭占比、二氧化碳排放量
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页