温度传感器 程序

合集下载

温度采集与显示设计程序详解

温度采集与显示设计程序详解

温度采集与显示设计程序详解程序流程如下:1.初始化温度传感器:连接温度传感器至控制器,并进行初始化。

这包括设置传感器接口和模式,设置精度等。

2.采集温度数据:通过温度传感器读取环境温度数据,并将其存储在变量中。

3.数据处理:对采集到的温度数据进行一定的处理,例如进行单位转换、滤波处理等。

4.数据显示:将处理后的温度数据通过显示器显示出来。

可以使用LCD液晶显示器、LED数码管、数码管等不同的显示器设备。

5.重复采集与显示:循环执行步骤2-4,以实现实时监测和显示环境温度。

实现细节如下:1. 初始化温度传感器:根据具体采用的温度传感器型号和接口类型,选择相应的初始化函数进行初始化。

例如,如果使用OneWire接口的DS18B20温度传感器,可以使用Arduino库中的OneWire库进行初始化。

2.采集温度数据:通过读取温度传感器的输出,可以获取到环境温度的原始数据。

具体的采集方法和代码取决于所采用的传感器和控制器类型。

3.数据处理:在采集到的温度数据上进行一定的处理,以满足实际需求。

例如,对于DS18B20传感器输出的12位数据,可以通过位运算进行小数点处理,从而得到实际的温度值。

4. 数据显示:根据设计需求选择相应的显示器设备,并使用相应的显示库函数将处理后的温度数据显示出来。

例如,使用LiquidCrystal库操作LCD液晶显示器进行显示。

5. 重复采集与显示:使用循环语句,如while循环,不断执行数据采集和显示的步骤,以实现实时监测和显示环境温度。

可以根据实际需求设置采集和显示的时间间隔。

总结:温度采集与显示设计主要包括温度传感器的初始化、温度数据的采集、数据的处理和显示器的选择与操作。

通过合理的程序设计和选择适合的硬件设备,可以实现实时监测和显示环境温度。

具体的实现细节和程序代码取决于具体的传感器和控制器类型,以及所采用的显示器设备。

(完整版)读取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码}。

18B20温度传感器温度计程序

18B20温度传感器温度计程序

18B20温度传感器温度计程序2008-9-261.实验任务本实验实现的是通过18B20温度传感器读回温度并在6位数码管上显示。

精度为,范围为2.实验目的学会使用单片机控制18B20此类单总线器件。

原理及引脚介绍DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。

因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。

DS18B20产品的特点(1)、只要求一个端口即可实现通信。

(2)、在DS18B20中的每个器件上都有独一无二的序列号。

(3)、实际应用中不需要外部任何元器件即可实现测温。

(4)、测量温度范围在-55。

C到+125。

C之间。

(5)、数字温度计的分辨率用户可以从9位到12位选择。

(6)、内部有温度上、下限告警设置。

TO-92封装的DS18B20的引脚排列见下图,其引脚功能描述见下:1.GND地信号2.DQ数据输入/输出引脚。

开漏单总线接口引脚。

当被用着在寄生电源下,也能够向器件提供电源。

3.VDD可选择的VDD引脚。

当工作于寄生电源时,此引脚必需接地。

