ds18b20详解与程序

合集下载

DS18B20单片机数码管显示原理图和程序

DS18B20单片机数码管显示原理图和程序

最近天气热了,想要是做个能显示温度的小设备就好了,于是想到DIY个电子温度计,网上找了很多资料,结合自己的材料,设计了这个用单片机控制的实时电子温度计。

作为单片机小虾的我做这个用了2天时间,当然是下班后,做工不行见谅了。

主要元件用到了单片机STC89C54RD+,DB18B20温度传感器,4为共阳数码管,PNPS8550三极管等。

先上原理图:洞洞板布局图:然后就是实物图了:附上源程序:程序是别人写的,我只是自己修改了下,先谢谢原程序者的无私奉献。

#include"reg52.h"#define uchar unsigned char#define uint unsigned intsbit DQ=P3^4; //温度数据口sbit wx1=P2^0; //位选1sbit wx2=P2^1; //位选2sbit wx3=P2^2; //位选3sbit wx4=P2^3; //位选4unsigned int temp, temp1,temp2, xs;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99, //共阳数码管0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6};/******延时程序*******/void delay1(unsigned int m){unsigned int i,j;for(i=m;i>0;i--)for(j=110;j>0;j--);}void delay(unsigned int m) //温度延时程序{while(m--);}void Init_DS18B20(){unsigned char x=0;DQ = 1; //DQ复位ds18b20通信端口delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于480usDQ = 1; //拉高总线delay(4);x=DQ; //稍做延时后如果x=0那么初始化成功x=1那么初始化失败delay(20);}/***********ds18b20读一个字节**************/uchar ReadOneChar(){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 高电平拉成低电平时读周期开始dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80; //delay(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0; //从高电平拉至低电平时,写周期的开始DQ = dat&0x01; //数据的最低位先写入delay(5); //60us到120us延时DQ = 1;dat>>=1; //从最低位到最高位传入}}/**************读取ds18b20当前温度************/void ReadTemperature(){unsigned char a=0;unsigned b=0;unsigned t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作/WriteOneChar(0x44); // 启动温度转换delay(5); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度存放器等〔共可读9个存放器〕前两个就是温度/ delay(5);a=ReadOneChar(); //读取温度值低位/b=ReadOneChar(); //读取温度值高位/temp1=b<<4; //高8位中后三位数的值temp1+=(a&0xf0)>>4; //低8位中的高4位值加上高8位中后三位数的值temp1室温整数值temp2=a&0x0f; //小数的值temp=((b*256+a)>>4); //当前采集温度值除16得实际温度值zhenshuxs=temp2*0.0625*10; //小数位,假设为0.5那么算为5来显示xs小数xiaoshu }void wenduxianshi(){wx1=0;P0=table[temp/10]; //显示百位delay1(5);wx1=1;wx2=0;P0=table[temp%10]+0x80; //显示十位加上0x80就显示小数点了。

JD412 DS18B20温度检测控制(带完整程序)

JD412  DS18B20温度检测控制(带完整程序)

DS18B20温度检测控制摘要温度是一个很重要的物理量,在现代工农业生产中,对它的测量与控制有十分重要的意义。

本论文从简单实用方面介绍了由DS18B20单总线数字式温度传感器与AT89S52单片机构成温度检测控制系统。

论文从五个方面介绍了这一设计:绪论部分简单介绍了课题背景及现状,并提出预期目标;第二部分对DS18B20、AT89S52、74LS244的硬件资源、功能等作了较详细的介绍;第三部分介绍了主要硬件电路的设计,包括测量电路、显示电路和电源电路;第四部分介绍软件设计。

程序采用C语言在Keil软件环境下编写、调试,并用计算机并口下载到单片机;第五部分主要对设计进行调试实验,并对实验结果作总结并指出不足。

