嵌入式单片机基础篇(四十二)之单总线协议-DS18B20原理与stm32F1以及51单片机程序

单总线协议-DS18B20原理与stm32F1以及51单片机程序

一、DS18B20技术性能特征

①、 独特的单总线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。大大提高了系统的抗干扰性。
② 、测温范围 -55℃~+125℃,精度为±0.5℃。
③、支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
④、 工作电源: 3.0~5.5V/DC (可以数据线寄生电源)。
⑤ 、在使用中不需要任何外围元件。
⑥、 测量结果以9~12位数字量方式串行传送。

二、DS18B20特点:

(1)DS18B20共有6种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1。所有这些信号,除了应答脉冲以外,都由主机发出同步信号。并且发送所有的命令和数据都是字节的低位在前。
(2)单总线是一种半双工通信方式

三、DS18B20的典型温度读取过程:

DS18B20的典型温度读取过程为:复位>>发SKIP ROM命令(0XCC)>>发开始转换命令(0X44)>>延时>>复位>>发送SKIP ROM命令(0XCC)>>发读存储器命令(0XBE)>>连续读出两个字节数据(即温度)>>结束。
1、如果总线上只有一个ds18b20,那么初始化时可以跳过ROM(CCH)
2、如果总线上只有多个ds18b20,那么初始化时需要搜索ROM(FOH)、读ROM(33H)读出64位序列号、发送匹配ROM指令(55H)以及64位序列号

四、原理与程序:

1、51单片机原理与程序:
(1)复位脉冲函数:

sbit DQ=P1^7;
unsigned char time;   //设置全局变量,专门用于严格延时
/*****************************************************
函数功能:将DS18B20传感器初始化,读取应答信号
出口参数:flag 
原理:主机将数据线DQ拉成低电平保持480us-960us后释放总线,等待15-60us后,在60us-240us内检测总线是否为
 低电平,如果为低电平说明ds18b20器件功能正常
***************************************************/
bit Init_DS18B20(void)	
{
   
 bit flag;         //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
 DQ = 1;           //先将数据线拉高
 for(time=0;time<2;time++); //略微延时约6微秒
 DQ = 0;           //再将数据线从高拉低,要求保持480~960us
 for(time=0;time<200;time++);  //略微延时约600微秒        //以向DS18B20发出一持续480~960us的低电平复位脉冲 
 DQ = 1;           //释放数据线(将数据线拉高) 
  for(time=0;time<10;time++);  //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
 flag=DQ;          //让单片机检测是否输出了存在脉冲(DQ=0表示存在)      
 for(time=0;time<200;time++); //延时足够长时间,等待存在脉冲输出完毕
     
 return (flag);    //返回检测成功标志
}

(2)写单字节函数:

/*****************************************************
函数功能:向DS18B20写入一个字节数据
入口参数:dat
原理:
(1)主机读0时序:主机先把总线拉低大于1us,如果主机发送0,主机会把总线继续拉低至少60us直至写周期结束,然后释放总线为高电平
(2)主机读1时序:主机先把总线拉低大于1us,然后释放总线直至写周期结束
(3)作为从机的ds18b20在检测到总线被拉低后(写周期开始),等待15us,在15-45us内对总线采样
(4)数据传输:多字节低字节在前,高字节在后,一字节的低位在前,高位在后
***************************************************/  
void WriteOneChar(unsigned char dat)
{
   
	unsigned char i=0;
	for (i=0; i<8; i++)
		 {
   
		  DQ =1;         // 先将数据线拉高
		  _nop_();	     //等待一个机器周期	 
		  DQ=0;          //将数据线从高拉低时即启动写时序       
		  DQ=dat&0x01;   //利用与运算取出要写的某位二进制数据,
                       //并将其送到数据线上等待DS18B20采样	
		 for(time=0;time<10;time++)	
		     ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
		  DQ=1;          //释放数据线		    
		  for(time=0;time<1;time++)
			  ;//延时3us,两个写时序间至少需要1us的恢复期
		  dat>>=1;       //将dat中的各二进制位数据右移1位
		 }
	  for(time=0;time<4;time++)
	              ; //稍作延时,给硬件一点反应时间
}

(3)读单字节函数:

/*****************************************************
函数功能:从DS18B20读取一个字节数据
出口参数:dat
原理:
(1)主机读0时序:主机先把总线拉低大于1us,然后释放总线,如果ds18b20发送0,ds18b20会把总线拉低15us,然后释放总线为高电平
(2)主机读1时序:主机先把总线拉低大于1us,然后释放总线,如果ds18b20发送1,则在主机释放总线后不拉低总线,也就是为高电平
(3)主机需在读周期开始(主机先把总线拉低大于1us,然后释放总线)后的15us内检测总线电平的高低。
***************************************************/ 
unsigned char ReadOneChar(void)
 {
   
		unsigned char i=0;	
		unsigned char dat;  //储存读出的一个字节数据
		for (i=0;i<8;i++)
		 {
   
		   
		   DQ =1;       // 先将数据线拉高
		   _nop_();	    //等待一个机器周期	 
		   DQ = 0;      //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
		   _nop_();     //等待一个机器周期		
		   _nop_();     //等待一个机器周期		   
		   DQ = 1;     //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
		   for(time=0;time<2;time++);      //延时约6us,使主机在15us内采样
			 	dat>>=1;
		   if(DQ==1)
		      dat|=0x80;  //如果读到的数据是1,则将1存入dat
		   for(time=0;time<1;time++);//延时3us,两个读时序之间必须有大于1us的恢复期	
	    }	                    
	 return(dat);    //返回读出的十进制数据
}