18B20管脚图4.实验原理图实验原理图5. 18B20操纵命令字指令说明读ROM(33H) 读18B20的序列号匹配ROM(55H) 继续读完64位序列号的命令,用于多个18B20时定位跳过ROM(CCH) 此命令执行后的在存储器打操作针对在线所有18B20 搜ROM(F0H) 识别总线上各器件的编码,为操作各器件做准备报警搜索(ECH) 公温度越限的器件对此命令作出响应指令说明温度转换(44H) 启动在线18B20做温度AD转换读数据(BEH) 从高速暂存器读9位温度值和CRC值写数据(4EH) 将数据写入高速暂存的第3和第4字节中复制(48H) 将高速暂存器中第3和第4字节复制到EERAM读EERAM(B8H) 将EERAM内容写入高速暂存器中第3和第4字节读电源供电方式(B4H) 了解18B20的供电方式6. 实验源程序WENDU_L EQU 29H;用于保留读出温度的低字节WENDU_H EQU 28H;用于保留读出温度的高字节XIAOSHU EQU 27H;用于保留温度的小数部份ZHENGSHU EQU 26H;用于保留整数部份BIAOZHI BIT 50H;18B20检查位1为存在,0为不存在ORG 0000HAJMP MAINORG 0030HMAIN:MOV SCON,#00HACALL DUWENACALL ZHENGHEACALL BCDACALL DISPACALL TIME1AJMP MAIN;---------------------------------------------------------------------------------------------------------------------------------------- ;读温度子程序;---------------------------------------------------------------------------------------------------------------------------------------- DUWEN:SETBACALL FUWEI ;读温度之前必需先复位JB BIAOZHI,CUNZAI;查看标志位看18B20是不是存在,1为存在,0为不存在RET ;不存在那么返回CUNZAI: ;存在那么开始读温度MOV A,#0CCH ;跳过ROM匹配ACALL XIE ;调写子程序MOV A,#44H ;发出温度转换命令ACALL XIE ;调写子程序ACALL TIME1 ;调1秒延时,等等AD转换完成,此刻分辨率为12位,温度最大转换时刻为750MSACALL FUWEI ;读温前需要复位MOV A,#0CCH ;跳过ROM匹配ACALL XIEMOV A,#0BEH ;发读温度命令ACALL XIEACALL DUSHU ;将闱出数据读回CLRRET;------------------------------------------------------------------------------------------------------------------------------;复位子程序;18B20复位需要将数据位拉低500us;18B20收到信号后要等待16-60us,然后发出60-240us的低脉冲;------------------------------------------------------------------------------------------------------------------------------- FUWEI:SETBNOPCLRMOV R0,#3INTE:MOV R1,#107 ;设一个537us延时KK1: DJNZ R1,KK1DJNZ R0,INTESETB ;拉高数据线,等待回应NOPNOPNOPMOV R0,#25 ;INTE1:JNB ,INTE2 ;延时延时50us等待18B20回应,假设返回低脉冲那么说明18B20存在DJNZ R0 ,INTE1AJMP INTE3 ;通过反映时刻而没检测到18B20的存在,那么跳转去清零标志位INTE2:SETB BIAOZHI ;检测到18B20存在,置1标志位CLRAJMP INTE4INTE3:CLR BIAOZHI ;没检测到18B20,清零标志位AJMP INTE5INTE4:MOV R0,#120 ;延时240us,确定回应信号已发完KK: DJNZ R0,KKINTE5:SETBRET;---------------------------------------------------------------------------------------------------------------------------------------- ;写18B20子程序;----------------------------------------------------------------------------------------------------------------------------------------- XIE:MOV R2,#8 ;写计数寄放器,一共有8位数据CLR CLP:CLRMOV R3,#6 ;设一个延时LL1:DJNZ R3,LL1RRC A ;右循环,先输出低位MOV ,CMOV R3,#23 ;设延时LL: DJNZ R3,LL ;SETBNOPNOPDJNZ R2,LP ;判定是不是完成数据传送SETB ;完成传送拉高数据位RET;----------------------------------------------------------------------------------------------------------------------------------------- ;从18B20中读出温度数据子程序;-----------------------------------------------------------------------------------------------------------------------------------------DUSHU:MOV R4,#2 ;设读回数据个数指针MOV R1,#WENDU_L ;把温度数据低位存入29HRE: MOV R2,#8 ;设数据长度指针RE1: CLR CSETBNOPNOP CLRNOPNOPNOPSETBMOV R3,#9 DJNZ R3,$ MOV C, MOV R3,#23NN: DJNZ R3,NNRRC ADJNZ R2,RE1MOV @R1,A DEC R1 ;高位存入28H DJNZ R4,RERET;---------------------------------------------------------------------------------------------------------------------------------;数据整合子程序;温度源数据的整合,读出数据的高字节的低四位决定温度的整数部份;低字节的低四位决定小数部份;----------------------------------------------------------------------------------------------------------------------------- ZHENGHE:MOV A,#0FHANL A,WENDU_L ;低字节的低四位就是小数部分MOV XIAOSHU,A ;取得小数部份MOV A,WENDU_L ;将高字节的低四位移入低字节的高4位,MOV C,40H ;获得的新字节就是整数部分的数据RRC AMOV C,41HRRC AMOV C,42HRRC AMOV C,43HRRC AMOV ZHENGSHU,ARET;----------------------------------------------------------------------------------------------------------------------------------------- ;显示数据拆解程序、显示程序、延时程序;----------------------------------------------------------------------------------------------------------------------------------------;数据拆解程序BCD:MOV A,ZHENGSHU MOV B,#10DIV ABMOV 50H,AMOV 51H,BMOV A,XIAOSHUMOV R0,#52HMOV R2,#4D0:MOV B,#10MUL ABMOV B,#16DIV ABMOV @R0,AINC R0MOV A,BDJNZ R2,D0RET ;----------------------------------- ;显示程序;---------------------------------- DISP:ACALL TIMEMOV R7,#6MOV DPTR,#TABMOV R0,#55HLP1:MOV A ,@R0;MOVC A,@A+DPTRCJNE R7,#2,NE1ANL A,#07FHNE1:MOV SBUF,AJNB TI ,$CLR TIDEC R0DJNZ R7,LP1RET;---------------------------------------- ;延时程序;---------------------------------------- TIME1:MOV R6,#4LOOP2:MOV R5,#250LOOP1:ACALL D1MSDJNZ R5,LOOP1DJNZ R6,LOOP2RETTIME:MOV R6,#200LOOP3:ACALL D1MSDJNZ R6,LOOP3RETD1MS:MOV R7,#250LOOP0:NOPNOPNOPDJNZ R7,LOOP0RETTAB:DB 0C0H,0F9H,0A4H,0B0H DB 99H, 92H, 82H, 0F8HDB 80H, 90H, 88H, 83HDB 0C6H,0A1H,86H, 8EHDB 0FFHEND。

DS18B20程序

DS18B20程序

Lesson11-1:数字温度传感器DS18B20,采用3位数码管显示,仿真通过#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit DS=P2^2; // 定义DS18B20接口uchar time=100;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//不带小数点编码。

uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点编码。