关键词:单总线单片机 AT89S52 DS18B20iAbstractTemperature is an important physical parameter and the measurement and control it is of great significance. This article introduced a simple and practical temperature examination control system by the DS18B20 1-wrie digital temperature sensor and AT89S52 single-chip computer. The article introduced this design from five aspects: The introduction part simply introduced the topic background and the present situation, and set the anticipated target;the second part introduced function and technique data of the AT89S52, DS18B20、74LS244; The third part introduced the design of main hardware circuit's, including metering circuit, display circuit and power circuit; part four introduced the design of software . Use the C program language which writes and debugs at Keil software environment ,and download to the single-chip computer by combine of computer; The fifth part mainly to designs carries on the debugging experiment, and does to the experimental result summarizes and points out the insufficiency.Key Words:1-wire single-chip computer AT89S52 DS18B20ii目录摘要 (i)Abstract (ii)目录 (iii)一绪论........................................................ - 1 -1. 1 课题背景.............................................. - 1 -1. 2温度采集技术现状....................................... - 1 -1. 3预期目标............................................... - 2 - 二器件介绍.................................................... - 3 - 2.1 DS18B20介绍........................................... - 3 - 2.1.1 测温原理........................................ - 3 - 2.1.2 数据处理........................................ - 4 - 2.1.3 多路测量........................................ - 7 - 2.2 单片机AT89S52介绍..................................... - 8 - 2.2.1 内部结构、资源.................................. - 8 - 2.2.2 引脚介绍........................................ - 9 - 2.2.3 机器周期和指令周期............................. - 11 - 2.2.4 最小系统....................................... - 12 - 2.3 74LS244介绍.......................................... - 12 - 三硬件设计................................................... - 13 - 3.1 总体设计.............................................. - 13 -iii3.2 测量电路.............................................. - 14 - 3.3 显示电路.............................................. - 14 - 3.4 电源电路设计.......................................... - 15 - 四软件设计................................................... - 16 - 4.1 总体程序设计.......................................... - 16 - 4.2主要子程序............................................ - 18 - 4.2.1 初始化......................................... - 18 - 4.2.2 写时间隙....................................... - 19 - 4.2.3 读时间隙....................................... - 20 - 4.2.4 多片传感器数据读取............................. - 21 - 五总结.............................................................................................错误!未定义书签。

DS18B20温度传感器程序及仿真

DS18B20温度传感器程序及仿真

DS18B20温度传感器程序及仿真程序#include#define uchar unsigned char#define uint unsigned int#define PORT (P2)sbit rs=P3^0;sbit en=P3^2;sbit ds=P3^3;sbit b=P3^4;uchar dat1,dat2,rw;uchar presence;void delay(uint z) //1ms延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void ds18b20_rest() //ds18b20复位,初始化函数{uchar count;uint i=2200;ds=0;for(count=240;count>0;count--); //延时480usds=1;while(ds&&(i>0)) i--;for(count=240;count>0;count--); //延时480us}void ds18b20_write(uchar dat) //向ds18b20写⼀个字节{uchar count;uchar i;for(i=8;i>0;i--){ds=0;for(count=1;count>0;count--);if(dat&0x01==0x01)ds=1;elseds=0;for(count=30;count>0;count--);ds=1;dat>>=1;}}uchar ds18b20_read() //从ds18b20读⼀个字节{ uchar i,count,dat;for(i=8;i>0;i--){dat>>=1;ds=0;for(count=1;count>0;count--);ds=1;for(count=1;count>0;count--);if(ds)dat|=0x80;for(count=30;count>0;count--);}return dat;}void ds18b20_change() //ds18b20获取并开始转换{ ds18b20_rest();ds18b20_write(0xcc);ds18b20_write(0x44);delay(1000);ds18b20_rest();ds18b20_write(0xcc);ds18b20_write(0xbe);dat1=ds18b20_read();dat2=ds18b20_read();}void lcd_com(uchar com) //向1602写命令{rs=0;rw=0;PORT=com;delay(1);en=1;delay(1);en=0;}void lcd_dat(uchar dat) //想1602写数据{rs=1;rw=0;PORT=dat;delay(1);en=1;delay(1);en=0;}void lcd_write(uchar c,uchar r,uchar dat) //向1602指定⾏,列,写数据{ lcd_com(0x80+0x40*c+r);lcd_dat(dat);delay(1);}void lcd_init() //1602初始化{lcd_com(0x38);lcd_com(0x0c);lcd_com(0x06);lcd_com(0x01);lcd_write(0,0,0x54);lcd_write(0,1,0x65);lcd_write(0,2,0x6d);lcd_write(0,3,0x70);lcd_write(0,4,0x65);lcd_write(0,5,0x72);lcd_write(0,6,0x61);lcd_write(0,7,0x74);lcd_write(0,8,0x75);lcd_write(0,9,0x72);lcd_write(0,10,0x65);lcd_write(0,11,0x3a);delay(1);lcd_write(1,10,0xdf);lcd_write(1,11,0x43);}void buzzer_sound(a) //蜂鸣器报警函数{if (a>=4)b=1;elseb=0;}void show() //显⽰{unsigned long int dat;uchar flag=0;if(dat2>=240){dat=(~(dat2*256+dat1)+1)*(0.0625*10); flag=1;buzzer_sound(dat%1000/100*2);}else{dat=(dat2*256+dat1)*(0.0625*10); buzzer_sound(dat%1000/100);}if(flag==1){lcd_write(1,9,0x30+dat%10); //+0x30表⽰⽤acsii显⽰lcd_write(1,8,0xa5); //⼩数点lcd_write(1,7,0x30+dat%100/10);lcd_write(1,6,0x30+dat%1000/100);lcd_write(1,5,0x30+dat/1000);lcd_write(1,4,0x2d); //负号}if(!flag){lcd_write(1,9,0x30+dat%10);lcd_write(1,8,0xa5);lcd_write(1,7,0x30+dat%100/10);lcd_write(1,6,0x30+dat%1000/100);lcd_write(1,5,0x30+dat/1000);lcd_write(1,4,0x20); //不显⽰负号}}void main(){lcd_init();while(1){ds18b20_change();// if(dat2>0x03&&dat2<240||dat2>0x01&&dat2>240) // b=0;// else b=1;show();delay(200);}}仿真。

