DS18B20 单片机数码管显示原理图和程序
DS18B20原理及程序编写
DS18B20原理及程序编写(一)概述DS18B20为单总线12位(二进制)温度读数。
内部有64位唯一的ID编码。
工作电压从3.0~5.5V。
测量温度范围从-55℃~125℃。
最高±0.0625℃分辩率。
其内部结构如下图所示。
DS18B20的核心功能是直接数字温度传感器。
温度传感器可以配置成9、10、11和12位方式。
相应的精度分别为:0.5℃、0.25℃、0.125℃和0.0625℃。
默认的分辨率为12位。
DS18B20在空闲低功耗状态下加电(寄生电源工作方式)。
主机必须发出Convert T [44h]命令使其对测量温度进行A-D转换。
接下来进行采集转换,结果存于两字节高速温度寄存器并返回到空闲低功耗状态。
如果DS18B20在外部VDD供电方式下,单片机可以在发出Convert T 命令并总线为1时(总线为0表示正在转换)发出“read time slots”命令。
DS18B20芯片内部共有8字节的寄存器,其中地址编号0,1为温度寄存器,里面存储着DS18B20温度转换后的AD值,其格式如表1所示。
地址编号2,3为温度报警寄存器,里面为报警设定值,地址编号4为配置寄存器(这三个寄存器在读取之前请使用“重新调入EEPROM”命令将存储在EEPROM里的内容调出,同样,在向温度报警寄存器里写入内容后,也要使用“复制到存储器”命令48H将温度报警寄存器内的内容存入EEPROM当中,以免掉电丢失数据)。
DS18B20内部寄存器映射如下图所示。
配置寄存器的格式如表2和表3所示。
DS18B20内部寄存器映射表1 温度寄存器的格式表2 配置寄存器的格式表3 温度分辨率配置DS18B20使用单总线工作方式,其通信协议以电平的高平时间作为依据,其基本时序有复位时序,写时序、读时序。
//********************************************************************** //** 文件名:DS18B20.c//** 说明:DS18B20驱动程序文件//----------------------------------------------------------------------//** 单位://** 创建人:张雅//** 创建时间:2010-01-20//** 联系方式:QQ:276564402//** 版本:V1.0//----------------------------------------------------------------------//**********************************************************************//----------------------------------------------------------------------//** 芯片:AT89S52//** 时钟:11.0592MHz//** 其它:这个文档为18B20的驱动程序,引用了数码管的驱动。
(完整版)DS18B20的工作原理
DS18B20的工作原理:DS18B20单线数字温度传感器是DALLAS半导体公司开发的适配微处理器的智能温度传感器。
它具有3脚TO-92小体积封装形式。
温度测量范围为-55℃--+125℃,可进行9-12位的编程,分辨率可达0.0625。
被测温度用符号扩展的16位数字量方式串行输出。
工作电压支持3V-5.5V,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少。
DS18B20采用3脚TO-92封装,引脚排列如图:DQ:数字信号端;GND:电源地;VDD:电源输入端DS18B20的内部框图如图:主要由寄生电源、64位激光ROM与单线接口、温度传感器、高速暂存器、触发寄存器、存储与控制逻辑、8位循环冗余校验码发生器组成。
测温电路原理:低温度系数振荡器用于产生稳定的频率f,振荡频率受温度的影响很小,高温度系数振荡器将被测温度转化成频率信号,随温度变化其振荡频率明显改变。
图中还隐含着计数门,当计数门打开时,DS18B20就对低温度振荡器产生的时钟脉冲进行计数,进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定。
每次测量前,首先将-55℃所对应的基数分别置入减法计数器、温度寄存器中。
在计数门关闭之前若计数器已减至零,温度寄存器中的数值就增加0.5℃。
然后,计数器依斜率累加器的状态置入新的数值,再对时钟计数,然后减至零,温度寄存器值又增加0.5℃。
只要计数门仍未关闭,就重复上诉过程,直至温度寄存器值达到被测温度值。
温度传感器的应用背景:当今社会已经完全进入了电子信息化,温度控制器在各行各业中已经得到了充分的利用。
具有对温度进行实时监控的功能,保证机器,测量仪器等等的正常运坐,他最大的特点是能实时监控周围温度的高低,并能同时控制电机运作来改变温度。
现阶段运用于国内大部分家庭,系统效率越来越高,成本也越来越低。
并可以根据其性质进行相应的改进运用于不同场合进行温度监测控制,比如仓库里、汽车里、电脑等等,带来大量的经济效益。
DS18B20原理及应用实例(源程序+原理图+Proteus仿真)
2、DS18B20 结构:如右图所示,DS18B20 有三只引脚,
VCC、DQ 和 GND。DQ 为数字信号输入/输出端(DQ 一般接控制器(单片机)的一个 I/O 口上,由于单总线为开漏所以需要外接一个 4.7K 的上拉电阻) ;GND 为电源地;VDD 为外 接供电电源输入端 (在寄生电源接线方式时接地) 。 DS18B20 内部结构主要由四部分组成: 64 位光刻 ROM、温度传感器、非挥发的温度报警触发器 TH 和 TL、配置寄存器。 光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列 码。64位光刻ROM的排列是:开始8位是产品类型标号,接着的48位是该DS18B20自身的序 列号,最后8位是前面56位的CRC校验码(循环冗余校验码)。光刻ROM的作用是使每一个 DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。 温度传感器可完成对温度的测量,以12位转化为例,用16位符号扩展的二进制补码读 数形式提供。 RAM数据暂存器,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。如 下图所示, 当温度转换命令发布后, 经转换所得的温度值以二字节补码形式存放在暂存器的 第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,第2、3 字节是用户EEPROM(常用于温度报警值储存)的镜像,用户用来设置最高报警和最低报 警值,在上电复位时其值将被刷新。第4个字节则是用户第3个EEPROM的镜像,用来配置 9~12位的转换精度(即分辨率) 。第5、6、7个字节为计算机自身使用。第8个字节为前8个字 节的CRC码。EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警 值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。
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就显示小数点了。
DS18B20温度传感器设计原理图及c程序代码
/*******************代码部分**********************//*************** writer:shopping.w ******************/ #include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}sbit DQ = P3^3;sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;uchar code Temp_Disp_Title[]={"Current Temp : "};uchar Current_Temp_Display_Buffer[]={" TEMP: "};uchar code Temperature_Char[8] ={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};uchar code df_Table[]=0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};uchar CurrentT = 0;uchar Temp_Value[]={0x00,0x00}; uchar Display_Digit[]={0,0,0,0};bit DS18B20_IS_OK = 1;void DelayXus(uint x){uchar i;while(x--){for(i=0;i<200;i++);}}bit LCD_Busy_Check(){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0&0x80);LCD_EN=0;return result;}void Write_LCD_Command(uchar cmd) {while(LCD_Busy_Check());LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_();P0 = cmd;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}void Write_LCD_Data(uchar dat){while(LCD_Busy_Check());LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}void LCD_Initialise(){Write_LCD_Command(0x01);DelayXus(5);Write_LCD_Command(0x38);DelayXus(5);Write_LCD_Command(0x0c);DelayXus(5);Write_LCD_Command(0x06);DelayXus(5);}void Set_LCD_POS(uchar pos){Write_LCD_Command(pos|0x80); }void Delay(uint x){while(--x);}uchar Init_DS18B20(){uchar status;DQ = 1;Delay(8);DQ = 0;Delay(90);DQ = 1;Delay(8);DQ = 1;return status;}uchar ReadOneByte(){uchar i,dat=0;DQ = 1;_nop_();for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;_nop_();_nop_();if(DQ)dat |= 0X80;Delay(30);DQ = 1;}return dat;}void WriteOneByte(uchar dat) {uchar i;for(i=0;i<8;i++){DQ = 0;DQ = dat& 0x01;Delay(5);DQ = 1;dat >>= 1;}}void Read_Temperature(){if(Init_DS18B20()==1)DS18B20_IS_OK=0;else{WriteOneByte(0xcc);WriteOneByte(0x44);Init_DS18B20();WriteOneByte(0xcc);WriteOneByte(0xbe);Temp_Value[0] = ReadOneByte();Temp_Value[1] = ReadOneByte();DS18B20_IS_OK=1;}}void Display_Temperature(){uchar i;uchar t = 150, ng = 0;if((Temp_Value[1]&0xf8)==0xf8){Temp_Value[1] = ~Temp_Value[1];Temp_Value[0] = ~Temp_Value[0]+1;if(Temp_Value[0]==0x00)Temp_Value[1]++;ng = 1;}Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);Display_Digit[3] = CurrentT/100;Display_Digit[2] = CurrentT%100/10;Display_Digit[1] = CurrentT%10;Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';Current_Temp_Display_Buffer[10] = '.';Current_Temp_Display_Buffer[9] = Display_Digit[1] + '0';Current_Temp_Display_Buffer[8] = Display_Digit[2] + '0';Current_Temp_Display_Buffer[7] = Display_Digit[3] + '0';if(Display_Digit[3] == 0)Current_Temp_Display_Buffer[7] = ' ';if(Display_Digit[2] == 0&&Display_Digit[3]==0)Current_Temp_Display_Buffer[8] = ' ';if(ng){if(Current_Temp_Display_Buffer[8] == ' ')Current_Temp_Display_Buffer[8] = '-';else if(Current_Temp_Display_Buffer[7] == ' ')Current_Temp_Display_Buffer[7] = '-';elseCurrent_Temp_Display_Buffer[6] = '-';}Set_LCD_POS(0x00);for(i=0;i<16;i++){Write_LCD_Data(Temp_Disp_Title[i]);}Set_LCD_POS(0x40);for(i=0;i<16;i++){Write_LCD_Data(Current_Temp_Display_Buffer[i]);}Set_LCD_POS(0x4d);Write_LCD_Data(0x00);Set_LCD_POS(0x4e);Write_LCD_Data('C');}void main(){LCD_Initialise();Read_Temperature();Delay(50000);Delay(50000);while(1){Read_Temperature();if(DS18B20_IS_OK)Display_Temperature();DelayXus(100);}}。
DS18B20的传感器数码管显示的设计原理及程序
以下是原理图:以下是原理图的程序设计:#include <reg52.h>#include<math.h>#define uchar unsigned charsbit DQ=P1^6;unsigned char tempL=0;unsigned char tempH=0;unsigned int tempa;uchar display_data[4]={0};uchar flag_fu=0; //温度正负值标志位float temperature; //温度值void DS18_delay(int useconds)//延时函数{int s;for (s=0; s<useconds;s++);}unsigned char Init_DS18B20(void){unsigned char x=0;DQ=0; //发送复位脉冲DS18_delay(29); //延时(>480ms)DQ=1; //拉高数据线DS18_delay(3); //等待(15~60ms) 等待存在脉冲x=DQ; //获得存在信号(用于判断是否有器件)DS18_delay(25); // 等待时间隙结束return(x); //返回存在信号,0 = 器件存在, 1 = 无器件}ReadOneChar(void)//读一个字节{unsigned char i=0;unsigned char dat=0;for (i=8;i>0;i--){DQ=1;DS18_delay(1);DQ=0;dat>>=1;//复合赋值运算,等效dat=dat>>1(dat=dat右移一位后的值) DQ=1;if(DQ)dat|=0x80;DS18_delay(4);}return(dat);}WriteOneChar(unsigned char dat){unsigned char i=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;DS18_delay(5);DQ=1;dat>>=1;}DS18_delay(4);}unsigned int ReadTemperature(void){Init_DS18B20();WriteOneChar(0xcc);WriteOneChar(0x44);DS18_delay(125);Init_DS18B20();WriteOneChar(0xcc);WriteOneChar(0xbe);tempL=ReadOneChar();tempH=ReadOneChar();tempa=((tempH*256)+tempL);if(tempa&0x8000){tempa=~tempa;tempa+=1;flag_fu=1;}else{flag_fu=0;}//温度转换,把高低位做相应的运算转化为实际温度temperature=tempa*0.625*8;DS18_delay(200);return temperature ;}void display(){unsigned char code dis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x7f,0xff};P3=0x01;P2=dis[display_data[0]];DS18_delay(10);P3=0x02;P2=dis[display_data[1]];DS18_delay(10);P3=0x04;P2=dis[display_data[2]]+0x80;DS18_delay(10);P3=0x08;P2=dis[display_data[3]];DS18_delay(10);}void main(){unsigned int temp;uchar i;while(1){temp=ReadTemperature();if(flag_fu==0){ if(temp>=1000){display_data[0]=temp/1000;display_data[1]=(temp/100)%10;display_data[2]=(temp/10)%10;display_data[3]=temp%10;}else if(temp>=100){display_data[0]=12;display_data[1]=temp/100;display_data[2]=(temp%100)/10;display_data[3]=temp%10;}else{ display_data[0]=12;display_data[1]=12;display_data[2]=temp/10;display_data[3]=temp%10;}}else{ if(abs(temp)>100){display_data[0]=10;display_data[1]=abs(temp)/100;display_data[2]=(abs(temp)%100)/10;display_data[3]=abs(temp)%10;}else{display_data[0]=12;display_data[1]=10;display_data[2]=abs(temp)/10;display_data[3]=abs(temp)%10;}}for(i=0;i<250;i++)display();}}。
DS18B20工作原理及时序
DS18B20原理与分析DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。
与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
可以分别在93.75 ms和750 ms 内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。
因而使用DS18B20可使系统结构更趋简单,可靠性更高。
他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。
1.DS18B20简介(1)独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(2)在使用中不需要任何外围元件。
(3)可用数据线供电,电压范围:+3.0~ +5.5 V。
(4)测温范围:-55 ~+125 ℃。
固有测温分辨率为0.5 ℃。
(5)通过编程可实现9~12位的数字读数方式。
(6)用户可自设定非易失性的报警上下限值。
(7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。
(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
DS18B20的测温原理DS18B20的测温原理如图2所示,图中低温度系数晶振的振荡频率受温度的影响很小〔1〕,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55 ℃所对应的一个基数值。
DS18B20中文资料+C程序
DS18B20中文资料+C程序18b20温度传感器应用解析温度传感器的种类众多,在应用与高精度、高可靠性的场合时dallas(达拉斯)公司生产的ds18b20温度传感器当仁不让。
超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得ds18b20更受欢迎。
对于我们普通的电子爱好者来说,ds18b20的优势更是我们学习单片机技术和开发温度相关的小产品的不二选择。
了解其工作原理和应用可以拓宽您对单片机开发的思路。
ds18b20的主要特征:全系列数字温度切换及输入。
??一流的单总线数据通信。
最高12位分辨率,精度可达土0.5摄氏度。
12十一位分辨率时的最小工作周期为750毫秒。
??可选择真菌工作方式。
检测温度范围为c55°c~+125°c(c67°f~+257°f)??内置eeprom,限温报警功能。
64十一位光刻rom,内置产品序列号,便利多机了变。
??多样PCB形式,适应环境相同硬件系统。
ds18b20芯片PCB结构:ds18b20引脚功能:gnd电压地dq单数据总线vdd电源电压nc空插槽ds18b20工作原理及应用领域:ds18b20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。
其一个工作周期可分为两个部分,即温度检测和数据处理。
在讲解其工作流程之前我们有必要了解18b20的内部存储器资源。
18b20共有三种形态的存储器资源,它们分别是:rom只读存储器,用作放置ds18b20id编码,其前8位就是单线系列编码(ds18b20的编码就是19h),后面48位就是芯片唯一的序列号,最后8位就是以上56的位的crc码(缓存校验)。
数据在出产时设置无可奈何用户修改。
ds18b20共64十一位rom。
ram数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,ds18b20共9个字节ram,每个字节为8位。
第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户eeprom(常用于温度报警值储存)的镜像。
DS18B20逻辑时序图及程序设计
DS18B20逻辑时序图及程序设计通过单线总线的所有ROM操作,都从一个初始化序列开始。
初始化就是由单片机首先拉低总线一段时间,至少480us,然后拉高总线,等待一段时间,读取总线上的电平值,若为“1”则无器件在线,为“0”则存在器件。
若为“0”,则延迟一段时间,一般为200us,然后继续下面的操作。
由于需要响应按键的中断,所以程序中有对按键值的判断。
初始化时序图图3.10 DS18B20unsigned char ow_reset(uint n){unsigned char presence;//SET TO OUTPUT P4DIR=0xff;P4OUT=0xff;//pull dQ line low P4OUT=0x00;_NOP();_NOP();// leave it low for 600us delay(100);// allow line to return high P4OUT=0xff;//SET TO INPUT P4DIR=0x00;while(P4IN!=0);while(P4IN==0){presence =0; // get presence signalreturn(presence); // presence signal returned}1 = no part} // 0=presence,温度传感器还有许多与温度转换,温度值读取,匹配序列号等相DS18B20而这些寄存器操作这些指令都是建立在对寄存器的操作的基础上的,关的指令,写操作实现的,每一个指令都是八个字节,而由于的读/都是通过对DS18B20次数据发送,所8DS18B20是单总线器件,所以每发出一条指令,都需要进行而且都需要判断发送或接收循环为主体的,for写操作的程序是以/以对器件的读的比特值是“1”还是“0”。
控制器写入时序图图3.11 DS18B20的一个字节//读取ds18b20uchar DS18B20_ReadByte(uint n){uchar u;uchar q ;P4DIR=0xff; //SET TO OUTPUTSwitch(n){case 0:for(q=0;q<8;q++){u=u>>1;P4OUT &=~BIT0;_NOP();_NOP();P4OUT |=BIT0;P4DIR &=~BIT0; //SET TO INPUT_NOP();_NOP();u=u|0x80; if((P4IN&0x08)==0x08)u=u&0x7f; elsedelay(20);P4DIR |=BIT0; //SET TO OUTPUTP4OUT |=BIT0;} break;return u; }}”时,首先要将总线拉低,”或“13.11由时序图可以看出,单片机在写“0根据总DS18B20”来确定是保持高电平还是低电平,”或者“然后根据是“01显得电平进行采样,获得总线上写入的数据。
DS18B20温度检测仪表(数码管显示)doc资料
目录第1章绪论 (1)1.1 选题目的 (1)1.2 设计要求 (1)第2章电路结构及工作原理 (2)2.1 电路方框图 (2)2.1.1 电路图 (2)2.1.2 系统流程 (3)2.2芯片介绍 (5)2.2.1 DS18B20 (5)2.2.1.1 DS18B20的工作原理 (5)2.2.1.2 DS18B20的使用方法 (6)2.2.2 AT89C51 (8)2.2.2.1 AT89C51简介 (8)第3章整机工作原理 (10)第4章系统调试与分析 (12)4.1 系统的调试 (12)4.2系统的分析 (12)结论 (13)收获和体会 (14)致谢 (15)参考文献 (16)附录一元件清单 (17)课程设计任务书年月日第1章绪论1.1 选题目的随着人们生活水平的不断提高,单片机技术已经普及到我们生活,工作,科研等各个领域。
单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本文利用单片机结合传感器技术开发设计,把传感器理论与单片机实际应用有机结合,详细地讲述了利用温度传感器DS18B20测量环境温度,设置上下报警温度,当温度不在设置范围内是,可以报警。
同时51单片机在现代电子产品中广泛应用以及其技术已经非常成熟,DS18B20可以直接读出被测温度值,而且采用一线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。
1.2 设计要求(1)设计题目和设计指标测量温度范围为0-100℃。
并通过数码管显示(2)设计功能利用DS18B20实现温度采集,并用数码管显示第2章 电路结构及工作原理2.1 电路方框图图2-1 电路方框图2.1.1 电路图2.1.2 系统流程图2-3 读DS18B20的子程序图2-4 读转换温度子程序2.2芯片介绍2.2.1 DS18B202.2.1.1 DS18B20的工作原理当DS18B20接收到温度转换命令后,开始启动转换。
单总线温度传感器DS18B20
单总线温度传感器DS18B20DS18B20是DALLAS公司生产的单总线式数字温度传感器,它特别适用于构成多点温度测控系统,可直接将温度转化成串行数字信号(提供9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片。
它具有3引脚TO-92小体积封装形式,温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
以上特点使DS18B20非常适用于远距离多点温度检测系统。
⑴ DS18B20外形及引脚说明外形及引脚如图2所示:图2 管脚排列图在TO-92和SO-8的封装中引脚有所不同,具体差别请查阅PDF手册,在TO-92封装中引脚分配如下:1(GND):地2(DQ):单线运用的数据输入输出引脚3(VDD):可选的电源引脚⑵ DS18B20工作过程及时序DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。
高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。
初始时,温度寄存器被预置成-55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。
初始时,计数器1预置的是与-55℃相对应的一个预置值。
以后计数器1每一个循环的预置数都由斜率累加器提供。
为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。
计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1℃计数器所需要的计数个数。
DS18B20内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。
DS18B20原理及应用实例(源程序+原理图+Proteus仿真)
2 / 13
2012 年 8 月 13 日星期一
举例如下:
4ቤተ መጻሕፍቲ ባይዱDS18B20 的初始化:
根据 DS18B20 的通讯协议,主机(单片机)控制 DS18B20 完成温度转换必须经过三个 步骤:每一次读写之前都要对 DS18B20 进行复位操作,复位成功后发送一条 ROM 指令, 最后发送 RAM 指令,这样才能对 DS18B20 进行预定的操作。复位要求主 CPU 将数据线下 拉 500 微秒,然后释放,当 DS18B20 收到信号后等待 16~60 微秒左右,后发出 60~240 微秒的存在低脉冲,主 CPU 收到此信号表示复位成功。 (1) 先将数据线 DQ 置高电平“1”。 (2) 延时(该时间要求的不是很严格,但是尽可能的短一点) (3) 数据线拉到低电平“0”。 (4) 延时 750 微秒(该时间的时间范围可以从 480 到 960 微秒) 。 (5) 数据线拉到高电平“1”。 (6) 延时等待(如果初始化成功则在 15 到 60 微妙时间之内产生一个由 DS18B20 所返回 的低电平“0”。据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使 程序进入死循环,所以要进行超时控制) 。 (7) 若 CPU 读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平 算起(第(5)步的时间算起)最少要 480 微秒。 (8) 将数据线再次拉高到高电平“1”后结束。 初始化程序如下: uchar Init_DS18B20() { uchar status; //status 为 DS18B20 返回的状态 DQ = 1; Delay(8); DQ = 0; Delay(90); DQ = 1;
8、DS18B20 应用举例(一)
如下图所示:DQ 通过 4.7K 上拉电阻外接正电源(由于单总线为开漏所以需要外接一 个 4.7K 的上拉电阻),并连接单片机 P3.3 口。 本例中,1602LCD 显示 DS18B20 所测量的外部温度,调节 DS18B20 模拟改变外界 温度时,新的温度将刷新显示在 LCD 上。
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 题目要求 (2)1.1.1 基本要求 (2)1.1.2 发挥部分 (2)1.1.3 说明 (2)1.2 系统基本方案 (2)1.2.1 各模块电路的方案选择及论证 (2)1.2.2 系统各模块的最终方案 (5)2. 硬件设计与实现 (6)2.1系统硬件模块关系 (6)2.2 主要单元电路的设计 (6)2.2.1 温度采集部分设计 (6)2.2.2 加热控制部分 (8)2.2.3 键盘、显示、控制器部分 (8)3. 系统软件设计 (10)3.1 读取DS18B20温度模块子程序 (10)3.2 数据处理子程序 (10)3.3 键盘扫描子程序 (12)3.4 主程序流程图 (13)4. 系统测试 (14)4.1 静态温度测试 (14)4.2动态温控测量 (14)4.3结果分析 (14)附录1:产品使用说明 (15)附录2:元件清单 (15)附录3:系统硬件原理图 (16)附录4:软件程序清单 (17)参考文献 (26)1.系统方案选择和论证1.1题目要求设计并制作一个水温自动控制系统,控制对象为1L净水,容器为搪瓷器皿。
DS18B20介绍、流程图和程序源代码
DS18B20单线数字温度传感器DALLAS半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器,体积更小、适用电压更宽、更经济。
一线总线独特而且经济的特点,使用户可轻松地组建温度传感器网络,为测量系统的构建引入全新概念。
DS18B20、DS1822 “一线总线”数字化温度传感器同DS1820一样,支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C,而DS1822的精度较差为± 2°C 。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性,适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。
DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C,分辨率设定,以及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS1822与DS18B20软件兼容,是DS18B20的简化版本。
省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。
继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。
DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
1、 DS18B20性能特点DS18B20的性能特点:①采用单总线专用技术,既可通过串行口线,也可通过其它I/O口线与微机接口,无须经过其它变换电路,直接输出被测温度值(9位二进制数,含符号位),②测温范围为-55℃-+125℃,测量分辨率为0.0625℃,③内含64位经过激光修正的只读存储器ROM,④适配各种单片机或系统机,⑤用户可分别设定各路温度的上、下限,⑥内含寄生电源。
DS18B20温度传感器详解带c程序
00A2H
+0.5
0000 0000 0000 000
0000H
-0.5
1111 1111 1111 1000
FFF8H
-10.125
1111 1111 0110 1110
FF5EH
-25.0625
1111 1110 0110 1111
FF6FH
-55 执行序列与介绍 3.1 执行序列
duan=1; switch(i) {
case 0: if(zf==0) P1=numfh[zf];
else if(bai!=0) P1=numd[bai]; else if(shi!=0) P1=numd[shi]; else P1=numdg[ge]; break;
case 1: if(zf==0&&shi!=0) P1=numd[shi];
表 3.2 DS18B20 温度/数字对应关系表
温度(℃)
输出的二进制码
对应的十六进制码
+125
0000 0111 1101 0000
07D0H
+85
0000 0101 0101 0000
0550H
+25.0625
0000 0001 1001 0001
0191H
+10.125
0000 0000 1010 0010
uchar x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--); } /******************15us 延时函数****************/ void delay(uint z) {
while(z--); } /******************初始化 DS18B20 函数****************/ void reset_ds18b20() {
ds18b20详解及程序
最近都在学习和写单片机的程序, 今天有空又模仿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检验值.配置寄存器的命令内容如下:MSBLSBR0和R1是温度值分辨率位, 按下表进行配置.默认出厂设置是R1R0 = 11, 即12位.温度值分辨率配置表4种分辨率对应的温度分辨率为0.5℃, 0.25℃, 0.125℃, 0.0625℃(即最低一位代表的温度值)12位分辨率时的两个温度字节的具体格式如下:低字节:高字节:其中高字节前5位都是符号位S, 若分辨率低于12位时, 相应地使最低为0, 如: 当分辨率为10位时, 低字节为:, 高字节不变....一些温度与转换后输出的数字参照如下:由上表可看出, 当输出是负温度时, 使用补码表示, 方便计算机运算(若是用C语言, 直接将结果赋值给一个int变量即可).DS18B20 的使用方法:由于DS18B20 采用的是1-Wire 总线协议方式,即在一根数据线实现数据的双向传输,而对单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
数字温度传感器DS18B20(含程序)
数字温度传感器DS18B20摘要DS-18B20 数字温度传感器具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
应用范围广泛,适用于冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域,轴瓦,缸体,纺机,空调,等狭小空间工业设备测温和控制和汽车空调、冰箱、冷柜、以及中低温干燥箱等。
一、引脚图DS18B20引脚定义:(1)DQ为数字信号输入/输出端;(2)GND为电源地;(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)二、DS18B20的主要特性1.1、电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电1.2、DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯1.3、多个DS18B20可以并联在唯一的三线上,实现组网多点测温1.4、DS18B20在使用中不需要任何外围元件1.5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃1.6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温1.7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快1.8、测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力1.9、负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
三、DS18B20的外形和内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20内部结构图四、DS18B20工作原理DS18B20的温度转换时的延时时间由2s 减为750ms。
DS18B20测温原理如图3所示。
DS18B20温度测试程序(51单片机数码管显示)+电路图
DS18B20温度测试程序(51单片机数码管显示)+电路图•下面是电路图采用4位数码管显示程序一共有2个文件:/****************************************************************************** *****************************************ds18b20.h 头文件******************************************************************************* ****************************************/#ifndef _DS18B20_H_#define _DS18B20_H_#include <reg51.h>#define led P1#define ledw P2extern unsigned char f;extern void ds18b20_reset();extern void dela(unsigned char i);extern void ds18b20_write(unsigned char dat);extern unsigned char ds18b20_read();extern unsigned char ds18b20_temp();extern unsigned char ledtab[];#endif/****************************************************************************** **************************************ds18b20.c 文件******************************************************************************* *************************************/#include"ds18b20.h"#define uchar unsigned char#define uint unsigned int#define led P1#define ledw P2uchar ledtab[]={0xc0,0xf9,0xa4, 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};sbit dq=P3^7 ;uchar delay,f;//uchar f;void dela(uchar i) //5us t=5+i*2{while(--i);}void ds18b20_reset(){while(1){dq=1;dq=0;delay=250; //540us延时,当delay=1时延时为2us ,T=2*xwhile(--delay);dq=1;delay=25;while(--delay);while(dq==0){delay=220;while(--delay);if(dq==1)break;}delay=150;while(--delay);break;}}void ds18b20_write(uchar dat) {uchar i=0;for(i=0;i<8;i++){dq=1;dq=0;delay=3;while(--delay);dq=dat&0x01;delay=35;while(--delay);dq=1;dat=dat>>1;}}uchar ds18b20_read(){uchar i=0,m=0;for(i=0;i<8;i++){//m>>=1dq=1;dq=0;delay=4;while(--delay);dq=1;delay=4;while(--delay);if(dq==1)m|=0x01<<i;//m=m|0x80;delay=25;while(--delay);dq=1;delay=1;while(--delay);}return m;}uchar ds18b20_temp(){uchar temp=0,temph=0,templ=0,k=0; ds18b20_reset();ds18b20_write(0xcc);ds18b20_write(0x44);ds18b20_reset();ds18b20_write(0xcc);ds18b20_write(0xbe);templ=ds18b20_read();temph=ds18b20_read();if((temph&0xf80)!=0){f=1;templ=~templ;temph=~temph;k=templ+1;templ=k;if(templ>0xff){temph++;}}elsef=0;templ=templ>>4;temph=temph<<4;temp=templ|temph;return temp;}/****************************************************************************** ************************************main.c 主文件******************************************************************************* ************************************/#include<reg51.h>#include"ds18b20.h"#define uchar unsigned charvoid main(){uchar a=0,b=0,c=0,temp=0;while(1){temp=ds18b20_temp();a=temp/100;b=temp0/10;c=temp;if(f==1){led=0xbf;ledw=1;dela(5000);ledw=0;dela(600);}led=ledtab[c]; ledw=8;dela(5000); ledw=0;dela(600) ;led=ledtab[b]; ledw=4;dela(5000); ledw=0;dela(600) ;led=ledtab[a]; ledw=2;dela(5000);ledw=0;dela(600) ; }}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最近天气热了,想要是做个能显示温度的小设备就好了,于是想到DIY个电子温度计,网上找了很多资料,结合自己的材料,设计了这个用单片机控制的实时电子温度计。
作为单片机小虾的我做这个用了2天时间,当然是下班后,做工不行见谅了。
主要元件用到了单片机STC89C54RD+,DB18B20温度传感器,4为共阳数码管,PNPS8550三极管等。
先上原理图:
洞洞板布局图:
然后就是实物图了:
附上源程序:程序是别人写的,我只是自己修改了下,先谢谢原程序者的无私奉献。
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^4; //温度数据口
sbit wx1=P2^0; //位选1
sbit wx2=P2^1; //位选2
sbit wx3=P2^2; //位选3
sbit wx4=P2^3; //位选4
unsigned 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); //精确延时大于480us
DQ = 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 important
Init_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得实际温度值zhenshu
xs=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就显示小数点了。
delay1(5);
wx2=1;
wx3=0;
P0=table[xs%10]; //显示个位
delay1(5);
wx3=1;
wx4=0;
P0=table[12]; //显示C 字符
delay1(5);
wx4=1;
}
void main()
{
while(1)
{
ReadTemperature();
wenduxianshi();
}
}。