void mdelay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}///////功能:串口初始化,波特率9600,方式1///////void Init_Com(void){TMOD = 0x20;PCON = 0x00;SCON = 0x50;TH1 = 0xFd;TL1 = 0xFd;TR1 = 1;}void dsreset(void) // DS18B20初始化{uint i;DS=0; // 首先拉低,要求480usi=103;while(i>0)i--;DS=1; // 上升沿,要求15~60usi=4;while(i>0)i--;}void rxwait()//等待应答脉冲{uint i;while(DS);while(~DS);i=8;while(i>0)i--;}bit tmpreadbit(void) //读一位{uint i;bit dat;DS=0;i++; //1us延时DS=1;//15us内,主机必须停止将DS引脚置低i++;i++; //15us延时dat=DS;i=8;while(i>0)i--;//读时隙不低于60us延时return (dat);}uchar tmpread(void) // 读一个字节{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tmpreadbit();dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DA T里}return(dat); //将一个字节数据返回}void tmpwritebyte(uchar dat) //写一个字节到DS18B20里{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb) //写1部分{DS=0;i++;i++;DS=1;i=8;while(i>0)i--;}else{DS=0; //写0部分i=8;while(i>0)i--;DS=1;i++;i++;}}}void tmpchange(void) //发送温度转换命令{dsreset();//初始化DS18B20rxwait(); //等待应答脉冲mdelay(1); //延时tmpwritebyte(0xcc); // 跳过序列号命令tmpwritebyte(0x44); //发送温度转换命令}uint tmp() //获得温度{float tt;uchar a,b;uint temp; // 存放温度值dsreset();rxwait();//等待应答脉冲mdelay(1);tmpwritebyte(0xcc);tmpwritebyte(0xbe); //发送读取数据命令a=tmpread(); //连续读两个字节数据b=tmpread();temp=b;temp<<=8; //出厂默认设置为12位分辨率temp=temp|a; //两字节合成一个整型变量。

TMP100数字温度计及其程序设计

TMP100数字温度计及其程序设计

TMP100数字温度计及其程序设计1.1 基本参数及引脚说明 1.基本参数TMP100是德州仪器(TI )公司的一款数字温度传感器芯片。

主要特点有: 1) 工作电压范围:2.7V~5.5V2) 超低功耗:45μA (待机时0.1μA ) 3) 接口方式:I2C 二线串行接口 4) 可编程分辨率:9-Bits 到 12-Bits 5) 操作频率: 100 KHz /400KHz/3.4MHz6) 精度:测量温度在-25℃~85℃时,为±2℃在-55℃~125℃时,为±3℃ 2. 从器件地址、引脚说明及封装表x.1 TMP100引脚描述引脚名称引脚编号功能描述引脚封装图SCL 1 I2C 时钟输入 GND 2电源地ADD1 3 地址输入端1V+ 4 电源正极 ADD0 5 地址输入端0SDA 6 I2C 数据口表x.2 TMP100 SLA VE ADDRESS更多资料请登陆 本站主要探讨A VR 、51、及Freescale8位单片机。

提供常用电1ADD1 ADD0 器件从地址R/W0 0 1001 000 0悬空1001 0010 1 1001 010 1 0 1001 100 1悬空1001 1011 1 1001 110悬空0 1001 0111:READ 0:WRITE111悬空 1 10011.2 TMP100内部寄存器描述1.2.1 指针寄存器TMP100内部共有5个寄存器,一个指针寄存器(Point Register)和四个数据寄存器(Temperature Register、Configuration Register、TL及TH Register)。

对数据寄存器的选择是通过指针寄存器的低2位(P1和P0)来决定的。

指针寄存器的位描述,及P1、P0的设置对应具体的数据寄存器分别见表x.3和x.4。

表x.3 Point Register的各位(8-Bits)P7 P6 P5 P4 P3 P2 P1 P00 0 0 0 0 0 RegisterBits表x.4 数据寄存器的指针地址P1 P0 数据寄存器0 0 温度寄存器(只读,保存温度值)0 1 配置寄存器(可读写)1 0 临界温度下限寄存器(可读写)1 1 临界温度上限寄存器(可读写)1.2.2 配置寄存器表x.5 Configuration Register的各位(8-Bits)D7 D6 D5 D4 D3 D2 D1 D0 OS/ALERT R1 R0 F1 F0 POL TM SD对各位的描述如下:SD:置1时,TMP100进入SHUT DOWN模式;置0时,进入连续温度转换模式;OS/ALERT:TMP100进入SHUT DOWN模式下,该位被置1后,将启动一次温度的测量转换,完成后继续进入SHUT DOWN模式;R1、R0:用于选择TMP100的分辨率,共四种,9-Bits、10-Bits、11-Bits、12-Bits,更多资料请登陆本站主要探讨A VR、51、及Freescale8位单片机。

ds18b20程序设计傻瓜式讲解

ds18b20程序设计傻瓜式讲解

ds18b20程序设计傻瓜式讲解
DS18B20 是一款数字温度传感器,可以直接读出被测温度,并采用 9 位数字量串行输出。

下面是一个简单的 DS18B20 程序设计讲解:
1. 初始化
在 DS18B20 通信过程中,首先需要初始化数据线,即将其置为高电平。

在初始化时,需要持续至少 480 微秒的高电平。

2. 跳过 ROM
在 DS18B20 中,每个传感器都有一个唯一的 ROM 序列号,可以通过跳过ROM 操作来避免对 ROM 进行操作。

具体操作是先发出一个低电平,然后持续至少 60 微秒的高电平。

3. 发送命令
在跳过 ROM 后,需要向传感器发送命令。

常用的命令有温度转换命令和读取温度命令。

温度转换命令是 0x44,读取温度命令是 0xBE。

4. 读取数据
在发送命令后,需要等待传感器响应。

传感器响应的标志是数据线上的低电平。

在低电平持续约 60-240 微秒后,数据线将变为高电平,此时可以开始读取数据。

每次读取一位数据后,需要将数据线置为低电平,等待传感器响应。

5. 数据解析
DS18B20 的数据由 9 位数字量组成,其中最高位是符号位。

如果最高位为0,则表示温度为正数;如果最高位为 1,则表示温度为负数。

其余 8 位为温度值,可以通过一定的计算公式将其转换为实际温度值。

以上就是 DS18B20 的程序设计流程。

需要注意的是,在实际应用中,还需要考虑数据传输的校验、错误处理等问题。

DS18B20温度传感器实训教程

