锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

51单片机温度传感器

时间:2022-11-08 16:00:00 温度传感器40度

51单片机总结—— DS18B20数字温度传感器

单总线时序及注意事项:
单总线信号类型:复位脉冲、存在脉冲、写0、写1、读0、读1。所有这些信号由脉冲除以存在DS18B总线控制器发出20发出的其他信号。
数据传输总是从最低有效率开始
电路连接图

执行序列
访问单线总线端口DS18B协议如下:
步骤1. 初始化
步骤2. ROM操作指令
步骤3. DS18B20功能指令
温度转换命令
读取暂存器命令

电路连接图
在这里插入图片描述
使用程序:

**

程序内容:

初始化时序
初始化时序包含复位DS18B20和接收DS18B20返回的存在信号。
主机和DS18B在进行任何通信之前,都需要对其进行初始化。在初始化期间,总线控制器降低总线,保持480us上述挂在总线上的设备将被复位,然后释放总线,直到15-60us,此时18B20将返回一个60-240 us低电平之间有信号。
脉冲复位脉冲和存在脉冲时序图

程序中使用:

写时序:
写时序分为0时序和1时序。
总线控制器控制单总线高低电平的持续时间DS18B20中。
为了产生写时序,总线控制器必须将总线拉低至少1us,写0时序时,总线必须保持低电平60~120us之间,然后释放总线,在总线产生写时序后产生写时序15us允许在内部拉高总线。注:两个写作周期之间的间隔至少为1us。

使用程序:

读时序:
读时序分为读0时序和读1时序。
通过读取总线控制器DS18B20控制总线高低电平接收DS18B20数据。
为了产生读时序,总线控制器必须至少拉低总线1us,然后在读取信号开始后释放总线15us内总线控制器采样总线数据,读取至少60个数据us以上注意阅读周期之间至少有1个间隔us。

使用程序:

配置主函数内容
DS18B20暂存器


配置寄存器图表

DS18B20功能指令:
温度转换指令(44h)
该命令用于启动温度转换。执行温度转换指令,导致温度转换结果数
以两个字节的形式存储在高速暂存器中,然后DS18B保持等待状态。
读暂存器指令(BEh)
这个命令读取了暂存器的内容。读取将从字节0开始 一开始,一直持续下去,直到读完暂存
如果不想读完所有字节,控制器可以随时发出复位命令停止
读取。
写暂存器指令(4)Eh)
这条命令向DS18B20 将数据写入临时存储器,开始位置TH 寄存器(暂存器第2
字节),然后写入TL 寄存器(暂存器第3 个字节),最后写入配置寄存器
(暂存器第四 个字节)
复制临存器指令(48)h)
这条命令把TH,TL 配置寄存器(2、3、4) 字节)的内容拷贝到EEPROM 中。

使用程序(用于主函数):

程序实现:
#include
#include
#define MAIN_Fosc 11059200UL //宏定义主时钟HZ
//自定义类型名
typedef unsigned char INT8U;
typedef unsigned char uchar;

typedef unsigned int INT16U;
typedef unsigned int uint;

///硬件接口位声明
sbit DS = P2^2; //DS18B20单总线
sbit du = P2^6; ///数码管段选择
sbit we = P2^7; ///数码管位选择

void Display(INT16U Value);

///共阴极数码管段选码
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; ///不带小数点0-9
///数码管位选码
uchar code T_COM[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};第一,2,3,4,5,6,7

void Delay_Ms(INT16U ms) //毫秒延迟
{
INT16U i;
do{
i=MAIN_Fosc/96000;
while(–i); //96T per loop
} while(–ms);
}
//us延迟函数,执行一次us–需要6.5us,进入一次函数需要11.95us
void Delay_us(uchar us)
{
while(us–);
}