DS18B20温度传感器程序

DS18B20温度传感器程序

DS18B20温度传感器程序#include#include#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit beep=P2^3;uint temp;float f_temp;unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void dsreset() //DS18B20复位,初始化函数{uint i;ds=0;i=103;while(i>0) i--;ds=1;i=4;while(i>0) i--;}bit tempreadbit() //读1位字节uint i;bit dat;ds=0;i++; //i++起延时作用ds=1;i++;i++;dat=ds;i=8; while(i>0) i--;return(dat);}uchar tempread() //读一个字节数据函数{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1); //读出的数据最低位在最前,这样刚好一个字节在dat里}return(dat);}tempwritebyte(uchar dat)//向DS18B20写一个字节数据函数{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb)ds=0;i++;i++;ds=1;i=8;while(i>0) i--;}else{ds=0;i=8;while(i>0) i--;ds=1;i++;i++;}}}tempchange() //DS18B20开始获取温度{dsreset();delay(1);tempwritebyte(0xcc); //写跳过读ROM指令tempwritebyte(0x44); //写温度转换指令}uint get_temp() //读取寄存器的温度数据{uchar a,b;dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread(); //读底8位b=tempread(); //读高8位temp=b;temp<<=8; //两个字节组合为1个字节temp=temp|a;f_temp=temp*0.0625;//温度寄存器中为12位,分辨率为0.0625度temp=f_temp*10+0.5; //小数只取一位,加0.5为四舍五入f_temp=f_temp+0.05;return temp; //temp是整型}main(){while(1){tempchange();}}。

DS18B20

DS18B20

3.1.2.1 DS18B20简述DS18B20 是美国DALLAS 公司生产的可完全替代DS1820 的全新型单线数字式温度计。

它具有结构简单,不需外接元件,采用一根I/O 数据线既可供电又可传输数据、并可由用户设置温度报警界限等特点,可广泛用于食品库、冷库、粮库等需要控制温度的地方。

DS18B20 是DS1820 的改进型产品,该产品具有比DS1820 更好的性能,目前,该产品已成为DS1820 的替代品而在温控系统中得到广泛的应用。

3.1.2.2 DS18B20系列的性能特点与DALLAS 公司生产的DS1820 相比,DS18B20 具有如下特点:在-10℃~+85℃范围内,DS18B20 具有±0.5℃的精度。

因而DS18B20 在和DS1820 的测温精度相同时,具有更宽广的温度范围。

分辨率为9~12 位(包括1 位符号位),并可由编程决定具体位数。

DS18B20 的转换时间与设定的分辨率有关,当设定为9位时,最大转换时间为93.75ms;10 位时的转换时间为187.5ms;11 位时为375ms;12 位时为750ms。

