1、基于 单片机和DS18B20的温度采集系统目录第1章 概述. 2第2章 测温器件原理和特性 . 3 2.1 DS18B20工作原理 32.2 DS18B20特性 . 4第3章 硬件电路设计. 5 3.1 测温电路的原理. 53.2 部分接口电路原理与设计. 53.3 测温电路总体的电路设计. 7第4章 软件电路设计. 84.1 程序主要部分. 84.2完整的程序. 9第5章 安装与调试. 95.1 电路参数的选取与安装. 95.2 调试. 9第6章 总结. 10参考文献. 11附录1 硬件系统电路. 12附录2 完整的程序. . 13第1章 概述DS18B20是美国DALLAS半导体公司继DS
2、1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现912位的数字值读数方式。可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。因而使用DS18B20可使系统结构更趋简单,可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。21世纪是电子的世纪,电子
3、产业带来的革命成为世界争相发展高新技术产业的亮点。预计2008年世界电子行业将形成50万亿美元的产值。电子产品已经深入到各个领域甚至进入到平常百姓家里。随着电子技术的发展,数字温度计的种类可谓五花八门,最近一种简易数字温度计的出现马上风靡大江南北,深受消费者青睐。它外形小巧便携式设计,可放在任何地方。该产品已经投放市场,很快轰动神州大地,消费者争相购买,很多家庭也纷纷在各自家门外挂起了这样的智能温度计,具有非常大的市场前景。第2章 测温器件原理和特性21 DS18B20工作原理DS18B20的测温原理如图2.1所示,图中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减
4、法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在 -55 所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到
5、减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度,这就是DS18B20的测温原理。图2.1温度测量电路原理图另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)发ROM功能命令发存储器操作命令处理数据。各种操作的时序图与DS1820相同,可参看文献2。22 DS18B20的特性1独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。 2. 在使用中不需要任何外围元件。3. 可用数
6、据线供电,电压范围:+3.0 +5.5 V。4. 测温范围:-55 +125 。固有测温分辨率为0.5 。 5. 通过编程可实现912位的数字读数方式。6. 用户可自设定非易失性的报警上下限值。7. 支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。8 . 负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常作。第3章 硬件电路设计3.1测温电路的原理如图3.1所示,模拟量的温度首先经过温度采集传感器即DS18B20,并在单片机的控制处理下,发送初始化命令,写入控制字,读出相应的转化数据,最后经过相应的处理送到显示系统上显示。图3.1 测温系统框图3.2 部分接
7、口电路原理与设计3.2.1 DS18B20测温过程与电路设计由于DS18B20 采用的是单总线传输方式,即在一根数据线实现数据的双向传输,而对单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。该协议定义了几种信号的时序:初始化时序(dsInit()实现)、读时序(readByte()、写时序(writeByte()。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收,数据和命令的传输都是低位在先,进而完成对数据的采集。电路设计可
8、以参看图4.2 关于DS18B20详细的引脚功能描述如下:1、GND 地信号;2、DQ数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下,此引脚可以向器件提供电源;漏极开路, 常态下高电平。 通常要求外接一个约5k的上拉电阻。 3、VCC可选择的VCC 引脚。电压范围:35.5V; 当工作于寄生电源时,此引脚必须接地。图3.2 DS18B20接口电路3.2.2单片机工作过程与电路设计单片机是指一个集成在一块芯片上的完整计算机系统。它具有一个完整计算机所需要的大部分部件:CPU、内存、内部和外部总线系统。同时集成诸如通讯接口、定时器,实时时钟等外围设备。在内部ROM中载入程序既可以实现对其的
9、操作控制。我们使用了AT89S52这款单片机,它具有内部ROM空间大,工作速度快等优点,便于以后的升级扩展,具体的技术细节请参看技术手册。现在主流的MCS-51单片机要想正常工作必须配备复位和时钟电路,复位脚必需在振荡器起振后至少保持两个机器周期复位电平。也就是说,复位脚(RST)复位电平保持时间应包含VCC的建立时间、振荡器起振时间和至少两个机器周期时间。本次设计采用最基本的上电复位电路,具体参数和连接请参看图3.3。另外的时钟电路则为整个系统提供了系统的时基,主要有一个晶振来起振,另外两个电容可以增强时钟电路的稳定性,具体参数和连接图请参看图3.4。图3.3 单片机复位电路图3.4单片机时
10、钟电路3.2.3 液晶显示电路设计为了保证连接的简单和方便我们使用了一款82的字符型LCD,具体型号为VT082A它具有体积小、接口简单、功率损耗低和使用寿命长等许多优点,在各种设计中得到了广泛的使用。它的操作时序完全符合6800的8位并行接口时序。具体的控制字可以参考手册,操作的时序如图3.5所示:图3.5液晶接口时序3.3 测温电路总体的电路设计经过以上论述我们以AT89S52单片机为例,电路采用正常供电方式,当DS18B20处于写存储器操作和温度A/D变换操作时,总线上须有强的上拉,上拉开启时间最大为10 s。只要在数据线上加一个上拉电阻4.7 k,另外2个脚分别接电源和地即可。显示部分
11、并没有采用数码管,而是使用了82型字符LCD。(硬件电路图见附录1)第4章 软件设计41程序主要部分程序主要部分如下:详细完整的程序请参看附录。void Delay_Us(int i) /微秒延时程序void Check_Bf(void) /LCD读忙函数void Lcd_W(unsigned char dat,unsigned char cd) /LCD写命令或数据函数void Lcd_Init(void) /LCD初始化函数void dsInit() /DS18B20初始化函数void dsWait() /DS18B20等待函数bit readBit() /向DS18B20读取一位数据un
12、signed char readByte()/读取一字节数据, 通过调用readBit()来实现void writeByte(unsigned char dat) /向DS18B20写入一字节数据void sendChangeCmd()/向DS18B20发送温度转换命令int getTmpValue() /获取当前温度值void display(int v) /调用液晶显示函数void main(void) /主函数 unsigned char i; Lcd_Init(); /调用液晶初始化函数 while(1)/ sendChangeCmd(); /启动温度转换 for(i = 0; i 7
13、)&1); Delay_Us(20); void Lcd_W(unsigned char dat,unsigned char cd) Check_Bf(); RS=cd; /cd=0为指令,为1为数据 RW=0; EN=1; LCD_P=dat; EN=0; /下降沿有效 void Lcd_Init(void) Lcd_W(0x38,0); Lcd_W(0x08,0); Lcd_W(0x01,0); Lcd_W(0x0f,0); Lcd_W(0x06,0); Lcd_W(0x80,0); /通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值, 目前显示范围: -55 +125度
14、/延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时10ms. void delay(unsigned int i) unsigned int j; while(i-) for(j = 0; j 0) i-; DQ = 1; /产生一个上升沿, 进入等待应答状态 i = 4; while(i0) i-; void dsWait() unsigned int i; while(DQ); while(DQ); /检测到应答脉冲 i = 4; while(i 0) i-; /向DS18B20读取一位数据 /读一位, 让DS18B20一小周期低电平, 然后两小周期高电平, /之后DS1
15、8B20则会输出持续一段时间的一位数据 bit readBit() unsigned int i; bit b; DQ = 0; /写1, 将DQ拉低15us后, 在15us60us内将DQ拉高, 即完成写1 if(b) DQ = 0; i+; i+; /拉低约16us, 符号要求1560us内 DQ = 1; i = 8; while(i0) i-; /延时约64us, 符合写时隙不低于60us要求 else /写0, 将DQ拉低60us120us DQ = 0; i = 8; while(i0) i-; /拉低约64us, 符号要求 DQ = 1; i+; i+; /整个写0时隙过程已经超
16、过60us, 这里就不用像写1那样, 再延时64us了 void sendChangeCmd()/向DS18B20发送温度转换命令 dsInit(); /初始化DS18B20, 无论什么命令, 首先都要发起初始化 dsWait(); /等待DS18B20应答 delay(1); /延时1ms, 因为DS18B20会拉低DQ 60240us作为应答信号 writeByte(0xcc); /写入跳过序列号命令字 Skip Rom writeByte(0x44); /写入温度转换命令字 Convert T void sendReadCmd()/向DS18B20发送读取数据命令 dsInit(); d
17、sWait(); delay(1); writeByte(0xcc); /写入跳过序列号命令字 Skip Rom writeByte(0xbe); /写入读取数据令字 Read Scratchpad int getTmpValue()/获取当前温度值 unsigned int tmpvalue; int value; /存放温度数值 float t; unsigned char low, high; sendReadCmd(); /连续读取两个字节数据 low = readByte(); high = readByte(); /将高低两个字节合成一个整形变量 /计算机中对于负数是利用补码来表示
18、的 /若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value tmpvalue = high; tmpvalue = 8; tmpvalue |= low; value = tmpvalue; /使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度 t = value * 0.0625; Lcd_W(datas3+30,1); Lcd_W(datas4+30,1); Lcd_W(0xdf,1); Lcd_W(C,1); void main(void) unsigned char i; Lcd_Init(); while(1) /启动温度转换 sendChangeCmd(); /显示5次 for(i = 0; i 40; i+) display(tempValue); tempValue = getTmpValue();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1