DS18B20温度传感器实训教程
c.添加温度传感器控制程序temp.c
(2)程序编写、编译。
a.编写主函数程序main.c如下:
#include "reg52.h"
#include"temp.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
2硬件连接3程序烧入芯片1选择单片机型号串口号打开程序文件关闭单片机电源再点击下载程序然后打开电源程序显示下载操作成功即可
DS18B20
1、
1、掌握DS18B20温度传感器设计与制作及其特性;
2、熟练KeiluVision5软件及程序烧入软件基础运用;
3、了解并使用单片机开发试验仪做基础实验。
4、学会基础的C51单片机程序编写并看懂较为复杂的程序。
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc);//跳过ROM操作命令
Ds18b20WriteByte(0xbe);//发送读取温度命令
}
/*******************************************************************************
for(j=8; j>0; j--)
{
DSPORT = 0;//先将总线拉低1us
i++;
DSPORT = 1;//然后释放总线
i++;
i++;//延时6us等待数据稳定
bi = DSPORT;//读取数据,从最低位开始读取

DS18B20温度传感器程序

DS18B20温度传感器程序

DS18B20温度传感器程序#include "DS18B20.h"uchar TMPL,TMPH;sbit DQ=P2^3;uchar DS18B20_Reset(){uchar x;DQ=1 ; //数据线拉高DQ=0; //数据线拉低Delay_700us(); //延时480us-960usDQ=1; //数据线拉低Delay_30us(); //延时15us-60usx=DQ; //读取此时数据线的值while(!DQ); //直到DQ为高return x; //返回复位结果}uchar DS18B20_readbit(){ bit x ;uchar i;DQ=1; //数据线拉高i++; //延时2微秒DQ=0; //数据线拉低Delay_6us(); //延时6微秒DQ=1; //数据线拉高i++;i++; //延时4微秒x=DQ; //读数据线状态Delay_50us();//延时50微秒return (x); //返回数值void DS18B20_writebit(uchar aa){ uchar i;DQ=1; //将数据线拉高i++; //延时大于1微秒DQ=0; //将数据线拉低i++; //延时大于1微秒DQ=aa; //写入数据Delay_50us(); //延时使写周期在60-120微秒之间DQ=1;}uchar DS18B20_readbyte(){uchar i,j,dat;dat=0;j=1;for(i=0;i<8;i++){if(DS18B20_readbit()){dat=dat+(j<<i);}}return (dat);}void DS18B20_writebyte(uchar dat){uint temp;uchar j;for(j=0;j<8;j++)temp=dat>>j;temp=temp&0x01;DS18B20_writebit(temp) ;}}bit DS18B20_readpower(){bit x;while(DS18B20_Reset()); //复位,通信前必须复位DS18B20_writebyte(0xcc);DS18B20_writebyte(0xb4); //读供电方式命令x=DQ;Delay_10us();return x;}void DS18B20_SetResolution(unsigned char res) {switch (res){case 9:res=0;break;case 10:res=1;break;case 11:res=2;break;case 12:res=3;break;}while(DS18B20_Reset()); //复位,通信前必须复位DS18B20_writebyte(0x4e); //写暂存器指令DS18B20_writebyte(0xff); //此值被写入THDS18B20_writebyte(0xff); //此值被写入TLDS18B20_writebyte(0x1f|(res<<5)); //设置精度0 res[1-0] 11111}long DS18B20_GetTemperature(){ long wendu;while(DS18B20_Reset());DS18B20_writebyte(0xcc);//跳过ROMDS18B20_writebyte(0x44);//温度转换while(DS18B20_Reset());DS18B20_writebyte(0xcc);//跳过ROMDS18B20_writebyte(0xbe);//读暂存器TMPL=DS18B20_readbyte();TMPH=DS18B20_readbyte();wendu=TMPH<<8|TMPL;wendu=wendu*0.0625;return wendu;}DS18B20.H#ifndef _DS18B20_H_#define _DS18B20_H_#include "delay.h"#include#define uchar unsigned char#define uint unsigned intuchar DS18B20_Reset();uchar DS18B20_readbit();void DS18B20_writebit(uchar aa);uchar DS18B20_readbyte();void DS18B20_writebyte(uchar dat);bit DS18B20_readpower();void DS18B20_SetResolution(unsigned char res); long DS18B20_GetTemperature();#endif</i);。

单片机控制的温度传感器C语言程序

单片机控制的温度传感器C语言程序
temp_h= Readbyte(); //存储温度高字节值(其中高五位为符号位)
EA = 1;
}
/*数据转换*/
void DigitalConvert()
{
uchar total = 0;
tempsign = (temp_h >> 7) & 0x01; //得出符号位
if(tempsign == 0)//正数的处理方法
{
uint i = 0;
bit b = 0;
DO = 0; //产生读时隙
i++;//维持低电平至少1us
DO = 1; //1us以上后拉高
Delayus(2); //延时8us,DO下降沿15内ds18b20输出的数据才有效
b = DO; //读取数据
Delayus(40);//每个读时隙至少持续60us
}
/*写一个字节*/
void Writebyte(uchar byte_to_write)
{
uchar i = 0;
uchar j = 0;
bit write_bit = 0;
for(j=0; j<8; j++)
{
write_bit =(byte_to_write & 0x01);
if(write_bit == 1) //写1
return(b);
}
/*读取一个字节*/
uchar Readbyte()
{
uchar byte_read = 0;
uchar i, j;ቤተ መጻሕፍቲ ባይዱ
for(i=0; i<8; i++)
{
j = Readbit();

温度传感器 程序

温度传感器  程序

第4章系统程序的设计4.1 系统设计内容系统程序主要包括主程序、读出温度子程序、温度转换命令子程序、计算温度子程序、测量序列号子程序、显示数据刷新子程序等。

4.1.1主程序主程序主要功能是负责温度的实时显示、读出处理DS18B20的测量温度值。

主程序流程图如图4-1所示:开始初始化调用显示子程序读取并显示序列号显示当前四路温度图4-1 主程序流程图4.1.2读出温度子程序读出温度子程序的主要功能是读出RAM中的9字节。

在读出时须进行CRC 校验,校验有错时不进行温度数据的改写。

读出温度子程序流程图如图4-2所示:图4-2 读出温度子程序流程图4.1.3 温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时,转换时间约为750ms 。

在本程序设计中,采用1s 显示程序延时法等待转换的完成。

温度转换命令子程序流程图如图4-3所示:图4-3 温度转换命令子程序流程图 4.1.4计算温度子程序计算温度子程序将RAM 中读取值进行BCD 码的转换运算,并进行温度值正负的判定。

计算温度子程序流程图如图4-4所示: 发DS18B20复位命发跳过ROM 命令发温度转换开始命令结束 开始复位DS18B20 发跳过ROM 命令 发出温度转换命转换完毕 复位DS18B20 发匹配ROM 命令发1个DS18B20序列读温度值存入储存器 指向下一个延时N Y图4-4 计算温度子程序流程图4.1.5 温度数据的计算处理方法从DS18B20读取出的二进制值必须转换成十进制值,才能用于字符的显示。

DS18B20的转换精度为9~12位,为了提高精度采用12位。

在采用12位转换精度时,温度寄存器里的值是以0.0625为步进的,即温度值为寄存器里的二进制值乘以0.0625,就是实际的十进制温度值。

通过观察表4-1可以发现,一个十进制与二进制间有很明显的关系,就是把二进制的高字节的低半字节和低字节的高半字节组成一字节,这个字节的二进制化为十进制后,就是温度值的百、十、个位字节,所以二进制值范围是0~F ,转换成十进制小数就是0.0625的倍数(0~15倍)。

PN结温度传感器及测温电路原理

PN结温度传感器及测温电路原理

PN结温度传感器及测温电路原理温度传感器是通过物体随温度变化而改变某种特性来间接测量的。

不少材料、元件的特性都随温度的变化而变化,所以能作温度传感器的材料相当多。

温度传感器随温度而引起物理参数变化的有:膨胀、电阻、电容、而电动势、磁性能、频率、光学特性及热噪声等等。

随着生产的发展,新型温度传感器还会不断涌现。

由于工农业生产中温度测量的范围极宽,从零下几百度到零上几千度,而各种材料做成的温度传感器只能在一定的温度范围内使用。

具体可参考本站文章:常用的测温传感器的种类与测温范围及常用温度传感器的比较及选型。

温度传感器的种类较多,我们主要介绍PN结温度传感器及应用电路。

PN结温度传感器工作原理晶体二极管或三极管的PN结的结电压是随温度而变化的。

例如硅管的PN结的结电压在温度每升高1℃时,下降-2mV,利用这种特性,一般可以直接采用二极管(如玻璃封装的开关二极管1N4148)或采用硅三极管(可将集电极和基极短接)接成二极管来做PN结温度传感器。

这种传感器有较好的线性,尺寸小,其热时间常数为0.2—2秒,灵敏度高。

测温范围为-50—+150℃。

典型的温度曲线如图1所示。

同型号的二极管或三极管特性不完全相同,因此它们的互换性较差。

应用电路(一)图(2)是采用PN结温度传感器的数字式温度计,测温范围-50—150℃,分辨率为0.1℃,在0—100℃范围内精度可达±1℃。

图中的R1,R2,D,W1组成测温电桥,其输出信号接差动放大器A1,经放大后的信号输入0—±2.000V 数字式电压表(DVM)显示。

放大后的灵敏度10mV/℃。

A2接成电压跟随器。

与W2配合可调节放大器A1的增益。

通过PN结温度传感器的工作电流不能过大,以免二极管自身的温升影响测量精度。

一般工作电流为100—3 00mA。

采用恒流源作为传感器的工作电流较为复杂,一般采用恒压源供电,但必须有较好的稳压精度。

精确的电路调整非常重要,可以采用广口瓶装入碎冰渣(带水)作为0℃的标准,采用恒温水槽或油槽及标准温度计作为100℃或其它温度标准。

温度传感器18B20程序,超全注释

温度传感器18B20程序,超全注释

#include "reg51.H"#include "stdio.h"#include "intrins.h"sbit DQ=P1^4; //接18B20的数据口#define uchar unsigned char#define uint unsigned intuint temp; //温度值variable of temperature/*****************DS18B20******************/void Init_Ds18b20(void) //DS18B20初始化send reset and initialization command{DQ = 0; //单片机拉低总线delay10us(60); //精确延时,维持至少480usDQ = 1; //释放总线,即拉高了总线delay10us(20); //此处延时有足够,确保能让DS18B20发出存在脉冲。

}uchar Read_One_Byte() //读取一个字节的数据read a byte date//读数据时,数据以字节的最低有效位先从总线移出{uchar i = 0;uchar dat = 0;for(i=8;i>0;i--){DQ = 0; //将总线拉低,要在1us之后释放总线//单片机要在此下降沿后的15us内读数据才会有效。

_nop_(); //至少维持了1us,表示读时序开始dat >>= 1; //让从总线上读到的位数据,依次从高位移动到低位。

DQ = 1; //释放总线,此后DS18B20会控制总线,把数据传输到总线上delay10us(2); //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分if(DQ) //控制器进行采样{dat |= 0x80; //若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0}delay10us(4); //此延时不能少,确保读时序的长度60us。

温度传感器C代码

温度传感器C代码

#incl‎u de<r‎e g52.‎h>#d‎e fine‎ucha‎r uns‎i gned‎char‎#def‎i ne u‎i nt u‎n sign‎e d in‎tsbi‎t DQ=‎P2^0;‎//ds1‎8b20与‎单片机连接‎口sbi‎t RS=‎P1^0;‎sbit‎RW=P‎1^1;‎s bit ‎E N=P1‎^2;u‎n sign‎e d ch‎a r co‎d e st‎r1[]=‎{"tem‎p erat‎u re: ‎"};u‎n sign‎e d ch‎a r co‎d e st‎r2[]=‎{" ‎‎‎"};‎u char‎data‎disd‎a ta[5‎];ui‎n t tv‎a lue;‎//温度值‎ucha‎r tfl‎a g;//‎温度正负标‎志/**‎*****‎*****‎*****‎*****‎***lc‎d1602‎程序***‎*****‎*****‎*****‎*****‎***/ ‎v oid ‎d elay‎1ms(u‎n sign‎e d in‎t ms)‎//延时1‎毫秒(不够‎精确的)‎{unsi‎g ned ‎i nt i‎,j;‎ for‎(i=0;‎i<ms;‎i++)‎ f‎o r(j=‎0;j<1‎00;j+‎+);}‎void‎wr_c‎o m(un‎s igne‎d cha‎r com‎)//写指‎令//{‎dela‎y1ms(‎1);‎ RS=‎0;‎RW=0‎;‎E N=0;‎P‎0=com‎;‎d elay‎1ms(1‎);‎EN=1‎;‎d elay‎1ms(1‎);‎EN=0‎;}v‎o id w‎r_dat‎(unsi‎g ned ‎c har ‎d at)/‎/写数据/‎/{‎ de‎l ay1m‎s(1);‎R‎S=1;‎ RW‎=0;‎ EN=‎0;‎P0=d‎a t;‎ del‎a y1ms‎(1);‎ EN‎=1;‎ del‎a y1ms‎(1);‎ EN‎=0;}‎void‎lcd_‎i nit(‎)//初始‎化设置//‎{‎dela‎y1ms(‎15);‎ wr‎_com(‎0x38)‎;dela‎y1ms(‎5);‎ wr_‎c om(0‎x08);‎d elay‎1ms(5‎);‎wr_c‎o m(0x‎01);d‎e lay1‎m s(5)‎;‎w r_co‎m(0x0‎6);de‎l ay1m‎s(5);‎w‎r_com‎(0x0c‎);del‎a y1ms‎(5);‎}voi‎d dis‎p lay(‎u nsig‎n ed c‎h ar *‎p)//显‎示//{‎whil‎e(*p!‎='\0'‎){w‎r_dat‎(*p);‎p++;‎dela‎y1ms(‎1);}‎}in‎i t_pl‎a y()/‎/初始化显‎示{ l‎c d_in‎i t();‎‎w r_co‎m(0x8‎0);d‎i spla‎y(str‎1);w‎r_com‎(0x80‎+0x40‎);di‎s play‎(str2‎);‎}/*‎*****‎*****‎*****‎*****‎*****‎****d‎s1820‎程序***‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*/ vo‎i d de‎l ay_1‎8B20(‎u nsig‎n ed i‎n t i)‎//延时1‎微秒{‎ wh‎i le(i‎--);‎}voi‎d ds1‎820rs‎t()/*‎d s182‎0复位*/‎{‎ uns‎i gned‎char‎x=0;‎D‎Q = 1‎;‎‎//DQ‎复位‎dela‎y_18B‎20(4)‎; //延‎时‎D Q = ‎0; ‎‎ //D‎Q拉低‎ del‎a y_18‎B20(1‎00); ‎//精确延‎时大于48‎0us‎ DQ ‎= 1; ‎‎ /‎/拉高‎dela‎y_18B‎20(40‎);‎}‎ucha‎r ds1‎820rd‎()/*读‎数据*/‎{ un‎s igne‎d cha‎r i=0‎;‎u nsig‎n ed c‎h ar d‎a t = ‎0;‎for ‎(i=8;‎i>0;i‎--)‎{ ‎D Q = ‎0; //‎给脉冲信号‎‎d at>>‎=1;//‎右移‎ DQ ‎= 1; ‎//给脉冲‎信号‎ if(‎D Q)‎ da‎t|=0x‎80; ‎//或‎ de‎l ay_1‎8B20(‎10);‎}‎r etur‎n(dat‎);}‎v oid ‎d s182‎0wr(u‎c har ‎w data‎)/*写数‎据*/{‎u nsig‎n ed c‎h ar i‎=0;‎ fo‎r (i=‎8; i>‎0; i-‎-)‎{ DQ‎= 0;‎‎DQ =‎wdat‎a&0x0‎1;‎ de‎l ay_1‎8B20(‎10);‎‎D Q = ‎1;‎ wd‎a ta>>‎=1;‎ }}‎read‎_temp‎()/*读‎取温度值并‎转换*/‎{ucha‎r a,b‎;ds1‎820rs‎t(); ‎ds‎1820w‎r(0xc‎c);//‎*跳过读序‎列号*/‎d s182‎0wr(0‎x44);‎//*启动‎温度转换*‎/ds1‎820rs‎t(); ‎ds‎1820w‎r(0xc‎c);//‎*跳过读序‎列号*/‎d s182‎0wr(0‎x be);‎//*读取‎温度*/‎a=ds1‎820rd‎();b‎=ds18‎20rd(‎);tv‎a lue=‎b;tv‎a lue<‎<=8;‎t valu‎e=tva‎l ue|a‎;‎if(t‎v alue‎<0x0f‎f f)‎ tfl‎a g=0;‎‎e lse‎ {t‎v alue‎=~tva‎l ue+1‎;tfl‎a g=1;‎}‎tval‎u e=tv‎a lue*‎(0.62‎5);//‎温度值扩大‎10倍,精‎确到1位小‎数ret‎u rn(t‎v alue‎);}‎/****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎***/ ‎ vo‎i d ds‎1820d‎i sp()‎//温度值‎显示{ ‎u char‎flag‎d at;‎ di‎s data‎[0]=t‎v alue‎/1000‎+0x30‎;//百位‎数‎ dis‎d ata[‎1]=tv‎a lue%‎1000/‎100+0‎x30;/‎/十位数‎‎d isda‎t a[2]‎=tval‎u e%10‎0/10+‎0x30;‎//个位数‎‎disd‎a ta[3‎]=tva‎l ue%1‎0+0x3‎0;//小‎数位‎‎ if(‎t flag‎==0)‎‎f lagd‎a t=0x‎20;//‎正温度不显‎示符号‎ e‎l se‎‎flag‎d at=0‎x2d;/‎/负温度显‎示负号:-‎‎if(d‎i sdat‎a[0]=‎=0x30‎)‎{dis‎d ata[‎0]=0x‎20;//‎如果百位为‎0,不显示‎i‎f(dis‎d ata[‎1]==0‎x30)‎ {‎d isda‎t a[1]‎=0x20‎;//如果‎百位为0,‎十位为0也‎不显示‎ }‎ }‎ w‎r_com‎(0xc0‎);‎wr_d‎a t(fl‎a gdat‎);//显‎示符号位‎ w‎r_com‎(0xc1‎);‎ wr_‎d at(d‎i sdat‎a[0])‎;//显示‎百位‎ wr_‎c om(0‎x c2);‎‎w r_da‎t(dis‎d ata[‎1]);/‎/显示十位‎‎w r_co‎m(0xc‎3);‎ wr‎_dat(‎d isda‎t a[2]‎);//显‎示个位‎ wr‎_com(‎0xc4)‎;‎wr_d‎a t(0x‎2e);/‎/显示小数‎点‎wr_c‎o m(0x‎c5);‎ w‎r_dat‎(disd‎a ta[3‎]);//‎显示小数位‎}‎/***‎*****‎*****‎*****‎**主程序‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎/ voi‎d mai‎n(){‎init‎_play‎();//‎初始化显示‎w‎h ile(‎1){r‎e ad_t‎e mp()‎;//读取‎温度‎ ds1‎820di‎s p();‎//显示‎}}‎。

单片机DS18B20温度传感器C语言程序含CRC校验

单片机DS18B20温度传感器C语言程序含CRC校验

单片机中使用DS18B20温度传感器C语言程序(参考1)/******************************************************************************** DS18B20 测温程序硬件:AT89S52(1)单线ds18b20接 P2.2(2)七段数码管接P0口(3)使用外部电源给ds18b20供电,没有使用寄生电源软件:Kei uVision 3**********************************************************************************/ #include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp一定要声明为 int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码/*延时函数*/void TempDelay (uchar us){ while(us--); }void delay(uint count) //延时子函数{ uint i;while(count){ i=200;while(i>0)i--;count--; } }/*串口初始化,波特率9600,方式1 */void init_com(){ TMOD=0x20; //设置定时器1为模式2TH1=0xfd; //装初值设定波特率TL1=0xfd;TR1=1; //启动定时器SM0=0; //串口通信模式设置SM1=1;// REN=1; //串口允许接收数据PCON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}/*数码管的显示 */void display(uint temp){ uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=table[bai]; //显示百位dula=1; //从0到1,有个上升沿,解除锁存,显示相应段dula=0; //从1到0再次锁存wela=0;P0=0xfe;wela=1;wela=0;delay(1); //延时约2msP0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1); }/*****************************************时序:初始化时序、读时序、写时序。

温度传感器程序流程图

温度传感器程序流程图
据 循环显示各通道 扫描键盘 单通道显示
8 路数据采样子程序
开始 置通道数 置存储区首地址 调 16 次采集取平均
存数据 指向下一个通道 指向下一个存储单元
8 路通道采集完 结束
控制程序流程图
开始 采集数据
循环显示方式
扫描按键
有键按下吗
是 1 键按下吗 是 2 键按下吗 是 3 键按下吗 是 4 键按下吗 是 5 键按下吗 是 6 键按下吗 是 7 键按下吗 是 8 键按下吗
结束
退出
调 1 通道数据显示 调 2 通道数据显示 调 3 通道数据显示 调 4 通道数据显示 调 5 通道数据显示 调 6 通道数据显示 调 7 通道数据显示 调 8 通道数据显示
运算子程序流程图
开始 取要运算的数 先做减法,减去 07FFH 调乘法子程序,乘 125 采用移位法,除 256 二进制转 BCD 码

数字温度传感器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所示。

温度传感器代码

温度传感器代码

}
void main()
{
uchar a;
do
{
tmpchange();
// delay(200);
for(a=10;a>0;a--)
{
display(tmp());
if(temp>300|temp<270)
fm=0;
else
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}
void display(uint temp) //显示程序
{
uchar A0,A1,A2,A2t,A3,ser;
ser=temp/10;
SBUF=ser;
A0=temp/1000;
A1=(temp/100)%10;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
P1=0x01;
P0=table[A0];//显示百位
delay(1);
P1=0X02;
void tmpchange(void) //DS18B20 begin change
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus
tmpwritebyte(0x44); // initiates a single temperature conversion
b=tmpread();
temp=b;
temp<<=8; //two byte compose a int variable
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第4章系统程序的设计
4.1 系统设计内容
系统程序主要包括主程序、读出温度子程序、温度转换命令子程序、计算温度子程序、测量序列号子程序、显示数据刷新子程序等。

4.1.1主程序
主程序主要功能是负责温度的实时显示、读出处理DS18B20的测量温度值。

主程序流程图如图4-1所示:
图4-1 主程序流程图
4.1.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节。

在读出时须进行CRC 校验,校验有错时不进行温度数据的改写。

读出温度子程序流程图如图4-2所示:
图4-2 读出温度子程序流程图
4.1.3 温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时,转换时间约为750ms。

在本程序设计中,采用1s显示程序延时法等待转换的完成。

温度转换命令子程序流程图如图4-3所示:
图4-3 温度转换命令子程序流程图
4.1.4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定。

计算温度子程序流程图如图4-4所示:
图4-4 计算温度子程序流程图
4.1.5 温度数据的计算处理方法
从DS18B20读取出的二进制值必须转换成十进制值,才能用于字符的显示。

DS18B20的转换精度为9~12位,为了提高精度采用12位。

在采用12位转换精度时,温度寄存器里的值是以0.0625为步进的,即温度值为寄存器里的二进制值乘以0.0625,就是实际的十进制温度值。

通过观察表4-1可以发现,一个十进制与二进制间有很明显的关系,就是把二进制的高字节的低半字节和低字节的高半字节组成一字节,这个字节的二进制化为十进制后,就是温度值的百、十、个位字节,所以二进制值范围是0~F,转换成十进制小数就是0.0625的倍数(0~15倍)。

这样需要4位的数码管来表示小数部分。

实际应用不必这么高的精度,采用1位数码管来显示小数,可以精确到0.1℃。

表4.5 二进制与十进制的近似对应关系表
4.2 源程序
4.2.1 DS18B20的各条ROM命令
(1)Read ROM[33H]。

这条命令允许总线控制器独到DS18B20的8位系列编码、唯一的序列号和8位CRC码。

只要在总线上存在单只DS18B20时,才能使用该命令。

如果总线上有不止一个从机,则当所有从机试图同时传送信号时就会发生数据冲突(漏极开路连在一起形成相“与”的效果)。

(2)Match ROM[55H].这是一条匹配ROM命令,后跟64位ROM序列,让总线控制器在多点总线上定位一只特定的DS18B20.只有与64位ROM序列完全匹配的DS18B20才能响应随后的存储器操作.所有与64位ROM序列不匹配的从机都将等待复位脉冲.这条命令在总线上有单个或多个器件时都可以使用.
(3)Skip ROM[0CCH].这条命令允许总线控制器不用提供64位ROM编码就使用存储器操作命令,在单点总线情况下,可以节省时间.如果总线上不止一个从机,则在Skip ROM命令之后跟着发一条读命令.由于多个从机同时传送信号,所以总线上就会发生数据冲突(漏极开路下拉效果相当于相“与”)。

(4)Search ROM[0F0H]。

当一个系统初次启动时,总线控制器可能并不知道单线总线上有多少个器件或它们的64位ROM编码。

搜索ROM命令允许总线控制器用排除法识别总线上的所有从机的64位编码。

(5)Alarm Search[0ECH]。

这条命令的流程与Search ROM相同。

然而,只有在最近一次测温后遇到符合报警条件的情况下,DS18B20才会响应这条命令。

报警条件定义为温度高于TH或低于TL。

只要DS18B20不掉电,报警状态将一直保持,直到再一次测得的温度值达不到报警条件。

(6)Write Scratchpad[4EH]。

这条命令向DS18B20的暂存器TH和TL中写入数据。

可以在任何时刻发出复位命令来中止写入。

(7)Read Scratchapad[0BEH]。

这条命令读取暂存器的内容。

读取将从第一
字节开始,一直进行下去,直到第九字节(CRC)读完。

如果不想读完所有字节,则控制器可以在任何时间发出复位命令来中止读取。

(8)Copy Scratchpad[48H]。

这条命令把暂存器的内容拷贝到DS18B20的E²PROM存储器里,即把温度报警触发字节存入非易失性存储器里。

如果总线控制器在这条命令之后跟着发出读时间隙,而DS18B20又忙于把暂存器拷贝到E²PROM存储器,则DS18B20就会输出一个0;如果拷贝结束,则DS18B20输出1。

如果使用寄生电源,则总线控制器必须在这条命令发出后立即启动强上拉,并最少保持10ms。

(9)Convert T[44H]。

这条命令启动一次温度转换而无需其他数据。

温度转换命令被执行后DS18B20保持等待状态。

如果总线控制器在这条命令之后跟着发出读时间隙,而DS18B20又忙于做时间转换,则DS18B20将在总线上输出0;如果温度转换成功,则输出1。

如果使用寄生电源,则总线控制器必须在发出这条命令后立即启动强上拉,并保持500ms以上时间。

(10)Recall E²[0B8H]。

这条命令把报警触发器里的值拷贝回暂存器。

这种拷贝操作在DS18B20上电时自动执行,这样器件一上电暂存器里马上就存在有效的数据了。

若在这条命令发出之后发出读数据隙,器件会输出温度转换忙的标识:0表示忙;1表示完成。

(11)Read Power Supply[0B4H]。

若把这条命令发给DS18B20后发出读时间隙,器件会返回它的电源模式0:0表示寄生电源;1表示外部电源。

相关文档
最新文档