⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 DS18B20+LED数字温度计 数字温度计 数字温度
💻 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 + -