代码拉取完成,页面将自动刷新
同步操作将从 dk鲁晓东/STC15库 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#include"18b20.h"
#ifndef uchar
#define uchar unsigned char
#endif
sbit DSDQ=P2^7; // 18B20的数据脚,根据硬件修改
void DelayX0us(uchar n)
{
while (n--)
{
// _nop_();
// _nop_();
NOP96();//11M每个差12倍,22M---24倍
NOP96();
}
}
void DSreset()
{
CY = 1;
while (CY)
{
DSDQ = 0; //送出低电平复位信号
DelayX0us(48); //延时至少480us
DSDQ = 1; //释放数据线
DelayX0us(6); //等待60us
CY = DSDQ; //检测存在脉冲
DelayX0us(42); //等待设备释放数据线
}
}
uchar readDS(void)
{
uchar i;
uchar dat = 0;
for (i=0; i<8; i++) //8位计数器
{
dat >>= 1;
DSDQ = 0; //开始时间片
// _nop_(); //延时等待
// _nop_();
NOP48();
DSDQ = 1; //准备接收
// _nop_(); //接收延时
// _nop_();
NOP48();
if (DSDQ) dat |= 0x80; //读取数据
DelayX0us(6); //等待时间片结束
}
return dat;
}
void writeDS(uchar dat)
{
char i;
for (i=0; i<8; i++) //8位计数器
{
DSDQ = 0; //开始时间片
// _nop_(); //延时等待
// _nop_();
NOP48();
dat >>= 1; //送出数据
DSDQ = CY;
DelayX0us(6); //等待时间片结束
DSDQ = 1; //恢复数据线
}
}
//启动温度测量命令 ,芯片的温度测量时间为750ms/12位,93ms/9位
void starttemptest()
{
DSreset(); //初始化
writeDS(0xcc); //跳跃ROM编码识别,单片情况下
writeDS(0x44); //温度转换命令
//delay_ms(200); //这一句要看init是如何写的,若是有while检测的可以不写,因为转换结束要读数据时前面就会有检测
}
float gettempval(void)
{
float f_temp;
unsigned char lowcdat=0,highcdat=0;
unsigned int temp;
DSreset();
writeDS(0xcc);//跳跃ROM编码识别,单片情况下
writeDS(0xbe);//发送读取命令
lowcdat=readDS();//低位
highcdat=readDS();//高位
//DSreset();
temp=highcdat*256+lowcdat;
//加入为负数时情况
if(highcdat>0x7f)//为负数
{temp=~temp+1;
f_temp=-1.0*(temp*0.0625+0.05);
}
else
f_temp=temp*0.0625+0.05;
return f_temp;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。