基于msp430单片机和ds18b20使用数码管显示的温度测量--大学毕业(论文)设计.doc
基于msp430单片机和DS18B20使用数码管显示的温度测量毕业设计论文基于msp430单片机和DS18B20使数码管显示的温度测量摘要:为了在现实生活和工业生产及过程控制中准确测量温度,设计了一种基于低功耗MSP430单片机的数字温度计,整个系统通过单片机MSP430F149控制DS18B20读取温度,采用数码管显示,温度传感器DS18B20与单片机之间通过串口进行数据传输,MSP430系列单片机具有超低功耗,且外围的整合性高,DS18B20只需一个端口即可实现数据通信,连接方便,通过多次实验证明,该系统的测试结果与实际环境温度一致,除了具有接口电路简单,测量精度高,误差小,可靠性高等特点外,其成本低,功耗低的特点使其拥有更广阔的应用前景。关键字:温度测量 MSP430单片机 温度传感器DS18B20 超低功耗Abstract: in order to accurately measure the temperature in real life and industrial production and process control, a digital thermometer was designed with low power consumption based on MSP430 single chip microcomputer, the control system of DS18B20 read the temperature through the single-chip MSP430F149, the use of digital tube display, temperature sensor DS18B20 and single chip microcomputer for data transmission through the serial port, MSP430 Series MCU with low power consumption the periphery, and high integration, DS18B20 only needs one port to realize the data communication, the connection is convenient, through many experiments, the test results of the system and the actual environment temperature is the same, except with the interface circuit is simple, high precision, small error, high reliability, low cost, low power consumption it has a wider application prospect.图表 1关键字:温度测量 MSP430单片机 温度传感器DS18B20 超低功耗Keywords: temperature measurement MSP430 temperature sensor DS18B20 ultra low2 power consumption 目录一温度测量器的总体设计2二温度测量器的硬件选择31 主控器件:MSP430F14932 温度信息采集单元:DS18B2042.1 DS18B2042.2 DS18B20管脚排列43.显示单元:数码管及其驱动53.1 数码管53.2 驱动芯片:74HC5736三. 系统软件程序71、系统的程序流图72.处理DS18B20的子程序82、1 初始化时序92、2 写时序102、3 读时序113、温度计算子程序134、处理数码管显示的子程序15四、系统调试151、硬件检测和调试152、软件程序调试173、整体调试17五、结论分析17参考文献:17附录一:18附录二:18附录三:18清空内容一温度测量器的总体设计 生活中最常见的应该是利用物体的热胀冷缩测温度,比如家里用的温度计、体温计等等,这种很好做但是精密程度不够,反正生活中用的也不需要那么精密。这里提出使用电子器件测温度,利用温度传感器,就是利用某些材料电阻随温度的变化,通过电学上面测电阻用公式换算到温度等于多少度。传感器用处应该很多,不光是测温度,侧压力、光照强度等都可以用类似的方法,就是把想要测的量全转化成测电学量,然后公式换算出温度。我们提出用单片机MSP430为温度测量的主控制器,温度传感器DS18B20通过单总线与单片机连接,数码管显示及其驱动原件位显示单元,系统的基本组成如图1所示。 温度信号温度传感器DS18B20数据交换单片机电源数码管供电供电数据显示 图 1 系统的基本组成二温度测量器的硬件选择1 主控器件:MSP430F149 MSP430F149是一种新型的混合信号处理器,采用了美国德州仪器(Texas Instruments)公司最新低功耗技术(工作电流为0.1一400 p A ),它将大量的外围模块整合到片内,特别适合于开发和设计单片系统。MSP430149单片机主要具有如下特点: 低 电 压、超低功耗。工作电压3.3V ,等待方式下工作电流为1.3 w A,在RAM保持关闭工作方式下工作电流仅为0 A 。 具 有 12位的模数转换器(ADC12) ,可以得到很高的精度,并且省去了使用专门的模数转换器给设计电路板带来的麻烦。 拥 有 大容量的存储空间。存储器方面包括多达60 k Flash ROM和2 k RAM,如此数量的存储空间完全可以满足程序及数据的需要。 两 通 道串行通信接口。可用于与计算机进行异步或同步串行通信。 硬 件 乘法器。该乘法器独立于CPU进行乘法运算的操作,在提高乘法运算速度的同时也提升了CPU的利用效率。 串 行 在系统编程。通过仿真器对程序进行下载,并通过专用软件对程序及单片机的工作状态进行监控,极大地方便了程序的调试。2 温度信息采集单元:DS18B202.1 DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点: 采用单总线的接口方式 与微处理器连接时 仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。 单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。 测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 + 125 ; 在 -10+ 85°C 范围内,精度为 ± 0.5°C 。 在使用中不需要任何外围元件且有负压特性 电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。 持多点组网功能 多个 DS18B20 可以并联在惟一的单线上,实现多点测温。 供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而 使系统结构更趋简单,可靠性更高。 测量参数可配置 DS18B20 的测量分辨率可通过程序设定 912 位。 DS18B20 具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。2.2 DS18B20管脚排列1. GND为电源 地;2. DQ为数字信号输入输出端;3. VDD为外接供电电源输入端(在寄生电源接线方式时接地)。 图 2 芯片BS18B20管脚图3.显示单元:数码管及其驱动 3.1 数码管 本次设计因为是要显示温度-55 + 125 ,则选择了四位十二段共阴极的数码管显示,其引脚图如下: seg1 a f seg2 seg3 b e d dp c g seg4 图 3 四位阴极数码管引脚图3.2 驱动芯片:74HC573 74HC573的八个锁存器都是透明的D型锁存器,当使能(G)为高时,Q输出将随数据(D)输入而变。当使能为低时,输出将锁存在已建立的数据电平上。输出控制不是影响锁存器的内部工作,即老数据可以保持,甚至当输出被关闭时,新的数据也可以置入。这种电路可以驱动大电容或低阻抗负载,可与直接与系统总线接口并驱动总线,而不需要外接口。VccQ0Q1Q2Q3Q4Q5Q6Q7LPOED0D1D2D3D4D5D6D7GND74HC573 三. 系统软件程序1、系统的程序流图系统的程序主要包括主程序、读出温度子程序、写出温度子程序、温度转换命令字程序、计算温度子程序和数码管显示数据子程序。程序的功能是实时显示温度、读出并处理DS18B20的测量温度值,温度测量没1s进行一次,其程序流程如图: 初始化到达1s?调用显示子程序初次上电?读出温度值,温度计算处理显示数据刷新温度转换开始命令是否否是 2.处理DS18B20的子程序 DS18B20的一线工作协议流程是:初始化ROM操作指令存储器操作指令数据传输。其工作时序包括:l 初始化时序l 写时序l 读时序2、1 初始化时序主机首先发出一个480960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。做为从器件的DS18B20在一上电后就一直在检测总线上是否有480960微秒的低电平出现,如果有,在总线转为高电平后等待1560微秒后将总线电平拉低60240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。 图4 初始化时序时间图程序C代码如下:/初始化DS18B20void DS18B20Init(void)DQ_OUT;/设置为输出方向DQ_LOW;/拉低总线Delayus(50);DQ_HIGH;/释放总线Delayus(6);DQ_IN;/设置为输入方向while(DQ_DATA);/等待应答信号while(DQ_DATA);/等待释放总线2、2 写时序 接下来就是主机发出各种操作命令,但各种操作命令都是向DS18B20写0和写1组成的命令字节,接收数据时也是从DS18B20读取0或1的过程。因此首先要搞清主机是如何进行写0、写1、读0和读1的。写周期最少为60微秒,最长不超过120微秒。写周期一开始做为主机先把总线拉低1微秒表示写周期开始。随后若主机想写0,则继续拉低电平最少60微秒直至写周期结束,然后释放总线为高电平。若主机想写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。而做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。 图 5 写时序图程序C代码如下:/写一个字节void WriteByte(uchar WriteData)uchar i;uchar tmpData;for(i=0;i<8;i+)tmpData=WriteData&0x01;WriteData>>=1;DQ_OUT;DQ_LOW;if(tmpData)DQ_HIGH;elseDQ_LOW;Delayus(5);DQ_HIGH;2、3 读时序 对于读数据操作时序也分为读0时序和读1时序两个过程。读时隙是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60us才能完成。 图 6 读时序图 程序C代码如下: /读一个字节uchar ReadByte(void)uchar i;uchar ReadData=0;for(i=0;i<8;i+)DQ_OUT;DQ_LOW;ReadData>>=1;DQ_HIGH;Delayus(1);DQ_IN;if(DQ_DATA) ReadData|=0x80;Delayus(6);return ReadData; 3、温度计算子程序 DS18B20中的温度传感器完成对温度的测量,用16位二进制形式提供,形式表达,其中S为符号位。 SLS ByteMS ByteSSSSbit7 bit6 bit15 bit4 bit3 bit2 bit1 bit0bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8 图7 DS18B20的16位二进制形式例 如125的数字输出为07D0H (正温度 直接吧16进制数转成10进制即得到温度值 )-55的数字输出为 FC90H。 (负温度 把得到的16进制数 取反后 加1 再转成10进制数)程序C代码如下:/温度计算程序void GetT()if(MSB&0xF0)>0) /判断是否为负温度flag=1;elseflag=0;if(flag) /如果为负温度取反加1MSB=MSB;LSB=LSB+1;t1=MSB<<4; /得到温度整数部分t1|=(LSB>>4);/计算各位数码管要显示的数值if(flag)Bit1=16; /如果为负温度则显示"-"elseBit1=t1/100;Bit2=t1%100/10;Bit3=t1%10; 图 8 温度转换的例图4、处理数码管显示的子程序 本设计使用的是四位十二段共阴极数码管,其中有四个位选引脚,控制数码管的各个位,八个段选引脚,控制每一个数码管的八个段位a、b、c、d、e、f、g、dp,详细如上图3的引脚图,共阴极数码管各引脚对高电平有效,实现其对温度的显示的C程序如下:/数码管扫描显示程序void Display(void)for(uchar i=0;i<4;i+)P3OUT=BitCode; /输出位码if(i=3) /输出段码,如果第三位显示小数点P2OUT=CodeBiti&0x7F;elseP2OUT=CodeBiti;BitCode<<=1;/位码右移一位if(BitCode=0x10) BitCode=0x01;DelayMs(2); /延时1msP2OUT=0XFF;四、系统调试1、硬件检测和调试硬件调试比较简单,在系统设计的过程中,由于主控制器(MSP430F149单片机)部分是集成在单片机MSP430仿真器FET上的。因此主要是对DS18B20测温模块以及LED数码管数字显示模块进行硬件检测和调试。因此我们用软件proteus 7 对硬件电路进行仿真,其仿真截图如下: 图9 硬件仿真图其中最重要的部分是温度传感器DS18B20的模块,其电路连接如下: 图10 温度传感器DS18B20模块 2、软件程序调试本程序采用单片机MSP430的语言编写,用IAR System 公司开发的IAR Embedded Workbench for MSP430 Kickstart编译器编调试。进入IAR Embedded Workbench集成环境,然后在该环境下建立一个项目,进入源程序编辑界面。经过不断的调试和修改,编译生成正确的 .hex文件使其生成可进行硬件仿真的文件。3、整体调试整体调试 通过硬件和软件的调试后,连接各个模块。由于主控制器模块采用MSP430仿真调试器FET,其集成有 MSP430F149单片机以及与其相关的外围模块,通过计算机串口连接并由计算机的串口供电,进入相关的调试控制程序后对单片机进行管理和操作。温度测量以及显示模块焊接在一块电路板上,由直流稳压电源提供3V的电压。通过数据线将3个主要模块连接,温度传感器的数据端DS18B20与MSP430F149单片机的数据端连接。为了保证温度数据的正常读取,必须将二者的接地端短接,以保证其电势相等。接通电源后,由计算机进入MSP430调试环境,运行程序,这时LED数码管开始显示“00”(程序的开始复位信号),然后显示由DS18B20检测的温度数值。整体的调试过程必须一直调试能正常的显示温度值,而且在有温度变化时显示温度能改变就基本完成。 五、结论分析 在基于MSP430单片机的温度测试仪的设计中,在低功耗设计方面,首先是选低功耗件,从单片机、传感器和 LED显示器及其驱动电路,都尽量选择市场上功耗最低的品;其次在硬件电路设计方面,降低系统工作电压;再次,是软件设计融入低功耗思核心的方法就是在最短的时间内把需要的工作完成,然后进入休息状态,不论工作还是休息状态,立即关闭不必要的模块,一最大限度地降低功耗。DS18B数字温度传感器,具有线路简单,体积小的特点。因 此用它来组成一个测温系统,在一根通信线上可以挂多个数字温度测试仪,十分方便。相比其他的温度传感器,该系统设计具有结构简单、分辨率高、可调节的特点,且无需硬件同步时钟控制。通过这段时间对这个课程设计实验设计大大培养了我们的动手能力和同学间的相互合作的团结精神。 参考文献:MSP430单片机常用模块与实例精讲 主编(秦龙) 电子工业出版社 电子技术基础模拟部分 主编(康华光) 高等教育出版社 附录一:电路元件清单元器件型号数目单片机MSP430f1491电阻4.7k1温度传感器DS18B201杜邦线若干数码管7SEG-MPX4-CC1电容CAP1驱动芯片74HC5731附录二:软件源程序/DS18B20 温度测量实验/功能:在数码管上显示当前DS18B20 测到的温度/小数部分为4 位,温度为负时,最高位显示"-"/测量范围:-55 +125#include "msp430x14x.h"#define uint unsigned int#define uchar unsigned char#define DQ_OUT P1DIR|=BIT0#define DQ_IN P1DIR&=BIT0#define DQ_LOW P1OUT&=BIT0#define DQ_HIGH P1OUT|=BIT0#define DQ_DATA P1IN&BIT0/共阳数码管编码表uchar Code18=0xC0,0xF9,0xA4,0xB0,/0,1,2,30x99,0x92,0x82,0xF8,/4,5,6,70x80,0x90,0x88,0x83,/8,9,A,b0xC6,0xA1,0x86,0x8E,/C,d,E,F0xBF,0xFF;/-,全灭uchar Bit4=0,0,0,17; /数码管各位显示的数字uchar BitCode=0x01; /数码管位码初值/uchar wei=0x01,0x02,0x04,0x08;uint j=0;uint l=0;uchar MSB; /温度高字节uchar LSB; /温度低字节int t1=0; /温度整数部分数值uint t2=0; /温度小数部分数值uchar flag; /负温度标志/时钟初始化函数void InitClock(void)BCSCTL1=RSEL2+RSEL1+RSEL0;/XT2 开启 LFXT1 工作在低频模式 ACLK/不分频 最高的标称频率DCOCTL=DCO2+DCO1+DCO0;/DCO 为最高频率doIFG1&=OFIFG;/清除振荡器失效标志for(uint i=255;i>0;i-);while(IFG1&OFIFG);/判断XT2 是否起振BCSCTL2=SELM1+SELS;/MCLK SMCLK 时钟源为TX2CLK 不分频/端口初始化函数void InitPort(void)P2SEL=0x00;/P2 口所有引脚设置为一般的IO 口P3SEL=0x00;/P3 口所有引脚设置为一般的IO 口P2DIR=0xFF;/P2 口所有引脚设置为输出方向P3DIR=0xFF;/P3 口所有引脚设置为输出方向P2OUT=0x00;/P2 口先输出低电平P3OUT=0x80;/P3 口先输出低电平/P5SEL&=BIT7;/P5. 设7置为一般的IO 口/P5DIR|=BIT7;/P5.7 设置为输出方向/P5OUT&=BIT7;/P5.7 输出低电平来使能74HC573 来驱动数码管/ms 级延时子程序void DelayMs(uint ms)while(ms-)for(uint i=0;i<700;i+);/数码管扫描显示程序void Display(void)for(uchar i=0;i<4;i+)P3OUT=BitCode; /输出位码if(i=3) /输出段码,如果第三位显示小数点P2OUT=CodeBiti&0x7F;elseP2OUT=CodeBiti;BitCode<<=1;/位码右移一位if(BitCode=0x10) BitCode=0x01;DelayMs(2); /延时1msP2OUT=0XFF;/10us 级延时子程序void Delayus(uint us)while(us-)_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();/初始化DS18B20void DS18B20Init(void)DQ_OUT;/设置为输出方向DQ_LOW;/拉低总线Delayus(50);DQ_HIGH;/释放总线Delayus(6);DQ_IN;/设置为输入方向while(DQ_DATA);/等待应答信号while(DQ_DATA);/等待释放总线/读一个字节uchar ReadByte(void)uchar i;uchar ReadData=0;for(i=0;i<8;i+)DQ_OUT;DQ_LOW;ReadData>>=1;DQ_HIGH;Delayus(1);DQ_IN;if(DQ_DATA) ReadData|=0x80;Delayus(6);return ReadData;/写一个字节void WriteByte(uchar WriteData)uchar i;uchar tmpData;for(i=0;i<8;i+)tmpData=WriteData&0x01;WriteData>>=1;DQ_OUT;DQ_LOW;if(tmpData)DQ_HIGH;elseDQ_LOW;Delayus(5);DQ_HIGH;/温度计算程序void GetT()if(MSB&0xF0)>0) /判断是否为负温度flag=1;elseflag=0;if(flag) /如果为负温度取反加1MSB=MSB;LSB=LSB+1;t1=MSB<<4; /得到温度整数部分t1|=(LSB>>4);t2=(uint)(LSB&0x0F)*0.0625*10000); /得到温度小数部分并扩大10000 倍/计算各位数码管要显示的数值if(flag)Bit1=16; /如果为负温度则显示"-"elseBit1=t1/100;Bit2=t1%100/10;Bit3=t1%10;/Bit4=t2/1000;/Bit5=t2%1000/100;/Bit6=t2%100/10;/Bit7=t2%10;void main()WDTCTL=WDTPW+WDTHOLD;/关闭看门狗InitClock();InitPort();_DINT();/关闭中断/j=0;l=0;while(1)DS18B20Init();WriteByte(0xCC); /跳过ROM 配置WriteByte(0x44);/启动温度转换DS18B20Init();WriteByte(0xCC);WriteByte(0xBE); /读温度寄存器LSB=ReadByte(); /读温度数据低字节MSB=ReadByte(); /读温度数据高字节GetT(); /计算温度Display();附录三:电路焊接整体实物图 32