摘要:全面系统地介绍带I2C总线接口的10位数字温度传感器AD7416和RISC型8位单片机PIC16F84,以及与PC机通信的硬件接线方法和软件算法设计,并且提供完整的PC端C程序和单片机端汇编语言程序。
关键词:AD7416 PIC16F84 I2C总线 单片机
引言
在测量仪器仪表中,温度的检测几乎成为必不可少的部分。传统的模拟温度传感器,如AD590,因外围电路复杂、需调零等缺点,给应用开发带来一些麻烦。利用数字温度传感器配合单片机来设计各种控制系统,越来越多受到业内人士的推崇。美国模拟器件公司生产的AD7416是一款功能较多的温度器件,它在一个芯片上集成了I2C总线接口、温度传感器、10位数摸转换器和窗口门限温度控制器等功能。它与其它数字温度传感器相比具有体积小、编程简单等优点。
在本文介绍的温度检测系统中,其前端温度检测应用的是AD7416,控制器应用的是PIC16F84,将探测到的温度上传到上位机(PC机)。由于PIC16F84单片机是一款廉价的低端型号,其内部没有配置I2C接口和UART接口等外围模块,因此需要利用虚拟技术来模拟I2C和UART的功能,分别与下位器件AD7416和上位机进行通信。文后提供了完整的算法设计和程序清单。在此程序基础上稍加改动也可以适用于其它PIC单片机,甚至是其它厂家的单片机,来实现同样的功能。故本文具有比较广泛的启发性和实用价值。
1 硬件简介
硬件接线图如图1所示,前端电路主要由1片10位串行数字温度传感器AD7416和1片RISC型PIC16F84微控制器组成,上位机由PC兼容机担当。不过,上位机不是必须的,图1中给出了可选的相连PC的串行接口。通过该串口,可把检测到的现场温度值上传到PC机,以便进行实时处理、存储和监控。
1.1 与PC机的接口简介
硬件引脚连接关系如表1所列,其中列出了各引脚的功能。利用PIC16F84端口A的2条引脚与AD7416连接;利用端口B的3条引脚在前端电路与PC机之间传送信息,也可以直接传输给LED数码管驱动电路以供显示。
表1 三者相互连接的对应关系
AD7416 | PIC16F84 | PC接口 |
SDA SCL |
PORT A,0 PORT A,1 |
|
PORT B,0 PORT B,1 PORT B,2 |
SDATA SCLK SYNC |
PIC16F84单片机与PC机的通信接口选用并行打印口,通信方式选用串行同步方式。其中,并行打印口既可以是25芯的D型插口,也可以是36芯的Centronics连接器,如图2所示。串行同步方式通信的信号时序如图3所示。
1.2 AD7416简介
AD7416是一个带有温度超限功能的10位串行数字温度传感器,采用8引脚的SOIC或μSOIC封装。其内部结构如图4所示,引脚布局如图5所示,引脚功能如表2所列。
表2 引脚功能说明
引脚名称 | 引脚序号 | 引脚类型 |
功 能 说 明 |
SDA | 1 | I/O | I2C总线串行数据输入/输出传送线(开漏型) |
SCL | 2 | I | I/C总线串行时钟线(开漏型) |
OTI | 3 | O | 温度超限指示脚,低电平有效(开漏型) |
GND | 4 | - | 电源接地脚 |
A2~A0 | 5~7 | I | 串行总线地址低3位连线编程脚 |
VDD | 8 | - | 电源正极,工作电压范围2.7V~5.5V |
AD7416具有如下特点:10位温度至数字转换器;超温指示端为低电平有效的漏极开路型输出脚,可以实现“线与”接线方式;I2C兼容的串行接口;可选的串行总线地址,允许在单一总线上连接多达8个AD7416;低功耗节电方式(典型2mA);400ms更新速率;55℃~+125℃温度测量范围。
AD7416有5个内部寄存器。其中4个是数字寄存器,一个是地址指针寄存器。地址指针寄存器是一个8位寄存器,用于存放指定4个数据寄存器的地址码。对AD7416每一次串行写操作的第一个数据字节是数据寄存器的地址码,这就是随后的数据字节要写入的地址。其实,地址指针寄存器只需最低两位(记作P1和P0)用来选择数据寄存器,如表3所列。
表3 4个数据寄存器的地址分配
P1 | P0 | 数据寄存器 |
0 | 0 | 温度值寄存器(只读) |
0 | 1 | 配置寄存器(可读/写) |
1 | 0 | THYST寄存器(可读/写) |
1 | 1 | TOTI寄存器(可读/写) |
温度值寄存器是一个16位只读寄存器,其高10位以2的补码格式储存由模数转换器产生的10位温度测量读数;配置寄存器是一个8位读/写寄存器,用来设置AD7416的工作方式;THYST回滞温控点设置寄存器是一个16位的读/写寄存器,其高9位存储以2的补码格式表示下限温控点设定值;TOTI上限温控点设置寄存器一个16位读/写寄存器,其高9位存储以2的补码格式表示上限温控点设定值。AD7416上电时地址指针指向温度值寄存器,2个温控点分别指定TOTI=80℃和THYST=75℃。这样的缺省设置使得AD7416可以独立用作一个恒温控制器,而不需要与串行总线连接以及受控于其它主控器件。
图3
AD7416以10位2的补码格式表示温度数值,在16位温度值寄存器中的存储方式如表4所列。表5列出了几个温度数值的编码示例。
表4 温度值寄存器16位布局
D15 | D14 | D13 | D12 | D11 | D10 | D9 | D8 | D7 | D6 | D5~D0 |
B9 | B8 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | 未用 |
表5 温度数据格式
温度/℃ | 数字量输出B9B0 | 温度/℃ | 数字量输出B9~B0 |
-128 | 10 0000 0000 | +0.25 | 00 0000 0001 |
-100 | 10 01111 0000 | +25 | 0 0011 00100 |
-25 | 11 1001 1100 | +100 | 0 1100 10000 |
-0.25 | 11 1111 1111 | +125 | 0 1111 10100 |
0 | 00 0000 0000 | +127 | 0 1111 11100 |
为了避免在噪声环境下的误触发,AD7416内部集成了一个故障排队计数器。假若故障排队值设定为4,则必须连续4次(400ms)周期性地测量温度值大于TOTI或者小于THYST预定值,OTI端才送出有效电平。该条件只要不满足,排队计数器就会被自动复位,OTI端也就不会错误地输出有效电平,从而抑制了噪声干扰。
1.3 PIC16F84简介
PIC16F84是18引脚CMOS工艺的RISC微控制器,只有35条指令并且全部指令均为统一长度14位。它有1×14KB的片内Flash程序存储器,36×8KB的通用寄存器和64×8KB的E2PROM数据存储器。它有13个通用I/O引脚。每个引脚有吸纳25mA或输出20mA的能力。PIC16F84还有一个8位的定时器/计数器和一个自带PC时钟源的看门狗监视器。
PIC16F84由于具有Flash工艺特性,所以它极适合于那些可能会经常改动程序的应用。例如,用户可以随时改动已经出厂产品中的单片机程序,以增加或调整产品的功能。另外,它内部的E2PROM型数据存储器不仅有掉电保护数据的功能,更重要的是它是由单片机内部进行控制操作的,即外部电路无法对其进行读写。因此,它有极高的数据保密性。这使得PIC16F84在加密性产品,如智能IC卡、密码锁、电子防盗系统等方面有很广泛的应用。PIC16F84引脚布局如图6所示。
2 软件简介
为本应用项目开发的软件程序,可以对AD7416内部的寄存器编程,以及从这些数据寄存器读取温度值。PIC16F84扮演着上传下达的角色,单片机端的软件程序采用了汇编语言。AD7416一侧的通信程序,将利用并行端口RA来模拟I2C总线协议,控制AD7416的工作方式,并且读取它的温度测量值。PC机一侧的通信程序,将利用并行端口RB来连接PC的并行打印机口,把所收集到的温度上传给PC机,PC机端的软件程序采用的是C语言。
整个软件采用了模块化的程序设计方法。为了实现PIC16F84和AD7416之间I2C协议之下的串行通信,编写了一些专用子程序。这些子程序段包括:符号定义、PIC16F84的端口初始化、启动信号时序产生、停止信号时序产生、发送字节、读取字节、读取温度、向PC机串行被动发送等。具体程序见网站www.dpj.com.cn中的程序段0~程序段8。其中两个比较复杂的程序段还给出了流程图,如图7和图8所示。
2.1 采集温度数据
在发送字节子程序SENDBYTE被调用以后,AD7416就作好了提供温度数据的准备。从AD7416中读取温度数据,既可以1字节形式,也可以2字节形式。以2字节形式会更加精确,在本例中采用的就是2字节形式。这2个字节被读取后,保存到用户定义的2个寄存器HIHGBYTE和LOWBYTE内,之后用户再转移给其它外部器件或设备,以便作进一步地分析等处理。READBYTE子程序的功能相似于SENDBYE子程序的功能。不过,对于读取过程,需要检测SDATA线的状态,并且LOWBYTE寄存器也要作相应改动。
2个字节的读取过程需要主控器(即PIC16F84),在每个字节的读取之后分别输出不同的应答(ACK)信号电平。为了利用同一个数据读取程序,提供2种不同的ACK信号电平,需要查看ACKSTAUS寄存器的bit1,由该位的状态决定所需ACK信号脉冲的类型。
2.2 通过打印口向PC机上传数据
PC机的打印口提供了一种从PIC单片机到PC机传送数据的简易途径,以便在PC机上进行数据的记录和监测等处理。由于对打印机端口功能的讨论超出了本文的关注范围,因此文中只涉及一些必要的相关内容。随后所介绍的仅是一个如何以最少连线(仅需要3条)实现温度数据传送给PC机的简明范例。单片机其它的I/O端口引脚还可以留作它用。单片机向PC机每次传送16位的温度值,并且是以高位(MSB)开始传送的。PC机与单片机之间的三条接口连接,分别定义为SYNC(串行同步)、SDATA(串行数据)和SCLK(串行时钟)。
当PIC16F84从AD7416读取一次温度测量结果,它将把SYNC线电平拉低以通知PC机,并且开始一个计数器的递减过程。如果在该计数器递减到0之前,还没有检测到来自PC机时钟的(SCLK)上升沿,则将SYNC电平恢复到高电平,以中止本次数据的发送。这种设计方法允许在未连接PC机,或PC机端软件没有运行时,仍然能令PIC16F84继续读取温度数据。
当PIC16F84检测到SCLK的上升沿时,就利用温度数据的最高位(MSB)来设置SDATA。随后继续监视SCLK线,并且当该线变低时,一个用户定义的位计数器减1。再等待另一个SCLK上升沿,以便继续发送后续数据,直到16位数据全部发送完毕。在发送完后,将SCLK线拉高以告知PC机此发送过程结束。
图7和图8
3 程序清单
程序清单包括完整的单片机端汇编语言程序和PC机端的C高级语言程序。详见网站www.dpj.com.cn。
结语
可以说,本文提供了一个具有借鉴意义的温度检测系统的软硬件开发参考模型。在此基础上,如果PC机端软件利用VB或VC设计成图形界面就更方便于用户操作。如果利用PIC16F84的其它I/O端口引脚再扩展几条I2C总线,并且每条总线上挂接1~8片AD7416,则可以形成一个更加完善的分布式多点温度检测系统。
总之,采用数字温度传感器,可以使设计者完全 打破传统的设计模式(传感器+ADC),从而大大简化了设计方案,提高了电路的可靠性。