PCF8591 8位ADC转换芯片
1. 通过I2C通信方式进行数据传输
2. 芯片引脚图
3. 激活芯片
(1)使用I2C通信方式发送第一个字节:
器件地址0x9X,A2 A1A0是可变的器件地址;bit0是写入输出控制位(即选择是给芯片写入数据还是读取数据)
(2)使用I2C通信方式发送第二个字节(控制字):
控制字bit7和bit3位在芯片默认留空,置0即可,
bit6:模拟输出使能标志:(如果1,模拟输出为激活)
bit5和bit4:模拟输入的方式
00:四个单端输入
01:三个差分输入
10:AIN0和AIN1为单端输入;后面两个为差分输入
11:AIN0和AIN1,AIN2和AIN3,两个差分输入
bit2:自动增量标志:auto-increment为1,每次 A/D 转换后通道号将自动增加
bit1和bit0:选择输入的信号源通道,00,01,10,11
(3)信号读写从第三个字节开始
第三个字节开始收到的是模拟信号或者数字信号,不管是AD还是DA模式,信号都会被D/A转换器转换成对应的模拟电压
需要更加详细的了解这个芯片的,可以去找一下PCF8591的数据手册查看,有中文版的
4. PCF8591在CT107D中的使用:
(1)因为A0,A1,A2都接地,所以该器件地址为:若单片机对芯片进行写操作,则发送的地址为0x90;若单片机进行对芯片进行读操作,则发送的地址为0x91
(2)在CT107D中,PCF8591芯片的AIN3引脚端口接滑动变阻器Rb2,通过旋转滑动变阻器Rb2,则可改变AIN3引脚的输入电压。AIN1引脚端口接光敏电阻RD1,通过改变光敏电阻RD1的进光量,则可改变AIN1引脚的输入电压。如果使用4个单端输入模式,则模拟电压控制字为0x03;光敏电阻电压输入控制字为0x01;
(3)通过I2C进行数据传输
i2c通信时序代码如下:
i2c.c文件:
#include <REGX52.H>
#include "intrins.h"
#define DELAY_TIME 10
//定义时钟线和数据线
sbit scl = P2^0;
sbit sda = P2^1;
void i2c_delay(unsigned char i)
{
do
{
_nop_();
_nop_();
}
while(i--);
}
//启动i2c
void i2c_start(void)
{
sda = 1;
scl = 1;
i2c_delay(DELAY_TIME);
sda = 0;
i2c_delay(DELAY_TIME);
scl = 0;
}
//停止i2c
void i2c_stop(void)
{
sda = 0;
scl = 1;
i2c_delay(DELAY_TIME);
sda = 1;
i2c_delay(DELAY_TIME);
}
//发送一个字节数据
//byt:待发送的字节数据
void i2c_sendbyte(unsigned char byt)
{
unsigned char i;
EA = 0;
for(i=0; i<8; i++){
scl = 0;
i2c_delay(DELAY_TIME);
if(byt & 0x80){
sda = 1;
}
else{
sda = 0;
}
i2c_delay(DELAY_TIME);
scl = 1;
byt <<= 1;
i2c_delay(DELAY_TIME);
}
EA = 1;
scl = 0;
}
//接收一个数据字节
unsigned char i2c_receivebyte(void)
{
unsigned char dat;
unsigned char i;
EA = 0;
for(i=0;i<8;i++){
scl = 1;
i2c_delay(DELAY_TIME);
dat <<= 1;
if(sda)
dat |= 0x01;
scl = 0;
i2c_delay(DELAY_TIME);
}
EA = 1;
return dat;
}
//等待应答
unsigned char i2c_waitack(void)
{
unsigned char ackbit;
scl = 1;
i2c_delay(DELAY_TIME);
ackbit = sda;
scl = 0;
i2c_delay(DELAY_TIME);
return ackbit;
}
// 发送应答
void i2c_sendack(unsigned char ackbit)
{
scl = 0;
sda = ackbit;
i2c_delay(DELAY_TIME);
scl = 1;
i2c_delay(DELAY_TIME);
scl = 0;
sda = 1;
i2c_delay(DELAY_TIME);
}
实现AD转换的代码流程:
pcf8591.c文件:
初始化:开启I2C——发送地址(包含读写控制)——等待应答——发送控制字——等待——停止I2C—— 延时
void init_pcf8591(void)
{
i2c_start();
i2c_sendbyte(0x90); //激活,进行写操作,器件地址为0x90
i2c_waitack();
i2c_sendbyte(0x01); //AD输入通道(0~3) 0x01:光敏电阻 ;0x03:滑动电阻
i2c_waitack();
i2c_stop();
i2c_delay(10); //等待几毫秒的稳定
}
接收数据:开启I2C——(发送地址)——等待——接收数据——发送应答——停止I2C——返回数据
unsigned char adc_pcf8591(void)
{
unsigned char adc_vlan;
i2c_start();
i2c_sendbyte(0x91); //进行读操作,器件地址为0x91
i2c_waitack();
adc_vlan = i2c_receivebyte();
i2c_sendack(1); //i2c的发送应答
i2c_stop();
return adc_vlan;
}