蓝桥杯单片机外设驱动-4


单片机外设驱动-PCF8591+24c02

PCF8591功能概述

PCF8591

  PCF8591是具有IIC接口的8位A/D和D/A转换芯片,具有4路模拟输入、一路DAC输出和一个IIC总线接口。其主要的功能特性如下:

  • 单电源供电5V。
  • 通过3个硬件地址引脚编址。
  • 8位逐次逼近式A/D转换。
  • 片上跟踪与保持电路,采样速率取决与IIC总线速度。
  • 4路模拟输入可编程为单端输入或查分输入。
  • 自动增量通道选择。
  • 带一个模拟输出的乘法DAC。

设备地址

设备地址

  PCF8591的设备地址包括固定部分可编程部分。可编程部分需要根据硬件引脚A0、A1和A2来设置。设备地址的最后一位用于设置数据传输的方向,即读/写位。

  在IIC总线协议中,设备地址是起始信号后第一个发送的字节。如果硬件地址引脚A0、A1、A2均接地,那么PCF8591的设备的读操作地址为:0x91;而写操作地址则为:0x90

控制寄存器

控制寄存器

在蓝桥杯单片机设计与开发赛项使用的CT107D单片机开发平台中,PCF8591的三个硬件引脚地址均接地,两路模拟信号均为单端输入,分别是:

光敏传感器接到AIN1,通道1;控制寄存器应写入:0x01
 电位器Rb2接到AIN3,通道3;控制寄存器应写入:0x03

电路原理图

8591

A/D转换应用开发流程

  一个A/D转换的周期的开始,在发送有效的读设备地址给PCF8591之后,A/D转换在应答时钟脉冲的后沿被触发。PCF8591的A/D转换程序设计流程,可以分为四个步骤:

1--发送写设备地址,选择IIC总线上的PCF8591器件。
2--发送控制字节,选择模拟量输入模式和通道。
3--发送读设备地址,选择IIC总线上的PCF8591器件。
4--读取PCF8591中目标通道的数据。

/**
* @brief 等待应答
*
* @param[in] none
* @param[out] none
* @return none
*/
unsigned char i2c_waitack(void)
{
    unsigned char ackbit;

    scl = 1;
    i2c_delay(DELAY_TIME);
    ackbit = sda; //while(sda);  //wait ack
    scl = 0;
    i2c_delay(DELAY_TIME);

    return ackbit;
}

/**
* @brief I2C接收一个字节数据
*
* @param[in] none
* @param[out] da
* @return da - 从I2C总线上接收到得数据
*/
unsigned char i2c_receivebyte(void)
{
    unsigned char da;
    unsigned char i;
    EA = 0;
    for(i=0; i<8; i++) {
        scl = 1;
        i2c_delay(DELAY_TIME);
        da <<= 1;
        if(sda)
            da |= 0x01;
        scl = 0;
        i2c_delay(DELAY_TIME);
    }
    EA = 1;
    return da;
}
void init_pcf8591(void)
{
    i2c_start();                   //开始时序
    i2c_sendbyte(0x90);            //写地址        往哪个地址写
    i2c_waitack();                 //等待应答
    i2c_sendbyte(0x03);            //ADC通道3    0x01-Rb4  0x03-Rb2
    i2c_waitack();                 //等待应答
    i2c_stop();                    //停止时序
    operate_delay(10);
}

unsigned char adc_pcf8591(void)
{
    unsigned char temp;

    i2c_start();                     //开始时序
    i2c_sendbyte(0x91);              //读地址         读取哪个地址数据
    i2c_waitack();                   //等待应答
    temp = i2c_receivebyte();        //读数据
    i2c_sendack(1);                  //产生应答信号        
    i2c_stop();                      //停止时序

    return temp;
}

24c02

24C02功能概述

24c02

  24C02是一个2KB的串行EEPROM存储器,内部含有256个字节。在24C02里面有一个8字节页写缓冲器。该设备的工作电压为1.8V到6.0V,芯片的第7引脚WP为写保护引脚,将该引脚接地允许正常的读写。

设备地址

  24C02的设备地址包括固定部分和可编程部分。可编程部分需要根据硬件引脚A0、A1和A2来设置。设备地址的最后一位用于设置数据传输的方向,即读/写位。格式如下图:

设备地址

  设备地址是起始信号后第一个发送的字节。如果硬件地址引脚A0、A1、A2均接地,那么,24C02的设备的读操作地址为:0xA1;而写操作地址则为:0xA0

字节写操作

  24C02接收完设备地址后,产生应答信号;然后接收8位内存字节地址,产生应答信号,接着接收一个8位数据,产生应答信号;最后主机发送停止信号,字节写操作结束。

/**
* @brief 向AT24C02(add)中写入数据val
*
* @param[in] add - AT24C02存储地址
* @param[in] val - 待写入AT24C02相应地址的数据
* @return - none
*/
void write_eeprom(unsigned char add,unsigned char val)
{
    i2c_start();
    i2c_sendbyte(0xa0);    //写地址
    i2c_waitack();
    i2c_sendbyte(add);
    i2c_waitack();
    i2c_sendbyte(val);
    i2c_waitack();
    i2c_stop();
    operate_delay(10);
}

字节读操作

  主机首先发送起始信号,接着发送设备地址和它想要读取的数据内存字节地址,执行一个伪写操作。在24C02应答主机之后,主机重新发送起始信号和从设备地址,进行读操作。24C02响应并发送应答信号,然后输出所要求的一个8位字节数据。主机接收完这个8位数据后,产生一个“非应答”信号,最后发送停止条件,字节读操作结束。

/**
* @brief 从AT24C02(add)中读出数据da
*
* @param[in] add - AT24C02存储地址
* @param[out] da - 从AT24C02相应地址中读取到的数据
* @return - da
*/
unsigned char read_eeprom(unsigned char add)
{
    unsigned char da;

    i2c_start();
    i2c_sendbyte(0xa0);    //写地址
    i2c_waitack();
    i2c_sendbyte(add);
    i2c_waitack();
    i2c_start();
    i2c_sendbyte(0xa1);    //读地址
    i2c_waitack();
    da = i2c_receivebyte();
    i2c_sendack(0);
    i2c_stop();

    return da;
}

文章作者: Rb菌
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Rb菌 !
  目录