电源电压范围为3.0V~5.5V。

内含程序设置寄存器,可用来设置分辨率位数,该寄存器是DS1820 所没有的。

其格式见表2-1。

表2-1 寄存器位分布表其中,TM 为测试模式位,为1 表示测试模式,为0 表示工作模式,出厂时该位设为0,且不可改变。

R1 和R0 的设置组合与温度分辨率有关,具体关系见表2-2。

表2-2 温度分辨率的设置片内带有64 位激光ROM:从高位算起,该ROM 有一个字节的CRC 校验码,6 个字节的产品序号和一个字节的家庭代码。

对于家庭代码,DS1820 是10H,DS18B20 是28H。

内含温度数据寄存器:该寄存器由两个字节组成,实际上DS18B20 中寄存器的字节定义或温度值与DS1820 不一样,DS1820 的分辨率为0.5℃,而DS18B20 的12 位分辨率为2~4℃。

(完整版)读取DS18B20温度传感器的64位ID号方法及程序

(完整版)读取DS18B20温度传感器的64位ID号方法及程序

#include <reg52.h>#define uchar unsigned char#define uint unsigned int/********************************************************************/ sbit DQ = P2^2; //温度传感器信号线sbit rs = P3^5; //LCD数据/命令选择端(H/L)位声明sbit lcden = P3^4; //LCD使能信号端位声明/********************************************************************/ //uint temp; //定义整型的温度数据//float f_temp; //定义浮点型的温度数据//uint warn_11 = 270; //定义温度设定值,是温度值乘以10后的结果//uint warn_12 = 250; //定义温度下限值//uint warn_h1 = 300; //定义温度上限值/********************************************************************/ void delay(uint z); //延时函数void DS18B20_Reset(void); //DQ18B20复位,初始化函数bit DS18B20_Readbit(void); //读1位数据函数uchar DS18B20_ReadByte(void); //读1个字节数据函数void DS18B20_WriteByte(uchar dat); //向DQ18B20写一个字节数据函数void LCD_WriteCom(uchar com); //1602液晶命令写入函数void LCD_WriteData(uchar dat); //1602液晶数据写入函数void LCD_Init(); //LCD初始化函数void Display18B20Rom(char Rom); //显示18B20序列号函数/**********************************************//* 主函数 *//**********************************************/void main(){ uchar a,b,c,d,e,f,g,h;LCD_Init();DS18B20_Reset();delay(1);DS18B20_WriteByte(0x33);delay(1);a = DS18B20_ReadByte();b = DS18B20_ReadByte();c = DS18B20_ReadByte();d = DS18B20_ReadByte();e = DS18B20_ReadByte();f = DS18B20_ReadByte();g = DS18B20_ReadByte();h = DS18B20_ReadByte();LCD_WriteCom(0x80+0x40);Display18B20Rom(h);Display18B20Rom(g);Display18B20Rom(f);Display18B20Rom(e);Display18B20Rom(d);Display18B20Rom(c);Display18B20Rom(b);Display18B20Rom(a);while(1);}/***************************************************//* 延时函数:void delay() *//* 功能:延时函数 *//***************************************************/void delay(uint z)//延时函数{uint x,y;for( x = z; x > 0; x-- )for( y = 110; y > 0; y-- );}/***************************************************//* DS18B20函数:void DS18B20_Reset() *//* 功能:复位18B20 */ /***************************************************/void DS18B20_Reset(void)//DQ18B20复位,初始化函数{uint i;DQ = 0;i = 103;while( i > 0 ) i--;DQ = 1;i = 4;while( i > 0 ) i--;}/***************************************************//* DS18B20函数:void DS18B20_Readbit() *//* 功能:读1个字节数据函数 *//***************************************************/bit DS18B20_Readbit(void) //读1位数据函数{uint i;bit dat;DQ = 0;i++; //i++起延时作用DQ = 1;i++;i++;dat = DQ;i = 8;while( i > 0 )i--;return( dat );}/***************************************************//* DS18B20函数:void DS18B20_ReadByte() *//* 功能:读1个字节数据函数 */ /***************************************************/uchar DS18B20_ReadByte(void) //读1个字节数据函数{uchar i,j,dat;dat = 0;for( i = 1; i <= 8; i++ ){j = DS18B20_Readbit();dat = ( j << 7 ) | ( dat >> 1 );}return(dat);}/***************************************************//* DS18B20函数:void DS18B20_WriteByte() *//* 功能:向DQ18B20写一个字节数据函数 *//***************************************************/void DS18B20_WriteByte(uchar dat) //向DQ18B20写一个字节数据函数{uint i;uchar j;bit testb;for( j=1; j<=8; j++){testb = dat&0x01;dat= dat>>1;if(testb) //写1{DQ = 0;i++;i++;DQ = 1;i = 8;while(i>0)i--;}else{DQ = 0; //写0i = 8;while(i>0)i--;DQ = 1;i++;i++;}}}/***********************************************//* LCD函数:void LCD_WriteCom() *//* 功能:向LCD写入命令 *//***********************************************/void LCD_WriteCom(uchar com){rs = 0;P0 = com;delay(5);lcden = 0;delay(5);lcden = 1;delay(5);lcden = 0;}/***********************************************//* LCD函数:void LCD_WriteData(uchar dat) *//* 功能:向LCD写入数据 *//***********************************************/void LCD_WriteData(uchar dat){rs = 1; //选择LCD为写入数据状态lcden = 0;P0 = dat; //将待写入数据放到总线上delay(5);lcden = 1; //给LCD使能端一个脉冲delay(5); //信号将之前放到总线上lcden = 0; //的数据写入LCDdelay(5);}/***********************************************//* LCD函数:void LCD_Init() */ /* 功能:初始化LCD,设定LCD的初始状态 *//***********************************************/void LCD_Init(){LCD_WriteCom(0x38); //LCD显示模式设定delay(15);LCD_WriteCom(0x08); //关闭LCD显示delay(3);LCD_WriteCom(0x01); //LCD显示清屏delay(3);LCD_WriteCom(0x06); //设定光标地址指针为自动加1delay(3);LCD_WriteCom(0x0c); //打开LCD显示,但不显示光标}/**********************************************//* */ /* 显示18B20序列号 *//* *//**********************************************/void Display18B20Rom(char Rom){uchar h,l;l = Rom & 0x0f; //取低4位h = Rom & 0xf0; //取高4位h >>= 4;if( ( h >= 0x00 )&&( h <= 0x09 ) )LCD_WriteData(h+0x30); //取ASCII码elseLCD_WriteData(h+0x37); //取ASCII码if( ( l >= 0x00 )&&( l <= 0x09 ) )LCD_WriteData(l+0x30); //取ASCII码elseLCD_WriteData(l+0x37); //取ASCII码}。

