PCF8591应用程序实例_第1页
PCF8591应用程序实例_第2页
PCF8591应用程序实例_第3页
PCF8591应用程序实例_第4页
PCF8591应用程序实例_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1、引言 I2C总线是Philips公司推出的串行总线,整个系统仅靠数据线(SDA)和时钟线(SCL)实现完善的全双工数据传输,即CPU与各个外围器件仅靠这两条线实现信息交换。I2C总线系统与传统的并行总线系统相比具有结构简单、可维护性好、易实现系统扩展、易实现模块化标准化设计、可靠性高等优点。 在一个完整的单片机系统中,A/D转换芯片往往是必不可少的。PCF8591是一种具有I2C总线接口的A/D转换芯片。在与CPU的信息传输过程中仅靠时钟线SCL和数据线SDA就可以实现。2、芯片介绍 PCF8591是具有I2C总线接口的8位A/D及D/A转换器。有4路A/D转换输入,1路D/A模拟输出。这

2、就是说,它既可以作A/D转换也可以作D/A转换。A/D转换为逐次比较型。引脚图如图1所示。结构图如图2所示。电源电压典型值为5V。AIN0AIN3:模拟信号输入端。A0A3:引脚地址端。VDD、VSS:电源端。(2.56V)SDA、SCL:I2C总线的数据线、时钟线。OSC:外部时钟输入端,内部时钟输出端。EXT:内部、外部时钟选择线,使用内部时钟时EXT接地。AGND:模拟信号地。AOUT:D/A转换输出端。VREF:基准电源端。3 应用 3.1 器件总地址 PCF8591采用典型的I2C总线接口器件寻址方法,即总线地址由器件地址、引脚地址和方向位组成。飞利蒲公司规定A/D器件地址为1001

3、。引脚地址为A2A1A0,其值由用户选择,因此I2C系统中最多可接23=8个具有I2C总线接口的A/D器件。地址的最后一位为方向位R/ ,当主控器对A/D器件进行读操作时为1,进行写操作时为0。总线操作时,由器件地址、引脚地址和方向位组成的从地址为主控器发送的第一字节。 3.2 控制字节 控制字节用于实现器件的各种功能,如模拟信号由哪几个通道输入等。控制字节存放在控制寄存器中。总线操作时为主控器发送的第二字节。其格式如下所示:其中:D1、D0两位是A/D通道编号:00通道0,01通道1,10通道2,11通道3 D2 自动增益选择(有效位为1) D5、D4模拟量输入选择:00为四路单数入、01为

4、三路差分输入、10为单端与差分配合输入、11为模拟输出允许有效。 当系统为A/D转换时,模拟输出允许为0。模拟量输入选择位取值由输入方式决定:四路单端输入时取00,三路差分输入时取01,单端与差分输入时取10,二路差分输入时取11。最低两位时通道编号位,当对0通道的模拟信号进行A/D转换时取00,当对1通道的模拟信号进行A/D转换时取01,当对2通道的模拟信号进行A/D转换时取10,当对3通道的模拟信号进行A/D转换时取11。在进行数据操作时,首先是主控器发出起始信号,然后发出读寻址字节,被控器做出应答后,主控器从被控器读出第一个数据字节,主控器发出应答,主控器从被控器读出第二个数据字节,主控

5、器发出应答一直到主控器从被控器中读出第n个数据字节,主控器发出非应答信号,最后主控器发出停止信号。PCF8591 AD及D/A转换器的应用程序日期:2009-07-06 来源:东哥单片机学习网 作者:admin 字体:大 中 小 (投递新闻) PCF8591 AD及D/A转换器的应用程序/-函数声明,变量定义-#include <reg51.h>#include <intrins.h>sbit SDA=P10; / 将p1.0口模拟数据口sbit SCL=P11; / 将p1.1口模拟时钟口#define delayNOP(); _nop_();_nop_();_nop

6、_();_nop_(); bit bdata SystemError; / 从机错误标志位/-PCF8591专用变量定义-#define PCF8591_WRITE 0x92#define PCF8591_READ 0x93#define NUM 4 / 接收和发送缓存区的深度unsigned char idata receivebufNUM; / 数据接收缓冲区/-/ 函数名称: iic_start()/ 函数功能: 启动I2C总线子程序/-void iic_start(void) EA=0; /时钟保持高,数据线从高到低一次跳变,I2C通信开始 SDA = 1; SCL = 1; dela

