- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
基于AVR单片机的温度测量系统
1 引言
传统温度测量系统中,一般选用模拟式温度传感器。常用的模拟式温度传感器,其中一个共同特点是输出为模拟量,因此在测量电路中必须经过A/D转换才能成为计算机所能处理的数字量。数字式温度传感器将非电模拟量转换到数字信号这一处理过程的多个环节集成在单芯片上,实现了在测量点将温度值数字化,有效解决了传统温度传感器外围电路复杂,抗干扰能力差的弊病,降低了对系统的要求。
该系统以Atmel公司的ATmega8L单片机为控制中心,温度测量使用DS18B20单总线数字温度传感器,采用1602字符型液晶显示器作为温度值的显示输出。编程使用CodeVision AVR C Compiler编译器,该编译软件自带了使用器件库函数文件,省去了编写器件驱动程序的步骤,为程序的编写带来了极大的方便。
2硬件设计
图1给出系统电路图。ATmega8L单片机的PB0口线连接DS18B20;PD口连接1602 LCD。DS18B20采用源端连接方式,LCD采用4位总线模式。其中,液晶显示模块的连接方式取决于编程软件Code Vision AVR C Compiler的code wizard avr自动程序生成器的设置。采用这种方法,可直接调用库函数实现对液晶显示器的操作。
2.1 ATmega 8L单片机
Atmel公司的EEPROM电可擦除技术、闪速存储器技术是最引人瞩目的高质量和高可靠性生产技术。在CMOS器件生产领域,Atmel的设计水平、生产工艺及封装技术一直处于世界领先地位。这些技术使单片机也具有优秀的品质,在结构、性能等方面具有明显优势。
ATmega8L单片机的特点是:8 KB的系统内可编程Flash,512字节EEPROM,1 KB SRAM,32个通用I/O口线,32个通用工作寄存器,3个具有比较模式的灵活的定时器/计数器,片内/外中断,可编程串行USART,面向字节的两线串行接口,10位6路A/D转换器,具有片内振荡器的可编程看门狗定时器,一个SPI串行端口,以及5种可以通过软件进行选择的省电模式。
2.2 DS18B20数字温度传感器
1-Wire是Dallas公司的一项专有技术,与目前多数标准串行数据通信方式,如SPI/I2C/MICROWIRE不同,它采用单根信号线,既传输时钟,又传输数据,而且数据传输是双向的,因此具有节省I/O口线资源、结构简单、成本低廉、便于总线扩展和维护等诸多优点。
DS18B20的测量温度范围是-55~+125℃。该温度传感器的输出温度数据可与摄氏度校准,使用查找表或转换规则就可计算温度值。在温度寄存器中温度数据存储格式为一个16位符号扩展的两个单元,温度寄存器格式如图2所示。符号位S表示温度的正负。S=0时为正;S=1时为负。当DS18B20的配置为12位分辨率时(测量精度是0.062 5℃),温度寄存器的所有位数据都是有效的;当DS181320的配置为11位分辨率时(测量精度是0.125℃),bit0未定义;当DS181320的配置为10位分辨率时(测量精度是0.25℃),bit0和bit1未定义的;当DS181320的配置为9位分辨率时(测量精度是..5℃),bit0~bit2未定义。
2.3 1602液晶显示器
1602液晶显示器采用金鹏电子有限公司生产的OCM2×16A。字符点阵系列模块是一类专门用于显示字母、数字、符号等的点阵型液晶显示模块,分4位和8位数据传输方式,提供5×7点阵+光标的显示模式,设置有显示数据缓冲区DDRAM、字符发生器CGROM和字符发生器CGRAM。可以使用CGRAM来存储自定义的最多8个5×8点阵的图形字符的字模数据,并提供设置、清显示、光标回原点、显示开/关、光标开/关、显示字符闪烁、光标移位、显示移位等丰富的指令。此外,还提供了内部上电自动复位电路。当外加电源电压超过+4.5 V时,可自动对模块初始化操作,将模块设置为默认的显示工作状态。
3软件设计
3.1 Code Vision AVR C Compiler
Code Vision AVR是C交叉编译器,具有为Atmel公司的AVR系列单片机所设计的集成开发环境和程序自动生成器。编译后的coff目标文件可以用于C源代码级调试,也可以使用AVR Studio调试器进行调试。
除了标准的C库函数,Code Vision AVR C Compiler还具有其他器件的库函数,如字母数字液晶显示模块、飞利浦I2C总线、NS公司的LM75温度传感器、飞利浦的PCF8563和PCF8583、Dallas公司的DS1302和DS1307实时时钟器件、以及DS1820/DS1822温度传感器等。CodeVision AVR还包含了code wizard avr程序自动生成器,使用时只要添加相关器件的头文件就可以在短短几分钟内生成初始化程序,并可以根据需要调用头文件中包含的功能函数,以实现对外围设备的操作。
3.2程序设计
图3所示给出程序流程。编写程序时,先要声明哪些口线与外围器件通讯,例如DS18B20单线总线与单片机PB0口线的连接声明如下:
然后,把功能函数的头文件包含到程序中才能调用头文件中的功能函数,头文件存放于"..INC"目录下。该温度测量系统用到的功能函数在"DS18B20.h"、"1WIRE.h"、"LCD.h"这3个头文件中。
在调用功能函数对DS18B20进行操作时,由于每片DS18B20都有唯一的代码(64位产品序列号),在多点温度测控系统中,代码是识别和操作DS18B20的基础,无论读取还是选择对某一个传感器进行操作,主机必须发送64位代码。如果只有1个DS18B20,就不需要ROM码,指针addr要设为NULL(0)。如果有多个器件,首先要读ROM码对每一个器件进行识别,然后才能在调用时对需要的器件通过ROM码进行地址匹配。程序先对I/O口初始化操作,然后利用头文件DS18B20.h中的函数floatDS18B20_temperature(unsigned char*addr)读取温度值。由函数定义可知,该函数的返回值是浮点型数据,提取各个位的值时需要进行整除和取余操作。由于浮点型数据无法进行整除和取余操作,需要先转化为长整型数据。浮点型数据转化为长整型数据时,小数点后的值会丢失,为了保持小数点后的数值不会因为转化为长整型后丢失,同时对浮点型数据乘以1 000,这样就可以分离出百位、十位、个位、十分位、百分位、千分位的值。将分离出来的各个位的值分别转化成LCD的字符码,即可显示将LCD的字符码传送到LCD,并显示出来。
4实验结果
为了检测测量系统的准确性,进行了温度测量实验。由于铂电阻温度传感器的精度高,稳定性好,应用温度范围广,因此,作为一种常用的温度检测器,不仅广泛用于工业测温,而且被制成各种标准温度计。这里,采用PT1000作为标准温度计。将DS18B20和PT1000捆绑在一起放入高低温箱中进行测试,通过改变高低温箱的温度,待箱中温度稳定后,记录在液晶显示器上显示温度值;同时用高精度万用表测PT1000铂电阻的具体阻值,然后根据PT1000的分度表算出温度值,将两者数值对比即可算出系统的误差。表1给出测试结果。可见,DS18B20与PT1000铂电阻所测的温度吻合得很好。这说明该温度测量系统的测量准确可靠。
5结语
该温度测量系统硬件设计简单,充分利用编译器CodeVisionAVR C Compiler的库函数,省去编写驱动程序的麻烦,大大缩短了开发周期,并且具有抗干扰能力强,扩展方便,廉价和适用的特点,可以扩展进行多点测量,而且同样只占用一个I/O口,在温度测量系统中具有广泛的应用价值。