DS18B20 测温系统

电子综合实践设计报告专业班级:学生姓名:指导教师:设计时间:物理与通信电子学院摘要DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单、体积小、低功耗、高精度、抗干扰能力强等特点的数字温度传感器。

本设计采用多点测温方法,在一个IO口上挂接多个DS18B20测温,在远距离工作时,为了防止信号的衰减,DS18B20用屏蔽双绞线包裹,远端接地的方法工作,并把所测得的温度在LCD上显示出来。

文中简要的介绍了DS18B20的基本特点、引脚功能、测温原理及时序的控制。

给出了DS18B20的使用电路、使用中的注意事项、硬件及软件设计方法。

经过测试,该系统的测量精度及速度等指标均能满足设计要求。

关键词:DS18B20 测温系统数字温度传感器多点测温目录摘要 (2)1 引言 (4)2 设计要求 (4)3 方案设计与原理 (4)3.1 DS18B20 简介 (4)3.1.1 DS18B20特性 (4)3.1.2说明: (5)3.1.3 DS18B20测温原理: (5)3.1.4 DS18B20测温原理图: (6)3.1.5 64位激光刻ROM (7)3.1.6 CRC发生器 (7)3.1.7 单总线系统 (7)3.2 DS18B20指令控制 (7)3.2.1 ROM时序指令控制 (8)3.2.2DS18B20功能指令控制 (8)3.3 18B20时序详解 (9)3.3.1初始化时序 (9)3.3.2读/写时序 (9)3.4二叉树遍历 (11)4 设计程序流程图: (16)5 设计硬件原理图 (17)6 DS18B20使用中应注意事项 (18)7测试中出现的问题及解决办法和说明: (18)8 结束语 (19)9 参考文献: (20)10 附录: (21)1 引言本系统利用DS18B20进行测温,基于单片机AT89S52进行温度控制,具有硬件电路简单,控温精度高、功能强,体积小,简单灵活等优点,可以应用于控制温度在-55℃到+125℃之间的各种场合,可以实现温度的实时采集、显示功能。

