蓝桥杯 — PCF8591芯片、IIC总线协议解释、EEPROM的使用

目录

1、IIC总线相关介绍

2、PCF8591芯片

3、EEPROM使用


1、IIC总线相关介绍

I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。

(1)void init_pcf8591(void)(初始化操作)

void init_pcf8591(void)
{
	i2c_start();
	i2c_sendbyte(0x90);
	i2c_waitack();
	i2c_sendbyte(0x03);  //ADC通道3
	i2c_waitack();
	i2c_stop();
	operate_delay(10);
}

  这个函数为PCF8591初始化函数,对于选择通道函数为i2c_sendbyte(),上述代码选择通道3。

  最后两位配置选择哪个通道 ,其余位不用管。

(2)unsigned char adc_pcf8591(void)(A/D转换函数)

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;
}

  通过I2C总线提取ADC结果,此函数为ADC转化结果函数。

(3)void dac_pcf8591(unsigned char dat)(D/A转换)

void dac_pcf8591(unsigned char dat)
{
	i2c_start();
	i2c_sendbyte(0x90);
	i2c_waitack();
	i2c_sendbyte(0x40);  //DAC转换
	i2c_waitack();
	
	i2c_sendbyte(dat);
	i2c_waitack();
	i2c_stop();
}

  此函数为DAC转化结果函数。上述函数都需要自己写,要准确记得每步操作。

2、PCF8591芯片

(1)原理图

PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。PCF8591的最大转化速率由I2C总线的最大速率决定。AIN0~AIN3:模拟信号输入端,A0~A2:引脚地址端,SDA、SCL:I2C 总线的数据线、时钟线。OSC:外部时钟输入端,内部时钟输出端,EXT:内部、外部时钟选择线,使用内部时钟时 EXT 接地,AGND:模拟信号接地。AOUT:D/A 转换输出端。

 (2)地址字节

   \bullet A2、A1、A0硬件接地为0;

   \bullet 最低位表示的是你要从IIC总线上读数还是写数据,1表示读,0表示写,故写数据发的地址为:0X90;读数据发的地址为:0X91;

(3)控制字节

   \bullet PCF8591上提供了4路模拟通道,根据需求进行选择,如选择通道3即发送控制字节:0x03;

 (4)A/D转换时序要求配置

   \bullet 配置初始化函数

   A/D转换需要一个初始化函数:Init_ADpcf8591();和一个获得AD转换后的数值的函数:adc_pcf8591(); 其中初始化函数的作用是发送AD转换的控制字节;adc_pcf8591()发送读取得地址并读回数据

   这个是初始化的协议:分别是startIIC、(地址写)发送0x90、等待应答、发送控制字节(AD这里是选择通道的指令,如选择通道3,0x03)0x03、等待应答、(达到目的,没有后续的操作,直接停止总线)StopIIC。

   其实就是配置初始化函数操作,按照上述操作进行写代码。

  \bullet 配置转换数值函数

  首先开始startIIC—发送读地址0X91—等待应答—读数值—返回给PCF8591表示收到—如果不在接受则要传参数1—StopIIC。依次是:startIIc、发送读地址0x91、等待应答、读回AD转换后的数值、读回后发送应答给PCF8591,表示收到,并且不需要再返回应答,要传参数1,如图红圈示,即函数Ack(1);、最后stopIIC总线。

(5) A/D转换要求

  D/A转换其实就是把数字信号转换成模拟信号输出,用单片机发数字通过D/A转换成电压输出,检测的方法可以用电压表测量。配置方面和D/A类似。

3、EEPROM使用

(1) AT24C02芯片原理图

  管脚介绍:

  AT24C02,可以掉电依旧保存上一次操作的数据,下次上电后接着运行。

(2)部分定义函数说明

  向AT24C02(add)写入数据val。

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);
}

  向AT24C02(add)读出数据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;
}

  其中写函数需要指定AT24C02的地址以及需要写入的数据,读函数要想取回写进的数据,需要从相同的地址里面读。

图1:Device Address

   从图1上看,读数据地址为:0XA1;写地址为:0XA0;:读数的时候读出一个数之后发送一个应答信号,若ACK(0)表示还想继续读下一个字节,若ACK(1);则不想再读数,让EEPROM停止发送。

发布了64 篇原创文章 · 获赞 70 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/fanjufei123456/article/details/104427873