7、yNOP(); / 延时5us SDA = 0; delayNOP(); SCL = 0;/-/ 函数名称: iic_stop()/ 函数功能: 停止I2C总线数据传送子程序/-void iic_stop(void) SDA = 0; /时钟保持高,数据线从低到高一次跳变,I2C通信停止 SCL = 1; delayNOP(); SDA = 1; delayNOP(); SCL = 0;/-/ 函数名称: slave_ACK/ 函数功能: 从机发送应答位子程序/-void slave_ACK(void) SDA = 0; SCL = 1; delayNOP(); SDA = 1; SCL =

8、0;/-/ 函数名称: slave_NOACK/ 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束/-void slave_NOACK(void) SDA = 1; SCL = 1; delayNOP(); SDA = 0; SCL = 0;/-/ 函数名称: check_ACK/ 函数功能: 主机应答位检查子程序,迫使数据传输过程结束/-void check_ACK(void) SDA = 1; / 将p1.0设置成输入,必须先向端口写1 SCL = 1; F0 = 0; if(SDA = 1) / 若SDA=1表明非应答,置位非应答标志F0 F0 = 1; SCL = 0;/-/

9、函数名称: IICSendByte/ 入口参数: ch/ 函数功能: 发送一个字节/-void IICSendByte(unsigned char ch) unsigned char idata n=8; / 向SDA上发送一位数据字节,共八位 while(n-) if(ch&0x80) = 0x80) / 若要发送的数据最高位为1则发送位1 SDA = 1; / 传送位1 SCL = 1; delayNOP(); SDA = 0; SCL = 0; else SDA = 0; / 否则传送位0 SCL = 1; delayNOP(); SCL = 0; ch = ch<<

10、1; / 数据左移一位 /-/ 函数名称: IICreceiveByte/ 返回接收的数据/ 函数功能: 接收一字节子程序/-unsigned char IICreceiveByte(void) unsigned char idata n=8; / 从SDA线上读取一上数据字节,共八位 unsigned char tdata; while(n-) SDA = 1; SCL = 1; tdata = tdata<<1; / 左移一位,或_crol_(temp,1) if(SDA = 1) tdata = tdata|0x01; / 若接收到的位为1,则数据的最后一位置1 else t

11、data = tdata&0xfe; / 否则数据的最后一位置0 SCL=0; return(tdata);/-/ 函数名称: DAC_PCF8591/ 入口参数: slave_add从机地址,n要发送的数据个数/ 函数功能: 发送n位数据子程序/-void DAC_PCF8591(unsigned char controlbyte,unsigned char wdata) iic_start(); / 启动I2C IICSendByte(PCF8591_WRITE); / 发送地址位 check_ACK(); / 检查应答位 if(F0 = 1) SystemError = 1; r

12、eturn; / 若非应答表明器件错误或已坏,置错误标志位SystemError IICSendByte(controlbyte&0x77); /Control byte check_ACK(); / 检查应答位 if(F0 = 1) SystemError = 1; return; / 若非应答表明器件错误或已坏,置错误标志位SystemError IICSendByte(wdata); /data byte check_ACK(); / 检查应答位 if(F0 = 1) SystemError = 1; return; / 若非应答表明器件错误或已坏,置错误标志位SystemErr

13、or iic_stop(); / 全部发完则停止 delayNOP(); delayNOP(); delayNOP(); delayNOP();/-/ 函数名称: ADC_PCF8591/ 入口参数: controlbyte控制字/ 函数功能: 连续读入4路通道的A/D转换结果到receivebuf/-void ADC_PCF8591(unsigned char controlbyte) unsigned char idata receive_da,i=0; iic_start(); IICSendByte(PCF8591_WRITE); /控制字 check_ACK(); if(F0 = 1

14、) SystemError = 1; return; IICSendByte(controlbyte); /控制字 check_ACK(); if(F0 = 1) SystemError = 1; return; iic_start(); /重新发送开始命令 IICSendByte(PCF8591_READ); /控制字 check_ACK(); if(F0 = 1) SystemError = 1; return; while(i<4) receive_da=IICreceiveByte(); receivebufi+=receive_da; slave_ACK(); / 收到一个字节后发送一个应答

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论