(4)DS18B20温度转换函数:

/*****************************************************
函数功能:做好读温度的准备
***************************************************/ 
void ReadyReadTemp(void)
{
   
      Init_DS18B20();     //将DS18B20初始化
		WriteOneChar(0xCC); // 跳过读序号列号的操作
		WriteOneChar(0x44); // 启动温度转换	  
	   for(time=0;time<100;time++);	 //温度转换需要一点时间
		Init_DS18B20();     //将DS18B20初始化
		WriteOneChar(0xCC); //跳过读序号列号的操作
		WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位	
}

转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0, 这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际 温度。 例如+125℃的数字输出为07D0H,,-25.0625℃的数字输出为FE6FH。

(5)主机温度转换函数:

 while(1)                //不断检测并显示温度
	 {
   	
		ReadyReadTemp();     //读温度准备
	  TL=ReadOneChar();    //先读的是温度值低位
		TH=ReadOneChar();    //接着读的是温度值高位
		TN=TH*16+TL/16;      //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
			                  //这样得出的是温度的整数部分,小数部分被丢弃了
	   TD=(TL%16)*10/16;    //计算温度的小数部分,将余数乘以10再除以16取整,
			                  //这样得到的是温度小数部分的第一位数字(保留1位小数)
	   display_temp1(TN);    //显示温度的整数部分
	   display_temp2(TD);    //显示温度的小数部分
      delaynms(10);               
    }	

2、51单片机完整程序:

#include<reg51.h>    //包含单片机寄存器的头文件
#include<intrins.h>  //包含_nop_()函数定义的头文件
unsigned char code digit[10]={
   "0123456789"};     //定义字符数组显示数字
unsigned char code Str[]={
   "Test by DS18B20"};    //说明显示的是温度
unsigned char code Error[]={
   "Error!Check!"};     //说明没有检测到DS18B20
unsigned char code Temp[]={
   "Temp:"};             //说明显示的是温度
unsigned char code Cent[]={
   "Cent"};              //温度单位
/*******************************************************************************
以下是对液晶模块的操作程序
*******************************************************************************/
sbit RS=P2^0;           //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1;           //读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2;            //使能信号位,将E位定义为P2.2引脚
sbit BF=P0^7;           //忙碌标志位,,将BF位定义为P0.7引脚
/*****************************************************
函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
void delay1ms()
{
   
   unsigned char i,j;	
	 for(i=0;i<10;i++)
	  for(j=0;j<33;j++)
	   ;		 
 }
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
 void delaynms(unsigned char n)
 {
   
   unsigned char i;
	for(i
  • 10
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
单总线是一种串行通信协议,它只需要一条数据线即可实现通信,这种协议非常适合与温度传感器等低速设备进行通信。 DS18B20温度传感器是一种具有数字温度传感器,它采用单总线接口,可以直接与STM32F103C8T6单片机进行通信。 下面是STM32F103C8T6单总线DS18B20温度传感器通讯的基本原理: 1. 初始化 在通信开始前,需要先初始化DS18B20温度传感器,初始化的具体步骤如下: a. 将总线拉低,保持至少480us以上,用于复位DS18B20。 b. 将总线拉高,等待15-60us,用于DS18B20发出存在脉冲。 c. 读取总线电平,判断DS18B20是否存在,如果存在,则通讯可以开始。 2. 发送指令 在DS18B20STM32F103C8T6单片机建立通信后,STM32F103C8T6单片机需要向DS18B20发送指令,以获取温度数据。 发送指令的具体步骤如下: a. 将总线拉低,保持至少1us。 b. 发送指令字节,指令字节由3位地址码和5位功能码组成。 c. 等待DS18B20的响应,DS18B20会发送一个存在脉冲,然后发送应答信号。 3. 读取温度数据 在DS18B20接收到指令并响应后,STM32F103C8T6单片机就可以读取温度数据了。 读取温度数据的具体步骤如下: a. 将总线拉低,保持至少1us。 b. 发送读取温度指令字节。 c. DS18B20发送温度数据,STM32F103C8T6单片机接收并处理温度数据。 以上是STM32F103C8T6单总线DS18B20温度传感器通讯的基本原理。在实际应用中,还需要根据具体的需求进行相应的配置和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值