蓝桥杯单片机CT107D中的PCF8591(8位ADC转换芯片)的了解和使用(实现AD转换,附部分代码)

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通信时序代码如下:

        i2​​​​​​c.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;
}

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值