ds18b20温度采集
DS18B20单总线温度采集实验
DS18B20单总线温度采集实验一、实验目的1. 熟悉Keil IDE uVision集成开发环境软件的使用方法。
2. 学习DS18B20 单总线温度传感器的使用。
二、实验内容DS18B20 为单总线12 位(二进制)温度读数。
内部有64 位唯一的ID 编码。
工作电压从 3.0~5.5V。
测量温度范围从-55℃~125℃。
高位±0.0625℃分辨率。
三、实验要求1. 数码管显示温度数据,显示百、十、个位并保留一位小数。
2. 画出程序流程图,并独立编写C51程序。
3. 做好实验前预习,完成proteus仿真和实物搭建。
四、实验硬件电路及芯片特性DS18B20 内部框图:温度寄存器格式:DSl8B20 工作过程中的协议如下:初始化ROM 操作命令存储器操作命令处理数据初始化:单总线上的所有处理均从初始化开始。
单片机将总线拉低至少480μs 然后释放总线,DS18B20 检测到上升沿后在等待15~60μs 后拉低总线,说明器件存在。
拉低持续时间为60~240μs。
读写时序:推荐的读时序: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”命令。
温度分辩率配置:五、实验步骤1. 在Keil IDE u Vision集成开发环境下建立工程文件,编辑源文件、编译、链接并生成目标文件,仿真调试验证结果。
DS18B20温度采集与控制
(3)发送 DS18B20 功能指令。
指令名称 温度转换
指令代码 44H
指令功能 启动 DS18B20 温度转换,最长 750ms,结果存于内部 9 字节 RAM
-1-
写暂存器
4EH
读暂存器 复制暂存器 重调 EEPROM 读供电模式
BEH 48H B8H B4H
发此命令后,可向内 RAM 发 3 个字节,1st 是 TH,2st 是 TL, 3st 配置寄存器 发此命令后,依次读出内 RAM 中 0~8 字节的内容,低位在前。 复制 2、3、4 字节的内容到 EEPROM 中 EEPROM 中的内容恢复到 2、3、4 字节 当 DS18B20 寄生供电时为“0”,外部电源供电为“1”
要想完成一次测温任务,首先需要主 MCU 指挥 DS18B20 进行一次温度转换,待转换完 成后,再让主 MCU 读取 DS18B20 内部 RAM 中的温度数据。具体操作如下:
(1)主 MCU 控制“1-Wire”总线进行复位初始化。参见“对 DS18B20 进行复位初始 化”操作。
(2)主 MCU 发送跳过 ROM 的操作(CCH)命令。 (3)主 MCU 发送转换温度的操作(44H)命令,后面释放总线至少 750 毫秒,让 DS18B20 完成转换的操作。 (4)主 MCU 发出复位操作并接收 DS18B20 的应答(存在)脉冲。 (5)主 MCU 发送跳过 ROM 的操作(CCH)命令。 (6)主 MCU 发送读取 RAM 的命令(BEH),随后主机依次读取 DS18B20 发出的从第 0 一第 8,共九个字节的数据。如果只想读取温度数据,那在读完第 0 和第 1 个数据后即丢 掉(不读)后续字节的内容。 上述操作中,涉及到主 MCU 对 DS18B20 的写(发送)操作和读(读取)操作,下文将 介绍如何完成这两种操作方法。 写操作:写操作周期最少为 60 微秒,最长不超过 120 微秒。写周期开始时,主机先把总 线拉低 1 微秒表示写周期开始。之后主机若想写 0,则继续拉低电平最少 60 微秒直至写周期 结束,然后释放总线为高电平。主机若想写 1,则拉低总线电平 1 微秒后就释放总线为高电 平,一直到写周期结束。 作为从机的 DS18B20 在检测到总线被拉低后等待 15 微秒然后从 15us 到 60us 开始对总 线采样,在采样期内总线为高电平则为 1,若采样期内总线为低电平则为 0。如下图所示。
基于DS18B20的锂动力电池单体温度采集
基于DS18B20的锂动力电池单体温度采集1.DS18B20测温原理DS18B20测温原理如图1所示,在图1中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号发送给计数器1。
高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为计数器2的脉冲输入。
图2中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。
请点击输入图片描述计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在 -55 ℃ 所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值。
请点击输入图片描述由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作必须按协议进行。
操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
因DS18B20采用一线通信接口,所以必须先完成ROM设定,否则记忆和控制功能将无法使用。
首先提供以下功能命令之一:1)读ROM。
2)ROM匹配。
3)搜索ROM。
4)跳过ROM。
5)报警检查。
这些指令操作作用在没有一个器件的64位光刻ROM序列号,可以在挂在一线上多个器件选定某一个器件,同时,总线也可以知道总线上挂有有多少,什么样的设备。
2.基于DS18B20的锂动力电池单体温度采集锂动力电池模组主要由多个单体电芯所组成,通过合理的模组设计,可以通过有限的几个采样点来得到整个锂动力电池模组内电芯的温度。
ds18b20多路温度采集程序
本程序为ds18b20的多路温度采集程序,是我自己参考其他程序后改写而成,可显示4路正负温度值,并有上下限温度报警(声音、灯光报警)。
亲测,更改端口即可使用。
(主要器件:51单片机,ds18b20,lcd显示器)附有proteus仿真图,及序列号采集程序/****上限62度下限-20度****/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit ds=P1^1;sbit rs=P1^4;sbit e=P1^6;sbit sp=P1^0;sbit d1=P1^2;sbit d2=P1^3;ucharlcdrom[4][8]={{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e} ,{0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9},{0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0},{0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7}};unsigned char code table0[]={"TEMPERARTURE:U "}; unsigned char code table1[]={"0123456789ABCDEF"};int f[4];int tvalue;float ftvalue;uint warnl=320;uint warnh=992;/****lcd程序****/void delayms(uint ms)//延时{uint i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);}void wrcom(uchar com)//写指令{delayms(1);rs=0;P3=com;delayms(1);e=1;delayms(1);e=0;}void wrdat(uchar dat)//写数据{rs=1;e=0;P3=dat;delayms(5);e=1;delayms(5);e=0;}void lcdinit()//初始化lcd {delayms(15);wrcom(0x38);delayms(5);wrcom(0x0c);delayms(5);wrcom(0x06);delayms(5);wrcom(0x01);delayms(5); }void display(uchar *p)//显示{while(*p!='\0'){wrdat(*p);p++;delayms(1);}}displayinit()//初始化显示{lcdinit();wrcom(0x80);display(table0);}/****ds18b20程序****/ void dsrst()//ds18b20复位{uint i;ds=0;i=103;while(i>0)i--;ds=1;i=4;while(i>0)i--;}bit dsrd0()//读一位数据{uint i;bit dat;ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i>0)i--;return(dat);}uchar dsrd()//读1个字节数据{uchar i,j,dat;dat=0;for(i=8;i>0;i--){j=dsrd0();dat=(j<<7)|(dat>>1);}return(dat);}void dswr(uchar dat)//写数据{uint i;uchar j;bit testb;for(j=8;j>0;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++;}}}void tmstart()//初始化ds18b20{sp=1;d1=1;d2=1;dsrst();delayms(1);dswr(0xcc);dswr(0x44);}void read_dealtemp()//读取并处理温度{uchar i,j,t;uchar a,b;for(j=0;j<4;j++){dsrst();delayms(1);dswr(0x55);for(i=0;i<8;i++){dswr(lcdrom[j][i]);//发送64位序列号}dswr(0xbe);a=dsrd();b=dsrd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0){d1=1;tvalue=~tvalue+1;wrcom(0xc0);wrdat(0x2d);if(tvalue>warnl){d2=0;sp=0;}else{d2=1;sp=1;}}else{d2=1;wrcom(0xc0);wrdat(' ');if(tvalue>warnh){d1=0;sp=0;}else{d1=1;sp=1;}}if(j==0){wrcom(0x8e); wrdat('2');}if(j==1){wrcom(0x8e);wrdat('3');}if(j==2){wrcom(0x8e);wrdat('4');}if(j==3){wrcom(0x8e);wrdat('5');}ftvalue=tvalue*0.0625;tvalue=ftvalue*10+0.5;ftvalue=ftvalue+0.05;f[j]=tvalue;//温度扩大十倍,精确到一位小数tvalue=f[j];t=tvalue/1000;wrcom(0x80+0x41);wrdat(table1[t]);//显示百位t=tvalue%1000/100;wrdat(table1[t]);//显示十位t=tvalue%100/10;wrdat(table1[t]);//显示个位wrdat(0x2e); //显示小数点儿t=tvalue%10/1;wrdat(table1[t]);//显示小数位delayms(5000);}}/****主函数****/void main(){d1=1;d2=1;sp=1;displayinit();//初始化显示while(1){tmstart();//初始化read_dealtemp();//读取温度}}/****序列号读取程序****/#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit DQ = P1^1; //温度传感器信号线sbit rs = P1^4; //LCD数据/命令选择端(H/L)位声明sbit lcden = P1^6; //LCD使能信号端位声明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; //写0 i = 8;while(i>0)i--; DQ = 1;i++;i++;}}}/* LCD函数:void LCD_WriteCom() *//* 功能:向LCD写入命令*//***********************************************/void LCD_WriteCom(uchar com){rs = 0;P3= 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;P3= 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温度数据采集系统
目录摘要 (2)一、绪论 (3)二、系统方案实现 (3)2.1.设计要求 (3)2.2.设计方案论证 (3)2.3.总体设计框图 (4)三、主要硬件介绍 (4)3. 1.DS18B20 (4)3.1.1 DS18B20的主要特性 (4)3.1.2 DS18B20的外形和内部结构 (5)3.1.3 DS18B20工作原理 (6)3.1.4 高速暂存存储器 (7)3.2 AT89C51 (8)四、软件介绍 (9)4.1 功能概述 (9)4.2 系统软件流程图 (9)4.2.1程序 (9)4.2.2读出温度子程序 (10)4.2.3温度转换命令子程序 (11)4.3具体程序 (11)五、总结 (17)六、设计体会及今后的改进意见 (17)参考文献 (18)摘要本文基于DS18B20设计了一种温度数据采集系统,系统主要由AT89C51单片机,一个DS18B20 数字温度传感器以及一个液晶数码管构成。
软件方面,我们采用keil。
软件对程序进行编写以及调试,硬件方面,我们通过Proteus软件对硬件电路进行仿真以及测试,该系统结构简单,功耗较低,测温范围为- 50℃~ + 255℃。
现场温度直接以"一线总线"的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量。
该系统硬件分为3部分:DS18B20 温度测量模块、单片机模块、显示模块。
关键词:DS18B20、7SEG-MPX4液晶数码管、AT89C51一、绪论在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。
其中,温度控制也越来越重要。
在工业生产的很多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。
采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而大大提高产品的质量和数量。
因此,单片机对温度的控制问题是工业生产中经常会遇到的控制问题。
ds18b20多路温度采集程序
本程序为ds18b20的多路温度采集程序,是我自己参考其他程序后改写而成,可显示4路正负温度值,并有上下限温度报警(声音、灯光报警)。
亲测,更改端口即可使用。
(主要器件:51单片机,ds18b20,lcd 显示器)附有proteus仿真图,及序列号采集程序/****上限62度下限-20度****/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit ds=P1^1;sbit rs=P1^4;sbit e=P1^6;sbit sp=P1^0;sbit d1=P1^2;sbit d2=P1^3;uchar lcdrom[4][8]={{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e}, {0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9},{0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0},{0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7}};unsigned char code table0[]={"TEMPERARTURE:U "}; unsigned char code table1[]={"0123456789ABCDEF"};int f[4];int tvalue;float ftvalue;uint warnl=320;uint warnh=992;/****lcd程序****/void delayms(uint ms)//延时{uint i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);}void wrcom(uchar com)//写指令{delayms(1);rs=0;P3=com;delayms(1);e=1;delayms(1);e=0;}void wrdat(uchar dat)//写数据{rs=1;e=0;P3=dat;delayms(5);e=1;delayms(5);e=0;}void lcdinit()//初始化lcd {delayms(15);wrcom(0x38);delayms(5);wrcom(0x0c);delayms(5);wrcom(0x06);delayms(5);wrcom(0x01);delayms(5); }void display(uchar *p)//显示{while(*p!='\0'){wrdat(*p);p++;delayms(1);}}displayinit()//初始化显示{lcdinit();wrcom(0x80);display(table0);}/****ds18b20程序****/ void dsrst()//ds18b20复位{uint i;ds=0;i=103;while(i>0)i--;ds=1;i=4;while(i>0)i--;}bit dsrd0()//读一位数据{uint i;bit dat;ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i>0)i--;return(dat);}uchar dsrd()//读1个字节数据{uchar i,j,dat;dat=0;for(i=8;i>0;i--){j=dsrd0();dat=(j<<7)|(dat>>1);}return(dat);}void dswr(uchar dat)//写数据{uint i;uchar j;bit testb;for(j=8;j>0;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++;}}}void tmstart()//初始化ds18b20 {sp=1;d1=1;d2=1;dsrst();delayms(1);dswr(0xcc);dswr(0x44);}void read_dealtemp()//读取并处理温度{uchar i,j,t;uchar a,b;for(j=0;j<4;j++){dsrst();delayms(1);dswr(0x55);for(i=0;i<8;i++){dswr(lcdrom[j][i]);//发送64位序列号}dswr(0xbe);a=dsrd();b=dsrd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0){d1=1;tvalue=~tvalue+1;wrcom(0xc0);wrdat(0x2d);if(tvalue>warnl){d2=0;sp=0;}else{d2=1;sp=1;}}else{d2=1;wrcom(0xc0);wrdat(' ');if(tvalue>warnh){d1=0;sp=0;}else{d1=1;sp=1;}}if(j==0){wrcom(0x8e);wrdat('2');}if(j==1){wrcom(0x8e);wrdat('3');}if(j==2){wrcom(0x8e);wrdat('4');}if(j==3){wrcom(0x8e);wrdat('5');}ftvalue=tvalue*0.0625; tvalue=ftvalue*10+0.5;ftvalue=ftvalue+0.05;f[j]=tvalue;//温度扩大十倍,精确到一位小数tvalue=f[j];t=tvalue/1000;wrcom(0x80+0x41);wrdat(table1[t]);//显示百位t=tvalue%1000/100;wrdat(table1[t]);//显示十位t=tvalue%100/10;wrdat(table1[t]);//显示个位wrdat(0x2e); //显示小数点儿t=tvalue%10/1;wrdat(table1[t]);//显示小数位delayms(5000);}}/****主函数****/void main(){d1=1;d2=1;sp=1;displayinit();//初始化显示while(1){tmstart();//初始化read_dealtemp();//读取温度}}/****序列号读取程序****/#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit DQ = P1^1; //温度传感器信号线sbit rs = P1^4; //LCD数据/命令选择端(H/L)位声明sbit lcden = P1^6; //LCD使能信号端位声明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;P3= 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;P3= 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温度采集系统
3.单片机的晶振电路:
4.单片机的复位电路:
三、显示电路
a fg b
ed c h
1.数码管的分类
数码管按段数分为七段数码管和八段数码管,八段
数码管比七段数码管多一个发光二极管单元(多一个小 数点显示);按能显示多少个“8”可分为1位、2位、4 位等等数码管;按发光二极管单元连接方式分为共阳极 数码管和共阴极数码管。共阳数码管是指将所有发光二 极管的阳极接到一起形成公共阳极(COM)的数码管。共 阳数码管在应用时应将公共极COM接到+5V,当某一 字段发光二极管的阴极为低电平时,相应字段就点亮。 当某一字段的阴极为高电平时,相应字段就不亮。共阴 数码管是指将所有发光二极管的阴极接到一起形成公共 阴极(COM)的数码管。共阴数码管在应用时应将公共极 COM接到地线GND上,当某一字段发光二极管的阳极 为高电平时,相应字段就点亮。当某一字段的阳极为低 电平时,相应字段就不亮。
P1口、P2口(P1.0-P1.7,1-8脚;P2.0-p2.7,21-28脚): 都是上拉电阻的8位准双向I/O端口。每一位可以驱动4个LS 型TTL负载。在访问片外EPROM/ROM时,P2口可以输出高 8位地址。
P3口(P3.0-P3.7,10-17脚):P3口是一个带内部上拉电 阻的8位准双向I/O端口。P3每一位都能驱动4个LS型TTL负 载。P3口的引脚还具有第二功能。
P3口线的第二功能入下表所示
口 线 替代的第二功能 P3.0 RXD(串行口输入) P3.1 TXD(串行口输出) P3.2 INT0(外部中断0输入) P3.3 INT1(外部中断1输入) P3.4 T0(定时器0的外部输入) P3.5 T1(定时器1的外部输入) P3.6 WR(片外数据存储器“写选通控制”输出) P3.7 RD(片外数据存储器“读选通控制”输出)
基于DS18B20的无线温度采集系统
电子系统设计实践报告所用仪器、仪表目录at89s52单片机、nrl14l01收发模块、液晶显示模块实践设计任务在子站进行温度采集,然后通过无线网络发送给主站,在主站的液晶显示器上显示出子站当前的温度。
方案设计与论证1温度采集模块方案一:采用瑞士Sensirion公司研制的SHT11型智能化湿度/温度传感器,它采用CMOSens专利技术(CMOS和传感器技术的融合),外形尺寸小。
它具有I2C 总线接口,接口电路简单,并具有数字式输出、免调试、免标定、一致性好的特点。
其电路原理图如图1所示。
因其价格较贵,所以不采用此方案。
图1 SHT11电路原理图方案二:采用DALLAS公司推出的一线式数字温度传感器DS18B20,该芯片的管脚简单,无需外围硬件设备即可进行温度测量,与单片机交换信息仅需一根I/O 口线,多个DS18B20可以并联到3根或2根线上,实现多点测温。
CPU只需1根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可以节省大量的引线和逻辑电路。
温度测量范围为-55~125℃,固有测温分辨率为0.5℃,符合本设计的要求,可编程为9~12位A/D转换精度,用户可自设定非易失性的报警上下限值,支持多点组网功能。
具有负压特性,电源极性接反时,温度计不会因发热而烧毁,只是不能正常工作而已。
被测量温度用符号扩展的16位数字量方式输出,而且其体积较小,方便焊接,因此采用此方案。
其电路图如图2图2 温度采集电路图2显示电路模块方案一:单片机扫描键盘得到功率预置值,通过IOB高8位接口控制选定数码管,IOB低8位接口控制数码管显示,将该值送到LED显示器中显示。
其硬件原理如图3所示。
此方案设备体积大,功耗大,因此不采用此方案。
图3 LED硬件原理图方案二:显示器LCD 如图4所示,选用JHD1602-B,具有体积小、质量轻、功耗低等优点,单片机四条数据线与其相连,数据分两次传送;两条控制线E、R/S 控制LCD 的显示。
综合实验一 18B20温度采集实验.doc
实验一18B20温度采集实验一、实验目的1. 掌握单片机与1-wire(一线器)的通信原理与编程方法;2. 掌握LED动态显示方法;3.了解温度传感器原理;二、实验原理及实验内容1. 实验原理关于18B20工作原理请读者参考DALLAS公司资料。
89S52控制DS18B20 完成温度转换必须经过三个步骤:初始化、ROM操作指令、存储器操作指令。
必须先启动DS18B20开始转换,再读出温度转换值。
本实验系统挂接一个18B20芯片,可使用默认的12位转换精度,外接供电电源,单片机与18B20接口是用单片机的P2.4。
2.实验内容a.程序要求,参考给出的流程图,在Keil编译环境下变成程序,要求采集温度,如果超出报警温度范围则报警,报警通过实验箱上的蜂鸣器实现,报警温度可以通过键盘设置,最后,生成*.HEX文件。
b.通过ISP将生成的*.HEX文件下载到单片机中,允许程序。
c.观测LCD上的显示温度数据,通过键盘操作控制报警温度。
图8-1 DS18B20温度采集系统流程图三、参考程序//DS18B20温度传感器程序 #include <reg52.h> #define Alarm 10 sbit Beep=P3^4;sbit DQ=P2^4; //数据传输线接单片机的相应的引脚 unsigned char tempL=0,tempH=0; //设全局变量 unsigned char flag=0;unsigned int temperature,negtemper; //温度值保存在temperature 里 unsigned char idata addrdat[2]={0x0,0x0};unsigned char tab[]={0xc0,0xf9,0xa4,0xb0, /* 0 1 2 3 4 */ 0x99,0x92,0x82,0xf8,0x80,0x90}; /* 5 6 7 8 9 */unsigned char tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; unsigned char dispbuf[3]={0,0,0}; unsigned char warning=20; bit on=0,off=1;//******************************//延时子程序//**void delay(unsigned int i){ while(i--);}void beep( bit i){ Beep=i;}//*****************************//初始化程序Init_DS18B20(void){ unsigned char x=0;DQ=1; //DQ先置高delay(8); //稍延时DQ=0; //发送复位脉冲delay(85); //延时(>480us)DQ=1; //拉高数据线delay(14); //等待(15~60us)x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1delay(20);} //***********************//读一个字节ReadOneChar(void) //主机数据线先从高拉至低电平1ms以上,再//使数据线升为高电平,从而产生读信号{unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期//之间必须有1ms以上的高电平恢复期unsigned char dat=0;for (i=8;i>0;i--) //一个字节有8位{DQ=1;delay(1);DQ=0;dat>>=1;DQ=1;if(DQ)dat|=0x80;delay(4);}return(dat);}//***********************//写一个字节WriteOneChar(unsigned char dat){ unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。
基于DS18B20的高精度温度采集、显示系统
2、设计分析及系统方案设计通过DS18B20进行小数11位温度转换、采集,通过单片机读取DS18B20采集到的11位温度值进行二进制到十六进制的转换,利用ZLG7290进行八位数码管显示;利用键盘进入中断来设定报警上、下限,当温度高于上限或低于下限时进入报警子程序。
利用键盘进入中断来查看当前设置的温度报警上下限值,利用ZLG7290和数码管来显示。
主程序不断循环采集温度比较,并可随时进入中断来修改温度上下限和查看温度值。
3、外围接口模块硬件电路功能描述1.DS18B20:用于测定温度,测量范围-55~+125,分辨率为0.0625℃,数据格式为二进制补码形式。
2.ZLG7290B:用于数码管动态显示驱动,键盘扫描管理。
能够驱动8位共阴极结构的LED数码管或64位独立的LED,同时还能扫描管理多达64个按键的扫描识别,其中八个键可以作为功能键使用。
接口采用I²C结构。
3.蜂鸣器:这里用作报警,为无源蜂鸣器。
设置DS18B20端口参数THI_WARNING EQU 40HTLI_WARNING EQU 41HTEMPER_FLAG EQU 42H ;温度符号位数据保存区TEMPER_POINT EQU 43H ;温度小数部分数据保存区TEMPER EQU 44H ;温度整数部分数值保存区TEMPER_H EQU 45H ;温度整数部分高位数值保存区TEMPER_L EQU 46H ;温度整数部分低位数值保存区TI_SHOW EQU 47H ;十进制温度整数部分数值保存区T_SAVE EQU 48HTEMPER_NUM EQU 60HFLAG1 BIT 00HDQ BIT P3.3;******************************;设置ZLG7290端口参数;******************************SDA BIT P1.0SCL BIT P1.1WSLA EQU 70HRSLA EQU 71HDISDA EQU 20HDISCON EQU 08H;*********************************ORG 8000HLJMP 8100HORG 8003HLJMP INT_7290;*********************************;初始化部分;*********************************ORG 8100HMOV SP,#60HCLR P1.7LCALL DELAYSETB P1.7;***************************;开中断,设置报警上下限值;**************************MOV TMOD,#11HMOV TL1,#0FCHMOV TH1,#4BHSETB TR1SETB EX0SETB EASETB IT0MOV THI_WARNING,#22HMOV TLI_WARNING,#20H;******************************************************************************;主程序部分;******************************************************************************LP1:LCALL GET_TEMPER ;从DS18B20读取温度数据LCALL TEMPER_COV ;转换读取的温度整数、符号位和小数部分数据并保存LCALL DATA_PRO;数码管显示前对要显示数据的相关处理LCALL LEDSHOW ;数码管显示程序MOV A,TEMPERCJNE A,TLI_WARNING,WAR;判断温度值是否低于报警下限值,低于则报警,不低于则判断WAR:JNC LOOP10;是否大于报警上限值LCALL BUZZL ;蜂鸣器报警程序SJMP LP1LOOP10:CJNE A,THI_WARNING,WAR1;判断温度值是否低于报警下限值,低于则报警,不低于则跳转WAR1:JC LP2LCALL BUZZH ;蜂鸣器报警程序SJMP LP1LP2: LCALL NOTWINKLE;对ZLG7290写入不闪烁控制字LJMP LP1;******************************************************************************;获取DS18B20温度值子程序;******************************************************************************GET_TEMPER:SETB DQBCD:LCALL INIT_1820 JB FLAG1,S22LJMP BCDS22:LCALL DELAY1MOV A,#0CCHLCALL WRITE_1820MOV A,#44HLCALL WRITE_1820LCALL DELAYCBA:LCALL INIT_1820 JB FLAG1,ABCLJMP CBAABC:LCALL DELAY1MOV A,#0CCHLCALL WRITE_1820MOV A,#0BEHLCALL WRITE_1820LCALL READ_18200RETWRITE_1820:MOV R2,#8CLR CWR1:CLR DQMOV R3,#6DJNZ R3,$RRC AMOV DQ,CMOV R3,#23DJNZ R3,$SETB DQNOPDJNZ R2,WR1SETB DQRETREAD_18200:MOV R4,#2MOV R1,#46HRE00:MOV R2,#8RE01:CLR CSETB DQNOPCLR DQNOPNOPSETB DQMOV R3,#2DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00RET;****************************************************************************** ;DS18B20温度值提取整数部分、符号位和小数部分的子程序;******************************************************************************TEMPER_COV:MOV A,#0F0HANL A,TEMPER_LSWAP AMOV TEMPER_NUM,AMOV A,TEMPER_HANL A,#07HSWAP AADD A,TEMPER_NUMMOV TEMPER_NUM,AMOV TEMPER,TEMPER_NUMMOV A,#0FHANL A,TEMPER_LSWAP AMOV TEMPER_POINT,AMOV A,TEMPER_HANL A,#08HSWAP AMOV TEMPER_FLAG,ARET;整数和小数的位偏移数据存储;****************************************************************************** ;30H——37H为数据存储区,其中30H--33H为小数值;34H--35H为整数值,36为百位值,37为符号位值;****************************************************************************** DATA_PRO:MOV 37H,#0AHMOV A,TEMPER_FLAGJZ POSITIVEMOV A,TEMPERCPL AANL A,#7FHADD A,#01HMOV TEMPER,AMOV 37H,#0BH POSITIVE: MOV A,TEMPERCJNE A,64H,SETHUNDREDBIT SETHUNDREDBIT:JC SETHUNDREDBIT1SUBB A,#64HMOV TEMPER,AMOV 36H,#01HSJMP SET1 SETHUNDREDBIT1: MOV 36H,#00HSET1: MOV A,TEMPERMOV B,#10DIV ABMOV 34H,BMOV 35H,AMOV A,TEMPER_POINTCLR CRLC ASWAP ARR AJNZ POINT1MOV 30H,#00HMOV 31H,#00HMOV 32H,#00HMOV 33H,#00HSJMP SHOWPOINT1: DEC AJNZ POINT2MOV 30H,#05HMOV 31H,#02HMOV 32H,#06HMOV 33H,#00HSJMP SHOWPOINT2: DEC AJNZ POINT3MOV 30H,#00HMOV 31H,#05HMOV 32H,#02HMOV 33H,#01HSJMP SHOWPOINT3: DEC AJNZ POINT4MOV 30H,#05HMOV 31H,#07HMOV 32H,#08HMOV 33H,#01HSJMP SHOWPOINT4: DEC AJNZ POINT5MOV 30H,#00HMOV 31H,#00HMOV 32H,#05HMOV 33H,#02HSJMP SHOW POINT5: DEC AJNZ POINT6MOV 30H,#05HMOV 31H,#02HMOV 32H,#06HMOV 33H,#00HSJMP SHOW POINT6: DEC AJNZ POINT7MOV 30H,#00HMOV 31H,#05HMOV 32H,#07HMOV 33H,#03HSJMP SHOW POINT7:MOV 30H,#05HMOV 31H,#07HMOV 32H,#03HMOV 33H,#04H SHOW: JNC SHOW1MOV A,33HADD A,#05H MOV 33H,A SHOW1:RET;****************************************************************************** ;ZLG7290数据显示部分子程序;******************************************************************************LEDSHOW: PUSH 00H PUSH 01H PUSH 02H PUSH 03HPUSH 07MOV DPTR,#LEDSEGCLR AMOV R7,#08HMOV R0,#20HMOV R1,#30H LOOP1:MOV A,@R1MOVC A,@A+DPTR MOV @R0,AINC R1INC R0DJNZ R7,LOOP1MOV A,24HADD A,#01HMOV 24H,ALOOP: MOV R7,#08H MOV R0,#20HMOV R2,#10HMOV R3,#WSLALCALL WRNBYTLCALL DELAY0POP 07HPOP 03HPOP 02HPOP 01HPOP 00HRET;******************************************************************************;延时子程序DELAY0: PUSH 00HPUSH 01HMOV R0,#00H DELAY2: MOV R1,#00H DJNZ R1,$DJNZ R0,DELAY2POP 01HPOP 00HRET DELAY1: MOV R7,#20H DJNZ R7,$RET DELAY: PUSH 00HPUSH 01HMOV R0,#00LP: MOV R1,#00HDJNZ R1,$DJNZ R0,LPPOP 01HPOP 00HRET;****************************************************************************** ;蜂鸣器子程序;******************************************************************************BUZZL:PUSH 04H MOV R4,#200 MOV TL0,#66HMOV TH0,#0FCHSETB TR0LOOP002:JNB TF0,$CLR TF0CPL P3.4MOV TL0,#55HMOV TH0,#0FCHDJNZ R4,LOOP002LCALL TWINKLEPOP 04HRETBUZZH:PUSH 04HMOV R4,#128MOV TL0,#66HMOV TH0,#0FCHSETB TR0LOOP003:JNB TF0,$CLR TF0CPL P3.4MOV TL0,#55HMOV TH0,#0FCHDJNZ R4,LOOP003LCALL TWINKLEPOP 04HRET;****************************************************************************** ;数码管闪烁子程序;******************************************************************************TWINKLE:PUSH 00HPUSH 02HPUSH 03HPUSH 07HMOV 38H,#70HMOV 39H,#0FFHMOV R7,#02HMOV R0,#38HMOV R2,#07HMOV R3,#WSLALCALL WRNBYTMOV 3AH,#00HMOV R7,#01HMOV R0,#3AHMOV R2,#0CHMOV R3,#WSLALCALL WRNBYTPOP 07HPOP 03HPOP 02HPOP 00HRET NOTWINKLE:PUSH 00HPUSH 02HPUSH 03HPUSH 07HMOV 38H,#70HMOV 39H,#00HMOV R7,#02HMOV R0,#38HMOV R2,#07HMOV R3,#WSLALCALL WRNBYTMOV 3AH,#00HMOV R7,#01HMOV R0,#3AHMOV R2,#0CH MOV R3,#WSLA LCALL WRNBYT POP 07HPOP 03HPOP 02HPOP 00H RET;****************************************************************************** ;中断子程序;****************************************************************************** INT_7290:PUSH 00HPUSH 01HPUSH 02HPUSH 03HPUSH 04HPUSH 07HPUSH ACCPUSH PSWLCALL NOTWINKLEMOV 50H,#00HMOV 51H,#00HMOV 52H,#00HMOV 53H,#00HMOV 54H,#00HMOV 55H,#00HMOV 56H,#00HMOV 57H,#00HLOOP_1: CLR CLCALL DISP1JB P3.2,$LCALL INITREADMOV A,29HDEC ACJNE A,#0FH,DOWN ;判断是F键吗,是F关中断退出SJMP TAIL1DOWN: CJNE A,#0EH,DOWN1 ;判断是E键吗,是E显示设定的温度上限MOV A,THI_WARNINGMOV B,#10DIV ABMOV DPTR,#LEDSEGMOVC A,@A+DPTRMOV 51H,AMOV A,BMOVC A,@A+DPTRMOV 50H,AMOV 52H,#12HMOV 53H,#6EHLCALL DISP1JB P3.2,$SJMP TAIL1DOWN1:CJNE A,#0DH,DOWN2 ;判断是D键吗,是D显示设定的温度下限 MOV A,TLI_WARNINGMOV B,#10DIV ABMOV DPTR,#LEDSEGMOVC A,@A+DPTRMOV 51H,AMOV A,BMOVC A,@A+DPTRMOV 50H,AMOV 52H,#12HMOV 53H,#1CHLCALL DISP1JB P3.2,$SJMP TAIL1DOWN2: CJNE A,#0CH,DOWN3 ;判断是C键吗,是C设定的温度下限MOV 50H,#00HMOV 51H,#00HMOV 52H,#12HMOV 53H,#1CHLCALL SET_TLIMITMOV TLI_WARNING,T_SAVEJB P3.2,$SJMP TAIL1DOWN3:CJNE A,#0BH,TAIL1 ;判断是B键吗,是B设定的温度上限MOV 52H,#12HMOV 53H,#6EHLCALL SET_TLIMITMOV THI_WARNING,T_SAVEJB P3.2,$SJMP TAIL1TAIL1: CLR IE0 ;必须清标志POP PSWPOP ACCPOP 07HPOP 04HPOP 03HPOP 02HPOP 01HPOP 00HRETI;****************************************************************************** ;设置报警温度上下限值子程序;****************************************************************************** SET_TLIMIT:LCALL DISP1AGAIN:JB P3.2,$LCALL INITREADMOV A,29HDEC ACJNE A,#0FH,STEP1SJMP TAILSTEP1:CJNE A,#0DH,STEP2SJMP AGAINSTEP2:CJNE A,#0CH,STEP3 SJMP AGAINSTEP3:CJNE A,#0BH,STEP4 JNC AGAINSTEP4:CJNE A,#0AH,STEP5JNC AGAINSTEP5: MOV T_SAVE,AMOV DPTR,#LEDSEGMOVC A,@A+DPTRMOV 51H,ALCALL DISP1 AGAIN1: JB P3.2,$LCALL INITREAD NOPMOV A,29HDEC ACJNE A,#0FH,STEP11 SJMP TAILSTEP11: CJNE A,#0DH,STEP12 SJMP AGAIN1STEP12: CJNE A,#0CH,STEP13 SJMP AGAIN1 STEP13:CJNE A,#0BH,STEP14 SJMP AGAIN1 STEP14:CJNE A,#0AH,STEP15 SJMP AGAIN1STEP15: MOV 50H,AMOV A,T_SAVEMOV B,#10MUL ABADD A,50HMOV T_SAVE,AMOV A,50HMOV DPTR,#LEDSEGMOVCA,@A+DPTRMOV 50H,ALCALL DISP1TAIL:RET;****************************************************************************** ;数码管显示子程序;******************************************************************************DISP1: PUSH 00H PUSH 02HPUSH 03HPUSH 04HPUSH 07HMOV R7,#08HMOV R0,#50HMOV R2,#10HMOV R3,#WSLA LCALL WRNBYT LCALL DELAY POP 07HPOP 04HPOP 03HPOP 02HPOP 00HRET;****************************************************************************** ;读取键值子程序;******************************************************************************INITREAD:MOV R0,#29H MOV R7,#01H MOV R2,#01HMOV R3,#WSLA MOV R4,#RSLA LCALL RDADD RET;****************************************************************************** ;初始化DS18B20子程序;******************************************************************************INIT_1820:SETB DQNOPCLR DQMOV R0,#80HTSR1:DJNZ R0,TSR1SETB DQMOV R0,#25HTSR2:DJNZ R0,TSR2JNB DQ,TSR3LJMP TSR4TSR3:SETB FLAG1 LJMP TSR5TSR4:CLR FLAG1 LJMP TSR7TSR5: MOV R0,#06BH TSR6:DJNZ R0,TSR6 TSR7:SETB DQRET;*********************************;ZLG7290相关子程序;*********************************;(1)带有内部单元地址的多字节写操作子程序 WRNBYT;******************************************************************* ;通用的I2C通讯子程序(多字节写操作);入口参数R7字节数,R0:源数据块首地址;R0原数据块首地址;R2从器件内部子地址;R3:外围器件地址(写);WRBYT、STOP、CACK、STA;******************************************************************* WRNBYT: PUSH PSWPUSH ACCWRADD: MOV A,R3 ;取外围器件地地址(包含r/w=0)LCALL STA ;发送起始信号SLCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,WRADD ;如果应MOV A,R2LCALL WRBYT ;发送内部寄存器首地址LCALL CACK ;检测外围器件的应答信号JB F0,WRADD ;如果应答不正确返回重来WRDA: MOV A,@R0LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,WRADD ;如果应答不正确返回重来INC R0DJNZ R7,WRDALCALL STOPPOP ACCPOP PSWRET;(2)带有内部单元地址的多字节读操作子程序 RDADD;******************************************************************* ;通用的I2C通讯子程序(多字节读操作);入口参数R7字节数;;R0目标数据块首地址;R2从器件内部子地址;;R3器件地址(写);R4器件地址(读);WRBYT、STOP、CACK、STA、MNACK;******************************************************************* RDADD: PUSH PSW ;从PCF8563的02H单元读入7个参数PUSH ACC ;存放于20H-26H单元RDADD1: LCALL STAMOV A,R3 ;取器件地址(写)LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,RDADD1 ;如果应答不正确返回重来MOV A,R2 ;取内部地址LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,RDADD1 ;如果应答不正确返回重来LCALL STAMOV A,R4 ;取器件地址(读)LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,RDADD1 ;如果应答不正确返回重来RDN: LCALL RDBYTMOV @R0,ADJNZ R7,ACKLCALL MNACKLCALL STOPPOP ACCPOP PSWRETACK: LCALL MACKINC R0SJMP RDN;(3)I2C各个信号子程序;********************************************************************** ; 启动信号子程序S;**********************************************************************STA: SETB SDA ;启动信号S SETB SCLNOP ;产生4.7US延时NOPNOPNOPNOPCLR SDA NOP ;产生4.7US延时NOPNOPNOPNOPCLR SCLRET;********************************************************************** ; 停止信号子程序P;*********************************************************************STOP: CLR SDA ;停止信号P SETB SCLNOP ;产生4.7US延时NOPNOPNOPNOPSETB SDA NOP ;产生4.7US延时NOPNOPNOPNOPCLR SCLCLR SDARET;********************************************************************** ; 应答信号子程序 MACKMACK: CLR SDA ;发送应答信号ACK SETB SCLNOP ;产生4.7US延时NOPNOP NOPNOPCLR SCL SETB SDA RET;********************************************************************** ; 非应答法信号子程序MNACK;**********************************************************************MNACK:SETB SDA ;发送非应答信号NACK SETB SCLNOP ;产生4.7US延时NOPNOP NOPNOPCLR SCL CLR SDA RET;********************************************************************** ; 应答检测子程序CACK;**********************************************************************CACK: SETB SDA;应答位检测子程序SETB SCLCLR F0MOV C,SDA ;采样SDAJNC CEND;应答正确时转CENDSETB F0;应答错误时F0置一CEND: CLR SCLRET;********************************************************************** ; 发送一个字节子程序WRBYT;**********************************************************************WRBYT: PUSH 06HMOV R6,#08H;发送一个字节子程序WLP: RLC A ;(入口参数A)MOV SDA,CSETB SCLNOP ;产生4.7US延时NOP NOPNOPNOPCLR SCL DJNZ R6,WLP POP 06H RET;********************************************************************** ; 接收一个字节子程序RDBYTRDBYT: PUSH 06HMOV R6,#08H ;接收一个字节子程序RLP: SETB SDASETB SCL; *******************************************NOP ;!!!!!产生大于15微秒的延时!!!!!!NOP ;注意这是专门为ZLG7290NOP ;添加的20微秒延时部分NOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOP; ********************************************MOV C,SDAMOV A,R2RLC AMOV R2,ACLR SCLDJNZ R6,RLP ;(出口参数R2)POP 06HRET;********************************************************************** LEDSEG:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H,0FEH,0F6H,00H,02H END。
基于DS18B20的温度采集系统
值 的 低 四 位 , 对 MSB 取 低 三 位 作 为温度值的高位, 整个温度的变化 范围为 0~99。
(六)结果显示 将当前的读取的并经过处理的 温 度 值 用 P0 口 和 部 分 P2 口 显 示 到数码管上, 便于观察, 同时在数 码管的右端将手工设定的温度值显 示出来, 便于对比, 通过按键可以 手工设定温度上限。 (七)键盘功能 用 p3.2 和 p3.4 作为按键输入, 实现对温度极限的手工设置, 其中 p3.2 用来实现减值操作, p3.4 完成 增值操作, CPU 将完成预置温度值 和读取温度值的比较, 两者相等则 固定显示当前温度, 否则同时显示 预置温度和读取温度。 (八)控制部分 通 过 P1 口 将 处 理 过 的 信 号 传 送给 DAC0832 进行模拟量的输出, 该 模 拟 量 经 过 LM324 放 大 , 作 为 控制信号输出。 (九)异步通信 通过异步串行接口将处理过的 温 度 信 号 发 送 给 远 端 的 监 控 PC, 采用 8 位异步通信方式, 波特率为
( 张远晖 编校)
26
《 空中交通管理》 2010 年 第 9 期
如 图 1 所 示 为 总 体 设 计 逻 辑 分辨率可达 0.0625℃, 被测温度用
图。
符号扩展 的 16 位 数 字 量 方 式 串 行
三、 系统功能描述
输出; 其工作电源从远端引入; 多
本 系 统 通 过 DS18B20 温 度 传 个 DS18B20 可 以 并 联 到 3 根 或 2
感器完成对温度的采集; 用左端两 根线上, CPU 只需一根端口线就能
并 处 理 过 的 温 度 值 发 送 给 PC, 作 端模拟温 度 信 号 的 采 集 , 以 12 位
Air Traffic Management/2010(9)
基于DS18B20的高分辨率温度数据采集
数据采集 电 子 测 量 技 术 EL ECTRONIC M EASU REM EN T TEC HNOLO GY第32卷第6期2009年6月 基于DS18B20的高分辨率温度数据采集黄 慧 殷兴辉(河海大学计算机及信息工程学院 南京 210098)摘 要:介绍了新型单总线结构温度传感器DS18B20的诸多高性能特点、内部结构及控制时序;在此基础上,建立以C8051F020单片机为处理器结合DS18B20构成了一个温度测量系统,并介绍其硬件组成和软件设计,指出软件编程的重点部分以及获得高分辨率的设定方法;最后使用该系统在较稳定的环境温度下实际测量环境温度,使用MFC编写上位机接受程序,根据串口传至PC的数据,得到实验结果,将实验室数据进行制图证明温度采集系统分辨率达0.0625℃。
该装置适于人们日常生活、工业生产和科学研究领域对温度测量的需要。
关键词:DS18B20;一线温度传感器;C8051F020单片机;温度测量中图分类号:TP212.11 文献标识码:AHigh2resolution temperature data acquisition based on DS18B20Huang Hui Y in Xinghui(College of Computer and information Engineering,Hehai University,Nanjing210098)Abstract:The internal structure and timing control of new12Wire temperature sensor DS18B20with a number of high2 performance features are introduced.On this basis,the C8051F020MCU processor combined DS18B20constitutes a temperature measurement system.Its hardware composition and software design are introduced.The focus of software programming and the access to high2resolution are pointed out.Finally,actual temperature is acquired by the system in more stable environment.According to the data from PC serial by MFC programming,the figure is draw to prove temperature resolution of0.0625℃.The device is suitable for daily life of people,industrial production and scientific research in the field of temperature measurement.K eyw ords:DS18B20;12Wire temperature sensor;C8051F020MCU;temperature measurement0 引 言温度是一种最基本的环境参数,人们的生活与环境的温度息息相关,工业和农业生产中的许多场合对温度有严格要求,如温室养殖场和冷冻室等。
ds18b20工作原理
ds18b20工作原理DS18B20是一种数字温度传感器,它可以通过一根数据线进行温度的采集和传输。
DS18B20工作原理的核心是利用温度对半导体材料电阻的影响来实现温度的测量。
接下来,我们将详细介绍DS18B20的工作原理。
首先,DS18B20内部包含了一个温度传感器芯片,该芯片采用了数字信号输出的方式。
在DS18B20内部,有一个模拟-数字转换器(ADC),它可以将模拟信号转换为数字信号。
当DS18B20受到温度的影响时,芯片内部的电阻会发生变化,进而改变了电压信号的大小。
ADC会将这个模拟信号转换为数字信号,然后通过数据线输出给外部设备。
其次,DS18B20采用了一种叫做“单总线”(One Wire)的通信协议。
这意味着DS18B20只需要一根数据线就可以完成温度的采集和传输。
在通信过程中,DS18B20会将温度数据以数字信号的形式发送给外部设备。
外部设备可以通过读取数据线上的数字信号来获取温度信息。
此外,DS18B20还具有一些特殊的功能,比如温度的精度调节、温度报警功能等。
通过这些功能,DS18B20可以满足不同场景下的温度监测需求。
总的来说,DS18B20的工作原理是基于半导体材料电阻随温度变化的特性,利用ADC将模拟信号转换为数字信号,并通过单总线通信协议将温度数据传输给外部设备。
同时,DS18B20还具有一些特殊的功能,可以满足不同场景下的温度监测需求。
在实际应用中,DS18B20被广泛应用于各种温度监测系统中,比如智能家居、工业自动化等领域。
由于其简单、稳定、精准的特点,DS18B20在温度监测领域具有很高的性价比,受到了广泛的认可和应用。
综上所述,DS18B20是一种基于半导体材料电阻特性的数字温度传感器,其工作原理是通过ADC将模拟信号转换为数字信号,并通过单总线通信协议将温度数据传输给外部设备。
在实际应用中,DS18B20具有简单、稳定、精准的特点,被广泛应用于各种温度监测系统中。
友台半导体有限公司 DS18B20H 单总线温度传感器说明书
特点 ● 单总线接口,节约布线资源● 应用简单,无需额外器件● 转换温度时间500ms● 可编程9~12位数字输出●宽供电电压范围● 每颗芯片有可编程的ID 序列号 ● 用户可自行设置报警值 ● 超强ESD 保护能力(HBM>8000V )● 典型待机电流功耗1µA @3V ●典型换电流功耗0.6mA@3V典型应用● 便携应用,手机与穿戴设备● 温度监控 ●粮情监测● 智能家电系统 ● 水温测量● 建筑、设备或机房内部温度监测系统● 过程监测和控制系统概述是一款高精度的单总线温度测量芯片。
温度传感器的测温范围为-55°C 到+125°C ;根据用户需要通过配置寄存器可以设定数字转换精度和测温速度。
芯片内置4byte 非易失性存储单元供用户使用,2byte 用于高低温报警,另外2byte 用于保存用户自定义信息。
在-10°C 到+85°C 范围内最大误差为±°C 。
用户可自主选择电源供电模式和寄生供电模式。
单总线接口允许多个设备挂在同一总线,该特性使得也非常便于部署分布型温度采集系统。
管脚图和管脚描述34167852GNDDQ VDD MSOP82.5V-5.5V DS18B20H DS18B200.4DS18B20图1 DS18B20框图结构框图图1是DS18B20的原理框图。
64位ROM存储了器件的唯一序列码。
暂存器包含了两个字节的温度寄存器,存储来自于温度传感器的数字输出。
另外,暂存器提供了一高一低两个报警触发阈值寄存器(TH和TL)。
配置寄存器允许用户设定温度数字转换的分辨率为9,10,11或12位。
2个字节的用户可编程E2PROM是非易失性存储,器件掉电时数据不会失去。
DS18B20使用单总线协议,总线通讯通过一根控制信号线实现。
控制线需要一个弱上拉电阻这样所有的器件都通过三态或者开漏极端口(就是DS18B20的DQ引脚)连接到总线上。
温度传感器ds18b20
温度传感器ds18b20温度传感器DS18B201. 简介温度传感器DS18B20是一种数字温度传感器,可用于测量环境温度。
该传感器由Maxim Integrated公司生产,并在许多应用中得到了广泛的应用,如家庭自动化、气象站、工业控制等。
DS18B20采用了数字化接口,并具有高精度、可编程分辨率和低功耗等特点。
2. 技术规格DS18B20的技术规格如下:- 工作电源:3.0V至5.5V- 测量范围:-55°C至+125°C- 分辨率:可编程为9、10、11或12位- 精度:±0.5°C(在-10°C至+85°C范围内)- 通信接口:一线式数字接口3. 工作原理DS18B20采用了一线式数字接口,这意味着它只需要一根数据线进行通信。
传感器从控制器接收命令,并通过数据线将温度数据发送回控制器。
传感器的数据线同时起到了供电的作用。
DS18B20通过内部的精密温度传感器测量环境温度。
传感器将温度转换为数字信号,并通过数据线将其发送给控制器。
传感器的分辨率可以根据需要进行编程,从而在精度和响应速度之间进行平衡。
4. 使用方法使用DS18B20温度传感器非常简单。
首先,将传感器的电源引脚连接到可用的电源引脚,并将数据线连接到控制器的GPIO引脚。
然后,通过控制器向传感器发送命令,请求温度数据。
传感器将在一段时间后将温度数据发送回控制器,控制器可以读取这些数据并进行相应的处理。
DS18B20还具有一些特殊的命令,如启动温度转换、复位传感器和读取ROM代码等。
这些命令可以通过与控制器的通信来实现。
5. 应用领域温度传感器DS18B20在许多应用中得到了广泛的应用。
以下是一些常见的应用领域:- 家庭自动化:DS18B20可以用于监测室内温度,从而实现智能化的温控系统。
- 气象站:DS18B20可以用于监测室外温度,并将数据发送到气象站系统进行分析和显示。
DS18B20温度采集报告
南京信息工程大学滨江学院课程论文(单片机原理及应用)题目DS18B20 温度采集报告学生姓名仇丽华学号20082305902院系滨江学院电子工程专业电子信息工程指导教师朱艳萍概述硬件电路的单片机芯片采用AT89S52芯片,进行数据处理。
数据采集部分的传感器采用DS18B20芯片数字温度传感器。
,用七段LED数码显示器显示测量的温度值,超过预定的温度值则会产生报警。
硬件电路设计1、AT89S52芯片AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程Flash 存储器。
使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。
2、DS18B20芯片(1) DS18B20简介DS18B20是由美国DALLAS公司生产的单线数字温度传感器芯片。
与传统的热敏电阻有所不同,DS18B20可直接将被测温度转化为串行数字信号,以供单片机处理,它还具有微型化、低功率、高性能、抗干扰能力强等优点。
通过编程,DS18B20可以实现9~12位的温度读数。
信息经过单线接口送入DS18B20或从DS18B20送出,因此从微处理器到DS18B20仅需连接一条信号线和地线。
读、写和执行温度变换所需的电源可以由数据线本身提供,而不需要外部电源。
(2) DS18B20的引脚功能DS18B20的引脚(图7-10),其功能如表7-8所示。
(3) DS18B20的主要特点❖采用单线技术,与单片机通信只需一个引脚;❖通过识别芯片各自唯一的产品序列号从而实现单线多挂接,简化了分布式温度检测的应用;❖实际应用中不需要外部任何器件即可实现测温;❖可通过数据线供电,电压的范围在3~5.5V;❖不需要备份电源;❖测量范围为-55~+125℃,在-10~+85℃范围内误差为0.5℃;❖数字温度计的分辨率用户可以在9位到12位之间选择,可配置实现9~12位的温度读数;❖将12位的温度值转换为数字量所需时间不超过750ms;❖用户定义的,非易失性的温度告警设置,用用户可以自行设定告警的上下限温度。
实验2.1 ZigBee之DS18B20温度传感器数据采集实验
图二-1 DS1820温度传感数据采集
返回数据:01 09 CB 01 00 D3 30 00 02 0x0149
49 01 6A,则返回温度数据负荷为
4. 利用测试结果转换工具,将返回数据转换成实际温度值,如所示。具体转换公式可 参考DS18B20传感器介绍。
图二-2 DS18B0温度采集结果分析
数据负荷长度:0x02,表示返回的数据负荷长度为2个字节 数据负荷:0x00A2,表示+10.125℃ 温度数载DS18B20温度传感器,采集温度。 1. 运行“ZigBee基础实验平台软件”,打开串口及“ZigBee串口调试工具”。 2. 发送读取DS18B20板载温度指令 3. 选择“板载温度”,发送指令02 07 CB 01 00 D3 30 00 00 2C,如图二-1所 示。
(四)实验准备
• DS18B20温度传感器数据采集指令格式 (1)发送读取DS18B20温度传感器数据请求 02 07 CB 01 00 D3 30 00 00 09
串口接收对象:0xCB //表示协调器 网络地址:0x0001 //表示读取网络地址为0001节点的数据,若需要采集其它节点 的板载温度,则需要将网络地址更改为其它的节点的网络地址。 数据对象:0xD3 //表示读取终端节点信息 命令标识:0x0030 //表示读取终端节点的板载温度 数据负荷长度为0 (2)返回温度数据: 02 09 CB 01 00 D3 30 00 02 A2 00 0C
实验一 DS18B20温度传感器数据采集实验
上海企想信息技术有限公司
(一)实验目的 了解单片机数据采集的工作原理,了解DS18B20温度传感器工作原 理; 学习和掌握通过ZigBee网络通信,利用上位机软件读取DS18B20温 度传感数据。 (二)实验设备 ZigBee套件:协调器、传感控制节点 传感器:DS18B20温度传感器 操作台:提供电源、PC、USB口、RS232串口、RJ45以太口 软件: ZigBee基础实验平台软件 (三)实验内容 利用“ZigBee基础实验平台软件”读取板载DS18B20温度传感器数据, 并对采集结果进行分析,具体DS18B20采集温度换算方法请参考介绍。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
“盛群杯”单片机大赛设计报告
温度读取部分:
采用数字温度传感器DS18B20。
DS18B20为数字式温度传感器,无需其他外加电路,直接输出数字量。
可直接与单片机通信,读取测温数据,电路简单。
如图1.2.2 所示。
DS18B20与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,因而使用DS18B20可使系统结构更趋简单,可靠性更高。
他在测温精度、转换时间、传输距离、分辨率等方面带来了令人满意的效果
2.2.1 温度采集部分设计
本系统采用半导体温度传感器作为敏感元件。
传感器我们采用了DS18B20单总线可编程温度传感器,来实现对温度的采集和转换,直接输出数字量,可以直接和单片机进行通讯,大大简化了电路的复杂度。
DS18B20应用广泛,性能可以满足题目的设计要求。
DS18B20的测温电路如图2.2.1所示。
图2.2.1 DS18B20测温电路
(1)DSI8B20的测温功能的实现:
其测温电路的实现是依靠单片机软件的编程上。
当DSI8B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的0,1字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0.062 5℃/LSB形式表示。
温度值格式如表2.2.1所示,其中“S”为标志位,对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变换为原码,再计算十进制值。
DSI8B20完成温度转换后,就把测得的温度值与 TH做比较,若T>TH或T<TL,则将该器件内的告警标志置位,并对主机发出的告警搜索命令做出响应。
表2.2.1 DS18B20温度值格式表
(2)、DSl820工作过程中的协议
初始化 -> RoM操作命令 -> 存储器操作命令-> 处理数据
①初始化单总线上的所有处理均从初始化开始
② ROM操作命令总线主机检测到DSl820的存在便可以发出ROM操作命令之一这些命令如表2.2.2所示
表2.2.2 ROM操作命令表
③存储器操作命令如表2.2.3所示
表2.2.3 存储器操作命令表
(3)温度转换算法及分析
由于DS18B20转换后的代码并不是实际的温度值,所以要进行计算转换。
温度高字节(MS Byte)高5位是用来保存温度的正负(标志为S的bit11~bit15),高字节(MS Byte)低3位和低字节来保存温度值(bit0 ~ bit10)。
其中低字节(LS Byte)的低4位来保存温度的小数位(bit0 ~ bit 3)。
由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取小数舍入,保留一位小数即可。
也就说,本系统的温度精确到了0.1度。
算法核心:首先程序判断温度是否是零下,如果是,则DS18B20保存的是温度的补码值,需要对其低8位(LS Byte)取反加一变成原码。
处理过后把DS18B20的温度Copy到单片机的RAM中,里面已经是温度值的Hex码了,然后转换Hex码到BCD码,分别把小数位,个位,十位的BCD码存入RAM中。
3.1读取DS18B20温度模块子程序
每次对DA18B20操作时多要按造DS18B20工作过程中的协议进行。
初始化-> RoM操作命令-> 存储器操作命令-> 处理数据程序流程图如图3.1.1所示。
3.2 数据处理子程序
由于DS18B20转换后的代码并不是实际的温度值,所以要进行数据处理。
由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取四舍五入,保留一位小数即可。
也就说,本系统的温度精确到了0.1度。
首先程序判断温度是否是零下,如果是,则DS18B20保存的是温度的补码值,需要对其低8位(LS Byte)取反加一变成原码。
处理过后把DS18B20的温度Copy到单片机的RAM 中,里面已经是温度值的Hex码了,然后转换Hex码到BCD码,分别把小数位,个位,十位的BCD码存入RAM中。
数据处理子程序流程图如图3.2.1所示。
图3.1.1 读取DS18B20温度子程序流程图
温度传输调试过程:
开始时初始化成功,从机有应答。
但在读取温度时
数据读出全为0xff ,说明从机没回应,或说从机没发数据到总线上,认为传输时序有问题,因为使用的命令是没问题的
开始时通信只能一次成功,第二次即出错。
第二次初始化失败
数据传输有问题,读出的数据为0x50,0x05
重新修改时序延时后,能得到正确的温度数据,但正确的温度读数是在断点设置的情况下,得到的。
在全速运行时,却无法通信,即从机没发数据到总线或从机就没接收数据。
大致判断情况为温度转换没完成。
因为温度转换过程中,不响应总线,向总线发数据,延长时间继续调试。
但延长时间过长,编译器死机。
经过调整温度获取正确。
采取的方案为使用定时器,在开启温度,过一段时间,再去读取温度。