项目八 DS18B20与蜂鸣器


bit init_18B20( )
{
bit ack;
IO_18B20=1; _nop_();
ack = IO_18B20; Delay10us(20);//总线释放
_nop_();
IO_18B20=1;
IO_18B20 = 0;
return ack; }
Delay10us(50);
IO_18B20 = 1;
DS18B20工作原理
DS18B20通过编程,可以实现最高12位的温度存储值 ,在寄存器中,以补码的格式存储。如下图所示,其中S表 示的是符号位,低11位都是2的幂,用来表示最终的温度。
DS18B20温度值
DS18B20工作协议过程
1、初始化。1-Wire总线开始需要检测这条总线上是否存在 DS18B20这个器件。如果存在DS18B20,总线会返回一个 低电平脉冲,如果不存在,总线保持为高电平。获取存在 脉冲不仅仅是检测是否存在DS18B20,还要通过这个脉冲 过程通知DS18B20准备好,单片机要对它进行操作了。
date &= ~sum; else
date |= sum; Delay10us(6); } return date; }
/* 18B20获取温度并转换 */ void start_18B20() {
bit ack; ack= init_18B20( ); if(ack==0) { Write18B20(0xcc); Write18B20(0x44); } }
void Write18B20(uchar date) { uchar sum;
for(sum=0x01; sum!= 0; sum<<=1) { IO_18B20 = 0; _nop_(); _nop_();

DS18B20测温程序,四位数码管显示两位小数

#include<reg51.H>#include<absacc.H>#include <intrins.h>#include<stdio.h>#define uchar unsigned char#define uint unsigned intuchar code TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code TAB1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; sbit DQ=P3^3;void delay(uint i){while(i--);}void DelayMS(uint ms){uchar i;while(ms--) for(i=0;i<120;i++);}void display(int k)//数码管显示{P2=0x08;P0=TAB[k%10];DelayMS(5);P2=0x04;P0=TAB[k/10%10];DelayMS(5);P2=0x02;P0=TAB1[k/100%10];DelayMS(5);P2=0x01;P0=TAB[k/1000];DelayMS(5);}init_DS(void){uchar x=0;DQ=1;delay(8);DQ=0;delay(85);DQ=1;delay(14);x=DQ;delay(20);}Read(void){uchar i=0;uchar dat=0;for(i=8;i>0;i--){//DQ=1;//delay(1);DQ=0;dat>>=1;DQ=1;if(DQ)dat|=0x80;//读出数据放入高位,最后右移到低位delay(4);}return(dat);}write(uchar dat){uchar i=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;//从地位开始写入delay(5);DQ=1;dat>>=1;}delay(4);}Readtem(void){ uchar a=0;uchar b=0;uchar t=0,t1;init_DS();write(0xcc);//跳过读序列号操作write(0x44);//启动温度转换delay(125);init_DS();write(0xcc);write(0xbe);// 读温度寄存器a=Read();//读取温度低位LSBb=Read();//读取温度低位HSBt1=(a&0x0f)*0.0625;//取小数部分t=((b<<4)|(a>>4));//取整数部分if(t>128){t=~t+1;}t=t+t1;return(t);}void main(){float tp;while(1){tp=Readtem();tp=tp*100;//把二位数乘以100变成四位数display(tp);}}。

(完整word版)DS18B20水温控制系统+电路图程序

水温控制系统摘要:该水温控制系统采用单片机进行温度实时采集与控制。

温度信号由“一线总线”数字化温度传感器DS18B20提供,DS18B20在-10~+85°C范围内,固有测温分辨率为0.5 ℃。

水温实时控制采用继电器控制电热丝和风扇进行升温、降温控制.系统具备较高的测量精度和控制精度,能完成升温和降温控制。

关键字:AT89C51 DS18B20 水温控制Abstract: This water temperature control system uses the Single Chip Microcomputer to carry on temperature real-time gathering and controling。

DS18B20,digitized temperature sensor, provides the temperature signal by "a main line”. In -10~+85℃the scope,DS18B20’s inherent measuring accuracy is 0.5 ℃. The water temperature real-time control system uses the electricity nichrome wire carring on temperature increiseament and operates the electric fan to realize the temperature decrease control。

The system has the higher measuring accuracy and the control precision,it also can complete the elevation of temperature and the temperature decrease control. Key Words:AT89C51 DS18B20 Water temperature control目录1.系统方案选择和论证 (2)1。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

- - 最近都在学习和写单片机的程序, 今天有空又模仿DS18B20温度测量显示实验写了一个与DS18B20基于单总线通信的程序.

DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应用)是DALLAS 公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。DS18B20 产品的特点: (1)、只要求一个I/O 口即可实现通信。 (2)、在DS18B20 中的每个器件上都有独一无二的序列号。 (3)、实际应用中不需要外部任何元器件即可实现测温。 (4)、测量温度范围在-55 到+125℃之间; 在-10 ~ +85℃范围内误差为±5℃; (5)、数字温度计的分辨率用户可以从9 位到12 位选择。将12位的温度值转换为数字量所需时间不超过750ms; (6)、内部有温度上、下限告警设置。

DS18B20引脚分布图 -

- DS18B20 详细引脚功能描述: 1、GND 地信号; 2、DQ数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下,此引脚可以向器件提供电源;漏极开路, 常太下高电平. 通常要求外接一个约5kΩ的上拉电阻. 3、VDD可选择的VDD 引脚。电压范围:3~5.5V; 当工作于寄生电源时,此引脚必须接地。

DS18B20存储器结构图

暂存储器的头两个字节为测得温度信息的低位和高位字节; 第3, 4字节是TH和TL的易失性拷贝, 在每次电复位时都会被刷新; 第5字节是配置寄存器的易失性拷贝, 同样在电复位时被刷新; 第9字节是前面8个字节的CRC检验值. - - 配置寄存器的命令内容如下: 0 R1 R0 1 1 1 1 1 MSB

LSB R0和R1是温度值分辨率位, 按下表进行配置.默认出厂设置是R1R0 = 11, 即12位.

温度值分辨率配置表 R1 R0 分辨率 最大转换时间(ms) 0 0 9bit 93.75(tconv/8) 0 1 10bit 183.50(tconv/4) 1 0 11bit 375(tconv/2) 1 1 12bit 750 (tconv) 4种分辨率对应的温度分辨率为0.5℃, 0.25℃, 0.125℃, 0.0625℃(即最低一位代表的温度值)

12位分辨率时的两个温度字节的具体格式如下: 低字节: 2^3 2^2 2^1 2^0 2^-1 2^-2 2^-3 2^-4

高字节: - - S S S S S 2^6 2^5 2^4

其中高字节前5位都是符号位S, 若分辨率低于12位时, 相应地使最低为0, 如: 当分辨率为10位时, 低字节为: 2^3 2^2 2^1 2^0 2^-1 2^-2 0 0

, 高字节不变.... 一些温度与转换后输出的数字参照如下: 温度 数字输出 换成16进制

+125℃ 00000111 11010000 07D0H

+85℃ 00000101 01010000 0550H +25.0625℃ 00000001 10010001 0191H +10.125℃ 00000000 10100010 00A2H +0.5℃ 00000000 00001000 0008H 0℃ 00000000 0000H - - 00000000

-0.5℃ 11111111 11111000 FFF8H

-10.125℃ 11111111 01011110 FFE5H -25.0625℃ 11111110 01101111 FF6FH -55℃ 11111100 10010000 FC90H 由上表可看出, 当输出是负温度时, 使用补码表示, 方便计算机运算(若是用C语言, 直接将结果赋值给一个int变量即可).

DS18B20 的使用方法: 由于DS18B20 采用的是1-Wire 总线协议方式,即在一根数据线实现数据的双向传输,而对单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。 由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。 DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。 该协议定义了几种信号的时序:初始化时序(dsInit()实现)、读时序(readByte())、写时序(writeByte())。 - - 所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。

DS18B20与单片机连接电路图:

利用软件模拟DS18B20的单线协议和命令:主机-

- 操作DS18B20必须遵循下面的顺序 1. 初始化 单线总线上的所有操作都是从初始化开始的. 过程如下: 1)请求: 主机通过拉低单线480us以上, 产生复位脉冲, 然后释放该线, 进入Rx接收模式. 主机释放总线时, 会产生一个上升沿脉冲. DQ : 1 -> 0(480us+) -> 1 2)响应: DS18B20检测到该上升沿后, 延时15~60us, 通过拉低总线60~240us来产生应答脉冲. DQ: 1(15~60us) -> 0(60~240us) 3)接收响应: 主机接收到从机的应答脉冲后, 说明有单线器件在线. 至此, 初始化完成. DQ: 0

