资讯详情

51单片机温度传感器

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

#include <reg52.h> #include <intrins.h> #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=i0.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);

}

谢谢!

标签: 温度传感器40度

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

锐单商城 - 一站式电子元器件采购平台