一、原理图
此处考点分析:可能会在引用iic文件时需要自己在头文件定义SCL/SDA
sbit sda = P2^1;
sbit scl = P2^0;
二、思维导图
三、代码示例
#include "iic.h"
#include "smg.h"
unsigned int adc1_value = 0; //AIN1的采样数据
float adc1_volt = 0; //AIN1的换算电压
unsigned int adc3_value = 0; //AIN3的采样数据
float adc3_volt = 0; //AIN3的换算电压
//PCF8591电压采样处理函数
unsigned char Read_PCF8591_ADC(unsigned char ain)
{
unsigned char tmp;
I2CStart();
I2CSendByte(0x90); //PCF8591的写设备地址
I2CWaitAck();
//选择AD转换通道
if(ain == 1)
{
I2CSendByte(0x01); //通道1,光敏电阻电压
}
else if(ain == 3)
{
I2CSendByte(0x03); //通道3,可调电阻电压
}
I2CWaitAck();
I2CStop();
SMG_Info(); //数码管显示函数,等待电压转换完成
I2CStart();
I2CSendByte(0x91); //PCF8591的读设备地址
I2CWaitAck();
//读出AD采样数据
tmp = I2CReceiveByte();
I2CSendAck(0); //产生应答信号
I2CStop();
return tmp;
}
//采样光敏电阻和可调电阻的电压数据应用分析处理
void App_Volt()
{
unsigned char i;
//采样通道3的电压
adc3_value = 0;
for(i = 0; i < 3; i++)
{
adc3_value += Read_PCF8591_ADC(3);
}
adc3_value = adc3_value / 3;
//将ADC采样到的数据换算成对应的电压值
adc3_volt = adc3_value * (5.0 / 255);
unsigned char n;
//采样通道1的电压
adc1_value = 0;
for(n = 0; n < 3; n++)
{
adc1_value += Read_PCF8591_ADC(1);
}
adc1_value = adc1_value / 3;
//将ADC采样到的数据换算成对应的电压值
adc1_volt = adc1_value * (5.0 / 255);
}
从PCF8591模数转换器中采样AIN3通道和AIN1通道的数据,并将采样数据转换为对应的电压值,可以为后续电压数据的应用分析提供基础。
-
Read_PCF8591_ADC(unsigned char ain)
函数用于从PCF8591模数转换器中读取ADC采样数据。在函数中:- 发送起始信号,并发送PCF8591的写设备地址。
- 根据传入的参数
ain
选择AD转换通道,如果ain
为1,则选择通道1(光敏电阻电压),如果为3,则选择通道3(可调电阻电压)。 - 等待电压转换完成,调用
SMG_Info()
函数进行数码管显示。 - 发送起始信号,并发送PCF8591的读设备地址。
- 读出AD采样数据,产生应答信号,停止信号,并返回读取的数据。
-
App_Volt()
函数用于应用分析处理采样到的电压数据。在函数中:- 通过循环采样通道3的电压数据,并计算平均值,然后将ADC采样到的数据换算成对应的电压值。
- 类似地,采样通道1的电压数据,并计算平均值,然后将ADC采样到的数据换算成对应的电压值。