2. ROM操作命令 当主机检测到应答脉冲, 便可发起ROM操作命令. 共有5类ROM操作命令, 如下表

命令类型 命令字节 功能 Read Rom 读ROM 33H 读取激光ROM中的64位,只能用于总线上单个DS18B20器件情况, 多挂时会发生数据冲突 - - Match Rom匹配ROM 55H 此命令后跟64位ROM序列号,寻址多挂总线上的对应DS18B20.只有序列号完全匹配的DS18B20才能响应后面的内存操

作命令,其他不匹配的将等待复位脉冲.可用于单挂或多挂两种情况. Skip Rom 跳过ROM CCH 可无须提供64位ROM序列号即可运行内

存操作命令, 只能用于单挂.

Search Rom搜索ROM F0H 通过一个排除法过程, 识别出总线上所有器件的ROM序列号

Alarm Search告警搜索 ECH 命令流程与Search Rom相同, 但DS18B20只有最近的一次温度测量时满足了告警触发条件的, 才会响应此命令.

3. 内存操作命令 在成功执行ROM操作命令后, 才可使用内存操作命令. 共有6种内存操作命令:

命令类型 命令字节 功能 Write Scratchpad 写暂存器 4EH 写暂存器中地址2~地址4的3个字节(TH,TL和配置寄存器)在发起复位脉冲之前,3个字节都必须要写. - - Read Scratchpad 读暂存器 BEH 读取暂存器内容,从字节0~一直到字节8共9个字节,主机可随时发起复位脉冲,停止此操作,通常我们只需读前5个字节.