/单总线初始化时序/
bit ds_init()
{
bit i;///声明变量存储(返回信号值)
DS = 1.//总线位于高电平
nop()//空指令延迟?
DS = 0.///拉低总线480us以上
Delay_us(75); //499.45us,18挂在总线上B20将全部复位
DS = 1;///释放总线
Delay_us(4);//15~60us,延时37.95us,等待18B20发回存在信号
i = DS;//(0 or 1)
Delay_us(20);//60~240us, 141.95us
DS = 1;///释放单总线
nop()
return (i);//若1=0,则DS1802存在于总线,准备好了,可以操作
}
/写字节,写时序/
void write_byte(uchar dat)////将要写的数据赋予形参dat,然后传递(一个字节,循环八次)
{
uchar i;
for(i=0;i<8;i )
{
DS = 0; ///拉低总线
nop()///小延迟产生写时序
DS = dat & 0x01;///数据传输总是从最低有效位开始,这里从最低数据开始(eg:00000001&00000001=00000001 00000000&00000001=00000000)
Delay_us(10)//写0时序,低电平保持60~120us,写1时序,60us以上,这里延迟76.95us,同时满足0和1
DS = 1;///释放总线,准备下次写入数据
nop(); //延迟大于1us即可
dat >>= 1.//写入第一个数据后,dat右移一个(为什么这里右移,明白了,让第二个,三个。。。移到一个和1。&)
}
}
/读一个字节/
uchar read_byte()
{
uchar i,j,dat;//循环变量,存储每读一位时用到的变量,存储一个字节的变量
for(i=0;i<8;i++)
{
DS = 0;//拉低单总线
nop();//小延时,此处要求1us,产生读时序
DS = 1;
nop();//释放总线
j=DS;//用j获取DS上的值
Delay_us(10);//76.95us,此处要求60us以上
DS = 1;
nop();//释放总线,又把总线交给从机DS180控制,方便下一次数据的读取
dat = (j<<7)|(dat>>1);//j左移七位,就将字节的最低位,移到了最高位,与上dat右移一位,把j的最高位写入dat最高位,依次
}
return (dat);//读字节

}

void main()
{
uint i; //温度两个字节
uchar L,M;//存取温度的低字节和高字节
while(1)
{
ds_init();//初始化DS18B20
write_byte(0xcc);//发送跳跃ROM指令
write_byte(0x44);//发送温度转换指令
ds_init();//初始化DS18B20
write_byte(0xcc);//发送跳跃ROM指令
write_byte(0xbe);//读取DS18B20暂存器值
L = read_byte();//读第一个字节
M = read_byte();//读第二个字节,只读两个字节是因为只需要知道温度值
/若为负温度时
M=0xfc;
L=0x90;
i=M;
i<<=8;
i|=L;
if(M>=0x08) //判断是否为负数
{
i=~i+1; //负数是以补码的形式存放的需要我们需要取反加一
s=0x40; //显示负数符号
}
else s=0;//为正数则不显示
temp=i
0.062510000;//浮点型数据转换
Display(temp);
/

	i = M;
	i<<=8;//左移八位,将M放到i的高八位
	i |=L;//把L写入i的低八位
	i = i * 0.0625 * 10 + 0.5;//将二进制换算成实际温度,10是为了保留小数点后一位,到时候在数码管上手动加小数点,0.5是为了四舍五入
	Display(i);
}

}
void Display(INT16U Value) //由于需要显示的数大于一个字节,所有形参需为int
{
du=0;//关闭段选
P0=table[Value/100]; //数码管显示百位
du=1; //打开段选
du=0; //关闭段选

we=0;	 //关闭位选
P0=T_COM[0];		   //选择第一位数码管
we=1;  //打开位选
Delay_Ms(3);



du=0;//关闭段选
P0=table[Value%100/10]|0x80; //数码管显示十位
du=1;	//打开段选
du=0;	//关闭段选

we=0;	 //关闭位选
P0=T_COM[1];		   //选择第二位数码管
we=1;  //打开位选
Delay_Ms(3);



du=0;//关闭段选
P0=table[Value%10]; //数码管显示个位
du=1;	//打开段选
du=0;	//关闭段选

we=0;	 //关闭位选
P0=T_COM[2];		   //选择第三位数码管
we=1;  //打开位选
Delay_Ms(3);

}

附表

谢谢!

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章