📄 ds18b20.c
字号:
#include <intrins.h>
sbit DQ=P3^3;
bit flag_init=0;
unsigned int tens,units,decile,tmp;
float tmprt;
DS18B20_init()
{
flag_init=1; //初始化成功标志位,0为成功
DQ=1; //DQ复位
_nop_();
DQ=0; //拉低DQ
Delay_uS(52); //延时484us(此信号要求480us~960us)
DQ=1; //释放DQ
Delay_uS(5); //延时61us (在检测到 I/O 引脚上的上升沿之后DS18B20等待15us~60us并且接着发送存在脉冲60-240us的低电平信号)
flag_init=DQ;
Delay_uS(25); //延时241us(DS18B20发送存在脉冲的低电平信号60~240us)
}
unsigned char Readonechar() //读一个字节
{
unsigned char i,dat=0;
for(i=8;i;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
Delay_uS(5);//延时61us(所有读时间片的最短持续期限为60us,各个读时间片之间必须有最短为1us的恢复时间)
}
return dat;
}
Writeonechar(unsigned char dat) //写一个字节
{
unsigned char i;
for(i=8;i;i--)
{
DQ=0;
DQ=dat&0x01;
Delay_uS(5); //延时61us(在I/O线由高电平变为低电平之后DS1820在15us~60us之间对 I/O 线采样)
DQ=1;
dat>>=1;
}
}
Readtemperature()
{
tens=0;units=0;decile=0;tmp=0;
tmprt=0;
DS18B20_init();
Writeonechar(0xcc);// 跳过读序列号的操作
Writeonechar(0x44);// 启动温度转换
DS18B20_init();
Writeonechar(0xcc);//跳过读序号列号的操作
Writeonechar(0xbe);//读取温度寄存器
units=Readonechar();//读低八位
tens=Readonechar(); //读高八位
tens<<=8;
tens|=units; //高低位合并
tmprt=tens*0.0625; //计算温度值
tmp=tmprt*10+0.5; //放大10倍输出并四舍五入
tens=tmp/100; //十位
units=tmp/10%10; //个位
decile=tmp%10; //小数位
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -