加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
18b20.c 2.39 KB
一键复制 编辑 原始数据 按行查看 历史
dk鲁晓东 提交于 2019-12-20 13:13 . 18B20温度驱动
#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;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化