Copy Scratchpad 复制暂存器 48H 将暂存器中的内容复制进EERAM, 以便将温度告警触发字节存入非易失内存. 如果此命令后主机产生读时隙, 那么只要器件还在进行复制都会输出0, 复制完成后输出1.

Convert T 温度转换 44H 开始温度转换操作. 若在此命令后主机产生时隙, 那么只要器件还在进行温度

转换就会输出0, 转换完成后输出1.

Recall E2 重调E2暂存器

B8H 将存储在EERAM中的温度告警触发值和配置寄存器值重新拷贝到暂存器中,此操作

在DS18B20加电时自动产生.

Read Power Supply 读供电方式 B4H 主机发起此命令后每个读数时隙内,DS18B20会发信号通知它的供电方式:0寄生电源, 1外部供电.

4. 数据处理 DS18B20要求有严格的时序来保证数据的完整性. 在单线DQ上, 有复位脉冲, 应答脉冲, 写0, 写1, 读0, 读1这6种信号类型. 除了应答脉冲外, 其它都由主机产生. 数据位的读和写是- - 通过读、写时隙实现的. 1) 写时隙: 当主机将数据线从高电平拉至低电平时, 产生写时隙.所有写时隙都必须在60us以上, 各写时隙间必须保证1us的恢复时间. 写"1" : 主机将数据线DQ先拉低, 然后释放15us后, 将数据线DQ拉高; 写"0" : 主机将DQ拉低并至少保持60us以上. 2)读时隙: 当主机将数据线DQ从高电平拉至低电平时, 产生读时隙. 所有读时隙最短必须持续60us, 各读时隙间必须保证1us的恢复时间. 读: 主机将DQ拉低至少1us,. 此时主机马上将DQ拉高, 然后就可以延时15us后, 读取DQ即可.

源代码: (测量范围: 0 ~ 99度) DS18B20 1#include 2//通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值 3sbit wela = P2^7; //数码管位选 4sbit dula = P2^6; //数码管段选 5sbit ds = P2^2; 6//0-F数码管的编码(共阴极) 7

相关文档
最新文档